multi_sharedWorker_manager.js (1544B)
1 var query = window.location.search; 2 var bc = new BroadcastChannel("bugSharedWorkerLiftetime" + query); 3 bc.onmessage = msgEvent => { 4 var msg = msgEvent.data; 5 var command = msg.command; 6 if (command == "postToWorker") { 7 postToWorker(msg.workerMessage); 8 } else if (command == "navigate") { 9 window.location = msg.location; 10 } else if (command == "finish") { 11 bc.postMessage({ command: "finished" }); 12 bc.close(); 13 window.close(); 14 } 15 }; 16 17 window.onload = () => { 18 bc.postMessage({ command: "loaded" }); 19 }; 20 21 function debug(message) { 22 if (typeof message != "string") { 23 throw new Error("debug() only accepts strings!"); 24 } 25 bc.postMessage({ command: "debug", message }); 26 } 27 28 let worker; 29 30 function postToWorker(msg) { 31 if (!worker) { 32 worker = new SharedWorker( 33 "multi_sharedWorker_sharedWorker.js", 34 "FrameWorker" 35 ); 36 worker.onerror = function (error) { 37 debug("Worker error: " + error.message); 38 error.preventDefault(); 39 40 let data = { 41 type: "error", 42 message: error.message, 43 filename: error.filename, 44 lineno: error.lineno, 45 isErrorEvent: error instanceof ErrorEvent, 46 }; 47 bc.postMessage({ command: "fromWorker", workerMessage: data }); 48 }; 49 50 worker.port.onmessage = function (message) { 51 debug("Worker message: " + JSON.stringify(message.data)); 52 bc.postMessage({ command: "fromWorker", workerMessage: message.data }); 53 }; 54 } 55 56 debug("Posting message: " + JSON.stringify(msg)); 57 worker.port.postMessage(msg); 58 }