@@ -551,10 +551,16 @@ class Listener {
551551}
552552
553553function initEventTarget ( self ) {
554- self [ kEvents ] = new SafeMap ( ) ;
554+ self [ kEvents ] = undefined ;
555555self [ kMaxEventTargetListeners ] = EventEmitter . defaultMaxListeners ;
556556self [ kMaxEventTargetListenersWarned ] = false ;
557- self [ kHandlers ] = new SafeMap ( ) ;
557+ self [ kHandlers ] = undefined ;
558+ }
559+
560+ function getEventsMap ( self ) {
561+ if ( self [ kEvents ] === undefined )
562+ self [ kEvents ] = new SafeMap ( ) ;
563+ return self [ kEvents ] ;
558564}
559565
560566class EventTarget {
@@ -660,7 +666,8 @@ class EventTarget {
660666
661667type = webidl . converters . DOMString ( type ) ;
662668
663- let root = this [ kEvents ] . get ( type ) ;
669+ const eventsMap = getEventsMap ( this ) ;
670+ let root = eventsMap . get ( type ) ;
664671
665672if ( root === undefined ) {
666673root = { size : 1 , next : undefined , resistStopPropagation : Boolean ( resistStopPropagation ) } ;
@@ -675,7 +682,7 @@ class EventTarget {
675682capture ,
676683passive ,
677684weak ) ;
678- this [ kEvents ] . set ( type , root ) ;
685+ eventsMap . set ( type , root ) ;
679686return ;
680687}
681688
@@ -717,6 +724,9 @@ class EventTarget {
717724type = webidl . converters . DOMString ( type ) ;
718725const capture = options ?. capture === true ;
719726
727+ if ( this [ kEvents ] === undefined )
728+ return ;
729+
720730const root = this [ kEvents ] . get ( type ) ;
721731if ( root === undefined || root . next === undefined )
722732return ;
@@ -736,6 +746,9 @@ class EventTarget {
736746}
737747
738748[ kRemoveWeakListenerHelper ] ( type , listener ) {
749+ if ( this [ kEvents ] === undefined )
750+ return ;
751+
739752const root = this [ kEvents ] . get ( type ) ;
740753if ( root === undefined || root . next === undefined )
741754return ;
@@ -791,7 +804,7 @@ class EventTarget {
791804event [ kIsBeingDispatched ] = true ;
792805}
793806
794- const root = this [ kEvents ] . get ( type ) ;
807+ const root = this [ kEvents ] ? .get ( type ) ;
795808if ( root === undefined || root . next === undefined ) {
796809if ( event !== undefined )
797810event [ kIsBeingDispatched ] = false ;
@@ -927,6 +940,8 @@ class NodeEventTarget extends EventTarget {
927940eventNames ( ) {
928941if ( ! isNodeEventTarget ( this ) )
929942throw new ERR_INVALID_THIS ( 'NodeEventTarget' ) ;
943+ if ( this [ kEvents ] === undefined )
944+ return [ ] ;
930945return ArrayFrom ( this [ kEvents ] . keys ( ) ) ;
931946}
932947
@@ -937,6 +952,8 @@ class NodeEventTarget extends EventTarget {
937952listenerCount ( type ) {
938953if ( ! isNodeEventTarget ( this ) )
939954throw new ERR_INVALID_THIS ( 'NodeEventTarget' ) ;
955+ if ( this [ kEvents ] === undefined )
956+ return 0 ;
940957const root = this [ kEvents ] . get ( String ( type ) ) ;
941958return root !== undefined ? root . size : 0 ;
942959}
@@ -1029,11 +1046,12 @@ class NodeEventTarget extends EventTarget {
10291046removeAllListeners ( type ) {
10301047if ( ! isNodeEventTarget ( this ) )
10311048throw new ERR_INVALID_THIS ( 'NodeEventTarget' ) ;
1032- if ( type !== undefined ) {
1049+ if ( this [ kEvents ] === undefined )
1050+ return this ;
1051+ if ( type !== undefined )
10331052this [ kEvents ] . delete ( String ( type ) ) ;
1034- } else {
1053+ else
10351054this [ kEvents ] . clear ( ) ;
1036- }
10371055
10381056return this ;
10391057}
@@ -1145,18 +1163,29 @@ function defineEventHandler(emitter, name, event = name) {
11451163
11461164function set ( value ) {
11471165validateThisInternalField ( this , kHandlers , 'EventTarget' ) ;
1148- let wrappedHandler = this [ kHandlers ] ?. get ( event ) ;
1166+ if ( this [ kHandlers ] === undefined )
1167+ this [ kHandlers ] = new SafeMap ( ) ;
1168+ let wrappedHandler = this [ kHandlers ] . get ( event ) ;
11491169if ( wrappedHandler ) {
1170+ const eventsMap = getEventsMap ( this ) ;
11501171if ( typeof wrappedHandler . handler === 'function' ) {
1151- this [ kEvents ] . get ( event ) . size -- ;
1152- const size = this [ kEvents ] . get ( event ) . size ;
1153- this [ kRemoveListener ] ( size , event , wrappedHandler . handler , false ) ;
1172+ const root = eventsMap . get ( event ) ;
1173+ if ( root !== undefined ) {
1174+ root . size -- ;
1175+ this [ kRemoveListener ] ( root . size , event , wrappedHandler . handler , false ) ;
1176+ }
11541177}
11551178wrappedHandler . handler = value ;
11561179if ( typeof wrappedHandler . handler === 'function' ) {
1157- this [ kEvents ] . get ( event ) . size ++ ;
1158- const size = this [ kEvents ] . get ( event ) . size ;
1159- this [ kNewListener ] ( size , event , value , false , false , false , false ) ;
1180+ const root = eventsMap . get ( event ) ;
1181+ if ( root !== undefined ) {
1182+ root . size ++ ;
1183+ this [ kNewListener ] ( root . size , event , value , false , false , false , false ) ;
1184+ } else {
1185+ // The wrapper was externally removed from kEvents (e.g. via
1186+ // removeEventListener); re-register it so the handler fires.
1187+ this . addEventListener ( event , wrappedHandler ) ;
1188+ }
11601189}
11611190} else {
11621191wrappedHandler = makeEventHandler ( value ) ;
0 commit comments