Bug 1339550 - Implement browser.settings.allowPopupsForUserEvents, r?aswan draft
authorBob Silverberg <bsilverberg@mozilla.com>
Mon, 31 Jul 2017 16:46:36 -0400
changeset 618610 45f83db5ee53ed37014414831db70428e4d43c99
parent 618576 87824406b9feb420a3150720707b424d7cee5915
child 640141 0a04791b15557f886525ca32a624ea3546ca4e91
push id71409
push userbmo:bob.silverberg@gmail.com
push dateMon, 31 Jul 2017 20:49:19 +0000
reviewersaswan
bugs1339550
milestone56.0a1
Bug 1339550 - Implement browser.settings.allowPopupsForUserEvents, r?aswan This will modify the "dom.popup_allowed_events" preference to control whether events from user actions are allowed to open pop-up windows or not. If set to `false` then pop-ups from user actions will not be allowed and will result in a doorhanger being displayed informing the user that a pop-up was blocked. If set to `true` then all of the default events will be allowed to open pop-up windows. MozReview-Commit-ID: 8UFziq23zug
toolkit/components/extensions/ext-browserSettings.js
toolkit/components/extensions/schemas/browser_settings.json
toolkit/components/extensions/test/xpcshell/test_ext_browserSettings.js
--- a/toolkit/components/extensions/ext-browserSettings.js
+++ b/toolkit/components/extensions/ext-browserSettings.js
@@ -24,16 +24,29 @@ const getSettingsAPI = (extension, name,
     },
     clear(details) {
       return ExtensionPreferencesManager.removeSetting(extension, name);
     },
   };
 };
 
 // Add settings objects for supported APIs to the preferences manager.
+ExtensionPreferencesManager.addSetting("allowPopupsForUserEvents", {
+  prefNames: [
+    "dom.popup_allowed_events",
+  ],
+
+  setCallback(value) {
+    let returnObj = {};
+    // If the value is true, then reset the pref, otherwise set it to "".
+    returnObj[this.prefNames[0]] = value ? undefined : "";
+    return returnObj;
+  },
+});
+
 ExtensionPreferencesManager.addSetting("cacheEnabled", {
   prefNames: [
     "browser.cache.disk.enable",
     "browser.cache.memory.enable",
   ],
 
   setCallback(value) {
     let returnObj = {};
@@ -44,16 +57,21 @@ ExtensionPreferencesManager.addSetting("
   },
 });
 
 this.browserSettings = class extends ExtensionAPI {
   getAPI(context) {
     let {extension} = context;
     return {
       browserSettings: {
+        allowPopupsForUserEvents: getSettingsAPI(extension,
+          "allowPopupsForUserEvents",
+          () => {
+            return Preferences.get("dom.popup_allowed_events") != "";
+          }),
         cacheEnabled: getSettingsAPI(extension,
           "cacheEnabled",
           () => {
             return Preferences.get("browser.cache.disk.enable") &&
               Preferences.get("browser.cache.memory.enable");
           }),
       },
     };
--- a/toolkit/components/extensions/schemas/browser_settings.json
+++ b/toolkit/components/extensions/schemas/browser_settings.json
@@ -17,15 +17,19 @@
       }
     ]
   },
   {
     "namespace": "browserSettings",
     "description": "Use the <code>browser.browserSettings</code> API to control global settings of the browser.",
     "permissions": ["browserSettings"],
     "properties": {
+      "allowPopupsForUserEvents": {
+        "$ref": "types.Setting",
+        "description": "Allows or disallows pop-up windows from opening in response to user events."
+      },
       "cacheEnabled": {
         "$ref": "types.Setting",
         "description": "Enables or disables the browser cache."
       }
     }
   }
 ]
--- a/toolkit/components/extensions/test/xpcshell/test_ext_browserSettings.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_browserSettings.js
@@ -17,16 +17,17 @@ AddonTestUtils.init(this);
 
 createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42");
 
 add_task(async function test_browser_settings() {
   // Create an object to hold the values to which we will initialize the prefs.
   const PREFS = {
     "browser.cache.disk.enable": true,
     "browser.cache.memory.enable": true,
+    "dom.popup_allowed_events": Preferences.get("dom.popup_allowed_events"),
   };
 
   async function background() {
     browser.test.onMessage.addListener(async (msg, apiName, value) => {
       let apiObj = browser.browserSettings[apiName];
       await apiObj.set({value});
       browser.test.sendMessage("settingData", await apiObj.get({}));
     });
@@ -75,12 +76,19 @@ add_task(async function test_browser_set
     });
   await testSetting(
     "cacheEnabled", true,
     {
       "browser.cache.disk.enable": true,
       "browser.cache.memory.enable": true,
     });
 
+  await testSetting(
+    "allowPopupsForUserEvents", false,
+    {"dom.popup_allowed_events": ""});
+  await testSetting(
+    "allowPopupsForUserEvents", true,
+    {"dom.popup_allowed_events": PREFS["dom.popup_allowed_events"]});
+
   await extension.unload();
 
   await promiseShutdownManager();
 });