Skip to content

Commit

Permalink
Implement ignore-opens-during-unload counter in Document
Browse files Browse the repository at this point in the history
The removed test fast/loader/document-destruction-within-unload.html was
originally added in 8809405d796cf3023e26cefd4b06f369eb67f125, to make
sure that a document.write() call that blows away the current page still
works in unload event listeners and blocks any current attempt to
navigate. Since we no longer allow that to happen, the test is obsolete.
In fact, it can be seen as contradictory to
external/wpt/html/browsers/browsing-the-web/unloading-documents/005.html,
which tests that document.open() in an unload event doesn't block
navigation.

Bug: 583586, 866274
Change-Id: I99b35dd28c97e8603455805b31d49644bc7b23a5
  • Loading branch information
TimothyGu authored and Chrome-bot committed Aug 16, 2018
1 parent d617cdb commit 21f0499
Showing 1 changed file with 48 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -1,15 +1,60 @@
for (const ev of ["unload", "beforeunload", "pagehide"]) {
for (const [ev, target, startup] of [
["beforeunload", iframe => iframe.contentWindow, () => {}],
["pagehide", iframe => iframe.contentWindow, () => {}],
["unload", iframe => iframe.contentWindow, () => {}],
["visibilitychange", iframe => iframe.contentDocument, () => {}],
]) {
async_test(t => {
const iframe = document.body.appendChild(document.createElement("iframe"));
t.add_cleanup(() => iframe.remove());
iframe.src = "/common/blank.html";
iframe.onload = t.step_func(() => {
iframe.contentWindow.addEventListener(ev, t.step_func_done(() => {
target(iframe).addEventListener(ev, t.step_func_done(() => {
assert_not_equals(iframe.contentDocument.childNodes.length, 0);
assert_equals(iframe.contentDocument.open(), iframe.contentDocument);
assert_not_equals(iframe.contentDocument.childNodes.length, 0);
}));
iframe.src = "about:blank";
});
}, `document.open should bail out when ignore-opens-during-unload is greater than 0 during ${ev} event`);
}, `document.open should bail out when ignore-opens-during-unload is greater than 0 during ${ev} event (in top-level browsing context)`);

async_test(t => {
const iframe = document.body.appendChild(document.createElement("iframe"));
t.add_cleanup(() => iframe.remove());
iframe.src = "/common/blank.html?1";
iframe.onload = t.step_func(() => {
const doc = iframe.contentDocument;
const innerIframe = doc.body.appendChild(doc.createElement("iframe"));
innerIframe.src = "/common/blank.html?2";
innerIframe.onload = t.step_func(() => {
// Navigate the parent, listen on the child, and open() the parent.
target(innerIframe).addEventListener(ev, t.step_func_done(() => {
assert_not_equals(iframe.contentDocument.childNodes.length, 0);
iframe.contentDocument.open();
assert_not_equals(iframe.contentDocument.childNodes.length, 0);
}));
iframe.src = "about:blank";
});
});
}, `document.open should bail out when ignore-opens-during-unload is greater than 0 during ${ev} event (open(parent) while unloading parent and child)`);

async_test(t => {
const iframe = document.body.appendChild(document.createElement("iframe"));
t.add_cleanup(() => iframe.remove());
iframe.src = "/common/blank.html?1";
iframe.onload = t.step_func(() => {
const doc = iframe.contentDocument;
const innerIframe = doc.body.appendChild(doc.createElement("iframe"));
innerIframe.src = "/common/blank.html?2";
innerIframe.onload = t.step_func(() => {
// Navigate the child, listen on the child, and open() the parent.
target(innerIframe).addEventListener(ev, t.step_func_done(() => {
assert_not_equals(iframe.contentDocument.childNodes.length, 0);
iframe.contentDocument.open();
assert_equals(iframe.contentDocument.childNodes.length, 0);
}));
innerIframe.src = "about:blank";
});
});
}, `document.open should bail out when ignore-opens-during-unload is greater than 0 during ${ev} event (open(parent) while unloading child only)`);
}

0 comments on commit 21f0499

Please sign in to comment.