summaryrefslogtreecommitdiff
path: root/cli/tests/unit/event_target_test.ts
diff options
context:
space:
mode:
authorKoen <41021050+vrugtehagel@users.noreply.github.com>2023-06-05 02:03:44 +0200
committerGitHub <noreply@github.com>2023-06-04 18:03:44 -0600
commitadf41edda12a26a84cb8b4252404aae2a9e7ae03 (patch)
treebea8a0a96318df38674620f726fef8d6064f2f0b /cli/tests/unit/event_target_test.ts
parent34dac6c6efa75f38c29031a65db1ee3332a67259 (diff)
fix(ext/web): Copy EventTarget list before dispatch (#19360)
Related issue: https://github.com/denoland/deno/issues/19358. This is a regression that seems to have been introduced in https://github.com/denoland/deno/pull/18905. It looks to have been a performance optimization. The issue is probably easiest described with some code: ```ts const target = new EventTarget(); const event = new Event("foo"); target.addEventListener("foo", () => { console.log('base'); target.addEventListener("foo", () => { console.log('nested'); }); }); target.dispatchEvent(event); ``` Essentially, the second event listener is being attached while the `foo` event is still being dispatched. It should then not fire that second event listener, but Deno currently does.
Diffstat (limited to 'cli/tests/unit/event_target_test.ts')
-rw-r--r--cli/tests/unit/event_target_test.ts14
1 files changed, 14 insertions, 0 deletions
diff --git a/cli/tests/unit/event_target_test.ts b/cli/tests/unit/event_target_test.ts
index 49bd354aa..c7acab364 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();