Skip to content

Commit

Permalink
Test that javascript: URL navigation does not fire beforeunload
Browse files Browse the repository at this point in the history
The current spec fires beforeunload, but the rewrite in whatwg/html#6315 does not.
  • Loading branch information
domenic committed Oct 27, 2022
1 parent 40772b8 commit 993d13e
Showing 1 changed file with 80 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// META: script=../resources/helpers.js

for (const stringCompletion of [false, true]) {
const testNameSuffix = stringCompletion ? ": string completion" : ": undefined completion";

testNoBeforeunload(
{ testRunnerWindow: "top", stringCompletion },
async (t, urlToSet) => {
const iframe = await addIframe();
iframe.contentWindow.location.href = urlToSet;

return iframe.contentWindow;
},
`Navigating an iframe via location.href to a javascript: URL must not fire beforeunload${testNameSuffix}`
);

testNoBeforeunload(
{ testRunnerWindow: "top", stringCompletion },
async (t, urlToSet) => {
const iframe = await addIframe();
iframe.src = urlToSet;

return iframe.contentWindow;
},
`Navigating an iframe via src="" to a javascript: URL after insertion must not fire beforeunload${testNameSuffix}`
);

testNoBeforeunload(
{ testRunnerWindow: "opener", stringCompletion },
async (t, urlToSet) => {
const w = await openWindow("/common/blank.html", t);
w.location.href = urlToSet;

return w;
},
`Navigating an opened window via location.href to a javascript: URL must not fire beforeunload${testNameSuffix}`
);


testNoBeforeunload(
{ testRunnerWindow: "opener", stringCompletion },
async (t, urlToSet) => {
const w = await openWindow("../resources/has-iframe.html", t);
w.frames[0].onbeforeunload = t.unreached_func("beforeunload must not fire on the iframe");
w.location.href = urlToSet;

return w;
},
`Navigating an opened window with an iframe via location.href to a javascript: URL must not fire beforeunload on the iframe${testNameSuffix}`
);
}

function testNoBeforeunload({ testRunnerWindow, stringCompletion }, setupAndNavigateFunc, description) {
promise_test(async t => {
t.add_cleanup(() => {
delete window.resolveTestPromise;
});

const ranPromise = new Promise(resolve => {
window.resolveTestPromise = resolve;
});

const urlToSet = makeURL({ testRunnerWindow, stringCompletion });
const w = await setupAndNavigateFunc(t, urlToSet);
w.onbeforeunload = t.unreached_func("beforeunload must not fire");

await ranPromise;
if (stringCompletion) {
await waitForMessage(w);
}
}, description);
}

function makeURL({ testRunnerWindow, stringCompletion }) {
const completion = stringCompletion ?
`"a string<script>window.${testRunnerWindow}.postMessage('ready', '*');</script>";` :
`undefined;`;

return `javascript:window.${testRunnerWindow}.resolveTestPromise();${completion};`;
}

0 comments on commit 993d13e

Please sign in to comment.