diff options
Diffstat (limited to 'browser/components/urlbar/UrlbarProviderBookmarkKeywords.sys.mjs')
-rw-r--r-- | browser/components/urlbar/UrlbarProviderBookmarkKeywords.sys.mjs | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/browser/components/urlbar/UrlbarProviderBookmarkKeywords.sys.mjs b/browser/components/urlbar/UrlbarProviderBookmarkKeywords.sys.mjs new file mode 100644 index 0000000000..416e6238ba --- /dev/null +++ b/browser/components/urlbar/UrlbarProviderBookmarkKeywords.sys.mjs @@ -0,0 +1,119 @@ +/* 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/. */ + +/** + * This module exports a provider that offers bookmarks with keywords. + */ + +import { + UrlbarProvider, + UrlbarUtils, +} from "resource:///modules/UrlbarUtils.sys.mjs"; + +const lazy = {}; + +ChromeUtils.defineESModuleGetters(lazy, { + KeywordUtils: "resource://gre/modules/KeywordUtils.sys.mjs", + UrlbarResult: "resource:///modules/UrlbarResult.sys.mjs", + UrlbarTokenizer: "resource:///modules/UrlbarTokenizer.sys.mjs", +}); + +/** + * Class used to create the provider. + */ +class ProviderBookmarkKeywords extends UrlbarProvider { + /** + * Returns the name of this provider. + * + * @returns {string} the name of this provider. + */ + get name() { + return "BookmarkKeywords"; + } + + /** + * Returns the type of this provider. + * + * @returns {integer} one of the types from UrlbarUtils.PROVIDER_TYPE.* + */ + get type() { + return UrlbarUtils.PROVIDER_TYPE.HEURISTIC; + } + + /** + * Whether this provider should be invoked for the given context. + * If this method returns false, the providers manager won't start a query + * with this provider, to save on resources. + * + * @param {UrlbarQueryContext} queryContext The query context object + * @returns {boolean} Whether this provider should be invoked for the search. + */ + isActive(queryContext) { + return ( + (!queryContext.restrictSource || + queryContext.restrictSource == + lazy.UrlbarTokenizer.RESTRICT.BOOKMARK) && + !queryContext.searchMode && + queryContext.tokens.length + ); + } + + /** + * Starts querying. + * + * @param {object} queryContext The query context object + * @param {Function} addCallback Callback invoked by the provider to add a new + * result. + */ + async startQuery(queryContext, addCallback) { + let keyword = queryContext.tokens[0]?.value; + + let searchString = UrlbarUtils.substringAfter( + queryContext.searchString, + keyword + ).trim(); + let { entry, url, postData } = await lazy.KeywordUtils.getBindableKeyword( + keyword, + searchString + ); + if (!entry || !url) { + return; + } + + let title; + if (entry.url.host && searchString) { + // If we have a search string, the result has the title + // "host: searchString". + title = UrlbarUtils.strings.formatStringFromName( + "bookmarkKeywordSearch", + [ + entry.url.host, + queryContext.tokens + .slice(1) + .map(t => t.value) + .join(" "), + ] + ); + } else { + title = UrlbarUtils.unEscapeURIForUI(url); + } + + let result = new lazy.UrlbarResult( + UrlbarUtils.RESULT_TYPE.KEYWORD, + UrlbarUtils.RESULT_SOURCE.BOOKMARKS, + ...lazy.UrlbarResult.payloadAndSimpleHighlights(queryContext.tokens, { + title: [title, UrlbarUtils.HIGHLIGHT.TYPED], + url: [url, UrlbarUtils.HIGHLIGHT.TYPED], + keyword: [keyword, UrlbarUtils.HIGHLIGHT.TYPED], + input: queryContext.searchString, + postData, + icon: UrlbarUtils.getIconForUrl(entry.url), + }) + ); + result.heuristic = true; + addCallback(this, result); + } +} + +export var UrlbarProviderBookmarkKeywords = new ProviderBookmarkKeywords(); |