bug 1378568 allow activeTab for captureVisibleTab r?mixedpuppy draft
authorAndy McKay <amckay@mozilla.com>
Wed, 06 Sep 2017 11:46:25 -0700
changeset 660216 15231580eba48e16431d61dcb26650e4195474c4
parent 659873 c959327c6b75cd4930a6ea087583c38b805e7524
child 730171 caccd21ca938bc9dafcfcb1075c3e31bd1c7f97e
push id78331
push userbmo:amckay@mozilla.com
push dateWed, 06 Sep 2017 18:54:41 +0000
reviewersmixedpuppy
bugs1378568
milestone57.0a1
bug 1378568 allow activeTab for captureVisibleTab r?mixedpuppy MozReview-Commit-ID: Cxrakbkzo1Y
browser/components/extensions/ext-tabs.js
browser/components/extensions/schemas/tabs.json
browser/components/extensions/test/browser/browser_ext_tabs_captureVisibleTab.js
--- a/browser/components/extensions/ext-tabs.js
+++ b/browser/components/extensions/ext-tabs.js
@@ -503,16 +503,26 @@ this.tabs = class extends ExtensionAPI {
             queryInfo.url = new MatchPatternSet([].concat(queryInfo.url));
           }
 
           return Array.from(tabManager.query(queryInfo, context),
                             tab => tab.convert());
         },
 
         async captureVisibleTab(windowId, options) {
+          if (windowId !== null) {
+            if (!extension.hasPermission("<all_urls>")) {
+              return Promise.reject({message: 'The "<all_urls>" permission is required to use the captureVisibleTab API with the "window" parameter'});
+            }
+          } else {
+            if (!extension.hasPermission("activeTab")) {
+              return Promise.reject({message: 'The "activeTab" permission is required use the captureVisibleTab API.'});
+            }
+          }
+
           let window = windowId == null ?
             windowTracker.topWindow :
             windowTracker.getWindow(windowId, context);
 
           let tab = tabManager.wrapTab(window.gBrowser.selectedTab);
           await tabListener.awaitTabReady(tab.nativeTab);
 
           return tab.capture(context, options);
--- a/browser/components/extensions/schemas/tabs.json
+++ b/browser/components/extensions/schemas/tabs.json
@@ -894,17 +894,16 @@
             ]
           }
         ]
       },
       {
         "name": "captureVisibleTab",
         "type": "function",
         "description": "Captures the visible area of the currently active tab in the specified window. You must have $(topic:declare_permissions)[&lt;all_urls&gt;] permission to use this method.",
-        "permissions": ["<all_urls>"],
         "async": "callback",
         "parameters": [
           {
             "type": "integer",
             "name": "windowId",
             "minimum": -2,
             "optional": true,
             "description": "The target window. Defaults to the $(topic:current-window)[current window]."
--- a/browser/components/extensions/test/browser/browser_ext_tabs_captureVisibleTab.js
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_captureVisibleTab.js
@@ -134,22 +134,50 @@ add_task(async function testCaptureVisib
   await runTest({color: [255, 255, 255], fullZoom: 1});
 });
 
 add_task(async function testCaptureVisibleTabPermissions() {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "permissions": ["tabs"],
     },
-
-    background() {
-      browser.test.assertEq(undefined, browser.tabs.captureVisibleTab,
-                               'Extension without "<all_urls>" permission should not have access to captureVisibleTab');
+    background: async function() {
+      await browser.test.assertRejects(
+        browser.tabs.captureVisibleTab(),
+        /activeTab/,
+        "Should receive missing permissions error");
       browser.test.notifyPass("captureVisibleTabPermissions");
-    },
+    }
   });
 
   await extension.startup();
 
   await extension.awaitFinish("captureVisibleTabPermissions");
 
   await extension.unload();
 });
+
+add_task(async function testCaptureVisibleTabActiveTabPermissions() {
+  let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, 'about:blank', true);
+  let extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      "permissions": ["activeTab", "tabs"],
+    },
+    background: async function() {
+      await browser.test.assertRejects(
+        browser.tabs.captureVisibleTab(123),
+        // Note any windowId should trigger this error.
+        /<all_urls>/,
+        "Should receive missing permissions error");
+
+      let img = await browser.tabs.captureVisibleTab();
+      browser.test.assertTrue(img.startsWith("data:image/png;base64,"), "img is PNG");
+      browser.test.notifyPass("captureVisibleTabActiveTabPermissions");
+    }
+  });
+
+  await extension.startup();
+
+  await extension.awaitFinish("captureVisibleTabActiveTabPermissions");
+
+  await extension.unload();
+  await BrowserTestUtils.removeTab(tab);
+});