[ undefined, 42, function() { return "hi" }, "hi", {}, [], Symbol() ].forEach(val => { test(t => { const frame = document.body.appendChild(document.createElement("iframe")), win = frame.contentWindow; t.add_cleanup(() => frame.remove()); assert_own_property(win, "opener"); assert_equals(win.opener, null); const beforeDesc = Object.getOwnPropertyDescriptor(win, "opener"), openerGet = beforeDesc.get, openerSet = beforeDesc.set; assert_own_property(beforeDesc, "get"); assert_own_property(beforeDesc, "set"); assert_true(beforeDesc.enumerable); assert_true(beforeDesc.configurable); win.opener = val; assert_equals(win.opener, val); assert_equals(openerGet(), null); const desc = Object.getOwnPropertyDescriptor(win, "opener"); assert_equals(desc.value, val); assert_true(desc.writable); assert_true(desc.enumerable); assert_true(desc.configurable); openerSet("x"); assert_equals(win.opener, "x"); }, "Setting window.opener to " + String(val)); // String() needed for symbols });