// In an earlier version of the HTML Standard, document open steps created a // new JavaScript realm and migrated the existing objects to use the new realm. // Test that this no longer happens. async_test(t => { const frame = document.body.appendChild(document.createElement("iframe")); // Ensure a load event gets dispatched to unblock testharness t.add_cleanup(() => frame.remove()); frame.src = "resources/global-variables-frame.html"; frame.onload = t.step_func_done(() => { assert_equals(frame.contentWindow.hey, "You", "precondition"); frame.contentDocument.open(); assert_equals(frame.contentWindow.hey, "You", "actual check"); }); }, "Obtaining a variable from a global whose document had open() invoked"); function testIdentity(desc, frameToObject, frameToConstructor) { async_test(t => { const frame = document.body.appendChild(document.createElement("iframe")); // Ensure a load event gets dispatched to unblock testharness t.add_cleanup(() => frame.remove()); frame.src = "/common/blank.html"; frame.onload = t.step_func_done(() => { const obj = frameToObject(frame); frame.contentDocument.open(); assert_equals(frameToObject(frame), obj); }); }, `${desc} maintains object identity through open()`); async_test(t => { const frame = document.body.appendChild(document.createElement("iframe")); // Ensure a load event gets dispatched to unblock testharness t.add_cleanup(() => frame.remove()); frame.src = "/common/blank.html"; frame.onload = t.step_func_done(() => { const obj = frameToObject(frame); const origProto = Object.getPrototypeOf(obj); const origCtor = frameToConstructor(frame); const sym = Symbol(); obj[sym] = "foo"; frame.contentDocument.open(); assert_equals(frameToObject(frame)[sym], "foo"); assert_true(frameToObject(frame) instanceof origCtor); assert_equals(Object.getPrototypeOf(frameToObject(frame)), origProto); assert_equals(frameToConstructor(frame), origCtor); }); }, `${desc} maintains its prototype and properties through open()`); } testIdentity("Document", frame => frame.contentDocument, frame => frame.contentWindow.Document); testIdentity("WindowProxy", frame => frame.contentWindow, frame => frame.contentWindow.Window); testIdentity("BarProp", frame => frame.contentWindow.locationbar, frame => frame.contentWindow.BarProp); testIdentity("History", frame => frame.contentWindow.history, frame => frame.contentWindow.History); testIdentity("localStorage", frame => frame.contentWindow.localStorage, frame => frame.contentWindow.Storage); testIdentity("Location", frame => frame.contentWindow.location, frame => frame.contentWindow.Location); testIdentity("sessionStorage", frame => frame.contentWindow.sessionStorage, frame => frame.contentWindow.Storage); testIdentity("Navigator", frame => frame.contentWindow.navigator, frame => frame.contentWindow.Navigator);