blob: afc81409cdbf0190288429a0606903c133e7f86b [file] [log] [blame] [edit]
<!DOCTYPE html>
<html>
<header>
<script src='/resources/testharness.js'></script>
<script src='/resources/testharnessreport.js'></script>
</header>
<body>
<script>
var defaultInit = {
timestamp : 100,
duration : 33,
}
function createDefaultVideoFrame(timestamp) {
if (!timestamp)
timestamp = defaultInit.timestamp;
const init = {
format: 'I420',
timestamp,
codedWidth: 4,
codedHeight: 2,
timestamp,
duration: defaultInit.duration
};
const data = new Uint8Array([
1, 2, 3, 4, 5, 6, 7, 8, // y
1, 2, // u
1, 2, // v
]);
return new VideoFrame(data, init);
}
async function createWorker(script)
{
script += "self.postMessage('ready');";
const blob = new Blob([script], { type: 'text/javascript' });
const url = URL.createObjectURL(blob);
const worker = new Worker(URL.createObjectURL(blob));
await new Promise(resolve => worker.onmessage = () => {
resolve();
});
URL.revokeObjectURL(url);
return worker;
}
promise_test(async t => {
let localFrame = createDefaultVideoFrame();
const worker = await createWorker(`
self.onmessage = (event) => {
let externalFrame = event.data;
externalFrame.close();
self.postMessage("Done");
}
`);
const promise = new Promise(resolve => worker.onmessage = resolve);
worker.postMessage(localFrame);
await promise;
assert_equals(localFrame.timestamp, defaultInit.timestamp);
localFrame.close();
}, 'Verify closing frames does not propagate accross contexts with Worker.postMessage.');
promise_test(async t => {
let localFrame = createDefaultVideoFrame();
const worker = await createWorker(`
self.onmessage = (event) => {
let externalFrame = event.data;
self.postMessage(externalFrame.timestamp);
externalFrame.close();
}
`);
const promise = new Promise(resolve => worker.onmessage = event => resolve(event.data));
worker.postMessage(localFrame);
assert_equals(await promise, defaultInit.timestamp);
localFrame.close();
}, 'Verify transferring frames closes them with Worker.postMessage.');
promise_test(async t => {
const frame0 = createDefaultVideoFrame(1);
const frame1 = createDefaultVideoFrame(2);
t.add_cleanup(() => {
frame0.close();
frame1.close();
});
const channel = new MessageChannel;
const promise = new Promise(resolve => channel.port2.onmessage = (e) => resolve(e.data));
channel.port1.postMessage([frame0, frame1]);
const frames = await promise;
t.add_cleanup(() => {
frames[0].close();
frames[1].close();
});
assert_equals(frames[0].timestamp, frame0.timestamp);
assert_equals(frames[1].timestamp, frame1.timestamp);
}, 'Verify serializing more than one video frame');
</script>
</body>
</html>