| function delayed_assert_done(t, w, windowProxySelfReference) { |
| // Let's make sure nobody is being sneaky |
| t.step_timeout(() => { |
| t.step_timeout(() => { |
| assert_equals(w[windowProxySelfReference], w, `${windowProxySelfReference} got cleared after some time`); |
| t.done(); |
| }, 0); |
| }, 0); |
| } |
| |
| [ |
| "frames", |
| "globalThis", |
| "self", |
| "window" |
| ].forEach(windowProxySelfReference => { |
| async_test(t => { |
| const frame = document.body.appendChild(document.createElement("iframe")), |
| otherW = frame.contentWindow; |
| assert_equals(otherW[windowProxySelfReference], otherW, `${windowProxySelfReference} is broken`); |
| frame.remove(); |
| assert_equals(otherW[windowProxySelfReference], otherW, `${windowProxySelfReference} got cleared after browsing context removal`); |
| assert_true(otherW.closed); |
| |
| delayed_assert_done(t, otherW, windowProxySelfReference); |
| }, `iframeWindow.${windowProxySelfReference} before and after removal`); |
| |
| async_test(t => { |
| const otherW = window.open(); |
| assert_equals(otherW[windowProxySelfReference], otherW, `${windowProxySelfReference} is broken`); |
| otherW.onunload = t.step_func(() => { |
| assert_equals(otherW[windowProxySelfReference], otherW, `${windowProxySelfReference} got cleared after browsing context unload`); |
| t.step_timeout(() => { |
| assert_equals(otherW.opener, null); // Ensure browsing context is discarded |
| assert_equals(otherW[windowProxySelfReference], otherW, `${windowProxySelfReference} got cleared after browsing context removal`); |
| delayed_assert_done(t, otherW, windowProxySelfReference); |
| }, 0); |
| }); |
| otherW.close(); |
| assert_equals(otherW[windowProxySelfReference], otherW, `${windowProxySelfReference} got cleared after browsing context closure`); |
| assert_true(otherW.closed); |
| }, `popupWindow.${windowProxySelfReference} before, after closing, and after discarding`) |
| }); |