Bug 1408099 - Fix ExtensionPreferencesManager.getLevelOfControl to deal with undefined settings, r?aswan draft
authorBob Silverberg <bsilverberg@mozilla.com>
Thu, 12 Oct 2017 17:31:27 -0400
changeset 679779 255f8ef02dcd9453efe0025ee2aef8b27770fe9c
parent 679173 bc7a5be76b723cf6aac1a919156e74997c5f4902
child 735664 f982a5c45ea1610b5f903f994e20414a0312a315
push id84293
push userbmo:bob.silverberg@gmail.com
push dateThu, 12 Oct 2017 23:58:45 +0000
reviewersaswan
bugs1408099
milestone58.0a1
Bug 1408099 - Fix ExtensionPreferencesManager.getLevelOfControl to deal with undefined settings, r?aswan Prior to this, if getLevelOfControl was called before the setting was defined to the EPM, an exception was thrown. This fixes it by returning a level of control of "not_controllable" if the setting has not yet been defined. MozReview-Commit-ID: 96jXLoJlUI
toolkit/components/extensions/ExtensionPreferencesManager.jsm
toolkit/components/extensions/test/xpcshell/test_ext_browserSettings_homepage.js
toolkit/components/extensions/test/xpcshell/xpcshell-common.ini
--- a/toolkit/components/extensions/ExtensionPreferencesManager.jsm
+++ b/toolkit/components/extensions/ExtensionPreferencesManager.jsm
@@ -337,17 +337,21 @@ this.ExtensionPreferencesManager = {
    *
    * @returns {Promise}
    *          Resolves to the level of control of the extension over the setting.
    */
   async getLevelOfControl(extension, name, storeType = STORE_TYPE) {
     // This could be called for a setting that isn't defined to the PreferencesManager,
     // in which case we simply defer to the SettingsStore.
     if (storeType === STORE_TYPE) {
-      for (let prefName of settingsMap.get(name).prefNames) {
+      let setting = settingsMap.get(name);
+      if (!setting) {
+        return "not_controllable";
+      }
+      for (let prefName of setting.prefNames) {
         if (Preferences.locked(prefName)) {
           return "not_controllable";
         }
       }
     }
     await ExtensionSettingsStore.initialize();
     return ExtensionSettingsStore.getLevelOfControl(extension, storeType, name);
   },
new file mode 100644
--- /dev/null
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_browserSettings_homepage.js
@@ -0,0 +1,29 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+add_task(async function test_homepage_get_without_set() {
+  async function background() {
+    let homepage = await browser.browserSettings.homepageOverride.get({});
+    browser.test.sendMessage("homepage", homepage);
+  }
+
+  let extension = ExtensionTestUtils.loadExtension({
+    background,
+    manifest: {
+      permissions: ["browserSettings"],
+    },
+  });
+
+  let defaultHomepage = Services.prefs.getComplexValue(
+    "browser.startup.homepage", Ci.nsIPrefLocalizedString).data;
+
+  await extension.startup();
+  let homepage = await extension.awaitMessage("homepage");
+  equal(homepage.value, defaultHomepage,
+        "The homepageOverride setting has the expected value.");
+  equal(homepage.levelOfControl, "not_controllable",
+        "The homepageOverride setting has the expected levelOfControl.");
+
+  await extension.unload();
+});
--- a/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini
+++ b/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini
@@ -9,16 +9,18 @@
 skip-if = os == "android" # Android does not use Places for history.
 [test_ext_background_private_browsing.js]
 [test_ext_background_runtime_connect_params.js]
 [test_ext_background_sub_windows.js]
 [test_ext_background_telemetry.js]
 [test_ext_background_window_properties.js]
 skip-if = os == "android"
 [test_ext_browserSettings.js]
+[test_ext_browserSettings_homepage.js]
+skip-if = os == "android"
 [test_ext_contextual_identities.js]
 skip-if = os == "android" # Containers are not exposed to android.
 [test_ext_debugging_utils.js]
 [test_ext_downloads.js]
 [test_ext_downloads_download.js]
 skip-if = os == "android"
 [test_ext_downloads_misc.js]
 skip-if = os == "android" || (os=='linux' && bits==32) # linux32: bug 1324870