shared-worker-from-blob-url.window.js (2508B)
1 function message_from_port(port) { 2 return new Promise(resolve => { 3 port.onmessage = e => resolve(e.data); 4 }); 5 } 6 7 promise_test(async t => { 8 const run_result = 'worker_OK_'; 9 const blob_contents = 10 'self.counter = 0; self.onconnect = e => {++self.counter;' + 11 'e.source.postMessage("' + run_result + '" + self.counter); };'; 12 const blob = new Blob([blob_contents]); 13 const url = URL.createObjectURL(blob); 14 15 const worker1 = new SharedWorker(url); 16 const reply1 = await message_from_port(worker1.port); 17 assert_equals(reply1, run_result + '1'); 18 const worker2 = new SharedWorker(url); 19 const reply2 = await message_from_port(worker2.port); 20 assert_equals(reply2, run_result + '2'); 21 }, 'Creating a shared worker from a blob URL works.'); 22 23 promise_test(async t => { 24 const run_result = 'worker_OK'; 25 const blob_contents = 26 'self.onconnect = e => { e.source.postMessage("' + run_result + '"); };'; 27 const blob = new Blob([blob_contents]); 28 const url = URL.createObjectURL(blob); 29 30 const worker = new SharedWorker(url); 31 URL.revokeObjectURL(url); 32 33 const reply = await message_from_port(worker.port); 34 assert_equals(reply, run_result); 35 }, 'Creating a shared worker from a blob URL works immediately before revoking.'); 36 37 promise_test(async t => { 38 const run_result = 'worker_OK_'; 39 const blob_contents = 40 'self.counter = 0; self.onconnect = e => {++self.counter;' + 41 'e.source.postMessage("' + run_result + '" + self.counter); };'; 42 const blob = new Blob([blob_contents]); 43 const url = URL.createObjectURL(blob); 44 45 const worker1 = new SharedWorker(url); 46 URL.revokeObjectURL(url); 47 48 const reply1 = await message_from_port(worker1.port); 49 assert_equals(reply1, run_result + '1'); 50 const worker2 = new SharedWorker(url); 51 const reply2 = await message_from_port(worker2.port); 52 assert_equals(reply2, run_result + '2'); 53 }, 'Connecting to a shared worker on a revoked blob URL works.'); 54 55 promise_test(async t => { 56 const run_result = false; 57 const blob_contents = ` 58 let constructedRequest = false; 59 try { 60 new Request("./file.js"); 61 constructedRequest = true; 62 } catch (e) {} 63 self.postMessage(constructedRequest); 64 `; 65 const blob = new Blob([blob_contents]); 66 const url = URL.createObjectURL(blob); 67 68 const worker = new SharedWorker(url); 69 const reply = await message_from_port(worker); 70 assert_equals(reply, run_result, "Should not be able to resolve request with relative file path in blob"); 71 }, 'Blob URLs should not resolve relative to document base URL.');