summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/mochitest/test_ext_browserAction_openPopup.html
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/extensions/test/mochitest/test_ext_browserAction_openPopup.html')
-rw-r--r--toolkit/components/extensions/test/mochitest/test_ext_browserAction_openPopup.html183
1 files changed, 183 insertions, 0 deletions
diff --git a/toolkit/components/extensions/test/mochitest/test_ext_browserAction_openPopup.html b/toolkit/components/extensions/test/mochitest/test_ext_browserAction_openPopup.html
new file mode 100644
index 0000000000..0d038da897
--- /dev/null
+++ b/toolkit/components/extensions/test/mochitest/test_ext_browserAction_openPopup.html
@@ -0,0 +1,183 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>action.openPopup Test</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+ <script type="text/javascript" src="head.js"></script>
+ <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
+"use strict";
+
+let extensionData = {
+ manifest: {
+ browser_specific_settings: {
+ gecko: {
+ id: "open-popup@tests.mozilla.org",
+ }
+ },
+ browser_action: {
+ default_popup: "popup.html",
+ },
+ permissions: ["activeTab"]
+ },
+
+ useAddonManager: "android-only",
+};
+
+add_task(async function setup() {
+ await SpecialPowers.pushPrefEnv({
+ "set": [
+ ["extensions.openPopupWithoutUserGesture.enabled", true],
+ ],
+ });
+});
+
+async function testActiveTabPermissions(withHandlingUserInput) {
+ const background = async function(withHandlingUserInput) {
+ let tabPromise;
+ let tabLoadedPromise = new Promise(resolve => {
+ // Wait for the tab to actually finish loading (bug 1589734)
+ browser.tabs.onUpdated.addListener(async (id, { status }) => {
+ if (id === (await tabPromise).id && status === "complete") {
+ resolve();
+ }
+ });
+ });
+ tabPromise = browser.tabs.create({ url: "https://www.example.com" });
+ tabLoadedPromise.then(() => {
+ // Once the popup opens, check if we have activeTab permission
+ browser.runtime.onMessage.addListener(async msg => {
+ if (msg === "popup-open") {
+ let tabs = await browser.tabs.query({});
+
+ browser.test.assertEq(
+ withHandlingUserInput ? 1 : 0,
+ tabs.filter((t) => typeof t.url !== "undefined").length,
+ "active tab permission only granted with user input"
+ );
+
+ await browser.tabs.remove((await tabPromise).id);
+ browser.test.sendMessage("activeTabsChecked");
+ }
+ });
+
+ if (withHandlingUserInput) {
+ browser.test.withHandlingUserInput(() => {
+ browser.browserAction.openPopup();
+ });
+ } else {
+ browser.browserAction.openPopup();
+ }
+ })
+ };
+
+ let extension = ExtensionTestUtils.loadExtension({
+ ...extensionData,
+
+ background: `(${background})(${withHandlingUserInput})`,
+
+ files: {
+ "popup.html": `<!DOCTYPE html><meta charset="utf-8"><script src="popup.js"><\/script>`,
+ async "popup.js"() {
+ browser.runtime.sendMessage("popup-open");
+ },
+ },
+ });
+
+ await extension.startup();
+ await extension.awaitMessage("activeTabsChecked");
+ await extension.unload();
+}
+
+add_task(async function test_browserAction_openPopup_activeTab() {
+ await testActiveTabPermissions(true);
+});
+
+add_task(async function test_browserAction_openPopup_non_activeTab() {
+ await testActiveTabPermissions(false);
+});
+
+add_task(async function test_browserAction_openPopup_invalid_states() {
+ let extension = ExtensionTestUtils.loadExtension({
+ ...extensionData,
+
+ background: async function() {
+ await browser.browserAction.setPopup({ popup: "" })
+ await browser.test.assertRejects(
+ browser.browserAction.openPopup(),
+ "No popup URL is set",
+ "Should throw when no URL is set"
+ );
+
+ await browser.browserAction.disable()
+ await browser.test.assertRejects(
+ browser.browserAction.openPopup(),
+ "Popup is disabled",
+ "Should throw when disabled"
+ );
+
+ browser.test.notifyPass("invalidStates");
+ },
+ });
+
+ await extension.startup();
+ await extension.awaitFinish("invalidStates");
+ await extension.unload();
+});
+
+add_task(async function test_browserAction_openPopup_no_click_event() {
+ let extension = ExtensionTestUtils.loadExtension({
+ ...extensionData,
+
+ background: async function() {
+ let clicks = 0;
+
+ browser.browserAction.onClicked.addListener(() => {
+ clicks++;
+ });
+
+ // Test with popup set
+ await browser.browserAction.openPopup();
+ browser.test.sendMessage("close-popup");
+
+ browser.test.onMessage.addListener(async (msg) => {
+ if (msg === "popup-closed") {
+ // Test without popup
+ await browser.browserAction.setPopup({ popup: "" });
+
+ await browser.test.assertRejects(
+ browser.browserAction.openPopup(),
+ "No popup URL is set",
+ "Should throw when no URL is set"
+ );
+
+ // We expect the last call to be a no-op, so there isn't really anything
+ // to wait on. Instead, check that no clicks are registered after waiting
+ // for a sufficient amount of time.
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ setTimeout(() => {
+ browser.test.assertEq(0, clicks, "onClicked should not be called");
+ browser.test.notifyPass("noClick");
+ }, 1000);
+ }
+ });
+ },
+ });
+
+ extension.onMessage("close-popup", async () => {
+ await AppTestDelegate.closeBrowserAction(window, extension);
+ extension.sendMessage("popup-closed");
+ });
+
+ await extension.startup();
+ await extension.awaitFinish("noClick");
+ await extension.unload();
+});
+</script>
+
+</body>
+</html>