@@ -56,6 +56,7 @@ import {passiveBrowserEventsSupported} from './checkPassiveEvents';
5656import {
5757 enableDeprecatedFlareAPI ,
5858 enableModernEventSystem ,
59+ enableLegacyFBPrimerSupport ,
5960} from 'shared/ReactFeatureFlags' ;
6061import {
6162 UserBlockingEvent ,
@@ -143,6 +144,7 @@ export function trapEventForPluginEventSystem(
143144 container : Document | Element ,
144145 topLevelType : DOMTopLevelEventType ,
145146 capture : boolean ,
147+ legacyFBSupport ?: boolean ,
146148) : void {
147149 let listener ;
148150 let listenerWrapper ;
@@ -166,10 +168,40 @@ export function trapEventForPluginEventSystem(
166168 ) ;
167169
168170 const rawEventName = getRawEventName ( topLevelType ) ;
171+ let fbListener ;
172+
173+ // When legacyFBSupport is enabled, it's for when we
174+ // want to add a one time event listener to a container.
175+ // This should only be used with enableLegacyFBPrimerSupport
176+ // due to requirement to provide compatibility with
177+ // internal FB www event tooling. This works by removing
178+ // the event listener as soon as it is invoked. We could
179+ // also attempt to use the {once: true} param on
180+ // addEventListener, but that requires support and some
181+ // browsers do not support this today, and given this is
182+ // to support legacy code patterns, it's likely they'll
183+ // need support for such browsers.
184+ if ( enableLegacyFBPrimerSupport && legacyFBSupport ) {
185+ const originalListener = listener ;
186+ listener = function ( ...p ) {
187+ try {
188+ return originalListener . apply ( this , p ) ;
189+ } finally {
190+ if ( fbListener ) {
191+ fbListener . remove ( ) ;
192+ } else {
193+ container . removeEventListener (
194+ ( ( rawEventName : any ) : string ) ,
195+ ( listener : any ) ,
196+ ) ;
197+ }
198+ }
199+ } ;
200+ }
169201 if ( capture ) {
170- addEventCaptureListener ( container , rawEventName , listener ) ;
202+ fbListener = addEventCaptureListener ( container , rawEventName , listener ) ;
171203 } else {
172- addEventBubbleListener ( container , rawEventName , listener ) ;
204+ fbListener = addEventBubbleListener ( container , rawEventName , listener ) ;
173205 }
174206}
175207
0 commit comments