Bug 1436450 - Fix <all_urls> as an optional API permission draft
authorTomislav Jovanovic <tomica@gmail.com>
Tue, 27 Mar 2018 00:40:23 +0200
changeset 773812 66fd146060eff67e824f57860bdd5b937dfc8326
parent 769110 2c4a055ed5d45fe9ca33ae1b450b40e31c9fb8aa
push id104319
push userbmo:tomica@gmail.com
push dateWed, 28 Mar 2018 15:56:48 +0000
bugs1436450
milestone61.0a1
Bug 1436450 - Fix <all_urls> as an optional API permission MozReview-Commit-ID: FXiUuNgPlRo
toolkit/components/extensions/ext-permissions.js
toolkit/components/extensions/test/xpcshell/test_ext_permissions.js
--- a/toolkit/components/extensions/ext-permissions.js
+++ b/toolkit/components/extensions/ext-permissions.js
@@ -54,16 +54,21 @@ this.permissions = class extends Extensi
               };
               Services.obs.notifyObservers(subject, "webextension-optional-permission-prompt");
             });
             if (!allow) {
               return false;
             }
           }
 
+          // Unfortunatelly, we treat <all_urls> as an API permission as well.
+          if (origins.includes("<all_urls>")) {
+            perms.permissions.push("<all_urls>");
+          }
+
           await ExtensionPermissions.add(context.extension, perms);
           return true;
         },
 
         async getAll() {
           let perms = context.extension.activePermissions;
           delete perms.apis;
           return perms;
--- a/toolkit/components/extensions/test/xpcshell/test_ext_permissions.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_permissions.js
@@ -433,16 +433,48 @@ add_task(function test_permissions_have_
       } catch (e) {
         ok(GRANTED_WITHOUT_USER_PROMPT.includes(perm),
            `Permission '${perm}' intentionally granted without prompting the user`);
       }
     }
   }
 });
 
+// Check <all_urls> used as an optional API permission.
+add_task(async function test_optional_all_urls() {
+  let extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      optional_permissions: ["<all_urls>"],
+    },
+
+    background() {
+      browser.test.onMessage.addListener(async () => {
+        let before = !!browser.tabs.captureVisibleTab;
+        let granted = await browser.permissions.request({origins: ["<all_urls>"]});
+        let after = !!browser.tabs.captureVisibleTab;
+
+        browser.test.sendMessage("results", [before, granted, after]);
+      });
+    },
+  });
+
+  await extension.startup();
+
+  await withHandlingUserInput(extension, async () => {
+    extension.sendMessage("request");
+    let [before, granted, after] = await extension.awaitMessage("results");
+
+    equal(before, false, "captureVisibleTab() unavailable before optional permission request()");
+    equal(granted, true, "request() for optional permissions granted");
+    equal(after, true, "captureVisibleTab() avaiable after optional permission request()");
+  });
+
+  await extension.unload();
+});
+
 // Check that optional permissions are not included in update prompts
 add_task(async function test_permissions_prompt() {
   function background() {
     browser.test.onMessage.addListener(async (msg, arg) => {
       if (msg == "request") {
         let result = await browser.permissions.request(arg);
         browser.test.sendMessage("result", result);
       }