From cd16b969fa60ebd526ed1099f180047335936f4f Mon Sep 17 00:00:00 2001 From: vrugtehagel Date: Sun, 4 Jun 2023 11:35:48 +0200 Subject: [PATCH 1/4] Copy EventTarget list before dispatch --- ext/web/02_event.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ext/web/02_event.js b/ext/web/02_event.js index e7553ea89b70cb..eb54e640edc319 100644 --- a/ext/web/02_event.js +++ b/ext/web/02_event.js @@ -739,9 +739,7 @@ function innerInvokeEventListeners( let handlers = targetListeners[type]; // Copy event listeners before iterating since the list can be modified during the iteration. - if (handlers.length > 1) { - handlers = ArrayPrototypeSlice(targetListeners[type]); - } + handlers = ArrayPrototypeSlice(targetListeners[type]); for (let i = 0; i < handlers.length; i++) { const listener = handlers[i]; From ae73dd2b12ebaea1cb3e4c7424392f45e7a484fb Mon Sep 17 00:00:00 2001 From: vrugtehagel Date: Sun, 4 Jun 2023 14:41:57 +0200 Subject: [PATCH 2/4] Added test, and double checking with [ci] --- cli/tests/unit/event_target_test.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cli/tests/unit/event_target_test.ts b/cli/tests/unit/event_target_test.ts index 49bd354aa2d15c..c7acab364c5de2 100644 --- a/cli/tests/unit/event_target_test.ts +++ b/cli/tests/unit/event_target_test.ts @@ -245,6 +245,20 @@ Deno.test(function eventTargetDispatchShouldSetTargetInListener() { assertEquals(called, true); }); +Deno.test(function eventTargetDispatchShouldFireCurrentListenersOnly() { + const target = new EventTarget(); + const event = new Event("foo"); + let callCount = 0; + target.addEventListener("foo", () => { + ++callCount; + target.addEventListener("foo", () => { + ++callCount; + }); + }); + target.dispatchEvent(event); + assertEquals(callCount, 1); +}); + Deno.test(function eventTargetAddEventListenerGlobalAbort() { return new Promise((resolve) => { const c = new AbortController(); From 8bebe22d83c62cf8211c1700196ab7dd21f00441 Mon Sep 17 00:00:00 2001 From: Koen <41021050+vrugtehagel@users.noreply.github.com> Date: Sun, 4 Jun 2023 16:14:22 +0200 Subject: [PATCH 3/4] Change unnecessary let to const --- ext/web/02_event.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ext/web/02_event.js b/ext/web/02_event.js index eb54e640edc319..ab4b0597cd9b8b 100644 --- a/ext/web/02_event.js +++ b/ext/web/02_event.js @@ -736,10 +736,8 @@ function innerInvokeEventListeners( return found; } - let handlers = targetListeners[type]; - // Copy event listeners before iterating since the list can be modified during the iteration. - handlers = ArrayPrototypeSlice(targetListeners[type]); + const handlers = ArrayPrototypeSlice(targetListeners[type]); for (let i = 0; i < handlers.length; i++) { const listener = handlers[i]; From c3a721e1d0e6aeaebd75c3e9d1874e818ae33914 Mon Sep 17 00:00:00 2001 From: vrugtehagel Date: Sun, 4 Jun 2023 21:53:02 +0200 Subject: [PATCH 4/4] Keep performance optimization using suggestion --- ext/web/02_event.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ext/web/02_event.js b/ext/web/02_event.js index ab4b0597cd9b8b..142fa66b2b031f 100644 --- a/ext/web/02_event.js +++ b/ext/web/02_event.js @@ -736,10 +736,15 @@ function innerInvokeEventListeners( return found; } + let handlers = targetListeners[type]; + const handlersLength = handlers.length; + // Copy event listeners before iterating since the list can be modified during the iteration. - const handlers = ArrayPrototypeSlice(targetListeners[type]); + if (handlersLength > 1) { + handlers = ArrayPrototypeSlice(targetListeners[type]); + } - for (let i = 0; i < handlers.length; i++) { + for (let i = 0; i < handlersLength; i++) { const listener = handlers[i]; let capture, once, passive;