summaryrefslogtreecommitdiffstats
path: root/toolkit/components/search/tests/xpcshell/test_initialization_with_region.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/search/tests/xpcshell/test_initialization_with_region.js')
-rw-r--r--toolkit/components/search/tests/xpcshell/test_initialization_with_region.js130
1 files changed, 130 insertions, 0 deletions
diff --git a/toolkit/components/search/tests/xpcshell/test_initialization_with_region.js b/toolkit/components/search/tests/xpcshell/test_initialization_with_region.js
new file mode 100644
index 0000000000..54a5adfc48
--- /dev/null
+++ b/toolkit/components/search/tests/xpcshell/test_initialization_with_region.js
@@ -0,0 +1,130 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const SEARCH_SERVICE_TOPIC = "browser-search-service";
+const SEARCH_ENGINE_TOPIC = "browser-search-engine-modified";
+
+const CONFIG = [
+ {
+ webExtension: {
+ id: "engine@search.mozilla.org",
+ },
+ orderHint: 30,
+ appliesTo: [
+ {
+ included: { everywhere: true },
+ excluded: { regions: ["FR"] },
+ default: "yes",
+ defaultPrivate: "yes",
+ },
+ ],
+ },
+ {
+ webExtension: {
+ id: "engine-pref@search.mozilla.org",
+ },
+ orderHint: 20,
+ appliesTo: [
+ {
+ included: { regions: ["FR"] },
+ default: "yes",
+ defaultPrivate: "yes",
+ },
+ ],
+ },
+];
+
+// Default engine with no region defined.
+const DEFAULT = "Test search engine";
+// Default engine with region set to FR.
+const FR_DEFAULT = "engine-pref";
+
+function listenFor(name, key) {
+ let notifyObserved = false;
+ let obs = (subject, topic, data) => {
+ if (data == key) {
+ notifyObserved = true;
+ }
+ };
+ Services.obs.addObserver(obs, name);
+
+ return () => {
+ Services.obs.removeObserver(obs, name);
+ return notifyObserved;
+ };
+}
+
+add_task(async function setup() {
+ Services.prefs.setBoolPref("browser.search.separatePrivateDefault", true);
+ Services.prefs.setBoolPref(
+ SearchUtils.BROWSER_SEARCH_PREF + "separatePrivateDefault.ui.enabled",
+ true
+ );
+
+ SearchTestUtils.useMockIdleService();
+ await SearchTestUtils.useTestEngines("data", null, CONFIG);
+ await AddonTestUtils.promiseStartupManager();
+});
+
+// This tests what we expect is the normal startup route for a fresh profile -
+// the search service initializes with no region details, then gets a region
+// notified part way through / afterwards.
+add_task(async function test_initialization_with_region() {
+ let reloadObserved = listenFor(SEARCH_SERVICE_TOPIC, "engines-reloaded");
+ let initPromise;
+
+ // Ensure the region lookup completes after init so the
+ // engines are reloaded
+ let srv = useHttpServer();
+ srv.registerPathHandler("/fetch_region", async (req, res) => {
+ res.processAsync();
+ await initPromise;
+ res.setStatusLine("1.1", 200, "OK");
+ res.write(JSON.stringify({ country_code: "FR" }));
+ res.finish();
+ });
+
+ Services.prefs.setCharPref(
+ "browser.region.network.url",
+ `http://localhost:${srv.identity.primaryPort}/fetch_region`
+ );
+
+ Region._setHomeRegion("", false);
+ Region.init();
+
+ initPromise = Services.search.init();
+ await initPromise;
+
+ let otherPromises = [
+ // This test expects settings to be saved twice.
+ promiseAfterSettings().then(promiseAfterSettings),
+ SearchTestUtils.promiseSearchNotification(
+ "engine-default",
+ SEARCH_ENGINE_TOPIC
+ ),
+ ];
+
+ Assert.equal(
+ Services.search.defaultEngine.name,
+ DEFAULT,
+ "Test engine shouldn't be the default anymore"
+ );
+
+ await Promise.all(otherPromises);
+
+ // Ensure that correct engine is being reported as the default.
+ Assert.equal(
+ Services.search.defaultEngine.name,
+ FR_DEFAULT,
+ "engine-pref should be the default in FR"
+ );
+ Assert.equal(
+ (await Services.search.getDefaultPrivate()).name,
+ FR_DEFAULT,
+ "engine-pref should be the private default in FR"
+ );
+
+ Assert.ok(reloadObserved(), "Engines do reload with delayed region fetch");
+});