Bug 1336560 - Allow distributions to hide search engines. r?florian draft
authorMichael Kaply <mozilla@kaply.com>
Thu, 09 Mar 2017 11:22:54 -0600
changeset 500170 e61419408368551901f1edd491b6019598fe0d40
parent 500153 efb1be243e1c38cd6a6b167b81fa4a251c9bd331
child 549564 1c61eb071b0860b8fb59fda0b85ece6a9c6a71ea
push id49643
push usermozilla@kaply.com
push dateThu, 16 Mar 2017 19:49:53 +0000
reviewersflorian
bugs1336560
milestone55.0a1
Bug 1336560 - Allow distributions to hide search engines. r?florian MozReview-Commit-ID: 12lSpSPZTqm
toolkit/components/search/nsSearchService.js
toolkit/components/search/tests/xpcshell/test_async_disthidden.js
toolkit/components/search/tests/xpcshell/test_sync_disthidden.js
toolkit/components/search/tests/xpcshell/xpcshell.ini
toolkit/components/telemetry/TelemetryEnvironment.jsm
--- a/toolkit/components/search/nsSearchService.js
+++ b/toolkit/components/search/nsSearchService.js
@@ -3686,16 +3686,30 @@ SearchService.prototype = {
         region = Services.prefs.getCharPref("browser.search.region");
       }
       if (!region || !(region in searchSettings)) {
         region = "default";
       }
       engineNames = searchSettings[region]["visibleDefaultEngines"];
     }
 
+    // Remove any engine names that are supposed to be ignored.
+    // This pref is only allows in a partner distribution.
+    let branch = Services.prefs.getDefaultBranch(BROWSER_SEARCH_PREF);
+    if (isPartnerBuild() &&
+        branch.getPrefType("ignoredJAREngines") == branch.PREF_STRING) {
+      let ignoredJAREngines = branch.getCharPref("ignoredJAREngines")
+                                    .split(",");
+      let filteredEngineNames = engineNames.filter(e => !ignoredJAREngines.includes(e));
+      // Don't allow all engines to be hidden
+      if (filteredEngineNames.length > 0) {
+        engineNames = filteredEngineNames;
+      }
+    }
+
     for (let name of engineNames) {
       uris.push(APP_SEARCH_PREFIX + name + ".xml");
     }
 
     // Store this so that it can be used while writing the cache file.
     this._visibleDefaultEngines = engineNames;
   },
 
