Bug 1389911 - Support activeTab permission on Firefox for Android browserAction.
MozReview-Commit-ID: 54MN0diEow4
--- a/mobile/android/components/extensions/ext-browserAction.js
+++ b/mobile/android/components/extensions/ext-browserAction.js
@@ -37,17 +37,21 @@ class BrowserAction {
EventEmitter.decorate(this);
}
/**
* Required by the BrowserActions module. This event will get
* called whenever the browser action is clicked on.
*/
onClicked() {
- this.emit("click", tabTracker.activeTab);
+ const tab = tabTracker.activeTab;
+
+ this.tabManager.addActiveTabPermission(tab);
+
+ this.emit("click", tab);
}
/**
* Updates the browser action whenever a tab is selected.
* @param {string} tabId The tab id to update.
*/
onTabSelected(tabId) {
let name = this.tabContext.get(tabId).name || this.defaults.name;
--- a/mobile/android/components/extensions/test/mochitest/test_ext_activeTab_permission.html
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_activeTab_permission.html
@@ -8,16 +8,17 @@
<script type="text/javascript" src="head.js"></script>
<link rel="stylesheet" href="chrome://mochikit/contents/tests/SimpleTest/test.css"/>
</head>
<body>
<script type="text/javascript">
"use strict";
+var {BrowserActions} = SpecialPowers.Cu.import("resource://gre/modules/BrowserActions.jsm", {});
var {PageActions} = SpecialPowers.Cu.import("resource://gre/modules/PageActions.jsm", {});
function pageLoadedContentScript() {
browser.test.sendMessage("page-loaded", window.location.href);
}
add_task(async function test_activeTab_pageAction() {
async function background() {
@@ -106,12 +107,102 @@ add_task(async function test_activeTab_p
info("Click the pageAction");
PageActions.synthesizeClick(uuid);
await extension.awaitFinish("page_action.activeTab.done");
await extension.unload();
});
+
+add_task(async function test_activeTab_browserAction() {
+ async function background() {
+ let createdTab;
+
+ function contentScriptCode() {
+ browser.test.log("content script executed");
+
+ return "tabs.executeScript result";
+ }
+
+ browser.browserAction.onClicked.addListener(async (tab) => {
+ browser.test.assertEq(createdTab.id, tab.id,
+ "browserAction clicked on the expected tab id");
+
+ const [result] = await browser.tabs.executeScript(tab.id, {
+ code: `(${contentScriptCode})()`,
+ }).catch(error => {
+ // Make the test to fail fast if something goes wrong.
+ browser.test.fail(`Unexpected exception on tabs.executeScript: ${error}`);
+ browser.tabs.remove(tab.id);
+ browser.test.notifyFail("browser_action.activeTab.done");
+ throw error;
+ });
+
+ browser.test.assertEq("tabs.executeScript result", result,
+ "Got the expected result from tabs.executeScript");
+
+ browser.tabs.onRemoved.addListener((tabId) => {
+ if (tabId !== tab.id) {
+ return;
+ }
+
+ browser.test.notifyPass("browser_action.activeTab.done");
+ });
+ browser.tabs.remove(tab.id);
+ });
+
+ createdTab = await browser.tabs.create({
+ url: "http://example.com/#test_activeTab_browserAction",
+ });
+
+ browser.test.log(`Created a new tab with id: ${createdTab.id}`);
+
+ browser.test.sendMessage("background_page.ready");
+ }
+
+ let extension = ExtensionTestUtils.loadExtension({
+ background,
+ manifest: {
+ "name": "BrowserAction Extension",
+ "browser_action": {
+ "default_title": "Browser Action",
+ },
+ "content_scripts": [
+ {
+ "js": ["page_loaded.js"],
+ "matches": ["http://example.com/*"],
+ "run_at": "document_end",
+ },
+ ],
+ "permissions": ["activeTab"],
+ },
+ files: {
+ "page_loaded.js": pageLoadedContentScript,
+ },
+ });
+
+ await extension.startup();
+
+ await extension.awaitMessage("background_page.ready");
+
+ const uuid = `{${extension.uuid}}`;
+
+ ok(BrowserActions.isShown(uuid), "browser action is shown");
+
+ info("Wait the new tab to be loaded");
+ const loadedURL = await extension.awaitMessage("page-loaded");
+
+ is(loadedURL, "http://example.com/#test_activeTab_browserAction",
+ "The expected URL has been loaded in a new tab");
+
+ info("Click the browserAction");
+ BrowserActions.synthesizeClick(uuid);
+
+ await extension.awaitFinish("browser_action.activeTab.done");
+
+ await extension.unload();
+});
+
</script>
</body>
</html>