diff options
Diffstat (limited to 'testing/web-platform/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js')
-rw-r--r-- | testing/web-platform/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js b/testing/web-platform/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js new file mode 100644 index 0000000000..1247400a4e --- /dev/null +++ b/testing/web-platform/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js @@ -0,0 +1,144 @@ +// 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'); |