Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

  • This test has a WPT meta file that expects 2 subtest issues.
  • This WPT test may be referenced by the following Test IDs:
<!DOCTYPE html>
<meta charset=utf-8>
<title>MediaStreamTrackHandle cannot be transferred to shared and service workers</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
<script src="/mediacapture-streams/permission-helper.js"></script>
<script>
const WORKER = 'MediaStreamTrackHandle-transfer-to-shared-and-service-workers-helper.js';
const SCOPE = 'MediaStreamTrackHandle-transfer-to-shared-and-service-workers-scope/';
function postToSharedWorker(t, value, transfer = []) {
const worker = new SharedWorker(WORKER, { name: `${t.name}` });
const result = new Promise(resolve => worker.port.onmessage = e => resolve(e.data));
worker.port.postMessage(value, transfer);
return result;
}
async function postToServiceWorker(t, value, transfer = []) {
const registration = await service_worker_unregister_and_register(t, WORKER, SCOPE);
t.add_cleanup(() => registration.unregister());
await wait_for_state(t, registration.installing, 'activated');
const result = new Promise(resolve => navigator.serviceWorker.onmessage = e => resolve(e.data));
registration.active.postMessage(value, transfer);
return result;
}
async function createHandle(t) {
await setMediaPermission('granted', ['camera']);
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const track = stream.getVideoTracks()[0];
t.add_cleanup(() => track.stop());
return new MediaStreamTrackHandle(track);
}
const workers = [
{ name: 'shared worker', post: postToSharedWorker },
{ name: 'service worker', post: postToServiceWorker },
];
for (const worker of workers) {
promise_test(async t => {
assert_equals(await worker.post(t, { value: 1 }), 'message');
}, `A plain object can be posted to a ${worker.name}`);
promise_test(async t => {
const handle = await createHandle(t);
assert_equals(await worker.post(t, handle, [handle]), 'messageerror');
}, `MediaStreamTrackHandle cannot be transferred to a ${worker.name}`);
}
</script>