<!doctype html>
<title>
Cross-Origin-Opener-Policy: opener is lost because the opener navigates.
</title>
<!--
COOP tests usually assume that the opener is lost because it navigated to a
page that triggered a browsing context group swap. It can also happen when
the opener navigates instead. This test verifies the behavior.
-->
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="/common/utils.js"></script>
<script src="resources/common.js"></script>
<script>
const executor_path = "/common/dispatcher/executor.html?pipe=";
const coop_same_origin_header =
'|header(Cross-Origin-Opener-Policy,same-origin)';
const coop_unsafe_none_header =
'|header(Cross-Origin-Opener-Policy,unsafe-none)';
function getExecutorPath(uuid, origin, coop_header) {
return origin.origin + executor_path + coop_header + `&uuid=${uuid}`;
}
// Note: Because we can not navigate the main page to verify the behavior,
// we instead create another layer of popup, and navigate the intermediate
// one. We can verify the opener behavior from this page, and the openee
// behavior from the second popup.
promise_test(async t => {
// Set up dispatcher communications.
const first_popup_token = token();
const post_navigate_first_popup_token = token();
const second_popup_token = token();
const reply_token = token();
const first_popup_url = getExecutorPath(
first_popup_token,
SAME_ORIGIN,
coop_same_origin_header);
const post_navigate_first_popup_url = getExecutorPath(
post_navigate_first_popup_token,
SAME_ORIGIN,
coop_unsafe_none_header);
const second_popup_url = getExecutorPath(
second_popup_token,
SAME_ORIGIN,
coop_same_origin_header);
// We open the first popup and then ping it, it will respond after loading.
const first_popup = window.open(first_popup_url);
send(first_popup_token, `send('${reply_token}', 'Popup loaded');`);
assert_equals(await receive(reply_token), "Popup loaded");
// We open the second popup and the ping it, it will respond after loading.
send(first_popup_token,
`opener.second_popup_url = window.open('${second_popup_url}');`);
send(second_popup_token, `send('${reply_token}', 'Popup loaded');`);
assert_equals(await receive(reply_token), "Popup loaded");
// Both popups are now loaded. We navigate the middle one to a page that
// does not have COOP, this should trigger a browsing context group swap.
send(first_popup_token, `location.href = '${post_navigate_first_popup_url}'`);
send(post_navigate_first_popup_token,
`send('${reply_token}', 'Popup navigated');`);
assert_equals(await receive(reply_token), "Popup navigated");
// Give some time for things to settle across processes etc. before
// proceeding with verifications.
await new Promise((resolve, reject) => { t.step_timeout(resolve, 1500); });
// The reference held by the main page to the first popup should be closed.
assert_equals(first_popup.closed, true);
// The second popup, opened by the first one should have its opener unset.
send(second_popup_token, `send('${reply_token}', opener);`);
assert_equals(await receive(reply_token), "");
}, "Verify that having the opener navigate instead of the openee also triggers COOP swaps.");
</script>