From afe2c649725f58e8edc7df4a95cd32f6c4b93500 Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Thu, 16 Aug 2018 15:09:40 -0700 Subject: [PATCH] Implement ignore-opens-during-unload counter in Document 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 Reviewed-on: https://chromium-review.googlesource.com/1169320 Commit-Queue: Timothy Gu Reviewed-by: Daniel Cheng Reviewed-by: Nate Chapin Cr-Commit-Position: refs/heads/master@{#583836} --- .../ignore-opens-during-unload.window.js | 51 +++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.js b/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.js index 5de4b1421b5ef1..43506a22a46da5 100644 --- a/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.js +++ b/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.js @@ -1,15 +1,60 @@ -for (const ev of ["unload", "beforeunload", "pagehide"]) { +for (const [ev, target] 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)`); }