diff options
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/js/11_workers.js | 14 | ||||
-rw-r--r-- | runtime/js/99_main.js | 1 | ||||
-rw-r--r-- | runtime/web_worker.rs | 7 | ||||
-rw-r--r-- | runtime/worker.rs | 4 |
4 files changed, 18 insertions, 8 deletions
diff --git a/runtime/js/11_workers.js b/runtime/js/11_workers.js index 80e85a3a1..5b8d03e71 100644 --- a/runtime/js/11_workers.js +++ b/runtime/js/11_workers.js @@ -140,14 +140,16 @@ error: null, }); - let handled = false; - this.dispatchEvent(event); - if (event.defaultPrevented) { - handled = true; + // Don't bubble error event to window for loader errors (`!e.fileName`). + // TODO(nayeemrmn): Currently these are never bubbled because worker + // error event fields aren't populated correctly and `e.fileName` is + // always empty. + if (e.fileName && !event.defaultPrevented) { + window.dispatchEvent(event); } - return handled; + return event.defaultPrevented; } #pollControl = async () => { @@ -165,7 +167,7 @@ } /* falls through */ case 2: { // Error if (!this.#handleError(data)) { - throw new Error("Unhandled error event in child worker."); + throw new Error("Unhandled error in child worker."); } break; } diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index 3a37abeab..44d457e5c 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -558,6 +558,7 @@ delete Object.prototype.__proto__; eventTarget.setEventTargetData(globalThis); + defineEventHandler(window, "error"); defineEventHandler(window, "load"); defineEventHandler(window, "unload"); diff --git a/runtime/web_worker.rs b/runtime/web_worker.rs index 0e3167041..014b3e738 100644 --- a/runtime/web_worker.rs +++ b/runtime/web_worker.rs @@ -119,6 +119,7 @@ pub struct WebWorkerInternalHandle { has_terminated: Arc<AtomicBool>, terminate_waker: Arc<AtomicWaker>, isolate_handle: v8::IsolateHandle, + pub name: String, pub worker_type: WebWorkerType, } @@ -264,6 +265,7 @@ impl WebWorkerHandle { fn create_handles( isolate_handle: v8::IsolateHandle, + name: String, worker_type: WebWorkerType, ) -> (WebWorkerInternalHandle, SendableWebWorkerHandle) { let (parent_port, worker_port) = create_entangled_message_port(); @@ -272,13 +274,14 @@ fn create_handles( let has_terminated = Arc::new(AtomicBool::new(false)); let terminate_waker = Arc::new(AtomicWaker::new()); let internal_handle = WebWorkerInternalHandle { - sender: ctrl_tx, + name, port: Rc::new(parent_port), termination_signal: termination_signal.clone(), has_terminated: has_terminated.clone(), terminate_waker: terminate_waker.clone(), isolate_handle: isolate_handle.clone(), cancel: CancelHandle::new_rc(), + sender: ctrl_tx, worker_type, }; let external_handle = SendableWebWorkerHandle { @@ -452,7 +455,7 @@ impl WebWorker { let (internal_handle, external_handle) = { let handle = js_runtime.v8_isolate().thread_safe_handle(); let (internal_handle, external_handle) = - create_handles(handle, options.worker_type); + create_handles(handle, name.clone(), options.worker_type); let op_state = js_runtime.op_state(); let mut op_state = op_state.borrow_mut(); op_state.put(internal_handle.clone()); diff --git a/runtime/worker.rs b/runtime/worker.rs index db9490dbe..983f174aa 100644 --- a/runtime/worker.rs +++ b/runtime/worker.rs @@ -217,6 +217,10 @@ impl MainWorker { async fn evaluate_module(&mut self, id: ModuleId) -> Result<(), AnyError> { let mut receiver = self.js_runtime.mod_evaluate(id); tokio::select! { + // Not using biased mode leads to non-determinism for relatively simple + // programs. + biased; + maybe_result = &mut receiver => { debug!("received module evaluate {:#?}", maybe_result); maybe_result.expect("Module evaluation result not provided.") |