From 35da22261cc57b1cef035b37559221af45e4c0fd Mon Sep 17 00:00:00 2001 From: Andrew Williams <awillia@google.com> Date: Sun, 13 Feb 2022 21:38:16 +0000 Subject: [PATCH] Bug 1753569 [wpt PR 32690] - [BroadcastChannel] Add Partitioning WPT, a=testonly Automatic update from web-platform-tests [BroadcastChannel] Add Partitioning WPT This CL tests that BroadcastChannel is partitioned in third-party contexts (tentative, pending changes to the spec). For more info, see https://github.com/whatwg/html/issues/5803 Bug: 1239274 Change-Id: I8d495ecb141847276aefd1bcc4a1af0ea1098db2 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3424369 Reviewed-by: Ben Kelly <wanderview@chromium.org> Reviewed-by: Mason Freed <masonf@chromium.org> Commit-Queue: Andrew Williams <awillia@google.com> Cr-Commit-Position: refs/heads/main@{#967421} -- wpt-commits: 65d9fd570851f5446d6b1e3e6f07440f9b69a561 wpt-pr: 32690 --- .../cross-partition.https.tentative.html | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 testing/web-platform/tests/webmessaging/broadcastchannel/cross-partition.https.tentative.html diff --git a/testing/web-platform/tests/webmessaging/broadcastchannel/cross-partition.https.tentative.html b/testing/web-platform/tests/webmessaging/broadcastchannel/cross-partition.https.tentative.html new file mode 100644 index 0000000000000..163e6c00a93a9 --- /dev/null +++ b/testing/web-platform/tests/webmessaging/broadcastchannel/cross-partition.https.tentative.html @@ -0,0 +1,72 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<!-- Pull in executor_path needed by newPopup / newIframe --> +<script src="/html/cross-origin-embedder-policy/credentialless/resources/common.js"></script> +<!-- Pull in newPopup / newIframe --> +<script src="/html/cross-origin-embedder-policy/anonymous-iframe/resources/common.js"></script> +<body> +<script> + +const emit_script = (channel_name, message, done_queue_name) => ` + const bc = new BroadcastChannel("${channel_name}"); + bc.postMessage("${message}"); + send("${done_queue_name}", "done"); +`; + +promise_test(async t => { + const origin = get_host_info().HTTPS_ORIGIN; + const not_same_site_origin = get_host_info().HTTPS_NOTSAMESITE_ORIGIN; + const response_queue_uuid = token(); + + const popup_init_script = ` + const importScript = ${importScript}; + await importScript("/html/cross-origin-embedder-policy/credentialless" + + "/resources/common.js"); + await importScript("/html/cross-origin-embedder-policy/anonymous-iframe" + + "/resources/common.js"); + await importScript("/common/utils.js"); + send("${response_queue_uuid}", newIframe("${origin}")); + `; + + // Create a same-origin iframe in a cross-site popup. + const not_same_site_popup_uuid = newPopup(t, not_same_site_origin); + send(not_same_site_popup_uuid, popup_init_script); + const iframe_1_uuid = await receive(response_queue_uuid); + + // Create a same-origin iframe in a same-site popup. + const same_origin_popup_uuid = newPopup(t, origin); + send(same_origin_popup_uuid, popup_init_script); + const iframe_2_uuid = await receive(response_queue_uuid); + + const channel_name = token(); + const bc = new BroadcastChannel(channel_name); + bc.onmessage = t.step_func(e => { + assert_equals(e.data, "msg from iframe2"); + t.done(); + }); + + // Instruct the not-same-top-level-site iframe to send a message on the BC + // channel we are listening on. This message should not be received since + // the iframe should be in a different partition. + send(iframe_1_uuid, + emit_script(channel_name, "msg from iframe1", response_queue_uuid)); + assert_equals(await receive(response_queue_uuid), "done"); + + // Now instruct the same-top-level-site iframe to send a BC message. By + // the time we send the script to execute, have it send the BC message, + // and then receive the BC message in our BC instance, it should be + // reasonable to assume that the message from the first iframe would have + // been delivered if it was going to be. + send(iframe_2_uuid, + emit_script(channel_name, "msg from iframe2", response_queue_uuid)); + assert_equals(await receive(response_queue_uuid), "done"); + +}, "BroadcastChannel messages aren't received from a cross-partition iframe"); + +</script> +</body>