summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/tests/testdata/run/event_listener_error_immediate_exit.ts.out4
-rw-r--r--cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out6
-rw-r--r--ext/web/02_event.js23
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;
+ }
}
}