@@ -65,6 +65,8 @@ import {
6565import {
6666 addResponderEventSystemEvent ,
6767 removeActiveResponderEventSystemEvent ,
68+ addListenerSystemEvent ,
69+ removeListenerSystemEvent ,
6870} from '../events/ReactDOMEventListener.js' ;
6971import { mediaEventTypes } from '../events/DOMTopLevelEventTypes' ;
7072import {
@@ -90,6 +92,7 @@ import {toStringOrTrustedType} from './ToStringValue';
9092import {
9193 enableDeprecatedFlareAPI ,
9294 enableTrustedTypesIntegration ,
95+ enableListenerAPI ,
9396} from 'shared/ReactFeatureFlags' ;
9497
9598let didWarnInvalidHydration = false ;
@@ -1345,6 +1348,42 @@ export function listenToEventResponderEventTypes(
13451348 }
13461349}
13471350
1351+ export function listenToEventListener (
1352+ type : string ,
1353+ passive : boolean ,
1354+ document : Document ,
1355+ ) : void {
1356+ if ( enableListenerAPI ) {
1357+ // Get the listening Map for this element. We use this to track
1358+ // what events we're listening to.
1359+ const listenerMap = getListenerMapForElement ( document ) ;
1360+ const passiveKey = type + '_passive' ;
1361+ const activeKey = type + '_active' ;
1362+ const eventKey = passive ? passiveKey : activeKey ;
1363+
1364+ if ( ! listenerMap . has ( eventKey ) ) {
1365+ if ( passive ) {
1366+ if ( listenerMap . has ( activeKey ) ) {
1367+ // If we have an active event listener, do not register
1368+ // a passive event listener. We use the same active event
1369+ // listener.
1370+ return ;
1371+ } else {
1372+ // If we have a passive event listener, remove the
1373+ // existing passive event listener before we add the
1374+ // active event listener.
1375+ const passiveListener = listenerMap . get ( passiveKey ) ;
1376+ if ( passiveListener != null ) {
1377+ removeListenerSystemEvent ( document , type , passiveListener ) ;
1378+ }
1379+ }
1380+ }
1381+ const eventListener = addListenerSystemEvent ( document , type , passive ) ;
1382+ listenerMap . set ( eventKey , eventListener ) ;
1383+ }
1384+ }
1385+ }
1386+
13481387// We can remove this once the event API is stable and out of a flag
13491388if ( enableDeprecatedFlareAPI ) {
13501389 setListenToResponderEventTypes ( listenToEventResponderEventTypes ) ;
0 commit comments