Bug 1363860 - Part 2: Allow WebExtensions to disable cookies
This works by allowing an extension to set a value of Services.perms.DENY_ACTION
for permissions.default.cookies, which stores the default permission
for cookies. This means that if no permissions have been explicitly
set for a given page, the default will be used, but if a user overrides the permissions
for a specific page then their chosen permission will override this default.
An extension can only use this to make the default behaviour to disable cookies.
MozReview-Commit-ID: 11mKGoRW9if
--- a/toolkit/components/extensions/ext-browserSettings.js
+++ b/toolkit/components/extensions/ext-browserSettings.js
@@ -58,16 +58,26 @@ ExtensionPreferencesManager.addSetting("
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("cookiesDisabled", {
+ prefNames: [
+ "permissions.default.cookies",
+ ],
+
+ setCallback(value) {
+ return {[this.prefNames[0]]: value ? PERM_DENY_ACTION : undefined};
+ },
+});
+
ExtensionPreferencesManager.addSetting("cacheEnabled", {
prefNames: [
"browser.cache.disk.enable",
"browser.cache.memory.enable",
],
setCallback(value) {
let returnObj = {};
@@ -119,16 +129,24 @@ this.browserSettings = class extends Ext
return Services.prefs.getCharPref("dom.popup_allowed_events") != "";
}),
cacheEnabled: getSettingsAPI(extension,
"cacheEnabled",
() => {
return Services.prefs.getBoolPref("browser.cache.disk.enable") &&
Services.prefs.getBoolPref("browser.cache.memory.enable");
}),
+ cookiesDisabled: getSettingsAPI(extension,
+ "cookiesDisabled",
+ () => {
+ let prefValue =
+ Services.prefs.getIntPref(
+ "permissions.default.cookies", null);
+ return prefValue === PERM_DENY_ACTION;
+ }),
homepageOverride: getSettingsAPI(extension,
HOMEPAGE_OVERRIDE_SETTING,
() => {
return Services.prefs.getComplexValue(
HOMEPAGE_URL_PREF, Ci.nsIPrefLocalizedString).data;
}, undefined, true),
imageAnimationBehavior: getSettingsAPI(extension,
"imageAnimationBehavior",
--- a/toolkit/components/extensions/schemas/browser_settings.json
+++ b/toolkit/components/extensions/schemas/browser_settings.json
@@ -39,16 +39,20 @@
"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."
},
+ "cookiesDisabled": {
+ "$ref": "types.Setting",
+ "description": "This boolean setting disables cookies by default if set to true."
+ },
"homepageOverride": {
"$ref": "types.Setting",
"description": "Returns the value of the overridden home page. Read-only."
},
"imageAnimationBehavior": {
"$ref": "types.Setting",
"description": "Controls the behaviour of image animation in the browser. This setting's value is of type ImageAnimationBehavior, defaulting to <code>normal</code>."
},
--- a/toolkit/components/extensions/test/xpcshell/test_ext_browserSettings.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_browserSettings.js
@@ -24,16 +24,17 @@ add_task(async function test_browser_set
// 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"),
"image.animation_mode": "none",
"permissions.default.desktop-notification": PERM_UNKNOWN_ACTION,
"ui.context_menus.after_mouseup": false,
+ "permissions.default.cookies": PERM_UNKNOWN_ACTION,
};
async function background() {
browser.test.onMessage.addListener(async (msg, apiName, value) => {
let apiObj = browser.browserSettings[apiName];
let result = await apiObj.set({value});
if (msg === "set") {
browser.test.assertTrue(result, "set returns true.");
@@ -140,16 +141,27 @@ add_task(async function test_browser_set
await testNoOpSetting("contextMenuShowEvent", "mousedown",
{"ui.context_menus.after_mouseup": AppConstants.platform === "win"});
} else {
await testSetting(
"contextMenuShowEvent", "mousedown",
{"ui.context_menus.after_mouseup": false});
}
+ await testSetting(
+ "cookiesDisabled", true,
+ {"permissions.default.cookies": PERM_DENY_ACTION});
+ await testSetting(
+ "cookiesDisabled", false,
+ {
+ // This pref is not defaulted on Android.
+ "permissions.default.cookies":
+ AppConstants.MOZ_BUILD_APP !== "browser" ? undefined : PERM_UNKNOWN_ACTION,
+ });
+
await extension.unload();
await promiseShutdownManager();
});
add_task(async function test_bad_value() {
async function background() {
await browser.test.assertRejects(
browser.browserSettings.contextMenuShowEvent.set({value: "bad"}),