diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt index 8f2c4884955ad5..b79ddb857a183e 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<69be45d967e3883a960c49d760fc2ca1>> + * @generated SignedSource<<5305f75118d01f9836177d36a1641225>> */ /** @@ -220,6 +220,12 @@ public object ReactNativeFeatureFlags { @JvmStatic public fun traceTurboModulePromiseRejectionsOnAndroid(): Boolean = accessor.traceTurboModulePromiseRejectionsOnAndroid() + /** + * Works together with enableAccumulatedUpdatesInRawPropsAndroid. Restricts its effect only to instances of View. + */ + @JvmStatic + public fun useAccumulatedRawPropsUpdatesOnlyInViewAndroid(): Boolean = accessor.useAccumulatedRawPropsUpdatesOnlyInViewAndroid() + /** * In Bridgeless mode, use the always available javascript error reporting pipeline. */ diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt index 1f06b7c3a1cdcf..3c4d8fd4d69022 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<9e9041983707511e02dfc8c5bbe54b90>> */ /** @@ -52,6 +52,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces private var lazyAnimationCallbacksCache: Boolean? = null private var loadVectorDrawablesOnImagesCache: Boolean? = null private var traceTurboModulePromiseRejectionsOnAndroidCache: Boolean? = null + private var useAccumulatedRawPropsUpdatesOnlyInViewAndroidCache: Boolean? = null private var useAlwaysAvailableJSErrorHandlingCache: Boolean? = null private var useEditTextStockAndroidFocusBehaviorCache: Boolean? = null private var useFabricInteropCache: Boolean? = null @@ -350,6 +351,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces return cached } + override fun useAccumulatedRawPropsUpdatesOnlyInViewAndroid(): Boolean { + var cached = useAccumulatedRawPropsUpdatesOnlyInViewAndroidCache + if (cached == null) { + cached = ReactNativeFeatureFlagsCxxInterop.useAccumulatedRawPropsUpdatesOnlyInViewAndroid() + useAccumulatedRawPropsUpdatesOnlyInViewAndroidCache = cached + } + return cached + } + override fun useAlwaysAvailableJSErrorHandling(): Boolean { var cached = useAlwaysAvailableJSErrorHandlingCache if (cached == null) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt index 18fe23d0ccb33a..c3b244a2f0e7b8 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<39bbdf6347c47d00708f1c8cbd5ac056>> */ /** @@ -92,6 +92,8 @@ public object ReactNativeFeatureFlagsCxxInterop { @DoNotStrip @JvmStatic public external fun traceTurboModulePromiseRejectionsOnAndroid(): Boolean + @DoNotStrip @JvmStatic public external fun useAccumulatedRawPropsUpdatesOnlyInViewAndroid(): Boolean + @DoNotStrip @JvmStatic public external fun useAlwaysAvailableJSErrorHandling(): Boolean @DoNotStrip @JvmStatic public external fun useEditTextStockAndroidFocusBehavior(): Boolean diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt index ac9a8c7ffd45d2..0a9e33fdef466d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<71ea4cd62cc16ed718fdc764ec97d0e8>> + * @generated SignedSource<<72f1c6b155d77cb5231c719636aa02f7>> */ /** @@ -87,6 +87,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi override fun traceTurboModulePromiseRejectionsOnAndroid(): Boolean = false + override fun useAccumulatedRawPropsUpdatesOnlyInViewAndroid(): Boolean = false + override fun useAlwaysAvailableJSErrorHandling(): Boolean = false override fun useEditTextStockAndroidFocusBehavior(): Boolean = true diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt index 8e48d4ccf37299..e1c8206351589a 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<2896efd81aed8e0100d61e739cb2ba04>> + * @generated SignedSource<<4a0cc2d95839f21f0eb92b4d7303fc88>> */ /** @@ -56,6 +56,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc private var lazyAnimationCallbacksCache: Boolean? = null private var loadVectorDrawablesOnImagesCache: Boolean? = null private var traceTurboModulePromiseRejectionsOnAndroidCache: Boolean? = null + private var useAccumulatedRawPropsUpdatesOnlyInViewAndroidCache: Boolean? = null private var useAlwaysAvailableJSErrorHandlingCache: Boolean? = null private var useEditTextStockAndroidFocusBehaviorCache: Boolean? = null private var useFabricInteropCache: Boolean? = null @@ -386,6 +387,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc return cached } + override fun useAccumulatedRawPropsUpdatesOnlyInViewAndroid(): Boolean { + var cached = useAccumulatedRawPropsUpdatesOnlyInViewAndroidCache + if (cached == null) { + cached = currentProvider.useAccumulatedRawPropsUpdatesOnlyInViewAndroid() + accessedFeatureFlags.add("useAccumulatedRawPropsUpdatesOnlyInViewAndroid") + useAccumulatedRawPropsUpdatesOnlyInViewAndroidCache = cached + } + return cached + } + override fun useAlwaysAvailableJSErrorHandling(): Boolean { var cached = useAlwaysAvailableJSErrorHandlingCache if (cached == null) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt index bb02af4a743e84..bb838581e162a2 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<8f051d9cd1918cdf584de4d469f40ae9>> + * @generated SignedSource<> */ /** @@ -87,6 +87,8 @@ public interface ReactNativeFeatureFlagsProvider { @DoNotStrip public fun traceTurboModulePromiseRejectionsOnAndroid(): Boolean + @DoNotStrip public fun useAccumulatedRawPropsUpdatesOnlyInViewAndroid(): Boolean + @DoNotStrip public fun useAlwaysAvailableJSErrorHandling(): Boolean @DoNotStrip public fun useEditTextStockAndroidFocusBehavior(): Boolean diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp index 5cdf7a4107abaf..8ad51d1d2cb147 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp @@ -222,12 +222,16 @@ jni::local_ref getProps( // is enabled. auto* oldProps = oldShadowView.props.get(); auto* newProps = newShadowView.props.get(); + auto isView = strcmp(newShadowView.componentName, "View") == 0; if (ReactNativeFeatureFlags::enablePropsUpdateReconciliationAndroid() && - strcmp(newShadowView.componentName, "View") == 0) { + isView) { return ReadableNativeMap::newObjectCxxArgs( newProps->getDiffProps(oldProps)); } - if (ReactNativeFeatureFlags::enableAccumulatedUpdatesInRawPropsAndroid()) { + if (ReactNativeFeatureFlags::enableAccumulatedUpdatesInRawPropsAndroid() || + (ReactNativeFeatureFlags:: + useAccumulatedRawPropsUpdatesOnlyInViewAndroid() && + isView)) { if (oldProps == nullptr) { return ReadableNativeMap::newObjectCxxArgs(newProps->rawProps); } else { @@ -597,7 +601,10 @@ void FabricMountingManager::executeMount( bool shouldCreateView = !allocatedViewTags.contains(newChildShadowView.tag); if (ReactNativeFeatureFlags:: - enableAccumulatedUpdatesInRawPropsAndroid()) { + enableAccumulatedUpdatesInRawPropsAndroid() || + (ReactNativeFeatureFlags:: + useAccumulatedRawPropsUpdatesOnlyInViewAndroid() && + strcmp(newChildShadowView.componentName, "View") == 0)) { if (shouldCreateView) { LOG(ERROR) << "Emitting insert for unallocated view " << newChildShadowView.tag; diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp index ace19660f21032..a6c7b0b37861fb 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<56a6f66de0f2498e35332d1203592e78>> */ /** @@ -231,6 +231,12 @@ class ReactNativeFeatureFlagsProviderHolder return method(javaProvider_); } + bool useAccumulatedRawPropsUpdatesOnlyInViewAndroid() override { + static const auto method = + getReactNativeFeatureFlagsProviderJavaClass()->getMethod("useAccumulatedRawPropsUpdatesOnlyInViewAndroid"); + return method(javaProvider_); + } + bool useAlwaysAvailableJSErrorHandling() override { static const auto method = getReactNativeFeatureFlagsProviderJavaClass()->getMethod("useAlwaysAvailableJSErrorHandling"); @@ -449,6 +455,11 @@ bool JReactNativeFeatureFlagsCxxInterop::traceTurboModulePromiseRejectionsOnAndr return ReactNativeFeatureFlags::traceTurboModulePromiseRejectionsOnAndroid(); } +bool JReactNativeFeatureFlagsCxxInterop::useAccumulatedRawPropsUpdatesOnlyInViewAndroid( + facebook::jni::alias_ref /*unused*/) { + return ReactNativeFeatureFlags::useAccumulatedRawPropsUpdatesOnlyInViewAndroid(); +} + bool JReactNativeFeatureFlagsCxxInterop::useAlwaysAvailableJSErrorHandling( facebook::jni::alias_ref /*unused*/) { return ReactNativeFeatureFlags::useAlwaysAvailableJSErrorHandling(); @@ -621,6 +632,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() { makeNativeMethod( "traceTurboModulePromiseRejectionsOnAndroid", JReactNativeFeatureFlagsCxxInterop::traceTurboModulePromiseRejectionsOnAndroid), + makeNativeMethod( + "useAccumulatedRawPropsUpdatesOnlyInViewAndroid", + JReactNativeFeatureFlagsCxxInterop::useAccumulatedRawPropsUpdatesOnlyInViewAndroid), makeNativeMethod( "useAlwaysAvailableJSErrorHandling", JReactNativeFeatureFlagsCxxInterop::useAlwaysAvailableJSErrorHandling), diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h index a29fac018040c4..b086999d4df312 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<94c5db58f8b59d4ccc16e4983d3c6f2e>> + * @generated SignedSource<> */ /** @@ -126,6 +126,9 @@ class JReactNativeFeatureFlagsCxxInterop static bool traceTurboModulePromiseRejectionsOnAndroid( facebook::jni::alias_ref); + static bool useAccumulatedRawPropsUpdatesOnlyInViewAndroid( + facebook::jni::alias_ref); + static bool useAlwaysAvailableJSErrorHandling( facebook::jni::alias_ref); diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp index 8b7211a0c18e7a..12d94e803f1a19 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<1eb35511f4c5fd393c234c026709eb11>> + * @generated SignedSource<> */ /** @@ -154,6 +154,10 @@ bool ReactNativeFeatureFlags::traceTurboModulePromiseRejectionsOnAndroid() { return getAccessor().traceTurboModulePromiseRejectionsOnAndroid(); } +bool ReactNativeFeatureFlags::useAccumulatedRawPropsUpdatesOnlyInViewAndroid() { + return getAccessor().useAccumulatedRawPropsUpdatesOnlyInViewAndroid(); +} + bool ReactNativeFeatureFlags::useAlwaysAvailableJSErrorHandling() { return getAccessor().useAlwaysAvailableJSErrorHandling(); } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h index 2db4f4eb08f5b8..21f61ad7f715ed 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<88118789d97156c16a7ab691ca181d00>> + * @generated SignedSource<<7f1a36b350cd878f146eb88f366606bf>> */ /** @@ -199,6 +199,11 @@ class ReactNativeFeatureFlags { */ RN_EXPORT static bool traceTurboModulePromiseRejectionsOnAndroid(); + /** + * Works together with enableAccumulatedUpdatesInRawPropsAndroid. Restricts its effect only to instances of View. + */ + RN_EXPORT static bool useAccumulatedRawPropsUpdatesOnlyInViewAndroid(); + /** * In Bridgeless mode, use the always available javascript error reporting pipeline. */ diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp index a66e85dd2bdda4..a2d4b4e7725747 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -605,6 +605,24 @@ bool ReactNativeFeatureFlagsAccessor::traceTurboModulePromiseRejectionsOnAndroid return flagValue.value(); } +bool ReactNativeFeatureFlagsAccessor::useAccumulatedRawPropsUpdatesOnlyInViewAndroid() { + auto flagValue = useAccumulatedRawPropsUpdatesOnlyInViewAndroid_.load(); + + if (!flagValue.has_value()) { + // This block is not exclusive but it is not necessary. + // If multiple threads try to initialize the feature flag, we would only + // be accessing the provider multiple times but the end state of this + // instance and the returned flag value would be the same. + + markFlagAsAccessed(32, "useAccumulatedRawPropsUpdatesOnlyInViewAndroid"); + + flagValue = currentProvider_->useAccumulatedRawPropsUpdatesOnlyInViewAndroid(); + useAccumulatedRawPropsUpdatesOnlyInViewAndroid_ = flagValue; + } + + return flagValue.value(); +} + bool ReactNativeFeatureFlagsAccessor::useAlwaysAvailableJSErrorHandling() { auto flagValue = useAlwaysAvailableJSErrorHandling_.load(); @@ -614,7 +632,7 @@ bool ReactNativeFeatureFlagsAccessor::useAlwaysAvailableJSErrorHandling() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(32, "useAlwaysAvailableJSErrorHandling"); + markFlagAsAccessed(33, "useAlwaysAvailableJSErrorHandling"); flagValue = currentProvider_->useAlwaysAvailableJSErrorHandling(); useAlwaysAvailableJSErrorHandling_ = flagValue; @@ -632,7 +650,7 @@ bool ReactNativeFeatureFlagsAccessor::useEditTextStockAndroidFocusBehavior() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(33, "useEditTextStockAndroidFocusBehavior"); + markFlagAsAccessed(34, "useEditTextStockAndroidFocusBehavior"); flagValue = currentProvider_->useEditTextStockAndroidFocusBehavior(); useEditTextStockAndroidFocusBehavior_ = flagValue; @@ -650,7 +668,7 @@ bool ReactNativeFeatureFlagsAccessor::useFabricInterop() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(34, "useFabricInterop"); + markFlagAsAccessed(35, "useFabricInterop"); flagValue = currentProvider_->useFabricInterop(); useFabricInterop_ = flagValue; @@ -668,7 +686,7 @@ bool ReactNativeFeatureFlagsAccessor::useNativeViewConfigsInBridgelessMode() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(35, "useNativeViewConfigsInBridgelessMode"); + markFlagAsAccessed(36, "useNativeViewConfigsInBridgelessMode"); flagValue = currentProvider_->useNativeViewConfigsInBridgelessMode(); useNativeViewConfigsInBridgelessMode_ = flagValue; @@ -686,7 +704,7 @@ bool ReactNativeFeatureFlagsAccessor::useOptimizedEventBatchingOnAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(36, "useOptimizedEventBatchingOnAndroid"); + markFlagAsAccessed(37, "useOptimizedEventBatchingOnAndroid"); flagValue = currentProvider_->useOptimizedEventBatchingOnAndroid(); useOptimizedEventBatchingOnAndroid_ = flagValue; @@ -704,7 +722,7 @@ bool ReactNativeFeatureFlagsAccessor::useRawPropsJsiValue() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(37, "useRawPropsJsiValue"); + markFlagAsAccessed(38, "useRawPropsJsiValue"); flagValue = currentProvider_->useRawPropsJsiValue(); useRawPropsJsiValue_ = flagValue; @@ -722,7 +740,7 @@ bool ReactNativeFeatureFlagsAccessor::useRuntimeShadowNodeReferenceUpdate() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(38, "useRuntimeShadowNodeReferenceUpdate"); + markFlagAsAccessed(39, "useRuntimeShadowNodeReferenceUpdate"); flagValue = currentProvider_->useRuntimeShadowNodeReferenceUpdate(); useRuntimeShadowNodeReferenceUpdate_ = flagValue; @@ -740,7 +758,7 @@ bool ReactNativeFeatureFlagsAccessor::useTurboModuleInterop() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(39, "useTurboModuleInterop"); + markFlagAsAccessed(40, "useTurboModuleInterop"); flagValue = currentProvider_->useTurboModuleInterop(); useTurboModuleInterop_ = flagValue; @@ -758,7 +776,7 @@ bool ReactNativeFeatureFlagsAccessor::useTurboModules() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(40, "useTurboModules"); + markFlagAsAccessed(41, "useTurboModules"); flagValue = currentProvider_->useTurboModules(); useTurboModules_ = flagValue; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h index c920a430af62d4..cb1b0fb6bc125e 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<29ce7fa71b300ff721db97d622c29e6a>> + * @generated SignedSource<<126221f92020798d0a3d94ec94413233>> */ /** @@ -64,6 +64,7 @@ class ReactNativeFeatureFlagsAccessor { bool lazyAnimationCallbacks(); bool loadVectorDrawablesOnImages(); bool traceTurboModulePromiseRejectionsOnAndroid(); + bool useAccumulatedRawPropsUpdatesOnlyInViewAndroid(); bool useAlwaysAvailableJSErrorHandling(); bool useEditTextStockAndroidFocusBehavior(); bool useFabricInterop(); @@ -84,7 +85,7 @@ class ReactNativeFeatureFlagsAccessor { std::unique_ptr currentProvider_; bool wasOverridden_; - std::array, 41> accessedFeatureFlags_; + std::array, 42> accessedFeatureFlags_; std::atomic> commonTestFlag_; std::atomic> disableMountItemReorderingAndroid_; @@ -118,6 +119,7 @@ class ReactNativeFeatureFlagsAccessor { std::atomic> lazyAnimationCallbacks_; std::atomic> loadVectorDrawablesOnImages_; std::atomic> traceTurboModulePromiseRejectionsOnAndroid_; + std::atomic> useAccumulatedRawPropsUpdatesOnlyInViewAndroid_; std::atomic> useAlwaysAvailableJSErrorHandling_; std::atomic> useEditTextStockAndroidFocusBehavior_; std::atomic> useFabricInterop_; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h index 09fc2d3d8de037..c2a9edbdc6e496 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<3a526f2dc57cf7ace4597660e4b809c4>> + * @generated SignedSource<<685137ef1fbb3bf96628a5f393ee2286>> */ /** @@ -155,6 +155,10 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider { return false; } + bool useAccumulatedRawPropsUpdatesOnlyInViewAndroid() override { + return false; + } + bool useAlwaysAvailableJSErrorHandling() override { return false; } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h index 167a864dc79632..8603e59a3e9265 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<8bfb8e4ff7b6b6a4febcb9679cdaa7e4>> */ /** @@ -333,6 +333,15 @@ class ReactNativeFeatureFlagsDynamicProvider : public ReactNativeFeatureFlagsDef return ReactNativeFeatureFlagsDefaults::traceTurboModulePromiseRejectionsOnAndroid(); } + bool useAccumulatedRawPropsUpdatesOnlyInViewAndroid() override { + auto value = values_["useAccumulatedRawPropsUpdatesOnlyInViewAndroid"]; + if (!value.isNull()) { + return value.getBool(); + } + + return ReactNativeFeatureFlagsDefaults::useAccumulatedRawPropsUpdatesOnlyInViewAndroid(); + } + bool useAlwaysAvailableJSErrorHandling() override { auto value = values_["useAlwaysAvailableJSErrorHandling"]; if (!value.isNull()) { diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h index 09bd6a9c3accbb..db7fb76022d328 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<89e9d4db655464901795f56f93583be8>> + * @generated SignedSource<> */ /** @@ -57,6 +57,7 @@ class ReactNativeFeatureFlagsProvider { virtual bool lazyAnimationCallbacks() = 0; virtual bool loadVectorDrawablesOnImages() = 0; virtual bool traceTurboModulePromiseRejectionsOnAndroid() = 0; + virtual bool useAccumulatedRawPropsUpdatesOnlyInViewAndroid() = 0; virtual bool useAlwaysAvailableJSErrorHandling() = 0; virtual bool useEditTextStockAndroidFocusBehavior() = 0; virtual bool useFabricInterop() = 0; diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp index 4bbbba6d75185a..43f88d089ab026 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<6b314d87b09e65d8c70a0d3f4caf953a>> + * @generated SignedSource<<945e7f78a27293eb36e13ffaf034e084>> */ /** @@ -211,6 +211,11 @@ bool NativeReactNativeFeatureFlags::traceTurboModulePromiseRejectionsOnAndroid( return ReactNativeFeatureFlags::traceTurboModulePromiseRejectionsOnAndroid(); } +bool NativeReactNativeFeatureFlags::useAccumulatedRawPropsUpdatesOnlyInViewAndroid( + jsi::Runtime& /*runtime*/) { + return ReactNativeFeatureFlags::useAccumulatedRawPropsUpdatesOnlyInViewAndroid(); +} + bool NativeReactNativeFeatureFlags::useAlwaysAvailableJSErrorHandling( jsi::Runtime& /*runtime*/) { return ReactNativeFeatureFlags::useAlwaysAvailableJSErrorHandling(); diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h index 7b6eca3462ae51..c2edcf924e3e02 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<3b3ce0cfc8578f517393b89dc76a9aac>> + * @generated SignedSource<<410d80345815d506c1adfda660cdcfcc>> */ /** @@ -103,6 +103,8 @@ class NativeReactNativeFeatureFlags bool traceTurboModulePromiseRejectionsOnAndroid(jsi::Runtime& runtime); + bool useAccumulatedRawPropsUpdatesOnlyInViewAndroid(jsi::Runtime& runtime); + bool useAlwaysAvailableJSErrorHandling(jsi::Runtime& runtime); bool useEditTextStockAndroidFocusBehavior(jsi::Runtime& runtime); diff --git a/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h index 5c577da128fdb2..a7f00305a745b3 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h @@ -116,7 +116,10 @@ class ConcreteComponentDescriptor : public ComponentDescriptor { rawProps.parse(rawPropsParser_); #ifdef ANDROID - if (ReactNativeFeatureFlags::enableAccumulatedUpdatesInRawPropsAndroid()) { + if (ReactNativeFeatureFlags::enableAccumulatedUpdatesInRawPropsAndroid() || + (ReactNativeFeatureFlags:: + useAccumulatedRawPropsUpdatesOnlyInViewAndroid() && + strcmp(getComponentName(), "View") == 0)) { auto& oldDynamicProps = props->rawProps; auto newDynamicProps = rawProps.toDynamic(); auto mergedDynamicProps = mergeDynamicProps( diff --git a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js index 5776f00b7574b8..03d63dd2d6fa21 100644 --- a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js +++ b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js @@ -362,6 +362,16 @@ const definitions: FeatureFlagDefinitions = { purpose: 'operational', }, }, + useAccumulatedRawPropsUpdatesOnlyInViewAndroid: { + defaultValue: false, + metadata: { + dateAdded: '2025-01-22', + description: + 'Works together with enableAccumulatedUpdatesInRawPropsAndroid. Restricts its effect only to instances of View.', + expectedReleaseValue: false, + purpose: 'experimentation', + }, + }, useAlwaysAvailableJSErrorHandling: { defaultValue: false, metadata: { diff --git a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js index 55d41655b3d005..dd3217f5610db2 100644 --- a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<1292b8fff14cbf6ea3bffea28d0428bc>> + * @generated SignedSource<<3ccd4107985aa36522d0fee191262f2b>> * @flow strict */ @@ -81,6 +81,7 @@ export type ReactNativeFeatureFlags = $ReadOnly<{ lazyAnimationCallbacks: Getter, loadVectorDrawablesOnImages: Getter, traceTurboModulePromiseRejectionsOnAndroid: Getter, + useAccumulatedRawPropsUpdatesOnlyInViewAndroid: Getter, useAlwaysAvailableJSErrorHandling: Getter, useEditTextStockAndroidFocusBehavior: Getter, useFabricInterop: Getter, @@ -298,6 +299,10 @@ export const loadVectorDrawablesOnImages: Getter = createNativeFlagGett * Enables storing js caller stack when creating promise in native module. This is useful in case of Promise rejection and tracing the cause. */ export const traceTurboModulePromiseRejectionsOnAndroid: Getter = createNativeFlagGetter('traceTurboModulePromiseRejectionsOnAndroid', false); +/** + * Works together with enableAccumulatedUpdatesInRawPropsAndroid. Restricts its effect only to instances of View. + */ +export const useAccumulatedRawPropsUpdatesOnlyInViewAndroid: Getter = createNativeFlagGetter('useAccumulatedRawPropsUpdatesOnlyInViewAndroid', false); /** * In Bridgeless mode, use the always available javascript error reporting pipeline. */ diff --git a/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js index eb63439b22de93..de35867f890caf 100644 --- a/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<8832888b0f86cc7ea59546b8abaf2d74>> * @flow strict */ @@ -57,6 +57,7 @@ export interface Spec extends TurboModule { +lazyAnimationCallbacks?: () => boolean; +loadVectorDrawablesOnImages?: () => boolean; +traceTurboModulePromiseRejectionsOnAndroid?: () => boolean; + +useAccumulatedRawPropsUpdatesOnlyInViewAndroid?: () => boolean; +useAlwaysAvailableJSErrorHandling?: () => boolean; +useEditTextStockAndroidFocusBehavior?: () => boolean; +useFabricInterop?: () => boolean;