bug 1378568 allow activeTab for captureVisibleTab r?mixedpuppy
MozReview-Commit-ID: Cxrakbkzo1Y
--- 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)[<all_urls>] 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);
+});