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
--- 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();
});