Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'android'
- Manifest: toolkit/components/extensions/test/mochitest/mochitest-remote.toml includes toolkit/components/extensions/test/mochitest/mochitest-common.toml
- Manifest: toolkit/components/extensions/test/mochitest/mochitest.toml includes toolkit/components/extensions/test/mochitest/mochitest-common.toml
<!DOCTYPE HTML>
<html>
<head>
  <title>action.openPopup Incognito 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: "geckoview-only",
};
add_task(async function setup() {
  await SpecialPowers.pushPrefEnv({
    "set": [
      ["extensions.openPopupWithoutUserGesture.enabled", true],
    ],
  });
});
async function getIncognitoWindow() {
  // Since events will be limited based on incognito, we need a
  // spanning extension to get the tab id so we can test access failure.
  let windowWatcher = ExtensionTestUtils.loadExtension({
    manifest: {
      permissions: ["tabs"],
    },
    background: function() {
      browser.windows.create({ incognito: true }).then(({ id: windowId }) => {
        browser.test.onMessage.addListener(async data => {
          if (data === "close") {
            await browser.windows.remove(windowId);
            browser.test.sendMessage("window-closed");
          }
        });
        browser.test.sendMessage("window-id", windowId);
      });
    },
    incognitoOverride: "spanning",
  });
  await windowWatcher.startup();
  let windowId = await windowWatcher.awaitMessage("window-id");
  return {
    windowId,
    close: async () => {
      windowWatcher.sendMessage("close");
      await windowWatcher.awaitMessage("window-closed");
      await windowWatcher.unload();
    },
  };
}
async function testWithIncognitoOverride(incognitoOverride) {
  let extension = ExtensionTestUtils.loadExtension({
    ...extensionData,
    incognitoOverride,
    background: async function() {
      browser.test.onMessage.addListener(async ({ windowId, incognitoOverride }) => {
        const openPromise = browser.browserAction.openPopup({ windowId });
        if (incognitoOverride === "not_allowed") {
          await browser.test.assertRejects(
            openPromise,
            /Invalid window ID/,
            "Should prevent open popup call for incognito window"
          );
        } else {
          try {
            browser.test.assertEq(await openPromise, undefined, "openPopup resolved");
          } catch (e) {
            browser.test.fail(`Unexpected error: ${e}`);
          }
        }
        browser.test.sendMessage("incognitoWindow");
      });
    },
    files: {
      "popup.html": `<!DOCTYPE html><meta charset="utf-8"><script src="popup.js"><\/script>`,
      "popup.js"() {
        browser.test.sendMessage("popup");
      },
    },
  });
  await extension.startup();
  let incognitoWindow = await getIncognitoWindow();
  await extension.sendMessage({ windowId: incognitoWindow.windowId, incognitoOverride });
  await extension.awaitMessage("incognitoWindow");
  if (incognitoOverride === "spanning") {
    await extension.awaitMessage("popup");
  }
  await extension.unload();
  await incognitoWindow.close();
}
add_task(async function test_browserAction_openPopup_incognito_window_spanning() {
  if (AppConstants.platform == "android") {
    todo(false, "Cannot open private windows on Android");
    return;
  }
  await testWithIncognitoOverride("spanning");
});
add_task(async function test_browserAction_openPopup_incognito_window_not_allowed() {
  if (AppConstants.platform == "android") {
    todo(false, "Cannot open private windows on Android");
    return;
  }
  await testWithIncognitoOverride("not_allowed");
});
</script>
</body>
</html>