// META: script=/common/get-host-info.sub.js function closedTest(newWindow, closeNewWindowsBrowsingContext) { assert_equals(newWindow.closed, false); closeNewWindowsBrowsingContext(); assert_equals(newWindow.closed, true); } test(() => { const frame = document.body.appendChild(document.createElement("iframe")); closedTest(frame.contentWindow, () => frame.remove()); }, "closed and same-origin nested browsing context"); test(() => { const openee = window.open(); closedTest(openee, () => openee.close()); // close() is a no-op once "is closing" is set openee.close(); assert_equals(openee.closed, true); }, "closed/close() and same-origin auxiliary browsing context"); const support = new URL("support/closed.html", location.href).pathname; [ { type: "cross-origin", url: `${get_host_info().HTTP_REMOTE_ORIGIN}${support}` }, { type: "cross-site", url: `${get_host_info().HTTP_NOTSAMESITE_ORIGIN}${support}` } ].forEach(val => { async_test(t => { const frame = document.createElement("iframe"), ident = `${val.type}-nested-bc`; frame.src = `${val.url}?window=parent&ident=${ident}`; const listener = t.step_func(e => { if (e.data === ident) { closedTest(frame.contentWindow, () => frame.remove()); self.removeEventListener("message", listener); t.done(); } }); // Use a message event rather than onload for consistency with auxiliary browsing contexts. self.addEventListener("message", listener); document.body.append(frame); }, `closed and ${val.type} nested browsing context`); async_test(t => { const ident = `${val.type}-auxiliary-bc`, support = new URL("support/closed.html", location.href).pathname, openee = window.open(`${val.url}?window=opener&ident=${ident}`), listener = t.step_func(e => { if (e.data === ident) { closedTest(openee, () => openee.close()); // close() is a no-op once "is closing" is set openee.close(); assert_equals(openee.closed, true); self.removeEventListener("message", listener); t.done(); } }); // As there's no cross-origin onload, use a message event. self.addEventListener("message", listener); }, `closed/close() and ${val.type} auxiliary browsing context`); });