| <!DOCTYPE html> |
| <meta charset=utf-8> |
| <title>WebCodecs objects cannot be deserialized in shared and service workers</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> |
| <script> |
| const WORKER = 'serialization-to-shared-and-service-workers-helper.js'; |
| const SCOPE = 'serialization-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; |
| } |
| |
| const types = [ |
| { |
| name: 'EncodedVideoChunk', |
| create: () => new EncodedVideoChunk({ type: 'key', timestamp: 0, data: new Uint8Array([1, 2, 3]) }) |
| }, |
| { |
| name: 'VideoFrame', |
| create: () => new VideoFrame(new Uint8Array(4 * 4 * 4), { format: 'RGBA', codedWidth: 4, codedHeight: 4, timestamp: 0 }), |
| transferable: true |
| }, |
| { |
| name: 'EncodedAudioChunk', |
| create: () => new EncodedAudioChunk({ type: 'key', timestamp: 0, data: new Uint8Array([1, 2, 3]) }) |
| }, |
| { |
| name: 'AudioData', |
| create: () => new AudioData({ format: 'f32', sampleRate: 8000, numberOfFrames: 4, numberOfChannels: 1, timestamp: 0, data: new Float32Array(4) }), |
| transferable: true |
| }, |
| ]; |
| |
| 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}`); |
| |
| for (const type of types) { |
| promise_test(async t => { |
| const object = type.create(); |
| t.add_cleanup(() => object.close?.()); |
| assert_equals(await worker.post(t, object), 'messageerror'); |
| }, `${type.name} cannot be cloned to a ${worker.name}`); |
| |
| if (type.transferable) { |
| promise_test(async t => { |
| const object = type.create(); |
| t.add_cleanup(() => object.close()); |
| assert_equals(await worker.post(t, object, [object]), 'messageerror'); |
| }, `${type.name} cannot be transferred to a ${worker.name}`); |
| } |
| } |
| } |
| </script> |