From 88e7bd073a64c0138c031e6bcef71423b283d6d9 Mon Sep 17 00:00:00 2001 From: MrBBot Date: Sun, 15 Aug 2021 15:58:01 +0100 Subject: [PATCH] events: allow dispatch many times without listener Fast path for EventTarget dispatch with no listeners didn't reset kIsBeingDispatched flag, meaning same event couldn't be dispatched multiple times. PR-URL: https://github.com/nodejs/node/pull/39772 Refs: https://github.com/nodejs/node/pull/39395 Reviewed-By: James M Snell Reviewed-By: Luigi Pinca Reviewed-By: Anna Henningsen --- lib/internal/event_target.js | 5 ++++- test/parallel/test-eventtarget.js | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/internal/event_target.js b/lib/internal/event_target.js index 03b2540878c625..ddab605c8a3c6a 100644 --- a/lib/internal/event_target.js +++ b/lib/internal/event_target.js @@ -521,8 +521,11 @@ class EventTarget { } const root = this[kEvents].get(type); - if (root === undefined || root.next === undefined) + if (root === undefined || root.next === undefined) { + if (event !== undefined) + event[kIsBeingDispatched] = false; return true; + } let handler = root.next; let next; diff --git a/test/parallel/test-eventtarget.js b/test/parallel/test-eventtarget.js index cfad9c60a32c01..d3b1ee7358a104 100644 --- a/test/parallel/test-eventtarget.js +++ b/test/parallel/test-eventtarget.js @@ -186,6 +186,22 @@ let asyncTest = Promise.resolve(); deepStrictEqual(event.composedPath(), []); + eventTarget2.dispatchEvent(event); + strictEqual(event.eventPhase, Event.NONE); + strictEqual(event.target, eventTarget2); + deepStrictEqual(event.composedPath(), []); +} +{ + // Same event dispatched multiple times, without listeners added. + const event = new Event('foo'); + const eventTarget1 = new EventTarget(); + const eventTarget2 = new EventTarget(); + + eventTarget1.dispatchEvent(event); + strictEqual(event.eventPhase, Event.NONE); + strictEqual(event.target, eventTarget1); + deepStrictEqual(event.composedPath(), []); + eventTarget2.dispatchEvent(event); strictEqual(event.eventPhase, Event.NONE); strictEqual(event.target, eventTarget2);