nested-blob-url-workers.html (1201B)
1 <!doctype html> 2 <script> 3 const baseLocation = window.location; 4 const parentWorkerScript = ` 5 const childWorkerScript = 'self.onmessage = async (e) => {' + 6 ' const response = await fetch(e.data);' + 7 ' const text = await response.text();' + 8 ' self.postMessage(text);' + 9 '};'; 10 const blob = new Blob([childWorkerScript], { type: 'text/javascript' }); 11 const blobUrl = URL.createObjectURL(blob); 12 const childWorker = new Worker(blobUrl); 13 14 // When a message comes from the parent frame, sends a resource url to the 15 // child worker. 16 self.onmessage = (e) => { 17 childWorker.postMessage(e.data); 18 }; 19 // When a message comes from the child worker, sends a content of fetch() to 20 // the parent frame. 21 childWorker.onmessage = (e) => { 22 self.postMessage(e.data); 23 }; 24 `; 25 const blob = new Blob([parentWorkerScript], { type: 'text/javascript' }); 26 const blobUrl = URL.createObjectURL(blob); 27 const worker = new Worker(blobUrl); 28 29 function fetch_in_worker(url) { 30 const resourceUrl = new URL(url, baseLocation).href; 31 return new Promise((resolve) => { 32 worker.onmessage = (event) => { 33 resolve(event.data); 34 }; 35 worker.postMessage(resourceUrl); 36 }); 37 } 38 </script>