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>