From 076e2c1160cf04734e44f26bfa36da60d985446f Mon Sep 17 00:00:00 2001 From: mcheang Date: Tue, 28 Nov 2023 21:27:35 +0000 Subject: [PATCH] Bug 1866390 - Part 2: Update search engine selector to display the app provided engine and build engine url params. r=Standard8 Differential Revision: https://phabricator.services.mozilla.com/D194665 --- .../settings/dumps/main/search-config-v2.json | 3 +- .../search/AppProvidedSearchEngine.sys.mjs | 153 ++++++++++++------ .../components/search/SearchService.sys.mjs | 38 +++-- 3 files changed, 129 insertions(+), 65 deletions(-) diff --git a/services/settings/dumps/main/search-config-v2.json b/services/settings/dumps/main/search-config-v2.json index 9fa22087a811..d9ad692840ad 100644 --- a/services/settings/dumps/main/search-config-v2.json +++ b/services/settings/dumps/main/search-config-v2.json @@ -3675,8 +3675,7 @@ "classification": "unknown", "urls": { "search": { - "base": "https://dict.leo.org/englisch-deutsch/{searchTerms}", - "searchTermParamName": "" + "base": "https://dict.leo.org/englisch-deutsch/{searchTerms}" }, "suggestions": { "base": "https://dict.leo.org/dictQuery/m-query/conf/ende/query.conf/strlist.json", diff --git a/toolkit/components/search/AppProvidedSearchEngine.sys.mjs b/toolkit/components/search/AppProvidedSearchEngine.sys.mjs index 1e441fcb76c6..f009fbae6700 100644 --- a/toolkit/components/search/AppProvidedSearchEngine.sys.mjs +++ b/toolkit/components/search/AppProvidedSearchEngine.sys.mjs @@ -4,7 +4,10 @@ /* eslint no-shadow: error, mozilla/no-aArgs: error */ -import { SearchEngine } from "resource://gre/modules/SearchEngine.sys.mjs"; +import { + SearchEngine, + EngineURL, +} from "resource://gre/modules/SearchEngine.sys.mjs"; const lazy = {}; @@ -17,15 +20,19 @@ ChromeUtils.defineESModuleGetters(lazy, { * search configuration. */ export class AppProvidedSearchEngine extends SearchEngine { + static URL_TYPE_MAP = new Map([ + ["search", lazy.SearchUtils.URL_TYPE.SEARCH], + ["suggestions", lazy.SearchUtils.URL_TYPE.SUGGEST_JSON], + ["trending", lazy.SearchUtils.URL_TYPE.TRENDING_JSON], + ]); + /** - * @param {object} options - * The options object - * @param {object} [options.details] - * An object that simulates the engine object from the config. + * @param {object} config + * The engine config from Remote Settings. */ - constructor({ details } = {}) { - let extensionId = details?.config.webExtension.id; - let id = extensionId + details?.locale; + constructor(config) { + let extensionId = config.identifier; + let id = config.identifier; super({ loadPath: "[app]" + extensionId, @@ -34,18 +41,9 @@ export class AppProvidedSearchEngine extends SearchEngine { }); this._extensionID = extensionId; - this._locale = details?.locale; + this._locale = "default"; - if (details) { - if (!details.config.webExtension.id) { - throw Components.Exception( - "Empty extensionID passed to _createAndAddEngine!", - Cr.NS_ERROR_INVALID_ARG - ); - } - - this.#init(details.locale, details.config); - } + this.#init(config); } /** @@ -156,32 +154,14 @@ export class AppProvidedSearchEngine extends SearchEngine { /** * Initializes the engine. * - * @param {string} locale - * The locale that is being used for this engine. - * @param {object} [config] + * @param {object} [engineConfig] * The search engine configuration for application provided engines. */ - #init(locale, config) { - let searchProvider; - if (locale != "default") { - searchProvider = config.webExtension.searchProvider[locale]; - } else if (locale == "default" && config.webExtension.default_locale) { - searchProvider = - config.webExtension.searchProvider[config.webExtension.default_locale]; - } else { - searchProvider = config.webExtension; - } + #init(engineConfig) { + this._telemetryId = engineConfig.identifier; - // We only set _telemetryId for app-provided engines. See also telemetryId - // getter. - if (config.telemetryId) { - this._telemetryId = config.telemetryId; - } else { - let telemetryId = this.id.split("@")[0]; - if (locale != lazy.SearchUtils.DEFAULT_TAG) { - telemetryId += "-" + locale; - } - this._telemetryId = telemetryId; + if (engineConfig.telemetrySuffix) { + this._telemetryId += `-${engineConfig.telemetrySuffix}`; } // Set the main icon URL for the engine. @@ -209,13 +189,88 @@ export class AppProvidedSearchEngine extends SearchEngine { // } // } - this._initWithDetails( - { - ...searchProvider, - //iconURL, - description: config.webExtension.description, - }, - config + // this._initWithDetails(config); + + // this._orderHint = config.orderHint; // TODO add order hint in searchEngineSelector for sorting engines. + // this._sendAttributionRequest = config.sendAttributionRequest ?? false; // TODO check if we need to this? + // if (details.iconURL) { + // this._setIcon(details.iconURL, true); + // } + + this._name = engineConfig.name.trim(); + this._definedAliases = + engineConfig.aliases?.map(alias => `@${alias}`) ?? []; + + for (const [type, urlData] of Object.entries(engineConfig.urls)) { + this.#setUrl(type, urlData, engineConfig.partnerCode); + } + } + + /** + * This sets the urls for the search engine based on the supplied parameters. + * + * @param {string} type + * The type of url. This could be a url for search, suggestions, or trending. + * @param {object} urlData + * The url data contains the template/base url and url params. + * @param {string} partnerCode + * The partner code associated with the search engine. + */ + #setUrl(type, urlData, partnerCode) { + let urlType = AppProvidedSearchEngine.URL_TYPE_MAP.get(type); + + if (!urlType) { + console.warn("unexpected engine url type.", type); + return; + } + + let engineURL = new EngineURL( + urlType, + urlData.method || "GET", + urlData.base ); + + if (urlData.params) { + for (const param of urlData.params) { + switch (true) { + case "value" in param: + engineURL.addParam( + param.name, + param.value == "{partnerCode}" ? partnerCode : param.value + ); + break; + case "experimentConfig" in param: + engineURL._addMozParam({ + name: param.name, + pref: param.experimentConfig, + condition: "pref", + }); + break; + case "searchAccessPoint" in param: + for (const [key, value] of Object.entries( + param.searchAccessPoint + )) { + engineURL.addParam(param.name, value, key); + } + break; + } + } + } + + if ( + !("searchTermParamName" in urlData) && + !urlData.base.includes("{searchTerms}") + ) { + throw new Error("Search terms missing from engine URL."); + } + + if ("searchTermParamName" in urlData) { + // The search term parameter is always added last, which will add it to the + // end of the URL. This is because in the past we have seen users trying to + // modify their searches by altering the end of the URL. + engineURL.addParam(urlData.searchTermParamName, "{searchTerms}"); + } + + this._urls.push(engineURL); } } diff --git a/toolkit/components/search/SearchService.sys.mjs b/toolkit/components/search/SearchService.sys.mjs index 5dd9676d34b4..78a67fa94422 100644 --- a/toolkit/components/search/SearchService.sys.mjs +++ b/toolkit/components/search/SearchService.sys.mjs @@ -2398,14 +2398,28 @@ export class SearchService { #setDefaultAndOrdersFromSelector(engines, privateDefault) { const defaultEngine = engines[0]; + if (!lazy.SearchUtils.newSearchConfigEnabled) { + this._searchDefault = { + id: defaultEngine.webExtension.id, + locale: defaultEngine.webExtension.locale, + }; + if (privateDefault) { + this.#searchPrivateDefault = { + id: privateDefault.webExtension.id, + locale: privateDefault.webExtension.locale, + }; + } + return; + } + this._searchDefault = { - id: defaultEngine.webExtension.id, - locale: defaultEngine.webExtension.locale, + id: defaultEngine.identifier, + locale: "default", }; if (privateDefault) { this.#searchPrivateDefault = { - id: privateDefault.webExtension.id, - locale: privateDefault.webExtension.locale, + id: privateDefault.identifier, + locale: "default", }; } } @@ -3586,12 +3600,13 @@ export class SearchService { */ async _makeEngineFromConfig(config) { lazy.logConsole.debug("_makeEngineFromConfig:", config); - let locale = - "locale" in config.webExtension - ? config.webExtension.locale - : lazy.SearchUtils.DEFAULT_TAG; if (!lazy.SearchUtils.newSearchConfigEnabled) { + let locale = + "locale" in config.webExtension + ? config.webExtension.locale + : lazy.SearchUtils.DEFAULT_TAG; + let engine = new lazy.AddonSearchEngine({ isAppProvided: true, details: { @@ -3606,12 +3621,7 @@ export class SearchService { return engine; } - return new lazy.AppProvidedSearchEngine({ - details: { - locale, - config, - }, - }); + return new lazy.AppProvidedSearchEngine(config); } /**