function assert_closed_opener(w, closed, opener) { assert_equals(w.closed, closed); assert_equals(w.opener, opener); } async_test(t => { const openee = window.open(); assert_closed_opener(openee, false, self); openee.onunload = t.step_func(() => { assert_closed_opener(openee, true, self); t.step_timeout(() => { assert_closed_opener(openee, true, null); t.done(); }, 0); }); openee.close(); assert_closed_opener(openee, true, self); }, "window.close() queues a task to discard, but window.closed knows immediately"); async_test(t => { const openee = window.open("", "greatname"); assert_closed_opener(openee, false, self); openee.close(); assert_closed_opener(openee, true, self); const openee2 = window.open("", "greatname"); assert_not_equals(openee, openee2); assert_closed_opener(openee, true, self); // Ensure second window.open() call was synchronous openee2.onunload = t.step_func(() => { assert_closed_opener(openee2, true, self); t.step_timeout(() => { assert_closed_opener(openee, true, null); assert_closed_opener(openee2, true, null); t.done(); }, 0); }); openee2.close(); assert_closed_opener(openee, true, self); // Ensure second close() call was synchronous assert_closed_opener(openee2, true, self); }, "window.close() affects name targeting immediately");