| <!doctype html> |
| <meta charset="utf-8"> |
| <title>window.parent: `null`</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <div id="log"></div> |
| <script> |
| async_test(t => { |
| var iframe = document.createElement('iframe'); |
| iframe.onload = t.step_func_done(() => { |
| var iWindow = iframe.contentWindow; |
| assert_equals(iWindow.parent, window); |
| document.body.removeChild(iframe); |
| assert_equals(iWindow.parent, null); |
| }); |
| |
| document.body.appendChild(iframe); |
| }, '`window.parent` is null when browsing context container element removed'); |
| |
| async_test(t => { |
| var iframe = document.createElement('iframe'); |
| var iframe2, removedEl; |
| |
| var testFunc = t.step_func(() => { |
| var frameWindow = iframe.contentWindow; |
| var frame2Window = iframe2.contentWindow; |
| |
| assert_equals(frameWindow.parent, window); |
| assert_equals(frame2Window.parent, frameWindow); |
| |
| iframe.removeEventListener('load', nestFrame); |
| iframe2.removeEventListener('load', testFunc); |
| removedEl = document.body.removeChild(iframe); |
| |
| assert_equals(frameWindow.parent, null); |
| assert_equals(frame2Window.parent, null); |
| |
| removedEl.addEventListener('load', t.step_func_done(() => { |
| // reattached iframe's browsing context will report window.parent again |
| assert_equals(removedEl.contentWindow.parent, window); |
| // The following window s are no longer referenced by active browsing contexts |
| assert_equals(frameWindow.parent, null); |
| assert_equals(frame2Window.parent, null); |
| // Per #the-iframe-element, reattaching a removed iframe will result in the |
| // browser creating a new browsing context once again, with a fresh |
| // document in our case, so the second iframe or any other elements |
| // previously added to iframe.contentDocument will be gone |
| assert_equals(removedEl.contentDocument.querySelector('iframe'), null); |
| assert_equals(removedEl.contentDocument.querySelector('hr'), null); |
| })); |
| document.body.appendChild(removedEl); |
| }); |
| |
| var nestFrame = function () { |
| iframe.contentDocument.body.appendChild(document.createElement('hr')); |
| iframe2 = iframe.contentDocument.createElement('iframe'); |
| // Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1229707 |
| iframe2.src = '/common/blank.html'; |
| iframe2.addEventListener('load', testFunc); |
| iframe.contentDocument.body.appendChild(iframe2); |
| }; |
| |
| iframe.addEventListener('load', nestFrame); |
| document.body.appendChild(iframe); |
| }, '`window.parent` null when parent browsing context container removed'); |
| </script> |