Files
sousa-gecko/testing/web-platform/tests/wasm/serialization/memory/window-success.tentative.https.html
T
Anne van Kesteren e04f3dd399 Bug 2038126 [wpt PR 59748] - Serialization & deserialization of WebAssembly.Memory, a=testonly
Automatic update from web-platform-tests
Serialization & deserialization of WebAssembly.Memory

For https://github.com/WebAssembly/spec/issues/2155.

--

wpt-commits: d5fc238896af5ebb44c9a9f7cd3b7e9830cfc70a
wpt-pr: 59748
2026-05-19 08:26:39 +00:00

81 lines
2.9 KiB
HTML

<!DOCTYPE html>
<meta charset="utf-8">
<title>Structured cloning of shared WebAssembly.Memory: success cases</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
"use strict";
function makeSharedMemory() {
const memory = new WebAssembly.Memory({ shared: true, initial: 1, maximum: 1 });
new Int32Array(memory.buffer)[0] = 100;
return memory;
}
function assertSharedRoundtrip(original, echoed) {
assert_true(echoed instanceof WebAssembly.Memory,
"Echoed object is a WebAssembly.Memory");
assert_not_equals(echoed, original,
"Structured cloning produces a fresh WebAssembly.Memory object");
assert_true(echoed.buffer instanceof SharedArrayBuffer,
"Echoed Memory's buffer is a SharedArrayBuffer");
assert_not_equals(echoed.buffer, original.buffer,
"Echoed Memory's buffer is a fresh SharedArrayBuffer wrapper");
assert_equals(echoed.buffer.byteLength, original.buffer.byteLength,
"Echoed Memory's buffer has the same byte length");
assert_equals(echoed.buffer.byteLength, 65536,
"Echoed Memory's buffer is one wasm page (64 KiB)");
assert_equals(new Int32Array(echoed.buffer)[0], 100,
"Echoed Memory observes writes made before cloning");
assert_equals(new Int32Array(original.buffer)[1], 200,
"Original Memory observes writes made by the destination");
}
promise_test(t => {
return new Promise(resolve => {
const memory = makeSharedMemory();
const worker = new Worker("resources/shared-memory-worker.js");
worker.onmessage = t.step_func(({ data }) => {
assertSharedRoundtrip(memory, data);
resolve();
});
worker.postMessage(memory);
});
}, "postMessaging a shared WebAssembly.Memory to a dedicated worker");
promise_test(t => {
return new Promise(resolve => {
const iframe = document.createElement("iframe");
iframe.src = "resources/shared-memory-iframe.html";
iframe.onload = t.step_func(() => {
const memory = makeSharedMemory();
window.onmessage = t.step_func(({ data }) => {
assertSharedRoundtrip(memory, data);
resolve();
});
iframe.contentWindow.postMessage(memory, "*");
});
document.body.appendChild(iframe);
});
}, "postMessaging a shared WebAssembly.Memory to a same-origin iframe");
promise_test(t => {
return new Promise(resolve => {
const memory = makeSharedMemory();
const channel = new MessageChannel();
channel.port2.onmessage = ({ data }) => {
new Int32Array(data.buffer)[1] = 200;
channel.port2.postMessage(data);
};
channel.port1.onmessage = t.step_func(({ data }) => {
assertSharedRoundtrip(memory, data);
resolve();
});
channel.port1.postMessage(memory);
});
}, "Cloning a shared WebAssembly.Memory through a MessageChannel");
</script>