encodedVideoChunk-serialization.crossAgentCluster.https.html (6052B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <script src='/resources/testharness.js'></script> 5 <script src='/resources/testharnessreport.js'></script> 6 <script src='/common/get-host-info.sub.js'></script> 7 <script src='/webcodecs/utils.js'></script> 8 <script id='workerCode' type='javascript/worker'> 9 self.onmessage = (e) => { 10 postMessage(e.data); 11 }; 12 </script> 13 <script id='sharedWorkerCode' type='javascript/worker'> 14 let received = new Map(); 15 self.onconnect = function (event) { 16 const port = event.ports[0]; 17 port.onmessage = function (e) { 18 if (e.data == 'create-chunk') { 19 let chunkOrError = null; 20 try { 21 chunkOrError = new EncodedVideoChunk({ 22 type: 'key', 23 timestamp: 0, 24 duration: 1, 25 data: new Uint8Array([2, 3, 4, 5]) 26 }); 27 } catch (error) { 28 chunkOrError = error 29 } 30 port.postMessage(chunkOrError); 31 return; 32 } 33 if (e.data.hasOwnProperty('id')) { 34 port.postMessage( 35 received.get(e.data.id) ? 'RECEIVED' : 'NOT_RECEIVED'); 36 return; 37 } 38 if (e.data.toString() == '[object EncodedVideoChunk]') { 39 received.set(e.data.timestamp, e.data); 40 } 41 }; 42 }; 43 </script> 44 </head> 45 <body> 46 <script> 47 const HELPER = '/webcodecs/encodedVideoChunk-serialization.crossAgentCluster.helper.html'; 48 const SAMEORIGIN_BASE = get_host_info().HTTPS_ORIGIN; 49 const CROSSORIGIN_BASE = get_host_info().HTTPS_NOTSAMESITE_ORIGIN; 50 const SAMEORIGIN_HELPER = SAMEORIGIN_BASE + HELPER; 51 const CROSSORIGIN_HELPER = CROSSORIGIN_BASE + HELPER; 52 const SERVICE_WORKER = 'serialization.crossAgentCluster.serviceworker.js'; 53 54 promise_test(async () => { 55 const target = (await appendIframe(SAMEORIGIN_HELPER)).contentWindow; 56 let chunk = createEncodedVideoChunk(10); 57 assert_true(await canSerializeEncodedVideoChunk(target, chunk)); 58 }, 'Verify chunks can be passed within the same agent clusters'); 59 60 promise_test(async () => { 61 const target = (await appendIframe(CROSSORIGIN_HELPER)).contentWindow; 62 let chunk = createEncodedVideoChunk(20); 63 assert_false(await canSerializeEncodedVideoChunk(target, chunk)); 64 }, 'Verify chunks cannot be passed accross the different agent clusters'); 65 66 promise_test(async () => { 67 const blob = new Blob([document.querySelector('#workerCode').textContent], { 68 type: 'text/javascript', 69 }); 70 const worker = new Worker(window.URL.createObjectURL(blob)); 71 let chunk = createEncodedVideoChunk(30); 72 worker.postMessage(chunk); 73 const received = await new Promise(resolve => worker.onmessage = e => { 74 resolve(e.data); 75 }); 76 assert_equals(received.toString(), '[object EncodedVideoChunk]'); 77 assert_equals(received.timestamp, 30); 78 }, 'Verify chunks can be passed back and forth between main and worker'); 79 80 promise_test(async () => { 81 const encodedScriptText = btoa("self.onmessage = (e) => { postMessage(e.data);};"); 82 const scriptURL = 'data:text/javascript;base64,' + encodedScriptText; 83 const worker = new Worker(scriptURL); 84 let chunk = createEncodedVideoChunk(40); 85 worker.postMessage(chunk); 86 const received = await new Promise(resolve => worker.onmessage = e => { 87 resolve(e.data); 88 }); 89 assert_equals(received.toString(), '[object EncodedVideoChunk]'); 90 assert_equals(received.timestamp, 40); 91 92 }, 'Verify chunks can be passed back and forth between main and data-url worker'); 93 94 promise_test(async () => { 95 const blob = new Blob([document.querySelector('#sharedWorkerCode').textContent], { 96 type: 'text/javascript', 97 }); 98 const worker = new SharedWorker(window.URL.createObjectURL(blob)); 99 let chunk = createEncodedVideoChunk(50); 100 worker.port.postMessage(chunk); 101 worker.port.postMessage({'id': 50}); 102 const received = await new Promise(resolve => worker.port.onmessage = e => { 103 resolve(e.data); 104 }); 105 assert_equals(received, 'NOT_RECEIVED'); 106 }, 'Verify chunks cannot be passed to sharedworker'); 107 108 promise_test(async () => { 109 navigator.serviceWorker.register(SERVICE_WORKER); 110 navigator.serviceWorker.ready.then((registration) => { 111 let chunk = createEncodedVideoChunk(60); 112 registration.active.postMessage(chunk); 113 registration.active.postMessage({'encodedVideoChunkId': 60}); 114 }); 115 const received = await new Promise(resolve => 116 navigator.serviceWorker.onmessage = (e) => { resolve(e.data); }); 117 assert_equals(received, 'NOT_RECEIVED'); 118 }, 'Verify chunks cannot be passed to serviceworker'); 119 120 promise_test(async () => { 121 const blob = new Blob([document.querySelector('#sharedWorkerCode').textContent], { 122 type: 'text/javascript', 123 }); 124 const worker = new SharedWorker(window.URL.createObjectURL(blob)); 125 worker.port.postMessage('create-chunk'); 126 const received = await new Promise(resolve => worker.port.onmessage = e => { 127 resolve(e.data); 128 }); 129 assert_true(received instanceof ReferenceError); 130 }, 'Verify chunks is unavailable in sharedworker'); 131 132 promise_test(async () => { 133 navigator.serviceWorker.register(SERVICE_WORKER); 134 let registration = await navigator.serviceWorker.ready; 135 registration.active.postMessage('create-EncodedVideoChunk'); 136 const received = await new Promise(resolve => 137 navigator.serviceWorker.onmessage = (e) => { resolve(e.data); }); 138 assert_true(received instanceof ReferenceError); 139 }, 'Verify chunks is unavailable in serviceworker'); 140 141 function appendIframe(src) { 142 const frame = document.createElement('iframe'); 143 document.body.appendChild(frame); 144 frame.src = src; 145 return new Promise(resolve => frame.onload = () => resolve(frame)); 146 }; 147 148 function createEncodedVideoChunk(ts) { 149 return new EncodedVideoChunk({ 150 type: 'key', 151 timestamp: ts, 152 duration: 1234, 153 data: new Uint8Array([5, 6, 7, 8]) 154 }); 155 } 156 157 function canSerializeEncodedVideoChunk(target, chunk) { 158 target.postMessage(chunk, '*'); 159 target.postMessage({'id': chunk.timestamp}, '*'); 160 return new Promise(resolve => window.onmessage = e => { 161 resolve(e.data == 'RECEIVED'); 162 }); 163 }; 164 </script> 165 </body> 166 </html>