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
--- 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