| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>Structured cloning of SharedArrayBuffers: BroadcastChannel within the same agent cluster</title> |
| <link rel="help" href="https://html.spec.whatwg.org/multipage/#structuredserialize"> |
| <link rel="help" href="https://html.spec.whatwg.org/multipage/#broadcasting-to-other-browsing-contexts"> |
| <link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/common/utils.js"></script> <!-- Use token() to allow running tests in parallel --> |
| |
| <div id="log"></div> |
| |
| <script> |
| "use strict"; |
| |
| promise_test(t => { |
| const channelName = token(); |
| return Promise.all([ |
| createIFrame(`resources/broadcastchannel-iframe.html?channel=${channelName}&index=0`), |
| createIFrame(`resources/broadcastchannel-iframe.html?channel=${channelName}&index=1`), |
| createIFrame(`resources/broadcastchannel-iframe.html?channel=${channelName}&index=2`) |
| ]).then(() => { |
| const sab = new SharedArrayBuffer(3); |
| const view = new Uint8Array(sab); |
| const channel = new BroadcastChannel(channelName); |
| |
| return new Promise(resolve => { |
| let soFar = 0; |
| channel.onmessage = t.step_func(({ data: { i } }) => { |
| assert_in_array(i, [0, 1, 2], "Any message events must come from expected sources"); |
| ++soFar; |
| |
| if (soFar === 3) { |
| assert_equals(view[0], 1, "The first iframe must have set view[0] to 1"); |
| assert_equals(view[1], 2, "The second iframe must have set view[1] to 2"); |
| assert_equals(view[2], 3, "The third iframe must have set view[2] to 3"); |
| resolve(); |
| } |
| }); |
| |
| channel.postMessage({ sab }); |
| }); |
| }); |
| }); |
| |
| function createIFrame(src) { |
| return new Promise((resolve, reject) => { |
| const iframe = document.createElement("iframe"); |
| iframe.src = src; |
| iframe.onload = () => resolve(iframe); |
| iframe.onerror = () => reject(`iframe with URL ${src} failed to load`); |
| document.body.appendChild(iframe); |
| }); |
| } |
| </script> |