diff --git a/html/cross-origin-embedder-policy/anonymous-iframe/broadcast-channel.tentative.window.js b/html/cross-origin-embedder-policy/anonymous-iframe/broadcast-channel.tentative.window.js index 255a7192099232..ad64ddf5f1f568 100644 --- a/html/cross-origin-embedder-policy/anonymous-iframe/broadcast-channel.tentative.window.js +++ b/html/cross-origin-embedder-policy/anonymous-iframe/broadcast-channel.tentative.window.js @@ -1,3 +1,4 @@ +// META: timeout=long // META: script=/common/get-host-info.sub.js // META: script=/common/utils.js // META: script=/common/dispatcher/dispatcher.js @@ -16,7 +17,15 @@ const emit_script = (key, message) => ` bc.postMessage("${message}"); `; -promise_test(async test => { +// For incorrect web browser implementations, some tests are failing by timing +// out. Calling this function turns timeout into errors. This informs developers +// about which precise test is failing. +const errorOnTimeout = test => + test.step_timeout(test.unreached_func("Timeout"), 9000); + +promise_test_parallel(async test => { + errorOnTimeout(test); + const origin = get_host_info().HTTPS_REMOTE_ORIGIN; const key_1 = token(); const key_2 = token(); @@ -53,4 +62,78 @@ promise_test(async test => { send(iframe_normal, emit_script(key_2, "msg_4")); assert_equals(await receive(queue_1), "msg_3"); assert_equals(await receive(queue_2), "msg_4"); -}) +}, "Anonymous iframe and normal iframe aren't in the same partition") + +promise_test_parallel(async test => { + errorOnTimeout(test); + + const origin = get_host_info().HTTPS_REMOTE_ORIGIN; + const key = token(); + + const iframe_anonymous_1 = newAnonymousIframe(origin); + const iframe_anonymous_2 = newAnonymousIframe(origin); + const queue = token(); + + send(iframe_anonymous_1 , listen_script(key, queue, queue)); + assert_equals(await receive(queue), "registered"); + send(iframe_anonymous_2, emit_script(key, "msg")); + assert_equals(await receive(queue), "msg"); +}, "Two sibling same-origin anonymous iframes are in the same partition"); + +promise_test_parallel(async test => { + errorOnTimeout(test); + + const origin = get_host_info().HTTPS_REMOTE_ORIGIN; + const key = token(); + const queue = token(); + + const iframe_anonymous_1 = newAnonymousIframe(origin); + send(iframe_anonymous_1, ` + const importScript = ${importScript}; + await importScript("/common/utils.js"); + await importScript("/html/cross-origin-embedder-policy/credentialless" + + "/resources/common.js"); + const newAnonymousIframe = ${newAnonymousIframe}; + const iframe_anonymous_2 = newAnonymousIframe("${origin}"); + send("${queue}", iframe_anonymous_2); + `); + const iframe_anonymous_2 = await receive(queue); + + send(iframe_anonymous_1 , listen_script(key, queue, queue)); + assert_equals(await receive(queue), "registered"); + send(iframe_anonymous_2, emit_script(key, "msg")); + assert_equals(await receive(queue), "msg"); +}, "Nested same-origin anonymous iframe are in the same partition"); + +promise_test_parallel(async test => { + errorOnTimeout(test); + + const origin = get_host_info().HTTPS_REMOTE_ORIGIN; + const key = token(); + const queue = token(); + + const iframe_anonymous_1 = newAnonymousIframe(origin); + const popup = newPopup(origin); + send(popup, ` + const importScript = ${importScript}; + await importScript("/common/utils.js"); + await importScript("/html/cross-origin-embedder-policy/credentialless" + + "/resources/common.js"); + const newAnonymousIframe = ${newAnonymousIframe}; + send("${queue}", newAnonymousIframe("${origin}")); + `); + const iframe_anonymous_2 = await receive(queue); + + const unexpected_queue = token(); + receive(unexpected_queue).then(test.unreached_func( + "Two same-origin anonymous iframe in different windows shouldn't be able " + + "to communicate using BroadcastChannel")); + + send(iframe_anonymous_1 , listen_script(key, queue, unexpected_queue)); + assert_equals(await receive(queue), "registered"); + await send(iframe_anonymous_2, emit_script(key, "msg")); + + // Wait a bit to give the opportunity for unexpected message to be received. + await new Promise(r => test.step_timeout(r, 500)); +}, "Two anonymous iframes in different windows do not share the same " + + "partition"); diff --git a/html/cross-origin-embedder-policy/anonymous-iframe/resources/common.js b/html/cross-origin-embedder-policy/anonymous-iframe/resources/common.js index e11e2307defd6e..4fd12a6a747414 100644 --- a/html/cross-origin-embedder-policy/anonymous-iframe/resources/common.js +++ b/html/cross-origin-embedder-policy/anonymous-iframe/resources/common.js @@ -19,3 +19,20 @@ const newIframe = (child_origin) => { document.body.appendChild(iframe); return sub_document_token; }; + +// Create a popup. The new document will execute any scripts sent toward the +// token it returns. +const newPopup = (origin) => { + const popup_token = token(); + const popup = window.open(origin + executor_path + `&uuid=${popup_token}`); + return popup_token; +}; + +const importScript = (url) => { + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = url; + const loaded = new Promise(resolve => script.onload = resolve); + document.body.appendChild(script); + return loaded; +}