Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

  • This test has a WPT meta file that expects 2 subtest issues.
  • This WPT test may be referenced by the following Test IDs:
// META: script=/common/get-host-info.sub.js
// META: script=/common/utils.js
// META: script=/common/dispatcher/dispatcher.js
const executor_path = '/common/dispatcher/executor.html?pipe=';
const cross_origin = get_host_info().OTHER_ORIGIN;
const same_origin = get_host_info().ORIGIN;
const coep_require_corp_header =
'|header(Cross-Origin-Embedder-Policy,require-corp)';
const corp_cross_origin_header =
'|header(Cross-Origin-Resource-Policy,cross-origin)';
const coop_restrict_properties_header =
'|header(Cross-Origin-Opener-Policy,restrict-properties)';
function iframePopupAboutBlankTest(
origin, {expectedCrossOriginIsolated}, description) {
promise_test(async t => {
assert_true(crossOriginIsolated, 'Is main frame crossOriginIsolated?');
assert_true(
'SharedArrayBuffer' in globalThis,
'Is SharedArrayBuffer defined in main frame?');
const reply_token = token();
const iframe_token = token();
const iframe = document.createElement('iframe');
iframe.src = origin + executor_path + coep_require_corp_header +
corp_cross_origin_header + `&uuid=${iframe_token}`;
document.body.appendChild(iframe);
send(iframe_token, `send('${reply_token}', 'Iframe loaded');`);
assert_equals(await receive(reply_token), 'Iframe loaded');
send(iframe_token, `
window.popup = window.open();
send('${reply_token}', popup === null);
`);
assert_equals(await receive(reply_token), 'false', 'Is popup handle null?');
send(
iframe_token,
`send('${reply_token}', popup.window.crossOriginIsolated);`);
assert_equals(
await receive(reply_token), `${expectedCrossOriginIsolated}`,
'Is popup crossOriginIsolated?');
send(iframe_token, `
send('${reply_token}', 'SharedArrayBuffer' in popup.window.globalThis);
`);
assert_equals(
await receive(reply_token), `${expectedCrossOriginIsolated}`,
'Is SharedArrayBuffer defined in popup?');
// Test whether the popup's subframe is crossOriginIsolated
const popup_iframe_token = token();
const popup_iframe_src = origin + executor_path + coep_require_corp_header +
corp_cross_origin_header + `&uuid=${popup_iframe_token}`;
send(iframe_token, `
const iframe = window.popup.document.createElement('iframe');
iframe.src = '${popup_iframe_src}';
popup.document.body.appendChild(iframe);
`);
send(popup_iframe_token, `
send('${reply_token}', 'Iframe in popup loaded');
`);
assert_equals(await receive(reply_token), 'Iframe in popup loaded');
send(popup_iframe_token, `
send('${reply_token}', crossOriginIsolated);
`);
assert_equals(
await receive(reply_token), `${expectedCrossOriginIsolated}`,
'Is iframe in popup crossOriginIsolated?');
send(popup_iframe_token, `
send('${reply_token}', 'SharedArrayBuffer' in globalThis);
`);
assert_equals(
await receive(reply_token), `${expectedCrossOriginIsolated}`,
'Is SharedArrayBuffer defined in iframe in popup?');
// Test whether a nested iframe is crossOriginIsolated
const popup_nested_iframe_token = token();
const popup_nested_iframe_src = origin + executor_path +
coep_require_corp_header + corp_cross_origin_header +
`&uuid=${popup_nested_iframe_token}`;
send(iframe_token, `
blank_iframe = popup.document.createElement('iframe');
blank_iframe.src = '';
popup.document.body.appendChild(blank_iframe);
nested_iframe =
blank_iframe.contentDocument.createElement('iframe');
nested_iframe.src = '${popup_nested_iframe_src}';
blank_iframe.contentDocument.body.appendChild(nested_iframe);
`);
send(popup_nested_iframe_token, `
send('${reply_token}', 'Nested iframe in popup loaded');
`);
assert_equals(await receive(reply_token), 'Nested iframe in popup loaded');
send(popup_nested_iframe_token, `
send('${reply_token}', crossOriginIsolated);
`);
assert_equals(
await receive(reply_token), `${expectedCrossOriginIsolated}`,
'Is nested iframe in popup crossOriginIsolated?');
send(popup_nested_iframe_token, `
send('${reply_token}', 'SharedArrayBuffer' in globalThis);
`);
assert_equals(
await receive(reply_token), `${expectedCrossOriginIsolated}`,
'Is SharedArrayBuffer defined in nested iframe in popup?');
// Navigate the popup out of the initial empty document, with COOP:RP and
// COEP: require-corp. Expect to be crossOriginIsolated.
const popup_token = token();
const popup_src = origin + executor_path + coop_restrict_properties_header +
coep_require_corp_header + `&uuid=${popup_token}`;
send(iframe_token, `popup.window.location = '${popup_src}';`);
send(popup_token, `send('${reply_token}', 'Popup loaded');`);
assert_equals(await receive(reply_token), 'Popup loaded');
send(popup_token, `send('${reply_token}', crossOriginIsolated);`);
assert_equals(
await receive(reply_token), 'true',
'Is popup crossOriginIsolated after navigation?');
send(popup_token, `
send('${reply_token}', 'SharedArrayBuffer' in globalThis);
`);
assert_equals(
await receive(reply_token), 'true',
'Is SharedArrayBuffer defined in popup after navigation?');
}, description);
}
iframePopupAboutBlankTest(
cross_origin, {expectedCrossOriginIsolated: false}, 'Cross-origin iframe');
iframePopupAboutBlankTest(
same_origin, {expectedCrossOriginIsolated: true}, 'Same-origin iframe');