diff options
-rw-r--r-- | cli/tests/testdata/run/event_listener_error_immediate_exit.ts.out | 4 | ||||
-rw-r--r-- | cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out | 6 | ||||
-rw-r--r-- | ext/web/02_event.js | 23 |
3 files changed, 18 insertions, 15 deletions
diff --git a/cli/tests/testdata/run/event_listener_error_immediate_exit.ts.out b/cli/tests/testdata/run/event_listener_error_immediate_exit.ts.out index 2b1b26444..8f03f71b8 100644 --- a/cli/tests/testdata/run/event_listener_error_immediate_exit.ts.out +++ b/cli/tests/testdata/run/event_listener_error_immediate_exit.ts.out @@ -3,8 +3,4 @@ error: Uncaught Error: bar throw new Error("bar"); ^ at [WILDCARD]/event_listener_error_immediate_exit.ts:4:9[WILDCARD] - at innerInvokeEventListeners (ext:deno_web/02_event.js:785:7) - at invokeEventListeners (ext:deno_web/02_event.js:825:5) - at dispatch (ext:deno_web/02_event.js:694:9) - at dispatchEvent (ext:deno_web/02_event.js:1086:12) at [WILDCARD]/event_listener_error_immediate_exit.ts:11:1 diff --git a/cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out b/cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out index 8ab76d6cf..85b52190b 100644 --- a/cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out +++ b/cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out @@ -2,11 +2,7 @@ error: Uncaught (in worker "") Error: bar throw new Error("bar"); ^ - at [WILDCARD]/event_listener_error_immediate_exit.ts:4:9 - at innerInvokeEventListeners (ext:deno_web/02_event.js:785:7) - at invokeEventListeners (ext:deno_web/02_event.js:825:5) - at dispatch (ext:deno_web/02_event.js:694:9) - at dispatchEvent (ext:deno_web/02_event.js:1086:12) + at [WILDCARD]/event_listener_error_immediate_exit.ts:4:9[WILDCARD] at [WILDCARD]/event_listener_error_immediate_exit.ts:11:1 error: Uncaught (in promise) Error: Unhandled error in child worker. at [WILDCARD] diff --git a/ext/web/02_event.js b/ext/web/02_event.js index 6a5db3464..0372293cf 100644 --- a/ext/web/02_event.js +++ b/ext/web/02_event.js @@ -482,7 +482,7 @@ function getRoot(eventTarget) { function isNode( eventTarget, ) { - return Boolean(eventTarget && ReflectHas(eventTarget, "nodeType")); + return eventTarget?.nodeType !== undefined; } // https://dom.spec.whatwg.org/#concept-shadow-including-inclusive-ancestor @@ -734,8 +734,12 @@ function innerInvokeEventListeners( return found; } + let handlers = targetListeners[type]; + // Copy event listeners before iterating since the list can be modified during the iteration. - const handlers = ArrayPrototypeSlice(targetListeners[type]); + if (handlers.length > 1) { + handlers = ArrayPrototypeSlice(targetListeners[type]); + } for (let i = 0; i < handlers.length; i++) { const listener = handlers[i]; @@ -804,12 +808,19 @@ function innerInvokeEventListeners( * Ref: https://dom.spec.whatwg.org/#concept-event-listener-invoke */ function invokeEventListeners(tuple, eventImpl) { const path = getPath(eventImpl); - const tupleIndex = ArrayPrototypeIndexOf(path, tuple); - for (let i = tupleIndex; i >= 0; i--) { - const t = path[i]; + if (path.length === 1) { + const t = path[0]; if (t.target) { setTarget(eventImpl, t.target); - break; + } + } else { + const tupleIndex = ArrayPrototypeIndexOf(path, tuple); + for (let i = tupleIndex; i >= 0; i--) { + const t = path[i]; + if (t.target) { + setTarget(eventImpl, t.target); + break; + } } } |