diff options
Diffstat (limited to 'testing/web-platform/tests/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/broadcastchannel-success.https.html')
-rw-r--r-- | testing/web-platform/tests/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/broadcastchannel-success.https.html | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/broadcastchannel-success.https.html b/testing/web-platform/tests/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/broadcastchannel-success.https.html new file mode 100644 index 0000000000..d3e9956368 --- /dev/null +++ b/testing/web-platform/tests/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/broadcastchannel-success.https.html @@ -0,0 +1,55 @@ +<!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> |