From 4d18f558e4cfebc5b8d9d594401e3ce74fc3226b Mon Sep 17 00:00:00 2001 From: Nayeem Rahman Date: Wed, 13 Apr 2022 10:50:57 +0100 Subject: feat(ext/web): Add error events for event listener and timer errors (#14159) - feat: Add handleable error event for even listener errors - feat: Add handleable error event for setTimeout()/setInterval() errors - feat: Add Deno.core.destructureError() - feat: Add Deno.core.terminate() - fix: Don't throw listener errors from dispatchEvent() - fix: Use biased mode when selecting between mod_evaluate() and run_event_loop() results --- runtime/js/11_workers.js | 14 ++++++++------ runtime/js/99_main.js | 1 + 2 files changed, 9 insertions(+), 6 deletions(-) (limited to 'runtime/js') 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"); -- cgit v1.2.3