[BroadcastChannel] Update flaky data URL shared worker test

The data URL shared worker opaque origin test is flaky on the
Chrome trybots, so try ensuring that the frame's BC instance
can receive messages before instantiating the first worker.
I can't reproduce this issue locally, but hopefully this
addresses the test flakiness.

Bug: 1322297
Change-Id: Id8bf867986050300b3e980b2c80eae4842b15ee0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3677618
Reviewed-by: Ben Kelly <wanderview@chromium.org>
Commit-Queue: Andrew Williams <awillia@google.com>
Cr-Commit-Position: refs/heads/main@{#1009117}
diff --git a/webmessaging/broadcastchannel/opaque-origin.html b/webmessaging/broadcastchannel/opaque-origin.html
index 1d05a90..e09d935 100644
--- a/webmessaging/broadcastchannel/opaque-origin.html
+++ b/webmessaging/broadcastchannel/opaque-origin.html
@@ -146,7 +146,6 @@
   return new Promise((resolve, reject) => {
     const channel_name = "opaque-origin-test-4";
     const bc1 = new BroadcastChannel(channel_name);
-    bc1.onmessage = e => { reject("Received message from an opaque origin"); };
 
     // Same as the previous test but with data URL shared workers (which
     // should have opaque origins per the HTML spec).
@@ -155,7 +154,7 @@
     const worker_2_name = `${worker_name_prefix}-2`;
 
     const handler = e => {
-      if(e.data == `${worker_1_name}-done`) {
+      if (e.data == `${worker_1_name}-done`) {
         const worker_script = data_url_worker_src(channel_name, worker_2_name);
         const worker2 = new SharedWorker(worker_script, worker_2_name);
         worker2.port.addEventListener("message", handler);
@@ -170,11 +169,22 @@
       }
     };
 
-    const worker_script = data_url_worker_src(channel_name, worker_2_name);
-    const worker1 = new SharedWorker(worker_script, worker_1_name);
-    worker1.port.addEventListener("message", handler);
-    worker1.port.start();
-    worker1.port.postMessage("go!");
+    bc1.onmessage = e => {
+      if (e.data == "go!") {
+        const worker_script = data_url_worker_src(channel_name, worker_1_name);
+        const worker1 = new SharedWorker(worker_script, worker_1_name);
+        worker1.port.addEventListener("message", handler);
+        worker1.port.start();
+        worker1.port.postMessage("go!");
+      } else {
+        reject("Received message from an opaque origin");
+      }
+    };
+
+    // Ensure that the BroadcastChannel instance above can receive messages
+    // before we create the first shared worker.
+    const bc2 = new BroadcastChannel(channel_name);
+    bc2.postMessage("go!");
     });
 }, "BroadcastChannel messages from data URL shared workers should be self-contained");
 //-->