Bug 1363860 - Part 2: Allow WebExtensions to disable cookies draft
authorBob Silverberg <bsilverberg@mozilla.com>
Wed, 29 Nov 2017 11:09:54 -0500
changeset 705216 6924ee31d6bcfbf203f39ddc2450560d8ec5a2ad
parent 705215 812017b1cbf91005a348858d12ffe49117e58476
child 742300 b2d6c35a3a23f66084e7492b7f69c2ee4f252119
push id91403
push userbmo:bob.silverberg@gmail.com
push dateWed, 29 Nov 2017 17:18:46 +0000
bugs1363860
milestone59.0a1
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
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
@@ -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"}),