summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/mochitest/test_ext_browserAction_openPopup_windowId.html
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/extensions/test/mochitest/test_ext_browserAction_openPopup_windowId.html')
-rw-r--r--toolkit/components/extensions/test/mochitest/test_ext_browserAction_openPopup_windowId.html162
1 files changed, 162 insertions, 0 deletions
diff --git a/toolkit/components/extensions/test/mochitest/test_ext_browserAction_openPopup_windowId.html b/toolkit/components/extensions/test/mochitest/test_ext_browserAction_openPopup_windowId.html
new file mode 100644
index 0000000000..c528028901
--- /dev/null
+++ b/toolkit/components/extensions/test/mochitest/test_ext_browserAction_openPopup_windowId.html
@@ -0,0 +1,162 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>action.openPopup Window ID 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",
+ default_area: "navbar",
+ },
+ permissions: ["activeTab"]
+ },
+
+ useAddonManager: "android-only",
+};
+
+add_task(async function setup() {
+ await SpecialPowers.pushPrefEnv({
+ "set": [
+ ["extensions.openPopupWithoutUserGesture.enabled", true],
+ ],
+ });
+});
+
+async function testWithWindowState(state) {
+ const background = async function(state) {
+ const originalWindow = await browser.windows.getCurrent();
+
+ let newWindowPromise;
+ const tabLoadedPromise = new Promise(resolve => {
+ browser.tabs.onUpdated.addListener(async (id, { status }, tab) => {
+ if (tab.windowId === (await newWindowPromise).id && status === "complete") {
+ resolve();
+ }
+ });
+ });
+
+ newWindowPromise = browser.windows.create({ url: "tab.html" });
+
+ browser.test.onMessage.addListener(async (msg) => {
+ if (msg === "close-window") {
+ await browser.windows.remove((await newWindowPromise).id);
+ browser.test.sendMessage("window-closed");
+ }
+ });
+
+ tabLoadedPromise.then(async () => {
+ const windowId = (await newWindowPromise).id;
+
+ switch (state) {
+ case "inactive":
+ const focusChangePromise = new Promise(resolve => {
+ browser.windows.onFocusChanged.addListener((focusedWindowId) => {
+ if (focusedWindowId === originalWindow.id) {
+ resolve();
+ }
+ })
+ });
+ await browser.windows.update(originalWindow.id, { focused: true });
+ await focusChangePromise;
+ break;
+ case "minimized":
+ await browser.windows.update(windowId, { state: "minimized" });
+ break;
+ default:
+ throw new Error(`Invalid state: ${state}`);
+ }
+
+ await browser.browserAction.openPopup({ windowId });
+ });
+ };
+
+ let extension = ExtensionTestUtils.loadExtension({
+ ...extensionData,
+
+ background: `(${background})(${JSON.stringify(state)})`,
+
+ files: {
+ "tab.html": "<!DOCTYPE html>",
+ "popup.html": `<!DOCTYPE html><meta charset="utf-8"><script src="popup.js"><\/script>`,
+ "popup.js"() {
+ // Small timeout to ensure the popup doesn't immediately close, which can
+ // happen when focus moves between windows
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ setTimeout(async () => {
+ let windows = await browser.windows.getAll();
+ let highestWindowIdIsFocused = Math.max(...windows.map((w) => w.id))
+ === windows.find((w) => w.focused).id;
+
+ browser.test.assertEq(true, highestWindowIdIsFocused, "new window is focused");
+
+ await browser.test.sendMessage("popup-open");
+
+ // Bug 1800100: Window leaks if not explicitly closed
+ window.close();
+ }, 1000);
+ },
+ },
+ });
+
+ await extension.startup();
+ await extension.awaitMessage("popup-open");
+ await extension.sendMessage("close-window");
+ await extension.awaitMessage("window-closed");
+ await extension.unload();
+}
+
+add_task(async function test_browserAction_openPopup_window_inactive() {
+ if (AppConstants.platform == "linux") {
+ // TODO bug 1798334: Currently unreliable on linux
+ todo(false, "Unreliable on linux");
+ return;
+ }
+ await testWithWindowState("inactive");
+});
+
+add_task(async function test_browserAction_openPopup_window_minimized() {
+ if (AppConstants.platform == "linux") {
+ // TODO bug 1798334: Currently unreliable on linux
+ todo(false, "Unreliable on linux");
+ return;
+ }
+ await testWithWindowState("minimized");
+});
+
+add_task(async function test_browserAction_openPopup_invalid_window() {
+ let extension = ExtensionTestUtils.loadExtension({
+ ...extensionData,
+
+ background: async function() {
+ await browser.test.assertRejects(
+ browser.browserAction.openPopup({ windowId: Number.MAX_SAFE_INTEGER }),
+ /Invalid window ID/,
+ "Should throw for invalid window ID"
+ );
+ browser.test.notifyPass("invalidWindow");
+ },
+ });
+
+ await extension.startup();
+ await extension.awaitFinish("invalidWindow");
+ await extension.unload();
+});
+</script>
+
+</body>
+</html>