Source code
Revision control
Copy as Markdown
Other Tools
// Returns a promise that asserts the "load" and "pageshow" events are not
// fired on |target|.
function assertNoLoadAndPageshowEvent(t, target) {
target.addEventListener("load", t.unreached_func("load should not be fired"));
target.addEventListener("pageshow", t.unreached_func("pageshow should not be fired"));
return new Promise(resolve => {
// Wait 50ms to ensure events fired after asynchronous navigations are
// also captured.
setTimeout(resolve, 50);
});
}
const url204 = "/common/blank.html?pipe=status(204)";
const postMessageToOpenerOnLoad = `
window.onload = () => {
window.opener.postMessage("loaded", "*")
}
`;
// -- Start of helpers for iframe initial empty document tests.
// Creates an iframe with an unset src and appends it to the document.
window.insertIframe = (t) => {
const iframe = document.createElement("iframe");
t.add_cleanup(() => iframe.remove());
document.body.append(iframe);
return iframe;
};
// Creates an iframe with src set to a URL that doesn't commit a new document
// (results in a HTTP 204 response) and appends it to the document.
window.insertIframeWith204Src = (t) => {
const iframe = document.createElement("iframe");
iframe.src = url204;
t.add_cleanup(() => iframe.remove());
document.body.append(iframe);
return iframe;
};
// Creates an iframe with src="about:blank" and appends it to the document.
window.insertIframeWithAboutBlankSrc = (t) => {
const iframe = document.createElement("iframe");
t.add_cleanup(() => iframe.remove());
iframe.src = "about:blank";
document.body.append(iframe);
return iframe;
};
// Creates an iframe with src="about:blank", appends it to the document, and
// waits for the non-initial about:blank document finished loading.
window.insertIframeWithAboutBlankSrcWaitForLoad = async (t) => {
const iframe = insertIframeWithAboutBlankSrc(t);
const aboutBlankLoad = new Promise(resolve => {
// In some browsers, the non-initial about:blank navigation commits
// asynchronously, while in other browsers, it would commit synchronously.
// This means we can't wait for the "load" event as it might have already
// ran. Instead, just wait for 100ms before resolving, as the non-initial
// about:blank navigation will most likely take less than 100 ms to commit.
t.step_timeout(resolve, 100);
});
await aboutBlankLoad;
return iframe;
};
// Waits for the "load" event for |urlRelativeToThisDocument| to run on
// |iframe|.
window.waitForLoad = (t, iframe, urlRelativeToThisDocument) => {
return new Promise(resolve => {
iframe.addEventListener("load", t.step_func(() => {
assert_equals(iframe.contentWindow.location.href, (new URL(urlRelativeToThisDocument, location.href)).href);
// Wait a bit longer to ensure all history stuff has settled, e.g. the document is "completely loaded"
// (which happens from a queued task).
setTimeout(resolve, 0);
}), { once: true });
});
};
// -- End of helpers for iframe initial empty document tests.
// -- Start of helpers for opened windows' initial empty document tests.
// window.open() to a URL that doesn't load a new document (results in a HTTP
// 204 response). This should create a new window that stays on the initial
// empty document.
window.windowOpen204 = (t) => {
const openedWindow = window.open(url204);
t.add_cleanup(() => openedWindow.close());
return openedWindow;
};
// window.open() (no URL set). This should create a new window that stays on
// the initial empty document as it won't trigger a non-initial about:blank
// navigation.
window.windowOpenNoURL = (t) => {
const openedWindow = window.open();
t.add_cleanup(() => openedWindow.close());
return openedWindow;
};
// window.open("about:blank"). This should create a new window that stays on
// the initial empty document as it won't trigger a non-initial about:blank
// navigation.
window.windowOpenAboutBlank = (t) => {
const openedWindow = window.open("about:blank");
t.add_cleanup(() => openedWindow.close());
return openedWindow;
};
// Waits for a postMessage with data set to |message| is received on the current
// window.
window.waitForMessage = (t, message) => {
return new Promise(resolve => {
window.addEventListener("message", t.step_func((event) => {
if (event.data == message)
resolve();
}));
});
};
// -- End of helpers for opened windows' initial empty document tests.