Skip to content

Commit 8480b86

Browse files
rubennortemeta-codesync[bot]
authored andcommitted
Enable the imperative EventTarget API in canary (#58479)
Summary: Pull Request resolved: #58479 `enableImperativeEvents` was defined as a JS-only feature flag, but OSS release stages are only applied to common flags: `ossReleaseStage` is consumed exclusively by the generators that produce the native override classes, so setting it on a JS-only flag is silently a no-op. The feature could therefore never be shipped through the canary channel. This defines `enableImperativeEvents` as a common flag at release stage `canary`, and renames the JS-only flag to `enableImperativeEvents_DEPRECATED`. The deprecated flag is kept because the common flag is read through the native module: a JS bundle delivered to a native build that predates this change finds no such method and falls back to the default, which would silently turn the feature off. The gate in `ReactNativeElement` and `ReadOnlyText` now keeps the public EventTarget methods when either flag is enabled. Changelog: [General][Added] - Enable the imperative EventTarget API (`addEventListener`, `removeEventListener`, `dispatchEvent`) on native view refs in canary Reviewed By: javache Differential Revision: D119645412 fbshipit-source-id: 4fd33dfaff1640fd5d40b5bc9c3f657ea7b3bb86
1 parent b5c1522 commit 8480b86

24 files changed

Lines changed: 216 additions & 91 deletions

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<b7ef80c2c39c734ae511fe6457b89ce7>>
7+
* @generated SignedSource<<de19deb8eaa373fc2048f5a9453674b7>>
88
*/
99

1010
/**
@@ -216,6 +216,12 @@ public object ReactNativeFeatureFlags {
216216
@JvmStatic
217217
public fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean = accessor.enableImmediateUpdateModeForContentOffsetChanges()
218218

219+
/**
220+
* When enabled, ReactNativeElement and ReadOnlyText expose the public EventTarget API (addEventListener, removeEventListener, dispatchEvent). When disabled, those methods are removed from those final classes.
221+
*/
222+
@JvmStatic
223+
public fun enableImperativeEvents(): Boolean = accessor.enableImperativeEvents()
224+
219225
/**
220226
* Enable ref.focus() and ref.blur() for all views, not just TextInput.
221227
*/

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<68aefd0293540d56f57e8badc0de04c8>>
7+
* @generated SignedSource<<a1c52a57a980eaab23d92416340a6734>>
88
*/
99

1010
/**
@@ -51,6 +51,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
5151
private var enableImagePrefetchingAndroidCache: Boolean? = null
5252
private var enableImageTransparentTintColorCache: Boolean? = null
5353
private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null
54+
private var enableImperativeEventsCache: Boolean? = null
5455
private var enableImperativeFocusCache: Boolean? = null
5556
private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null
5657
private var enableIntersectionObserverByDefaultCache: Boolean? = null
@@ -386,6 +387,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
386387
return cached
387388
}
388389

390+
override fun enableImperativeEvents(): Boolean {
391+
var cached = enableImperativeEventsCache
392+
if (cached == null) {
393+
cached = ReactNativeFeatureFlagsCxxInterop.enableImperativeEvents()
394+
enableImperativeEventsCache = cached
395+
}
396+
return cached
397+
}
398+
389399
override fun enableImperativeFocus(): Boolean {
390400
var cached = enableImperativeFocusCache
391401
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<247f721796621af8615014477518bcd9>>
7+
* @generated SignedSource<<8a0d1f134b175ada7550499896c09203>>
88
*/
99

1010
/**
@@ -90,6 +90,8 @@ public object ReactNativeFeatureFlagsCxxInterop {
9090

9191
@DoNotStrip @JvmStatic public external fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean
9292

93+
@DoNotStrip @JvmStatic public external fun enableImperativeEvents(): Boolean
94+
9395
@DoNotStrip @JvmStatic public external fun enableImperativeFocus(): Boolean
9496

9597
@DoNotStrip @JvmStatic public external fun enableInteropViewManagerClassLookUpOptimizationIOS(): Boolean

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<33071257f9c96a8664c9af429e387061>>
7+
* @generated SignedSource<<891abee69433c105d062b45ed357fd5c>>
88
*/
99

1010
/**
@@ -85,6 +85,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
8585

8686
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean = false
8787

88+
override fun enableImperativeEvents(): Boolean = false
89+
8890
override fun enableImperativeFocus(): Boolean = false
8991

9092
override fun enableInteropViewManagerClassLookUpOptimizationIOS(): Boolean = false

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<f218220c66b8367211cae49adba46afc>>
7+
* @generated SignedSource<<4c62625780d9f767714f8481c7496342>>
88
*/
99

1010
/**
@@ -55,6 +55,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
5555
private var enableImagePrefetchingAndroidCache: Boolean? = null
5656
private var enableImageTransparentTintColorCache: Boolean? = null
5757
private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null
58+
private var enableImperativeEventsCache: Boolean? = null
5859
private var enableImperativeFocusCache: Boolean? = null
5960
private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null
6061
private var enableIntersectionObserverByDefaultCache: Boolean? = null
@@ -421,6 +422,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
421422
return cached
422423
}
423424

425+
override fun enableImperativeEvents(): Boolean {
426+
var cached = enableImperativeEventsCache
427+
if (cached == null) {
428+
cached = currentProvider.enableImperativeEvents()
429+
accessedFeatureFlags.add("enableImperativeEvents")
430+
enableImperativeEventsCache = cached
431+
}
432+
return cached
433+
}
434+
424435
override fun enableImperativeFocus(): Boolean {
425436
var cached = enableImperativeFocusCache
426437
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Canary_Android.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<22ab94c6b0cc8f7ee39d546d9b93540a>>
7+
* @generated SignedSource<<843b2fa7e358dd73c9db083e42b93be6>>
88
*/
99

1010
/**
@@ -27,6 +27,8 @@ public open class ReactNativeFeatureFlagsOverrides_RNOSS_Canary_Android : ReactN
2727

2828
override fun enableAccessibilityOrder(): Boolean = true
2929

30+
override fun enableImperativeEvents(): Boolean = true
31+
3032
override fun enableIntersectionObserverByDefault(): Boolean = true
3133

3234
override fun enableSwiftUIBasedFilters(): Boolean = true

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<915bf918212b9898319de61d4cadaa13>>
7+
* @generated SignedSource<<e991f910f4be27f532c6b81c436bcdf1>>
88
*/
99

1010
/**
@@ -85,6 +85,8 @@ public interface ReactNativeFeatureFlagsProvider {
8585

8686
@DoNotStrip public fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean
8787

88+
@DoNotStrip public fun enableImperativeEvents(): Boolean
89+
8890
@DoNotStrip public fun enableImperativeFocus(): Boolean
8991

9092
@DoNotStrip public fun enableInteropViewManagerClassLookUpOptimizationIOS(): Boolean

packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<177c5cc7f6e970a2d4454c32d7f777ef>>
7+
* @generated SignedSource<<dc98fadf7aac306d7cdb4f5ab511f690>>
88
*/
99

1010
/**
@@ -225,6 +225,12 @@ class ReactNativeFeatureFlagsJavaProvider
225225
return method(javaProvider_);
226226
}
227227

228+
bool enableImperativeEvents() override {
229+
static const auto method =
230+
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableImperativeEvents");
231+
return method(javaProvider_);
232+
}
233+
228234
bool enableImperativeFocus() override {
229235
static const auto method =
230236
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableImperativeFocus");
@@ -714,6 +720,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffs
714720
return ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges();
715721
}
716722

723+
bool JReactNativeFeatureFlagsCxxInterop::enableImperativeEvents(
724+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
725+
return ReactNativeFeatureFlags::enableImperativeEvents();
726+
}
727+
717728
bool JReactNativeFeatureFlagsCxxInterop::enableImperativeFocus(
718729
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
719730
return ReactNativeFeatureFlags::enableImperativeFocus();
@@ -1113,6 +1124,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
11131124
makeNativeMethod(
11141125
"enableImmediateUpdateModeForContentOffsetChanges",
11151126
JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffsetChanges),
1127+
makeNativeMethod(
1128+
"enableImperativeEvents",
1129+
JReactNativeFeatureFlagsCxxInterop::enableImperativeEvents),
11161130
makeNativeMethod(
11171131
"enableImperativeFocus",
11181132
JReactNativeFeatureFlagsCxxInterop::enableImperativeFocus),

packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<eab10e240a16c8ef3f659bd8ded290f0>>
7+
* @generated SignedSource<<c17b71e1b754ff1773bb370681de06e4>>
88
*/
99

1010
/**
@@ -123,6 +123,9 @@ class JReactNativeFeatureFlagsCxxInterop
123123
static bool enableImmediateUpdateModeForContentOffsetChanges(
124124
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
125125

126+
static bool enableImperativeEvents(
127+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
128+
126129
static bool enableImperativeFocus(
127130
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
128131

packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<7b726d7483bb35062b79e582323f0d7e>>
7+
* @generated SignedSource<<023b0be9315450130aac118c65ac53eb>>
88
*/
99

1010
/**
@@ -150,6 +150,10 @@ bool ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges()
150150
return getAccessor().enableImmediateUpdateModeForContentOffsetChanges();
151151
}
152152

153+
bool ReactNativeFeatureFlags::enableImperativeEvents() {
154+
return getAccessor().enableImperativeEvents();
155+
}
156+
153157
bool ReactNativeFeatureFlags::enableImperativeFocus() {
154158
return getAccessor().enableImperativeFocus();
155159
}

0 commit comments

Comments
 (0)