summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_nontab_process_switch.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/extensions/test/browser/browser_ext_nontab_process_switch.js')
-rw-r--r--browser/components/extensions/test/browser/browser_ext_nontab_process_switch.js154
1 files changed, 154 insertions, 0 deletions
diff --git a/browser/components/extensions/test/browser/browser_ext_nontab_process_switch.js b/browser/components/extensions/test/browser/browser_ext_nontab_process_switch.js
new file mode 100644
index 0000000000..56511d1a7d
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_nontab_process_switch.js
@@ -0,0 +1,154 @@
+"use strict";
+
+add_task(async function process_switch_in_sidebars_popups() {
+ await SpecialPowers.pushPrefEnv({
+ set: [["extensions.content_web_accessible.enabled", true]],
+ });
+
+ let extension = ExtensionTestUtils.loadExtension({
+ useAddonManager: "temporary", // To automatically show sidebar on load.
+ manifest: {
+ content_scripts: [
+ {
+ matches: ["http://example.com/*"],
+ js: ["cs.js"],
+ },
+ ],
+
+ sidebar_action: {
+ default_panel: "page.html?sidebar",
+ },
+ browser_action: {
+ default_popup: "page.html?popup",
+ default_area: "navbar",
+ },
+ web_accessible_resources: ["page.html"],
+ },
+ files: {
+ "page.html": `<!DOCTYPE html><meta charset=utf-8><script src=page.js></script>`,
+ async "page.js"() {
+ browser.test.sendMessage("extension_page", {
+ place: location.search,
+ pid: await SpecialPowers.spawnChrome([], () => {
+ return windowGlobalParent.osPid;
+ }),
+ });
+ if (!location.search.endsWith("_back")) {
+ window.location.href = "http://example.com/" + location.search;
+ }
+ },
+
+ async "cs.js"() {
+ browser.test.sendMessage("content_script", {
+ url: location.href,
+ pid: await this.wrappedJSObject.SpecialPowers.spawnChrome([], () => {
+ return windowGlobalParent.osPid;
+ }),
+ });
+ if (location.search === "?popup") {
+ window.location.href =
+ browser.runtime.getURL("page.html") + "?popup_back";
+ }
+ },
+ },
+ });
+
+ await extension.startup();
+
+ let sidebar = await extension.awaitMessage("extension_page");
+ is(sidebar.place, "?sidebar", "Message from the extension sidebar");
+
+ let cs1 = await extension.awaitMessage("content_script");
+ is(cs1.url, "http://example.com/?sidebar", "CS on example.com in sidebar");
+ isnot(sidebar.pid, cs1.pid, "Navigating to example.com changed process");
+
+ await clickBrowserAction(extension);
+ let popup = await extension.awaitMessage("extension_page");
+ is(popup.place, "?popup", "Message from the extension popup");
+
+ let cs2 = await extension.awaitMessage("content_script");
+ is(cs2.url, "http://example.com/?popup", "CS on example.com in popup");
+ isnot(popup.pid, cs2.pid, "Navigating to example.com changed process");
+
+ let popup2 = await extension.awaitMessage("extension_page");
+ is(popup2.place, "?popup_back", "Back at extension page in popup");
+ is(popup.pid, popup2.pid, "Same process as original popup page");
+
+ is(sidebar.pid, popup.pid, "Sidebar and popup pages from the same process");
+
+ // There's no guarantee that two (independent) pages from the same domain will
+ // end up in the same process.
+
+ await closeBrowserAction(extension);
+ await extension.unload();
+});
+
+// Test that navigating the browserAction popup between extension pages doesn't keep the
+// parser blocked (See Bug 1747813).
+add_task(
+ async function test_navigate_browserActionPopups_shouldnot_block_parser() {
+ let extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ browser_action: {
+ default_popup: "popup-1.html",
+ default_area: "navbar",
+ },
+ },
+ files: {
+ "popup-1.html": `<!DOCTYPE html><meta charset=utf-8><script src=popup-1.js></script><h1>Popup 1</h1>`,
+ "popup-2.html": `<!DOCTYPE html><meta charset=utf-8><script src=popup-2.js></script><h1>Popup 2</h1>`,
+
+ "popup-1.js": function () {
+ browser.test.onMessage.addListener(msg => {
+ if (msg !== "navigate-popup") {
+ browser.test.fail(`Unexpected test message "${msg}"`);
+ return;
+ }
+ location.href = "/popup-2.html";
+ });
+ window.onload = () => browser.test.sendMessage("popup-page-1");
+ },
+
+ "popup-2.js": function () {
+ window.onload = () => browser.test.sendMessage("popup-page-2");
+ },
+ },
+ });
+
+ // Make sure the mouse isn't hovering over the browserAction widget.
+ EventUtils.synthesizeMouseAtCenter(
+ gURLBar.textbox,
+ { type: "mouseover" },
+ window
+ );
+
+ await extension.startup();
+
+ // Triggers popup preload (otherwise we wouldn't be blocking the parser for the browserAction popup
+ // and the issue wouldn't be triggered, a real user on the contrary has a pretty high chance to trigger a
+ // preload while hovering the browserAction popup before opening the popup with a click).
+ let widget = getBrowserActionWidget(extension).forWindow(window);
+ EventUtils.synthesizeMouseAtCenter(
+ widget.node,
+ { type: "mouseover" },
+ window
+ );
+ await clickBrowserAction(extension);
+
+ await extension.awaitMessage("popup-page-1");
+
+ extension.sendMessage("navigate-popup");
+
+ await extension.awaitMessage("popup-page-2");
+ // If the bug is triggered (e.g. it did regress), the test will get stuck waiting for
+ // the test message "popup-page-2" (which will never be sent because the extension page
+ // script isn't executed while the parser is blocked).
+ ok(
+ true,
+ "Extension browserAction popup successfully navigated to popup-page-2.html"
+ );
+
+ await closeBrowserAction(extension);
+ await extension.unload();
+ }
+);