closed-attribute.window.js (2342B)
1 // META: script=/common/get-host-info.sub.js 2 3 function closedTest(newWindow, closeNewWindowsBrowsingContext) { 4 assert_equals(newWindow.closed, false); 5 closeNewWindowsBrowsingContext(); 6 assert_equals(newWindow.closed, true); 7 } 8 9 test(() => { 10 const frame = document.body.appendChild(document.createElement("iframe")); 11 closedTest(frame.contentWindow, () => frame.remove()); 12 }, "closed and same-origin nested browsing context"); 13 14 test(() => { 15 const openee = window.open(); 16 closedTest(openee, () => openee.close()); 17 18 // close() is a no-op once "is closing" is set 19 openee.close(); 20 assert_equals(openee.closed, true); 21 }, "closed/close() and same-origin auxiliary browsing context"); 22 23 const support = new URL("support/closed.html", location.href).pathname; 24 [ 25 { 26 type: "cross-origin", 27 url: `${get_host_info().HTTP_REMOTE_ORIGIN}${support}` 28 }, 29 { 30 type: "cross-site", 31 url: `${get_host_info().HTTP_NOTSAMESITE_ORIGIN}${support}` 32 } 33 ].forEach(val => { 34 async_test(t => { 35 const frame = document.createElement("iframe"), 36 ident = `${val.type}-nested-bc`; 37 frame.src = `${val.url}?window=parent&ident=${ident}`; 38 const listener = t.step_func(e => { 39 if (e.data === ident) { 40 closedTest(frame.contentWindow, () => frame.remove()); 41 self.removeEventListener("message", listener); 42 t.done(); 43 } 44 }); 45 // Use a message event rather than onload for consistency with auxiliary browsing contexts. 46 self.addEventListener("message", listener); 47 document.body.append(frame); 48 }, `closed and ${val.type} nested browsing context`); 49 50 async_test(t => { 51 const ident = `${val.type}-auxiliary-bc`, 52 support = new URL("support/closed.html", location.href).pathname, 53 openee = window.open(`${val.url}?window=opener&ident=${ident}`), 54 listener = t.step_func(e => { 55 if (e.data === ident) { 56 closedTest(openee, () => openee.close()); 57 58 // close() is a no-op once "is closing" is set 59 openee.close(); 60 assert_equals(openee.closed, true); 61 62 self.removeEventListener("message", listener); 63 t.done(); 64 } 65 }); 66 // As there's no cross-origin onload, use a message event. 67 self.addEventListener("message", listener); 68 }, `closed/close() and ${val.type} auxiliary browsing context`); 69 });