| "use strict"; |
| |
| // This is for testing whether an object (e.g., a global property) is associated with Window, or |
| // with Document. Recall that Window and Document are 1:1 except when doing a same-origin navigation |
| // away from the initial about:blank. In that case the Window object gets reused for the new |
| // Document. |
| // |
| // So: |
| // - If something is per-Window, then it should maintain its identity across an about:blank |
| // navigation. |
| // - If something is per-Document, then it should be recreated across an about:blank navigation. |
| |
| window.testIsPerWindow = propertyName => { |
| runTests(propertyName, assert_equals, "must not"); |
| }; |
| |
| window.testIsPerDocument = propertyName => { |
| runTests(propertyName, assert_not_equals, "must"); |
| }; |
| |
| function runTests(propertyName, equalityOrInequalityAsserter, mustOrMustNotReplace) { |
| async_test(t => { |
| const iframe = document.createElement("iframe"); |
| document.body.appendChild(iframe); |
| const frame = iframe.contentWindow; |
| |
| const before = frame[propertyName]; |
| assert_implements(before, `window.${propertyName} must be implemented`); |
| |
| iframe.onload = t.step_func_done(() => { |
| const after = frame[propertyName]; |
| equalityOrInequalityAsserter(after, before); |
| }); |
| |
| iframe.src = "/common/blank.html"; |
| }, `Navigating from the initial about:blank ${mustOrMustNotReplace} replace window.${propertyName}`); |
| |
| // Per spec, discarding a browsing context should not change any of the global objects. |
| test(() => { |
| const iframe = document.createElement("iframe"); |
| document.body.appendChild(iframe); |
| const frame = iframe.contentWindow; |
| |
| const before = frame[propertyName]; |
| assert_implements(before, `window.${propertyName} must be implemented`); |
| |
| iframe.remove(); |
| |
| const after = frame[propertyName]; |
| assert_equals(after, before, `window.${propertyName} should not change after iframe.remove()`); |
| }, `Discarding the browsing context must not change window.${propertyName}`); |
| |
| // Per spec, document.open() should not change any of the global objects. In historical versions |
| // of the spec, it did, so we test here. |
| async_test(t => { |
| const iframe = document.createElement("iframe"); |
| |
| iframe.onload = t.step_func_done(() => { |
| const frame = iframe.contentWindow; |
| const before = frame[propertyName]; |
| assert_implements(before, `window.${propertyName} must be implemented`); |
| |
| frame.document.open(); |
| |
| const after = frame[propertyName]; |
| assert_equals(after, before); |
| |
| frame.document.close(); |
| }); |
| |
| iframe.src = "/common/blank.html"; |
| document.body.appendChild(iframe); |
| }, `document.open() must not replace window.${propertyName}`); |
| } |