summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/xpcshell/test_ext_settings_overrides_search_mozParam.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/extensions/test/xpcshell/test_ext_settings_overrides_search_mozParam.js')
-rw-r--r--browser/components/extensions/test/xpcshell/test_ext_settings_overrides_search_mozParam.js239
1 files changed, 239 insertions, 0 deletions
diff --git a/browser/components/extensions/test/xpcshell/test_ext_settings_overrides_search_mozParam.js b/browser/components/extensions/test/xpcshell/test_ext_settings_overrides_search_mozParam.js
new file mode 100644
index 0000000000..3248c5cefa
--- /dev/null
+++ b/browser/components/extensions/test/xpcshell/test_ext_settings_overrides_search_mozParam.js
@@ -0,0 +1,239 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+
+"use strict";
+
+const { AddonTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/AddonTestUtils.sys.mjs"
+);
+const { SearchTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/SearchTestUtils.sys.mjs"
+);
+const { NimbusFeatures } = ChromeUtils.importESModule(
+ "resource://nimbus/ExperimentAPI.sys.mjs"
+);
+const { sinon } = ChromeUtils.importESModule(
+ "resource://testing-common/Sinon.sys.mjs"
+);
+
+AddonTestUtils.init(this);
+AddonTestUtils.overrideCertDB();
+AddonTestUtils.createAppInfo(
+ "xpcshell@tests.mozilla.org",
+ "XPCShell",
+ "42",
+ "42"
+);
+
+let { promiseShutdownManager, promiseStartupManager } = AddonTestUtils;
+
+// Note: these lists should be kept in sync with the lists in
+// browser/components/extensions/test/xpcshell/data/test/manifest.json
+// These params are conditional based on how search is initiated.
+const mozParams = [
+ {
+ name: "test-0",
+ condition: "purpose",
+ purpose: "contextmenu",
+ value: "0",
+ },
+ { name: "test-1", condition: "purpose", purpose: "searchbar", value: "1" },
+ { name: "test-2", condition: "purpose", purpose: "homepage", value: "2" },
+ { name: "test-3", condition: "purpose", purpose: "keyword", value: "3" },
+ { name: "test-4", condition: "purpose", purpose: "newtab", value: "4" },
+];
+// These params are always included.
+const params = [
+ { name: "simple", value: "5" },
+ { name: "term", value: "{searchTerms}" },
+ { name: "lang", value: "{language}" },
+ { name: "locale", value: "{moz:locale}" },
+ { name: "prefval", condition: "pref", pref: "code" },
+];
+
+add_task(async function setup() {
+ let readyStub = sinon.stub(NimbusFeatures.search, "ready").resolves();
+ let updateStub = sinon.stub(NimbusFeatures.search, "onUpdate");
+ await promiseStartupManager();
+ await SearchTestUtils.useTestEngines("data", null, [
+ {
+ webExtension: {
+ id: "test@search.mozilla.org",
+ },
+ appliesTo: [
+ {
+ included: { everywhere: true },
+ default: "yes",
+ },
+ ],
+ },
+ ]);
+ await Services.search.init();
+ registerCleanupFunction(async () => {
+ await promiseShutdownManager();
+ readyStub.restore();
+ updateStub.restore();
+ });
+});
+
+/* This tests setting moz params. */
+add_task(async function test_extension_setting_moz_params() {
+ let defaultBranch = Services.prefs.getDefaultBranch("browser.search.");
+ defaultBranch.setCharPref("param.code", "good");
+
+ let engine = Services.search.getEngineByName("MozParamsTest");
+
+ let extraParams = [];
+ for (let p of params) {
+ if (p.condition == "pref") {
+ extraParams.push(`${p.name}=good`);
+ } else if (p.value == "{searchTerms}") {
+ extraParams.push(`${p.name}=test`);
+ } else if (p.value == "{language}") {
+ extraParams.push(`${p.name}=${Services.locale.requestedLocale || "*"}`);
+ } else if (p.value == "{moz:locale}") {
+ extraParams.push(`${p.name}=${Services.locale.requestedLocale}`);
+ } else {
+ extraParams.push(`${p.name}=${p.value}`);
+ }
+ }
+ let paramStr = extraParams.join("&");
+
+ for (let p of mozParams) {
+ let expectedURL = engine.getSubmission(
+ "test",
+ null,
+ p.condition == "purpose" ? p.purpose : null
+ ).uri.spec;
+ equal(
+ expectedURL,
+ `https://example.com/?q=test&${p.name}=${p.value}&${paramStr}`,
+ "search url is expected"
+ );
+ }
+
+ defaultBranch.setCharPref("param.code", "");
+});
+
+add_task(async function test_nimbus_params() {
+ let sandbox = sinon.createSandbox();
+ let stub = sandbox.stub(NimbusFeatures.search, "getVariable");
+ // These values should match the nimbusParams below and the data/test/manifest.json
+ // search engine configuration
+ stub.withArgs("extraParams").returns([
+ {
+ key: "nimbus-key-1",
+ value: "nimbus-value-1",
+ },
+ {
+ key: "nimbus-key-2",
+ value: "nimbus-value-2",
+ },
+ ]);
+
+ Assert.ok(
+ NimbusFeatures.search.onUpdate.called,
+ "Called to initialize the cache"
+ );
+
+ // Populate the cache with the `getVariable` mock values
+ NimbusFeatures.search.onUpdate.firstCall.args[0]();
+
+ let engine = Services.search.getEngineByName("MozParamsTest");
+
+ // Note: these lists should be kept in sync with the lists in
+ // browser/components/extensions/test/xpcshell/data/test/manifest.json
+ // These params are conditional based on how search is initiated.
+ const nimbusParams = [
+ { name: "experimenter-1", condition: "pref", pref: "nimbus-key-1" },
+ { name: "experimenter-2", condition: "pref", pref: "nimbus-key-2" },
+ ];
+ const experimentCache = {
+ "nimbus-key-1": "nimbus-value-1",
+ "nimbus-key-2": "nimbus-value-2",
+ };
+
+ let extraParams = [];
+ for (let p of params) {
+ if (p.value == "{searchTerms}") {
+ extraParams.push(`${p.name}=test`);
+ } else if (p.value == "{language}") {
+ extraParams.push(`${p.name}=${Services.locale.requestedLocale || "*"}`);
+ } else if (p.value == "{moz:locale}") {
+ extraParams.push(`${p.name}=${Services.locale.requestedLocale}`);
+ } else if (p.condition !== "pref") {
+ // Ignoring pref parameters
+ extraParams.push(`${p.name}=${p.value}`);
+ }
+ }
+ for (let p of nimbusParams) {
+ if (p.condition == "pref") {
+ extraParams.push(`${p.name}=${experimentCache[p.pref]}`);
+ }
+ }
+ let paramStr = extraParams.join("&");
+ for (let p of mozParams) {
+ let expectedURL = engine.getSubmission(
+ "test",
+ null,
+ p.condition == "purpose" ? p.purpose : null
+ ).uri.spec;
+ equal(
+ expectedURL,
+ `https://example.com/?q=test&${p.name}=${p.value}&${paramStr}`,
+ "search url is expected"
+ );
+ }
+
+ sandbox.restore();
+});
+
+add_task(async function test_extension_setting_moz_params_fail() {
+ // Ensure that the test infra does not automatically make
+ // this privileged.
+ AddonTestUtils.usePrivilegedSignatures = false;
+ Services.prefs.setCharPref(
+ "extensions.installedDistroAddon.test@mochitest",
+ ""
+ );
+
+ let extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ browser_specific_settings: {
+ gecko: { id: "test1@mochitest" },
+ },
+ chrome_settings_overrides: {
+ search_provider: {
+ name: "MozParamsTest1",
+ search_url: "https://example.com/",
+ params: [
+ {
+ name: "testParam",
+ condition: "purpose",
+ purpose: "contextmenu",
+ value: "0",
+ },
+ { name: "prefval", condition: "pref", pref: "code" },
+ { name: "q", value: "{searchTerms}" },
+ ],
+ },
+ },
+ },
+ useAddonManager: "permanent",
+ });
+ await extension.startup();
+ await AddonTestUtils.waitForSearchProviderStartup(extension);
+ equal(
+ extension.extension.isPrivileged,
+ false,
+ "extension is not priviledged"
+ );
+ let engine = Services.search.getEngineByName("MozParamsTest1");
+ let expectedURL = engine.getSubmission("test", null, "contextmenu").uri.spec;
+ equal(
+ expectedURL,
+ "https://example.com/?q=test",
+ "engine cannot have conditional or pref params"
+ );
+ await extension.unload();
+});