@@ -121,6 +121,11 @@ export class EventDelegator {
121121 for ( const handlerInfo of infosForElement . enumerateHandlers ( ) ) {
122122 this . eventInfoStore . remove ( handlerInfo . eventHandlerId ) ;
123123 }
124+
125+ for ( const eventName of infosForElement . enumeratedEventNamesForEnabledFlags ( ) ) {
126+ this . eventInfoStore . decrementCountByEventName ( eventName ) ;
127+ }
128+
124129 delete element [ this . eventsCollectionKey ] ;
125130 }
126131 }
@@ -135,12 +140,26 @@ export class EventDelegator {
135140
136141 public setStopPropagation ( element : Element , eventName : string , value : boolean ) : void {
137142 const infoForElement = this . getEventHandlerInfosForElement ( element , true ) ! ;
143+ const currentValue = infoForElement . stopPropagation ( eventName ) ;
138144 infoForElement . stopPropagation ( eventName , value ) ;
145+
146+ if ( ! currentValue && value ) {
147+ this . eventInfoStore . addGlobalListener ( eventName ) ;
148+ } else if ( currentValue && ! value ) {
149+ this . eventInfoStore . decrementCountByEventName ( eventName ) ;
150+ }
139151 }
140152
141153 public setPreventDefault ( element : Element , eventName : string , value : boolean ) : void {
142154 const infoForElement = this . getEventHandlerInfosForElement ( element , true ) ! ;
155+ const currentValue = infoForElement . preventDefault ( eventName ) ;
143156 infoForElement . preventDefault ( eventName , value ) ;
157+
158+ if ( ! currentValue && value ) {
159+ this . eventInfoStore . addGlobalListener ( eventName ) ;
160+ } else if ( currentValue && ! value ) {
161+ this . eventInfoStore . decrementCountByEventName ( eventName ) ;
162+ }
144163 }
145164
146165 private onGlobalEvent ( evt : Event ) {
@@ -298,16 +317,19 @@ class EventInfoStore {
298317
299318 // If this event name is an alias, update the global listener for the corresponding browser event
300319 const eventName = getBrowserEventName ( info . eventName ) ;
301-
302- if ( -- this . countByEventName [ eventName ] === 0 ) {
303- delete this . countByEventName [ eventName ] ;
304- document . removeEventListener ( eventName , this . globalListener ) ;
305- }
320+ this . decrementCountByEventName ( eventName ) ;
306321 }
307322
308323 return info ;
309324 }
310325
326+ public decrementCountByEventName ( eventName : string ) {
327+ if ( -- this . countByEventName [ eventName ] === 0 ) {
328+ delete this . countByEventName [ eventName ] ;
329+ document . removeEventListener ( eventName , this . globalListener ) ;
330+ }
331+ }
332+
311333 private handleEventNameAliasAdded ( aliasEventName , browserEventName ) {
312334 // If an event name alias gets registered later, we need to update the global listener
313335 // registrations to match. This makes it equivalent to the alias having been registered
@@ -338,14 +360,28 @@ class EventHandlerInfosForElement {
338360
339361 private stopPropagationFlags : { [ eventName : string ] : boolean } | null = null ;
340362
341- public * enumerateHandlers ( ) : IterableIterator < EventHandlerInfo > {
363+ public * enumerateHandlers ( ) : IterableIterator < EventHandlerInfo > {
342364 for ( const eventName in this . handlers ) {
343365 if ( Object . prototype . hasOwnProperty . call ( this . handlers , eventName ) ) {
344366 yield this . handlers [ eventName ] ;
345367 }
346368 }
347369 }
348370
371+ public * enumeratedEventNamesForEnabledFlags ( ) : IterableIterator < string > {
372+ for ( const eventName in this . preventDefaultFlags ) {
373+ if ( this . preventDefaultFlags [ eventName ] === true ) {
374+ yield eventName ;
375+ }
376+ }
377+
378+ for ( const eventName in this . stopPropagationFlags ) {
379+ if ( this . stopPropagationFlags [ eventName ] === true ) {
380+ yield eventName ;
381+ }
382+ }
383+ }
384+
349385 public getHandler ( eventName : string ) : EventHandlerInfo | null {
350386 return Object . prototype . hasOwnProperty . call ( this . handlers , eventName ) ? this . handlers [ eventName ] : null ;
351387 }
0 commit comments