Bug 1369581 - Requesting an optional permission that does not cause a prompt should succeed, r?aswan draft
authorBob Silverberg <bsilverberg@mozilla.com>
Fri, 02 Jun 2017 09:14:22 -0400
changeset 594896 f91247f396079474f941a8a5cd0897ce73a2dd1e
parent 594702 035c25bef7b5e4175006e63eff10c61c2eef73f1
child 633577 73b9060cbb7facb61aa2380316fe939276886059
push id64197
push userbmo:bob.silverberg@gmail.com
push dateThu, 15 Jun 2017 18:47:57 +0000
reviewersaswan
bugs1369581
milestone56.0a1
Bug 1369581 - Requesting an optional permission that does not cause a prompt should succeed, r?aswan Currently, if an extension requests one or more optional permissions, and those permissions do not cause a prompt to be displayed, the framework will reject that request and not grant any permissions. This should be the opposite in that we should grant permission to those optional permissions event though no prompt is displayed. MozReview-Commit-ID: 6SeyFSv92Lo
browser/base/content/test/webextensions/.eslintrc.js
browser/base/content/test/webextensions/browser.ini
browser/base/content/test/webextensions/browser_permissions_optional.js
browser/modules/ExtensionsUI.jsm
--- a/browser/base/content/test/webextensions/.eslintrc.js
+++ b/browser/base/content/test/webextensions/.eslintrc.js
@@ -1,7 +1,11 @@
 "use strict";
 
 module.exports = {
   "extends": [
     "plugin:mozilla/browser-test"
-  ]
+  ],
+
+  "env": {
+    "webextensions": true,
+  },
 };
--- a/browser/base/content/test/webextensions/browser.ini
+++ b/browser/base/content/test/webextensions/browser.ini
@@ -18,13 +18,14 @@ support-files =
 
 [browser_extension_sideloading.js]
 [browser_extension_update_background.js]
 [browser_extension_update_background_noprompt.js]
 [browser_permissions_addons_search.js]
 [browser_permissions_installTrigger.js]
 [browser_permissions_local_file.js]
 [browser_permissions_mozAddonManager.js]
+[browser_permissions_optional.js]
 [browser_permissions_unsigned.js]
 skip-if = require_signing
 [browser_update_checkForUpdates.js]
 [browser_update_findUpdates.js]
 [browser_update_interactive_noprompt.js]
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/webextensions/browser_permissions_optional.js
@@ -0,0 +1,43 @@
+"use strict";
+add_task(async function test_request_permissions_without_prompt() {
+  async function pageScript() {
+    const NO_PROMPT_PERM = "activeTab";
+    window.addEventListener("keypress", async () => {
+      let permGranted = await browser.permissions.request(
+        {permissions: [NO_PROMPT_PERM]});
+      browser.test.assertTrue(permGranted,
+                              `${NO_PROMPT_PERM} permission was granted.`);
+      let perms = await browser.permissions.getAll();
+      browser.test.assertTrue(perms.permissions.includes(NO_PROMPT_PERM),
+                              `${NO_PROMPT_PERM} permission exists.`)
+      browser.test.sendMessage("permsGranted");
+      }, {once: true});
+    browser.test.sendMessage("pageReady");
+  }
+
+  let extension = ExtensionTestUtils.loadExtension({
+    background() {
+      browser.test.sendMessage("ready", browser.runtime.getURL("page.html"));
+    },
+    files: {
+      "page.html": `<html><head><script src="page.js"></script></head></html>`,
+      "page.js": pageScript,
+    },
+    manifest: {
+      "optional_permissions": [
+        "activeTab"
+      ],
+    },
+  });
+  await extension.startup();
+
+  let url = await extension.awaitMessage("ready");
+  let win = window.open(url);
+  await extension.awaitMessage("pageReady");
+
+  let winutils = SpecialPowers.getDOMWindowUtils(win);
+  winutils.sendKeyEvent("keypress", KeyEvent.DOM_VK_A, 0, 0);
+  await extension.awaitMessage("permsGranted");
+
+  await extension.unload();
+});
--- a/browser/modules/ExtensionsUI.jsm
+++ b/browser/modules/ExtensionsUI.jsm
@@ -229,17 +229,17 @@ this.ExtensionsUI = {
       let strings = this._buildStrings({
         type: "optional",
         addon: {name},
         permissions,
       });
 
       // If we don't have any promptable permissions, just proceed
       if (strings.msgs.length == 0) {
-        resolve();
+        resolve(true);
         return;
       }
 
       resolve(this.showPermissionsPrompt(browser, strings, icon));
     }
   },
 
   // Escape &, <, and > characters in a string so that it may be