summaryrefslogtreecommitdiffstats
path: root/toolkit/components/satchel/nsFormAutoCompleteResult.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/satchel/nsFormAutoCompleteResult.sys.mjs')
-rw-r--r--toolkit/components/satchel/nsFormAutoCompleteResult.sys.mjs189
1 files changed, 189 insertions, 0 deletions
diff --git a/toolkit/components/satchel/nsFormAutoCompleteResult.sys.mjs b/toolkit/components/satchel/nsFormAutoCompleteResult.sys.mjs
new file mode 100644
index 0000000000..6c86119a86
--- /dev/null
+++ b/toolkit/components/satchel/nsFormAutoCompleteResult.sys.mjs
@@ -0,0 +1,189 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+export class FormAutoCompleteResult {
+ constructor(
+ searchString,
+ searchResult,
+ defaultIndex,
+ errorDescription,
+ items,
+ prevResult
+ ) {
+ this.searchString = searchString;
+ this._searchResult = searchResult;
+ this._defaultIndex = defaultIndex;
+ this._errorDescription = errorDescription;
+ this._items = items;
+ this._formHistResult = prevResult;
+ this.entries = prevResult ? prevResult.wrappedJSObject.entries : [];
+ }
+
+ // nsISupports
+ QueryInterface = ChromeUtils.generateQI(["nsIAutoCompleteResult"]);
+
+ // The user's query string
+ searchString = "";
+
+ // The result code of this result object, see |get searchResult| for possible values.
+ _searchResult = 0;
+
+ // The default item that should be entered if none is selected
+ _defaultIndex = 0;
+
+ // The reason the search failed
+ _errorDescription = "";
+
+ /**
+ * A reference to the form history nsIAutocompleteResult that we're wrapping.
+ * We use this to forward removeEntryAt calls as needed.
+ */
+ _formHistResult = null;
+
+ entries = null;
+
+ get wrappedJSObject() {
+ return this;
+ }
+
+ /**
+ * @returns {number} the result code of this result object, either:
+ * RESULT_IGNORED (invalid searchString)
+ * RESULT_FAILURE (failure)
+ * RESULT_NOMATCH (no matches found)
+ * RESULT_SUCCESS (matches found)
+ */
+ get searchResult() {
+ return this._searchResult;
+ }
+
+ /**
+ * @returns {number} the default item that should be entered if none is selected
+ */
+ get defaultIndex() {
+ return this._defaultIndex;
+ }
+
+ /**
+ * @returns {string} the reason the search failed
+ */
+ get errorDescription() {
+ return this._errorDescription;
+ }
+
+ /**
+ * @returns {number} the number of results
+ */
+ get matchCount() {
+ return this._items.length;
+ }
+
+ _checkIndexBounds(index) {
+ if (index < 0 || index >= this._items.length) {
+ throw Components.Exception(
+ "Index out of range.",
+ Cr.NS_ERROR_ILLEGAL_VALUE
+ );
+ }
+ }
+
+ /**
+ * Retrieves a result
+ *
+ * @param {number} index the index of the result requested
+ * @returns {string} the result at the specified index
+ */
+ getValueAt(index) {
+ this._checkIndexBounds(index);
+ return this._items[index].value;
+ }
+
+ getLabelAt(index) {
+ this._checkIndexBounds(index);
+ return this._items[index].label || this._items[index].value;
+ }
+
+ /**
+ * Retrieves a comment (metadata instance)
+ *
+ * @param {number} index the index of the comment requested
+ * @returns {object} the comment at the specified index
+ */
+ getCommentAt(index) {
+ this._checkIndexBounds(index);
+ return this._items[index].comment;
+ }
+
+ /**
+ * Retrieves a style hint specific to a particular index.
+ *
+ * @param {number} index the index of the style hint requested
+ * @returns {string|null} the style hint at the specified index
+ */
+ getStyleAt(index) {
+ this._checkIndexBounds(index);
+
+ if (index < this._formHistResult?.matchCount) {
+ return "fromhistory";
+ }
+
+ if (
+ this._formHistResult?.matchCount > 0 &&
+ index == this._formHistResult.matchCount
+ ) {
+ return "datalist-first";
+ }
+
+ return null;
+ }
+
+ /**
+ * Retrieves an image url.
+ *
+ * @param {number} index the index of the image url requested
+ * @returns {string} the image url at the specified index
+ */
+ getImageAt(index) {
+ this._checkIndexBounds(index);
+ return "";
+ }
+
+ /**
+ * Retrieves a result
+ *
+ * @param {number} index the index of the result requested
+ * @returns {string} the result at the specified index
+ */
+ getFinalCompleteValueAt(index) {
+ return this.getValueAt(index);
+ }
+
+ /**
+ * Returns true if the value at the given index is removable
+ *
+ * @param {number} index the index of the result to remove
+ * @returns {boolean} True if the value is removable
+ */
+ isRemovableAt(index) {
+ this._checkIndexBounds(index);
+ return this._items[index].removable;
+ }
+
+ /**
+ * Removes a result from the resultset
+ *
+ * @param {number} index the index of the result to remove
+ */
+ removeValueAt(index) {
+ this._checkIndexBounds(index);
+ // Forward the removeValueAt call to the underlying result if we have one
+ // Note: this assumes that the form history results were added to the top
+ // of our arrays.
+ if (this._formHistResult && index < this._formHistResult.matchCount) {
+ // Delete the history result from the DB
+ this._formHistResult.removeValueAt(index);
+ }
+ this._items.splice(index, 1);
+ }
+}