blob: d4a9296fca66d3017c267a8d8951bef2dcbee238 [file] [log] [blame]
// 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);