summaryrefslogtreecommitdiffstats
path: root/dom/serviceworkers/test/browser_intercepted_channel_process_swap.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/serviceworkers/test/browser_intercepted_channel_process_swap.js')
-rw-r--r--dom/serviceworkers/test/browser_intercepted_channel_process_swap.js110
1 files changed, 110 insertions, 0 deletions
diff --git a/dom/serviceworkers/test/browser_intercepted_channel_process_swap.js b/dom/serviceworkers/test/browser_intercepted_channel_process_swap.js
new file mode 100644
index 0000000000..2aa5618a20
--- /dev/null
+++ b/dom/serviceworkers/test/browser_intercepted_channel_process_swap.js
@@ -0,0 +1,110 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Tests that navigation loads through intercepted channels result in the
+// appropriate process swaps. This appears to only be possible when navigating
+// to a cross-origin URL, where that navigation is controlled by a ServiceWorker.
+
+"use strict";
+
+const SAME_ORIGIN = "https://example.com";
+const CROSS_ORIGIN = "https://example.org";
+
+const SAME_ORIGIN_ROOT = getRootDirectory(gTestPath).replace(
+ "chrome://mochitests/content",
+ SAME_ORIGIN
+);
+const CROSS_ORIGIN_ROOT = SAME_ORIGIN_ROOT.replace(SAME_ORIGIN, CROSS_ORIGIN);
+
+const SW_REGISTER_URL = `${CROSS_ORIGIN_ROOT}empty_with_utils.html`;
+const SW_SCRIPT_URL = `${CROSS_ORIGIN_ROOT}intercepted_channel_process_swap_worker.js`;
+const URL_BEFORE_NAVIGATION = `${SAME_ORIGIN_ROOT}empty.html`;
+const CROSS_ORIGIN_URL = `${CROSS_ORIGIN_ROOT}empty.html`;
+
+const TESTCASES = [
+ {
+ url: CROSS_ORIGIN_URL,
+ description:
+ "Controlled cross-origin navigation with network-provided response",
+ },
+ {
+ url: `${CROSS_ORIGIN_ROOT}this-path-does-not-exist?respondWith=${CROSS_ORIGIN_URL}`,
+ description:
+ "Controlled cross-origin navigation with ServiceWorker-provided response",
+ },
+];
+
+async function navigateTab(aTab, aUrl) {
+ BrowserTestUtils.startLoadingURIString(aTab.linkedBrowser, aUrl);
+
+ await BrowserTestUtils.waitForLocationChange(gBrowser, aUrl).then(() =>
+ BrowserTestUtils.browserStopped(aTab.linkedBrowser)
+ );
+}
+
+async function runTestcase(aTab, aTestcase) {
+ info(`Testing ${aTestcase.description}`);
+
+ await navigateTab(aTab, URL_BEFORE_NAVIGATION);
+
+ const [initialPid] = E10SUtils.getBrowserPids(aTab.linkedBrowser);
+
+ await navigateTab(aTab, aTestcase.url);
+
+ const [finalPid] = E10SUtils.getBrowserPids(aTab.linkedBrowser);
+
+ await SpecialPowers.spawn(aTab.linkedBrowser, [], () => {
+ Assert.ok(
+ content.navigator.serviceWorker.controller,
+ `${content.location} should be controlled.`
+ );
+ });
+
+ Assert.notEqual(
+ initialPid,
+ finalPid,
+ `Navigating from ${URL_BEFORE_NAVIGATION} to ${aTab.linkedBrowser.currentURI.spec} should have resulted in a different PID.`
+ );
+}
+
+add_task(async function setupPrefs() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.serviceWorkers.enabled", true],
+ ["dom.serviceWorkers.testing.enabled", true],
+ ],
+ });
+});
+
+add_task(async function setupBrowser() {
+ const tab = await BrowserTestUtils.openNewForegroundTab({
+ gBrowser,
+ opening: SW_REGISTER_URL,
+ });
+
+ await SpecialPowers.spawn(
+ tab.linkedBrowser,
+ [SW_SCRIPT_URL],
+ async scriptUrl => {
+ await content.wrappedJSObject.registerAndWaitForActive(scriptUrl);
+ }
+ );
+});
+
+add_task(async function runTestcases() {
+ for (const testcase of TESTCASES) {
+ await runTestcase(gBrowser.selectedTab, testcase);
+ }
+});
+
+add_task(async function cleanup() {
+ const tab = gBrowser.selectedTab;
+
+ await navigateTab(tab, SW_REGISTER_URL);
+
+ await SpecialPowers.spawn(tab.linkedBrowser, [], async () => {
+ await content.wrappedJSObject.unregisterAll();
+ });
+
+ BrowserTestUtils.removeTab(tab);
+});