summaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'runtime')
-rw-r--r--runtime/js/11_workers.js14
-rw-r--r--runtime/js/99_main.js1
-rw-r--r--runtime/web_worker.rs7
-rw-r--r--runtime/worker.rs4
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.")