blob: d3e9956368a5ce538ff6e57d6f1febcf8d882a59 [file] [log] [blame]
<!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>