new file mode 100644
--- /dev/null
+++ b/toolkit/components/search/tests/xpcshell/test_async_disthidden.js
@@ -0,0 +1,38 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/* Test that the ignoredJAREngines pref hides search engines  */
+
+"use strict";
+
+function run_test() {
+  let defaultBranch = Services.prefs.getDefaultBranch(BROWSER_SEARCH_PREF);
+  defaultBranch.setCharPref("ignoredJAREngines", "engine")
+  Services.prefs.setCharPref("distribution.id", "partner-1");
+
+  // The test engines used in this test need to be recognized as 'default'
+  // engines or the resource URL won't be used
+  let url = "resource://test/data/";
+  let resProt = Services.io.getProtocolHandler("resource")
+                        .QueryInterface(Ci.nsIResProtocolHandler);
+  resProt.setSubstitution("search-plugins", Services.io.newURI(url));
+
+  do_check_false(Services.search.isInitialized);
+
+  run_next_test();
+}
+
+add_task(function* test_disthidden() {
+  yield asyncInit();
+
+  do_check_true(Services.search.isInitialized);
+
+  let engines = Services.search.getEngines();
+  // From data/list.json - only 5 out of 6
+  // since one is hidden
+  do_check_eq(engines.length, 5);
+
+  // Verify that the Test search engine is not available
+  let engine = Services.search.getEngineByName("Test search engine");
+  do_check_eq(engine, null);
+});
new file mode 100644
--- /dev/null
+++ b/toolkit/components/search/tests/xpcshell/test_sync_disthidden.js
@@ -0,0 +1,32 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/* Test that the ignoredJAREngines pref hides search engines  */
+
+"use strict";
+
+function run_test() {
+  let defaultBranch = Services.prefs.getDefaultBranch(BROWSER_SEARCH_PREF);
+  defaultBranch.setCharPref("ignoredJAREngines", "engine");
+  Services.prefs.setCharPref("distribution.id", "partner-1");
+
+  // The test engines used in this test need to be recognized as 'default'
+  // engines or the resource URL won't be used
+  let url = "resource://test/data/";
+  let resProt = Services.io.getProtocolHandler("resource")
+                        .QueryInterface(Ci.nsIResProtocolHandler);
+  resProt.setSubstitution("search-plugins", Services.io.newURI(url));
+
+  do_check_false(Services.search.isInitialized);
+
+  let engines = Services.search.getEngines();
+  // From data/list.json - only 5 out of 6
+  // since one is hidden
+  do_check_eq(engines.length, 5);
+
+  do_check_true(Services.search.isInitialized);
+
+  // Verify that the Test search engine is not available
+  let engine = Services.search.getEngineByName("Test search engine");
+  do_check_eq(engine, null);
+}
--- a/toolkit/components/search/tests/xpcshell/xpcshell.ini
+++ b/toolkit/components/search/tests/xpcshell/xpcshell.ini
@@ -67,24 +67,26 @@ support-files =
 [test_resultDomain.js]
 [test_searchSuggest.js]
 [test_async.js]
 [test_async_addon.js]
 tags = addons
 [test_async_addon_no_override.js]
 tags = addons
 [test_async_distribution.js]
+[test_async_disthidden.js]
 [test_async_migration.js]
 [test_async_profile_engine.js]
 [test_sync.js]
 [test_sync_addon.js]
 tags = addons
 [test_sync_addon_no_override.js]
 tags = addons
 [test_sync_distribution.js]
+[test_sync_disthidden.js]
 [test_sync_fallback.js]
 [test_sync_delay_fallback.js]
 [test_sync_migration.js]
 [test_sync_profile_engine.js]
 [test_rel_searchform.js]
 [test_remove_profile_engine.js]
 [test_selectedEngine.js]
 [test_geodefaults.js]
--- a/toolkit/components/telemetry/TelemetryEnvironment.jsm
+++ b/toolkit/components/telemetry/TelemetryEnvironment.jsm
@@ -133,16 +133,17 @@ const DEFAULT_ENVIRONMENT_PREFS = new Ma
   ["browser.cache.disk.enable", {what: RECORD_PREF_VALUE}],
   ["browser.cache.disk.capacity", {what: RECORD_PREF_VALUE}],
   ["browser.cache.memory.enable", {what: RECORD_PREF_VALUE}],
   ["browser.cache.offline.enable", {what: RECORD_PREF_VALUE}],
   ["browser.formfill.enable", {what: RECORD_PREF_VALUE}],
   ["browser.newtabpage.enabled", {what: RECORD_PREF_VALUE}],
   ["browser.newtabpage.enhanced", {what: RECORD_PREF_VALUE}],
   ["browser.shell.checkDefaultBrowser", {what: RECORD_PREF_VALUE}],
+  ["browser.search.ignoredJAREngines", {what: RECORD_DEFAULTPREF_VALUE}],
   ["browser.search.suggest.enabled", {what: RECORD_PREF_VALUE}],
   ["browser.startup.homepage", {what: RECORD_PREF_STATE}],
   ["browser.startup.page", {what: RECORD_PREF_VALUE}],
   ["browser.tabs.animate", {what: RECORD_PREF_VALUE}],
   ["browser.urlbar.suggest.searches", {what: RECORD_PREF_VALUE}],
   ["browser.urlbar.userMadeSearchSuggestionsChoice", {what: RECORD_PREF_VALUE}],
   ["devtools.chrome.enabled", {what: RECORD_PREF_VALUE}],
   ["devtools.debugger.enabled", {what: RECORD_PREF_VALUE}],