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 <jasnell@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net>
1 parent 528f922 commit 88e7bd0

2 files changed

Lines changed: 20 additions & 1 deletion

File tree

‎lib/internal/event_target.js‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -521,8 +521,11 @@ class EventTarget {
521521
}
522522

523523
constroot=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
returntrue;
528+
}
526529

527530
lethandler=root.next;
528531
letnext;

‎test/parallel/test-eventtarget.js‎

Lines changed: 16 additions & 0 deletions
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+
constevent=newEvent('foo');
197+
consteventTarget1=newEventTarget();
198+
consteventTarget2=newEventTarget();
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)