Skip to content

Commit 88e7bd0

Browse files
mrbbottargos
authored andcommitted
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: #39772 Refs: #39395 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Anna Henningsen <[email protected]>
1 parent 528f922 commit 88e7bd0

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

lib/internal/event_target.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -521,8 +521,11 @@ class EventTarget {
521521
}
522522

523523
const root = this[kEvents].get(type);
524-
if (root === undefined || root.next === undefined)
524+
if (root === undefined || root.next === undefined) {
525+
if (event !== undefined)
526+
event[kIsBeingDispatched] = false;
525527
return true;
528+
}
526529

527530
let handler = root.next;
528531
let next;

test/parallel/test-eventtarget.js

+16
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,22 @@ let asyncTest = Promise.resolve();
186186
deepStrictEqual(event.composedPath(), []);
187187

188188

189+
eventTarget2.dispatchEvent(event);
190+
strictEqual(event.eventPhase, Event.NONE);
191+
strictEqual(event.target, eventTarget2);
192+
deepStrictEqual(event.composedPath(), []);
193+
}
194+
{
195+
// Same event dispatched multiple times, without listeners added.
196+
const event = new Event('foo');
197+
const eventTarget1 = new EventTarget();
198+
const eventTarget2 = new EventTarget();
199+
200+
eventTarget1.dispatchEvent(event);
201+
strictEqual(event.eventPhase, Event.NONE);
202+
strictEqual(event.target, eventTarget1);
203+
deepStrictEqual(event.composedPath(), []);
204+
189205
eventTarget2.dispatchEvent(event);
190206
strictEqual(event.eventPhase, Event.NONE);
191207
strictEqual(event.target, eventTarget2);

0 commit comments

Comments
 (0)