mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-04 23:08:39 +09:00
Merge remote-tracking branch 'origin/master' into custom
This commit is contained in:
commit
a85a33f6de
10 changed files with 7221 additions and 5216 deletions
|
|
@ -109,8 +109,15 @@ PlacesViewBase.prototype = {
|
|||
|
||||
get selectedNode() {
|
||||
if (this._contextMenuShown) {
|
||||
let popup = document.popupNode;
|
||||
return popup._placesNode || popup.parentNode._placesNode || null;
|
||||
let anchor = this._contextMenuShown.triggerNode;
|
||||
if (!anchor)
|
||||
return null;
|
||||
|
||||
if (anchor._placesNode)
|
||||
return this._rootElt == anchor ? null : anchor._placesNode;
|
||||
|
||||
anchor = anchor.parentNode;
|
||||
return this._rootElt == anchor ? null : (anchor._placesNode || null);
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
|
@ -176,13 +183,13 @@ PlacesViewBase.prototype = {
|
|||
},
|
||||
|
||||
buildContextMenu: function PVB_buildContextMenu(aPopup) {
|
||||
this._contextMenuShown = true;
|
||||
this._contextMenuShown = aPopup;
|
||||
window.updateCommands("places");
|
||||
return this.controller.buildContextMenu(aPopup);
|
||||
},
|
||||
|
||||
destroyContextMenu: function PVB_destroyContextMenu(aPopup) {
|
||||
this._contextMenuShown = false;
|
||||
this._contextMenuShown = null;
|
||||
},
|
||||
|
||||
_cleanPopup: function PVB_cleanPopup(aPopup, aDelay) {
|
||||
|
|
|
|||
|
|
@ -333,20 +333,6 @@ PlacesController.prototype = {
|
|||
return ip != null && (isPaste || ip.isTag != true);
|
||||
},
|
||||
|
||||
/**
|
||||
* Determines whether or not the root node for the view is selected
|
||||
*/
|
||||
rootNodeIsSelected: function PC_rootNodeIsSelected() {
|
||||
var nodes = this._view.selectedNodes;
|
||||
var root = this._view.result.root;
|
||||
for (var i = 0; i < nodes.length; ++i) {
|
||||
if (nodes[i] == root)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
/**
|
||||
* Looks at the data on the clipboard to see if it is paste-able.
|
||||
* Paste-able data is:
|
||||
|
|
@ -400,7 +386,7 @@ PlacesController.prototype = {
|
|||
* Gathers information about the selected nodes according to the following
|
||||
* rules:
|
||||
* "link" node is a URI
|
||||
* "bookmark" node is a bookamrk
|
||||
* "bookmark" node is a bookmark
|
||||
* "livemarkChild" node is a child of a livemark
|
||||
* "tagChild" node is a child of a tag
|
||||
* "folder" node is a folder
|
||||
|
|
@ -414,15 +400,10 @@ PlacesController.prototype = {
|
|||
* node are set on its corresponding object as properties.
|
||||
* Notes:
|
||||
* 1) This can be slow, so don't call it anywhere performance critical!
|
||||
* 2) A single-object array corresponding the root node is returned if
|
||||
* there's no selection.
|
||||
*/
|
||||
_buildSelectionMetadata: function PC__buildSelectionMetadata() {
|
||||
var metadata = [];
|
||||
var root = this._view.result.root;
|
||||
var nodes = this._view.selectedNodes;
|
||||
if (nodes.length == 0)
|
||||
nodes.push(root); // See the second note above
|
||||
|
||||
for (var i = 0; i < nodes.length; i++) {
|
||||
var nodeData = {};
|
||||
|
|
@ -501,10 +482,23 @@ PlacesController.prototype = {
|
|||
*/
|
||||
_shouldShowMenuItem: function PC__shouldShowMenuItem(aMenuItem, aMetaData) {
|
||||
var selectiontype = aMenuItem.getAttribute("selectiontype");
|
||||
if (selectiontype == "multiple" && aMetaData.length == 1)
|
||||
if (!selectiontype) {
|
||||
selectiontype = "single|multiple";
|
||||
}
|
||||
var selectionTypes = selectiontype.split("|");
|
||||
if (selectionTypes.indexOf("any") != -1) {
|
||||
return true;
|
||||
}
|
||||
var count = aMetaData.length;
|
||||
if (count > 1 && selectionTypes.indexOf("multiple") == -1)
|
||||
return false;
|
||||
if (selectiontype == "single" && aMetaData.length != 1)
|
||||
if (count == 1 && selectionTypes.indexOf("single") == -1)
|
||||
return false;
|
||||
// NB: if there is no selection, we show the item if (and only if)
|
||||
// the selectiontype includes 'none' - the metadata list will be
|
||||
// empty so none of the other criteria will apply anyway.
|
||||
if (count == 0)
|
||||
return selectionTypes.indexOf("none") != -1;
|
||||
|
||||
var forceHideAttr = aMenuItem.getAttribute("forcehideselection");
|
||||
if (forceHideAttr) {
|
||||
|
|
@ -551,9 +545,11 @@ PlacesController.prototype = {
|
|||
* 1) The "selectiontype" attribute may be set on a menu-item to "single"
|
||||
* if the menu-item should be visible only if there is a single node
|
||||
* selected, or to "multiple" if the menu-item should be visible only if
|
||||
* multiple nodes are selected. If the attribute is not set or if it is
|
||||
* set to an invalid value, the menu-item may be visible for both types of
|
||||
* selection.
|
||||
* multiple nodes are selected, or to "none" if the menuitems should be
|
||||
* visible for if there are no selected nodes, or to a |-separated
|
||||
* combination of these.
|
||||
* If the attribute is not set or set to an invalid value, the menu-item
|
||||
* may be visible irrespective of the selection.
|
||||
* 2) The "selection" attribute may be set on a menu-item to the various
|
||||
* meta-data rules for which it may be visible. The rules should be
|
||||
* separated with the | character.
|
||||
|
|
@ -584,7 +580,7 @@ PlacesController.prototype = {
|
|||
|
||||
var separator = null;
|
||||
var visibleItemsBeforeSep = false;
|
||||
var anyVisible = false;
|
||||
var usableItemCount = 0;
|
||||
for (var i = 0; i < aPopup.childNodes.length; ++i) {
|
||||
var item = aPopup.childNodes[i];
|
||||
if (item.localName != "menuseparator") {
|
||||
|
|
@ -598,12 +594,13 @@ PlacesController.prototype = {
|
|||
(!/tree/i.test(this._view.localName) || ip);
|
||||
var hideIfPrivate = item.getAttribute("hideifprivatebrowsing") == "true" &&
|
||||
PrivateBrowsingUtils.isWindowPrivate(window);
|
||||
item.hidden = hideIfNoIP || hideIfPrivate || hideParentFolderItem ||
|
||||
!this._shouldShowMenuItem(item, metadata);
|
||||
var shouldHideItem = hideIfNoIP || hideIfPrivate || hideParentFolderItem ||
|
||||
!this._shouldShowMenuItem(item, metadata);
|
||||
item.hidden = item.disabled = shouldHideItem;
|
||||
|
||||
if (!item.hidden) {
|
||||
visibleItemsBeforeSep = true;
|
||||
anyVisible = true;
|
||||
usableItemCount++;
|
||||
|
||||
// Show the separator above the menu-item if any
|
||||
if (separator) {
|
||||
|
|
@ -627,21 +624,21 @@ PlacesController.prototype = {
|
|||
}
|
||||
|
||||
// Set Open Folder/Links In Tabs items enabled state if they're visible
|
||||
if (anyVisible) {
|
||||
if (usableItemCount > 0) {
|
||||
var openContainerInTabsItem = document.getElementById("placesContext_openContainer:tabs");
|
||||
if (!openContainerInTabsItem.hidden && this._view.selectedNode &&
|
||||
PlacesUtils.nodeIsContainer(this._view.selectedNode)) {
|
||||
openContainerInTabsItem.disabled =
|
||||
!PlacesUtils.hasChildURIs(this._view.selectedNode);
|
||||
}
|
||||
else {
|
||||
// see selectiontype rule in the overlay
|
||||
var openLinksInTabsItem = document.getElementById("placesContext_openLinks:tabs");
|
||||
openLinksInTabsItem.disabled = openLinksInTabsItem.hidden;
|
||||
if (!openContainerInTabsItem.hidden) {
|
||||
var containerToUse = this._view.selectedNode || this._view.result.root;
|
||||
if (PlacesUtils.nodeIsContainer(containerToUse)) {
|
||||
if (!PlacesUtils.hasChildURIs(containerToUse, true)) {
|
||||
openContainerInTabsItem.disabled = true;
|
||||
// Ensure that we don't display the menu if nothing is enabled:
|
||||
usableItemCount--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return anyVisible;
|
||||
return usableItemCount > 0;
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
@ -707,10 +704,15 @@ PlacesController.prototype = {
|
|||
*/
|
||||
openSelectionInTabs: function PC_openLinksInTabs(aEvent) {
|
||||
var node = this._view.selectedNode;
|
||||
var nodes = this._view.selectedNodes;
|
||||
// In the case of no selection, open the root node:
|
||||
if (!node && !nodes.length) {
|
||||
node = this._view.result.root;
|
||||
}
|
||||
if (node && PlacesUtils.nodeIsContainer(node))
|
||||
PlacesUIUtils.openContainerNodeInTabs(this._view.selectedNode, aEvent, this._view);
|
||||
PlacesUIUtils.openContainerNodeInTabs(node, aEvent, this._view);
|
||||
else
|
||||
PlacesUIUtils.openURINodesInTabs(this._view.selectedNodes, aEvent, this._view);
|
||||
PlacesUIUtils.openURINodesInTabs(nodes, aEvent, this._view);
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -149,20 +149,20 @@
|
|||
command="placesCmd_new:bookmark"
|
||||
label="&cmd.new_bookmark.label;"
|
||||
accesskey="&cmd.new_bookmark.accesskey;"
|
||||
selection="any"
|
||||
selectiontype="any"
|
||||
hideifnoinsertionpoint="true"/>
|
||||
<menuitem id="placesContext_new:folder"
|
||||
command="placesCmd_new:folder"
|
||||
label="&cmd.new_folder.label;"
|
||||
accesskey="&cmd.context_new_folder.accesskey;"
|
||||
selection="any"
|
||||
selectiontype="any"
|
||||
hideifnoinsertionpoint="true"/>
|
||||
<menuitem id="placesContext_new:separator"
|
||||
command="placesCmd_new:separator"
|
||||
label="&cmd.new_separator.label;"
|
||||
accesskey="&cmd.new_separator.accesskey;"
|
||||
closemenu="single"
|
||||
selection="any"
|
||||
selectiontype="any"
|
||||
hideifnoinsertionpoint="true"/>
|
||||
<menuseparator id="placesContext_newSeparator"/>
|
||||
<menuitem id="placesContext_createBookmark"
|
||||
|
|
@ -182,14 +182,13 @@
|
|||
command="placesCmd_copy"
|
||||
label="©Cmd.label;"
|
||||
closemenu="single"
|
||||
accesskey="©Cmd.accesskey;"
|
||||
selection="any"/>
|
||||
accesskey="©Cmd.accesskey;"/>
|
||||
<menuitem id="placesContext_paste"
|
||||
command="placesCmd_paste"
|
||||
label="&pasteCmd.label;"
|
||||
closemenu="single"
|
||||
accesskey="&pasteCmd.accesskey;"
|
||||
selection="any"
|
||||
selectiontype="any"
|
||||
hideifnoinsertionpoint="true"/>
|
||||
<menuseparator id="placesContext_editSeparator"/>
|
||||
<menuitem id="placesContext_delete"
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ var SidebarUtils = {
|
|||
var openInTabs = isContainer &&
|
||||
(aEvent.button == 1 ||
|
||||
(aEvent.button == 0 && modifKey)) &&
|
||||
PlacesUtils.hasChildURIs(tbo.view.nodeForTreeIndex(cell.row));
|
||||
PlacesUtils.hasChildURIs(tbo.view.nodeForTreeIndex(cell.row), true);
|
||||
|
||||
if (aEvent.button == 0 && isContainer && !openInTabs) {
|
||||
tbo.view.toggleOpenState(cell.row);
|
||||
|
|
|
|||
|
|
@ -298,36 +298,6 @@ var gPrivacyPane = {
|
|||
|
||||
// HISTORY
|
||||
|
||||
/**
|
||||
* Read the location bar enabled and suggestion prefs
|
||||
* @return Int value for suggestion menulist
|
||||
*/
|
||||
readSuggestionPref: function PPP_readSuggestionPref()
|
||||
{
|
||||
let getVal = function(aPref)
|
||||
document.getElementById("browser.urlbar." + aPref).value;
|
||||
|
||||
// Suggest nothing if autocomplete is not enabled
|
||||
if (!getVal("autocomplete.enabled"))
|
||||
return -1;
|
||||
|
||||
// Bottom 2 bits of default.behavior specify history/bookmark
|
||||
return getVal("default.behavior") & 3;
|
||||
},
|
||||
|
||||
/**
|
||||
* Update browser.urlbar.autocomplete.enabled when a
|
||||
* browser.urlbar.suggest.* pref is changed from the ui.
|
||||
*/
|
||||
writeSuggestionPref: function PPP_writeSuggestionPref() {
|
||||
let getVal = (aPref) => {
|
||||
return document.getElementById("browser.urlbar.suggest." + aPref).value;
|
||||
}
|
||||
// autocomplete.enabled is true if any of the suggestions is true
|
||||
let enabled = ["history", "bookmark", "openpage"].map(getVal).some(v => v);
|
||||
Services.prefs.setBoolPref("browser.urlbar.autocomplete.enabled", enabled);
|
||||
},
|
||||
|
||||
/*
|
||||
* Preferences:
|
||||
*
|
||||
|
|
|
|||
|
|
@ -254,15 +254,12 @@
|
|||
|
||||
<vbox id="tabPrefsBox" align="start" flex="1">
|
||||
<checkbox id="historySuggestion" label="&locbar.history.label;"
|
||||
onsyncfrompreference="return gPrivacyPane.writeSuggestionPref();"
|
||||
accesskey="&locbar.history.accesskey;"
|
||||
preference="browser.urlbar.suggest.history"/>
|
||||
<checkbox id="bookmarkSuggestion" label="&locbar.bookmarks.label;"
|
||||
onsyncfrompreference="return gPrivacyPane.writeSuggestionPref();"
|
||||
accesskey="&locbar.bookmarks.accesskey;"
|
||||
preference="browser.urlbar.suggest.bookmark"/>
|
||||
<checkbox id="openpageSuggestion" label="&locbar.openpage.label;"
|
||||
onsyncfrompreference="return gPrivacyPane.writeSuggestionPref();"
|
||||
accesskey="&locbar.openpage.accesskey;"
|
||||
preference="browser.urlbar.suggest.openpage"/>
|
||||
</vbox>
|
||||
|
|
|
|||
12244
db/sqlite3/src/sqlite3.c
12244
db/sqlite3/src/sqlite3.c
File diff suppressed because it is too large
Load diff
|
|
@ -123,9 +123,9 @@ extern "C" {
|
|||
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
||||
** [sqlite_version()] and [sqlite_source_id()].
|
||||
*/
|
||||
#define SQLITE_VERSION "3.27.2"
|
||||
#define SQLITE_VERSION_NUMBER 3027002
|
||||
#define SQLITE_SOURCE_ID "2019-02-25 16:06:06 bd49a8271d650fa89e446b42e513b595a717b9212c91dd384aab871fc1d0f6d7"
|
||||
#define SQLITE_VERSION "3.29.0"
|
||||
#define SQLITE_VERSION_NUMBER 3029000
|
||||
#define SQLITE_SOURCE_ID "2019-07-10 17:32:03 fc82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88bfa6"
|
||||
|
||||
/*
|
||||
** CAPI3REF: Run-Time Library Version Numbers
|
||||
|
|
@ -189,6 +189,9 @@ SQLITE_API int sqlite3_libversion_number(void);
|
|||
#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
|
||||
SQLITE_API int sqlite3_compileoption_used(const char *zOptName);
|
||||
SQLITE_API const char *sqlite3_compileoption_get(int N);
|
||||
#else
|
||||
# define sqlite3_compileoption_used(X) 0
|
||||
# define sqlite3_compileoption_get(X) ((void*)0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -1293,8 +1296,14 @@ typedef struct sqlite3_api_routines sqlite3_api_routines;
|
|||
** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS]
|
||||
** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to
|
||||
** test whether a file is readable and writable, or [SQLITE_ACCESS_READ]
|
||||
** to test whether a file is at least readable. The file can be a
|
||||
** directory.
|
||||
** to test whether a file is at least readable. The SQLITE_ACCESS_READ
|
||||
** flag is never actually used and is not implemented in the built-in
|
||||
** VFSes of SQLite. The file is named by the second argument and can be a
|
||||
** directory. The xAccess method returns [SQLITE_OK] on success or some
|
||||
** non-zero error code if there is an I/O error or if the name of
|
||||
** the file given in the second argument is illegal. If SQLITE_OK
|
||||
** is returned, then non-zero or zero is written into *pResOut to indicate
|
||||
** whether or not the file is accessible.
|
||||
**
|
||||
** ^SQLite will always allocate at least mxPathname+1 bytes for the
|
||||
** output buffer xFullPathname. The exact size of the output buffer
|
||||
|
|
@ -2086,8 +2095,8 @@ struct sqlite3_mem_methods {
|
|||
**
|
||||
** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]]
|
||||
** <dt>SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER</dt>
|
||||
** <dd> ^This option is used to enable or disable the two-argument
|
||||
** version of the [fts3_tokenizer()] function which is part of the
|
||||
** <dd> ^This option is used to enable or disable the
|
||||
** [fts3_tokenizer()] function which is part of the
|
||||
** [FTS3] full-text search engine extension.
|
||||
** There should be two additional arguments.
|
||||
** The first argument is an integer which is 0 to disable fts3_tokenizer() or
|
||||
|
|
@ -2195,10 +2204,50 @@ struct sqlite3_mem_methods {
|
|||
** features include but are not limited to the following:
|
||||
** <ul>
|
||||
** <li> The [PRAGMA writable_schema=ON] statement.
|
||||
** <li> The [PRAGMA journal_mode=OFF] statement.
|
||||
** <li> Writes to the [sqlite_dbpage] virtual table.
|
||||
** <li> Direct writes to [shadow tables].
|
||||
** </ul>
|
||||
** </dd>
|
||||
**
|
||||
** [[SQLITE_DBCONFIG_WRITABLE_SCHEMA]] <dt>SQLITE_DBCONFIG_WRITABLE_SCHEMA</dt>
|
||||
** <dd>The SQLITE_DBCONFIG_WRITABLE_SCHEMA option activates or deactivates the
|
||||
** "writable_schema" flag. This has the same effect and is logically equivalent
|
||||
** to setting [PRAGMA writable_schema=ON] or [PRAGMA writable_schema=OFF].
|
||||
** The first argument to this setting is an integer which is 0 to disable
|
||||
** the writable_schema, positive to enable writable_schema, or negative to
|
||||
** leave the setting unchanged. The second parameter is a pointer to an
|
||||
** integer into which is written 0 or 1 to indicate whether the writable_schema
|
||||
** is enabled or disabled following this call.
|
||||
** </dd>
|
||||
**
|
||||
** [[SQLITE_DBCONFIG_LEGACY_ALTER_TABLE]]
|
||||
** <dt>SQLITE_DBCONFIG_LEGACY_ALTER_TABLE</dt>
|
||||
** <dd>The SQLITE_DBCONFIG_LEGACY_ALTER_TABLE option activates or deactivates
|
||||
** the legacy behavior of the [ALTER TABLE RENAME] command such it
|
||||
** behaves as it did prior to [version 3.24.0] (2018-06-04). See the
|
||||
** "Compatibility Notice" on the [ALTER TABLE RENAME documentation] for
|
||||
** additional information. This feature can also be turned on and off
|
||||
** using the [PRAGMA legacy_alter_table] statement.
|
||||
** </dd>
|
||||
**
|
||||
** [[SQLITE_DBCONFIG_DQS_DML]]
|
||||
** <dt>SQLITE_DBCONFIG_DQS_DML</td>
|
||||
** <dd>The SQLITE_DBCONFIG_DQS_DML option activates or deactivates
|
||||
** the legacy [double-quoted string literal] misfeature for DML statement
|
||||
** only, that is DELETE, INSERT, SELECT, and UPDATE statements. The
|
||||
** default value of this setting is determined by the [-DSQLITE_DQS]
|
||||
** compile-time option.
|
||||
** </dd>
|
||||
**
|
||||
** [[SQLITE_DBCONFIG_DQS_DDL]]
|
||||
** <dt>SQLITE_DBCONFIG_DQS_DDL</td>
|
||||
** <dd>The SQLITE_DBCONFIG_DQS option activates or deactivates
|
||||
** the legacy [double-quoted string literal] misfeature for DDL statements,
|
||||
** such as CREATE TABLE and CREATE INDEX. The
|
||||
** default value of this setting is determined by the [-DSQLITE_DQS]
|
||||
** compile-time option.
|
||||
** </dd>
|
||||
** </dl>
|
||||
*/
|
||||
#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */
|
||||
|
|
@ -2212,7 +2261,11 @@ struct sqlite3_mem_methods {
|
|||
#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */
|
||||
#define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */
|
||||
#define SQLITE_DBCONFIG_DEFENSIVE 1010 /* int int* */
|
||||
#define SQLITE_DBCONFIG_MAX 1010 /* Largest DBCONFIG */
|
||||
#define SQLITE_DBCONFIG_WRITABLE_SCHEMA 1011 /* int int* */
|
||||
#define SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 1012 /* int int* */
|
||||
#define SQLITE_DBCONFIG_DQS_DML 1013 /* int int* */
|
||||
#define SQLITE_DBCONFIG_DQS_DDL 1014 /* int int* */
|
||||
#define SQLITE_DBCONFIG_MAX 1014 /* Largest DBCONFIG */
|
||||
|
||||
/*
|
||||
** CAPI3REF: Enable Or Disable Extended Result Codes
|
||||
|
|
@ -3894,6 +3947,18 @@ SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt);
|
|||
*/
|
||||
SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt);
|
||||
|
||||
/*
|
||||
** CAPI3REF: Query The EXPLAIN Setting For A Prepared Statement
|
||||
** METHOD: sqlite3_stmt
|
||||
**
|
||||
** ^The sqlite3_stmt_isexplain(S) interface returns 1 if the
|
||||
** prepared statement S is an EXPLAIN statement, or 2 if the
|
||||
** statement S is an EXPLAIN QUERY PLAN.
|
||||
** ^The sqlite3_stmt_isexplain(S) interface returns 0 if S is
|
||||
** an ordinary statement or a NULL pointer.
|
||||
*/
|
||||
SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt);
|
||||
|
||||
/*
|
||||
** CAPI3REF: Determine If A Prepared Statement Has Been Reset
|
||||
** METHOD: sqlite3_stmt
|
||||
|
|
@ -4033,7 +4098,9 @@ typedef struct sqlite3_context sqlite3_context;
|
|||
** ^The fifth argument to the BLOB and string binding interfaces
|
||||
** is a destructor used to dispose of the BLOB or
|
||||
** string after SQLite has finished with it. ^The destructor is called
|
||||
** to dispose of the BLOB or string even if the call to bind API fails.
|
||||
** to dispose of the BLOB or string even if the call to the bind API fails,
|
||||
** except the destructor is not called if the third parameter is a NULL
|
||||
** pointer or the fourth parameter is negative.
|
||||
** ^If the fifth argument is
|
||||
** the special value [SQLITE_STATIC], then SQLite assumes that the
|
||||
** information is in static, unmanaged space and does not need to be freed.
|
||||
|
|
@ -4950,6 +5017,8 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6
|
|||
** <tr><td><b>sqlite3_value_nochange </b>
|
||||
** <td>→ <td>True if the column is unchanged in an UPDATE
|
||||
** against a virtual table.
|
||||
** <tr><td><b>sqlite3_value_frombind </b>
|
||||
** <td>→ <td>True if value originated from a [bound parameter]
|
||||
** </table></blockquote>
|
||||
**
|
||||
** <b>Details:</b>
|
||||
|
|
@ -5011,6 +5080,11 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6
|
|||
** than within an [xUpdate] method call for an UPDATE statement, then
|
||||
** the return value is arbitrary and meaningless.
|
||||
**
|
||||
** ^The sqlite3_value_frombind(X) interface returns non-zero if the
|
||||
** value X originated from one of the [sqlite3_bind_int|sqlite3_bind()]
|
||||
** interfaces. ^If X comes from an SQL literal value, or a table column,
|
||||
** and expression, then sqlite3_value_frombind(X) returns zero.
|
||||
**
|
||||
** Please pay particular attention to the fact that the pointer returned
|
||||
** from [sqlite3_value_blob()], [sqlite3_value_text()], or
|
||||
** [sqlite3_value_text16()] can be invalidated by a subsequent call to
|
||||
|
|
@ -5056,6 +5130,7 @@ SQLITE_API int sqlite3_value_bytes16(sqlite3_value*);
|
|||
SQLITE_API int sqlite3_value_type(sqlite3_value*);
|
||||
SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*);
|
||||
SQLITE_API int sqlite3_value_nochange(sqlite3_value*);
|
||||
SQLITE_API int sqlite3_value_frombind(sqlite3_value*);
|
||||
|
||||
/*
|
||||
** CAPI3REF: Finding The Subtype Of SQL Values
|
||||
|
|
@ -5791,7 +5866,7 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*);
|
|||
** associated with database N of connection D. ^The main database file
|
||||
** has the name "main". If there is no attached database N on the database
|
||||
** connection D, or if database N is a temporary or in-memory database, then
|
||||
** a NULL pointer is returned.
|
||||
** this function will return either a NULL pointer or an empty string.
|
||||
**
|
||||
** ^The filename returned by this function is the output of the
|
||||
** xFullPathname method of the [VFS]. ^In other words, the filename
|
||||
|
|
@ -7282,7 +7357,8 @@ SQLITE_API int sqlite3_test_control(int op, ...);
|
|||
#define SQLITE_TESTCTRL_SORTER_MMAP 24
|
||||
#define SQLITE_TESTCTRL_IMPOSTER 25
|
||||
#define SQLITE_TESTCTRL_PARSER_COVERAGE 26
|
||||
#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */
|
||||
#define SQLITE_TESTCTRL_RESULT_INTREAL 27
|
||||
#define SQLITE_TESTCTRL_LAST 27 /* Largest TESTCTRL */
|
||||
|
||||
/*
|
||||
** CAPI3REF: SQL Keyword Checking
|
||||
|
|
@ -10892,7 +10968,7 @@ SQLITE_API int sqlite3rebaser_configure(
|
|||
** in size. This function allocates and populates a buffer with a copy
|
||||
** of the changeset rebased rebased according to the configuration of the
|
||||
** rebaser object passed as the first argument. If successful, (*ppOut)
|
||||
** is set to point to the new buffer containing the rebased changset and
|
||||
** is set to point to the new buffer containing the rebased changeset and
|
||||
** (*pnOut) to its size in bytes and SQLITE_OK returned. It is the
|
||||
** responsibility of the caller to eventually free the new buffer using
|
||||
** sqlite3_free(). Otherwise, if an error occurs, (*ppOut) and (*pnOut)
|
||||
|
|
@ -11301,7 +11377,7 @@ struct Fts5PhraseIter {
|
|||
** Save the pointer passed as the second argument as the extension functions
|
||||
** "auxiliary data". The pointer may then be retrieved by the current or any
|
||||
** future invocation of the same fts5 extension function made as part of
|
||||
** of the same MATCH query using the xGetAuxdata() API.
|
||||
** the same MATCH query using the xGetAuxdata() API.
|
||||
**
|
||||
** Each extension function is allocated a single auxiliary data slot for
|
||||
** each FTS query (MATCH expression). If the extension function is invoked
|
||||
|
|
@ -11316,7 +11392,7 @@ struct Fts5PhraseIter {
|
|||
** The xDelete callback, if one is specified, is also invoked on the
|
||||
** auxiliary data pointer after the FTS5 query has finished.
|
||||
**
|
||||
** If an error (e.g. an OOM condition) occurs within this function, an
|
||||
** If an error (e.g. an OOM condition) occurs within this function,
|
||||
** the auxiliary data is set to NULL and an error code returned. If the
|
||||
** xDelete parameter was not NULL, it is invoked on the auxiliary data
|
||||
** pointer before returning.
|
||||
|
|
|
|||
|
|
@ -1341,7 +1341,7 @@ this.PlacesUtils = {
|
|||
* The container node to search through.
|
||||
* @returns true if the node contains uri nodes, false otherwise.
|
||||
*/
|
||||
hasChildURIs: function PU_hasChildURIs(aNode) {
|
||||
hasChildURIs: function PU_hasChildURIs(aNode, aMultiple=false) {
|
||||
if (!this.nodeIsContainer(aNode))
|
||||
return false;
|
||||
|
||||
|
|
@ -1357,11 +1357,14 @@ this.PlacesUtils = {
|
|||
root.containerOpen = true;
|
||||
}
|
||||
|
||||
let foundFirst = !aMultiple;
|
||||
let found = false;
|
||||
for (let i = 0; i < root.childCount && !found; i++) {
|
||||
let child = root.getChild(i);
|
||||
if (this.nodeIsURI(child))
|
||||
found = true;
|
||||
if (this.nodeIsURI(child)) {
|
||||
found = foundFirst;
|
||||
foundFirst = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!wasOpen) {
|
||||
|
|
|
|||
|
|
@ -165,6 +165,7 @@ function check_uri_nodes(aQuery, aOptions, aExpectedURINodes) {
|
|||
root.containerOpen = true;
|
||||
var node = root.getChild(0);
|
||||
do_check_eq(PU.hasChildURIs(node), aExpectedURINodes > 0);
|
||||
do_check_eq(PU.hasChildURIs(node, true), aExpectedURINodes > 1);
|
||||
do_check_eq(PU.getURLsForContainerNode(node).length, aExpectedURINodes);
|
||||
root.containerOpen = false;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue