blob: de9a6873f64f8d989d583499ff2191ba4f0e9474 [file] [log] [blame]
<!DOCTYPE html>
<meta charset="utf-8">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<script>
'use strict';
async function readAll(rs) {
const reader = rs.getReader();
const seq = [];
while (true) {
const {value, done} = await reader.read();
if (done) {
break;
}
seq.push(value);
}
return seq;
}
async function writeAll(ws, seq) {
const writer = ws.getWriter();
for (const data of seq) {
await writer.write(data);
}
await writer.close();
writer.releaseLock();
}
function createIframe() {
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
return iframe;
}
async_test((t) => {
Promise.resolve().then(async () => {
const iframe = createIframe();
const rs = internals.createReadableStream(3, '');
iframe.contentWindow.postMessage(rs, '*', [rs]);
const ev = await new Promise((r) => iframe.contentWindow.onmessage = r);
const seq = await readAll(ev.data);
assert_array_equals(seq, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
}).then(() => t.done(), t.step_func((e) => assert_unreached(e)));
}, '[rs] transferring between frames; optimizer is not used');
async_test((t) => {
Promise.resolve().then(async () => {
const iframe = createIframe();
const rs = internals.createReadableStream(3, 'perform-null');
iframe.contentWindow.postMessage(rs, '*', [rs]);
const ev = await new Promise((r) => iframe.contentWindow.onmessage = r);
const seq = await readAll(ev.data);
assert_array_equals(seq, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
}).then(() => t.done(), t.step_func((e) => assert_unreached(e)));
}, '[rs] transferring between frames; non-null but doing nothing optimizer is used');
async_test((t) => {
Promise.resolve().then(async () => {
const iframe = createIframe();
const rs = internals.createReadableStream(3, 'observable');
iframe.contentWindow.postMessage(rs, '*', [rs]);
const ev = await new Promise((r) => iframe.contentWindow.onmessage = r);
const seq = await readAll(ev.data);
assert_array_equals(
seq, [100, 101, 102, 103, 204, 205, 206, 207, 208, 209]);
}).then(() => t.done(), t.step_func((e) => assert_unreached(e)));
}, '[rs] transferring between frames; observable optimizer is used');
async_test((t) => {
Promise.resolve().then(async () => {
const iframe = createIframe();
const rs = internals.createReadableStream(3, 'perfect');
iframe.contentWindow.postMessage(rs, '*', [rs]);
const ev = await new Promise((r) => iframe.contentWindow.onmessage = r);
const seq = await readAll(ev.data);
assert_array_equals(seq, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
}).then(() => t.done(), t.step_func((e) => assert_unreached(e)));
}, '[rs] transferring between frames; perfect optimizer is used');
async_test((t) => {
Promise.resolve().then(async () => {
const iframe = createIframe();
const rs = internals.createReadableStream(3, 'perfect');
const reader = rs.getReader();
await reader.read();
await reader.read();
reader.releaseLock();
iframe.contentWindow.postMessage(rs, '*', [rs]);
const ev = await new Promise((r) => iframe.contentWindow.onmessage = r);
const seq = await readAll(ev.data);
assert_array_equals(seq, [2, 3, 4, 5, 6, 7, 8, 9]);
}).then(() => t.done(), t.step_func((e) => assert_unreached(e)));
}, '[rs] transferring between frames; read chunks before transferring');
async_test((t) => {
Promise.resolve().then(async () => {
const worker = new Worker('resources/transferring-back-worker.js');
const rs = internals.createReadableStream(3, 'perfect');
const mc = new MessageChannel();
worker.postMessage({port: mc.port2}, [mc.port2]);
mc.port1.start();
mc.port1.postMessage({rs}, [rs]);
const ev = await new Promise((r) => mc.port1.onmessage = r);
const seq = await readAll(ev.data.rs);
assert_array_equals(seq, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
}).then(() => t.done(), t.step_func((e) => assert_unreached(e)));
}, '[rs] transferring to worker; perfect optimizer is used');
async_test((t) => {
Promise.resolve().then(async () => {
const iframe = createIframe();
const {stream: ws, sink} = internals.createWritableStreamAndSink(3, '');
const writer = ws.getWriter();
writer.write(1);
writer.write(2);
writer.releaseLock();
iframe.contentWindow.postMessage(ws, '*', [ws]);
const ev = await new Promise((r) => iframe.contentWindow.onmessage = r);
await writeAll(ev.data, [3, 4, 5]);
assert_equals(await sink, '12345');
}).then(() => t.done(), t.step_func((e) => assert_unreached(e)));
}, '[ws] transferring between frames; non-null but doing nothing optimizer is used');
async_test((t) => {
Promise.resolve().then(async () => {
const iframe = createIframe();
const {stream: ws, sink}
= internals.createWritableStreamAndSink(3, 'perform-null');
const writer = ws.getWriter();
writer.write(1);
writer.write(2);
writer.releaseLock();
iframe.contentWindow.postMessage(ws, '*', [ws]);
const ev = await new Promise((r) => iframe.contentWindow.onmessage = r);
await writeAll(ev.data, [3, 4, 5]);
assert_equals(await sink, '12345');
}).then(() => t.done(), t.step_func((e) => assert_unreached(e)));
}, '[ws] transferring between frames; optimizer is not used');
async_test((t) => {
Promise.resolve().then(async () => {
const iframe = createIframe();
const {stream: ws, sink}
= internals.createWritableStreamAndSink(3, 'observable');
const writer = ws.getWriter();
writer.write(1);
writer.write(2);
writer.releaseLock();
iframe.contentWindow.postMessage(ws, '*', [ws]);
const ev = await new Promise((r) => iframe.contentWindow.onmessage = r);
await writeAll(ev.data, [3, 4, 5]);
assert_equals(await sink, 'A12A345');
}).then(() => t.done(), t.step_func((e) => assert_unreached(e)));
}, '[ws] transferring between frames; observable optimizer is used');
async_test((t) => {
Promise.resolve().then(async () => {
const iframe = createIframe();
const {stream: ws, sink}
= internals.createWritableStreamAndSink(3, 'perfect');
const writer = ws.getWriter();
writer.write(1);
writer.write(2);
writer.releaseLock();
iframe.contentWindow.postMessage(ws, '*', [ws]);
const ev = await new Promise((r) => iframe.contentWindow.onmessage = r);
const seq = await writeAll(ev.data, [3, 4, 5]);
assert_equals(await sink, '12345');
}).then(() => t.done(), t.step_func((e) => assert_unreached(e)));
}, '[ws] transferring between frames; perfect optimizer is used');
async_test((t) => {
Promise.resolve().then(async () => {
const worker = new Worker('resources/transferring-back-worker.js');
const {stream: ws, sink}
= internals.createWritableStreamAndSink(3, 'observable');
const mc = new MessageChannel();
let writer = ws.getWriter();
writer.write(1);
writer.write(2);
writer.releaseLock();
worker.postMessage({port: mc.port2}, [mc.port2]);
mc.port1.start();
mc.port1.postMessage({ws}, [ws]);
const ev = await new Promise((r) => mc.port1.onmessage = r);
await writeAll(ev.data.ws, [3, 4, 5]);
assert_equals(await sink, 'A12A345');
}).then(() => t.done(), t.step_func((e) => assert_unreached(e)));
}, '[ws] transferring to worker; observable optimizer is used');
</script>
</body>