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 878c6d9e146..d5f9f7ad42f 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<<074ec00cfb1585c529df9391492c21e4>> + * @generated SignedSource<> */ /** @@ -46,6 +46,12 @@ public object ReactNativeFeatureFlags { @JvmStatic public fun enableBackgroundExecutor(): Boolean = accessor.enableBackgroundExecutor() + /** + * Clean yoga node when does not change. + */ + @JvmStatic + public fun enableCleanTextInputYogaNode(): Boolean = accessor.enableCleanTextInputYogaNode() + /** * When enabled, Fabric will use customDrawOrder in ReactViewGroup (similar to old architecture). */ 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 1e22268a65c..0b2dee96585 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<<99c459dce42767a7da84810fbceea73e>> */ /** @@ -23,6 +23,7 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso private var commonTestFlagCache: Boolean? = null private var batchRenderingUpdatesInEventLoopCache: Boolean? = null private var enableBackgroundExecutorCache: Boolean? = null + private var enableCleanTextInputYogaNodeCache: Boolean? = null private var enableCustomDrawOrderFabricCache: Boolean? = null private var enableFixForClippedSubviewsCrashCache: Boolean? = null private var enableMicrotasksCache: Boolean? = null @@ -62,6 +63,15 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso return cached } + override fun enableCleanTextInputYogaNode(): Boolean { + var cached = enableCleanTextInputYogaNodeCache + if (cached == null) { + cached = ReactNativeFeatureFlagsCxxInterop.enableCleanTextInputYogaNode() + enableCleanTextInputYogaNodeCache = cached + } + return cached + } + override fun enableCustomDrawOrderFabric(): Boolean { var cached = enableCustomDrawOrderFabricCache 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 a32c9ad14f0..0cbb8b042ae 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<<490e64811f966f5e8399ed835db6b846>> + * @generated SignedSource<> */ /** @@ -34,6 +34,8 @@ public object ReactNativeFeatureFlagsCxxInterop { @DoNotStrip @JvmStatic public external fun enableBackgroundExecutor(): Boolean + @DoNotStrip @JvmStatic public external fun enableCleanTextInputYogaNode(): Boolean + @DoNotStrip @JvmStatic public external fun enableCustomDrawOrderFabric(): Boolean @DoNotStrip @JvmStatic public external fun enableFixForClippedSubviewsCrash(): 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 80a61f9a2eb..333af492244 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<<0e0913ae19c39f88c2e2536c2b5087e1>> + * @generated SignedSource<> */ /** @@ -29,6 +29,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi override fun enableBackgroundExecutor(): Boolean = false + override fun enableCleanTextInputYogaNode(): Boolean = false + override fun enableCustomDrawOrderFabric(): Boolean = false override fun enableFixForClippedSubviewsCrash(): Boolean = false 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 1316245b267..e2d021b90be 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<<4d92852851feacdbf9d4f3c4ead3124a>> + * @generated SignedSource<> */ /** @@ -27,6 +27,7 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces private var commonTestFlagCache: Boolean? = null private var batchRenderingUpdatesInEventLoopCache: Boolean? = null private var enableBackgroundExecutorCache: Boolean? = null + private var enableCleanTextInputYogaNodeCache: Boolean? = null private var enableCustomDrawOrderFabricCache: Boolean? = null private var enableFixForClippedSubviewsCrashCache: Boolean? = null private var enableMicrotasksCache: Boolean? = null @@ -69,6 +70,16 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces return cached } + override fun enableCleanTextInputYogaNode(): Boolean { + var cached = enableCleanTextInputYogaNodeCache + if (cached == null) { + cached = currentProvider.enableCleanTextInputYogaNode() + accessedFeatureFlags.add("enableCleanTextInputYogaNode") + enableCleanTextInputYogaNodeCache = cached + } + return cached + } + override fun enableCustomDrawOrderFabric(): Boolean { var cached = enableCustomDrawOrderFabricCache 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 1c24f464d60..f4ec23b29d2 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<> + * @generated SignedSource<<51dd25e88ebf2ac9929c477e710d3d8d>> */ /** @@ -29,6 +29,8 @@ public interface ReactNativeFeatureFlagsProvider { @DoNotStrip public fun enableBackgroundExecutor(): Boolean + @DoNotStrip public fun enableCleanTextInputYogaNode(): Boolean + @DoNotStrip public fun enableCustomDrawOrderFabric(): Boolean @DoNotStrip public fun enableFixForClippedSubviewsCrash(): Boolean 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 65031c3708e..52e85349948 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<> */ /** @@ -57,6 +57,12 @@ class ReactNativeFeatureFlagsProviderHolder return method(javaProvider_); } + bool enableCleanTextInputYogaNode() override { + static const auto method = + getReactNativeFeatureFlagsProviderJavaClass()->getMethod("enableCleanTextInputYogaNode"); + return method(javaProvider_); + } + bool enableCustomDrawOrderFabric() override { static const auto method = getReactNativeFeatureFlagsProviderJavaClass()->getMethod("enableCustomDrawOrderFabric"); @@ -142,6 +148,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableBackgroundExecutor( return ReactNativeFeatureFlags::enableBackgroundExecutor(); } +bool JReactNativeFeatureFlagsCxxInterop::enableCleanTextInputYogaNode( + facebook::jni::alias_ref /*unused*/) { + return ReactNativeFeatureFlags::enableCleanTextInputYogaNode(); +} + bool JReactNativeFeatureFlagsCxxInterop::enableCustomDrawOrderFabric( facebook::jni::alias_ref /*unused*/) { return ReactNativeFeatureFlags::enableCustomDrawOrderFabric(); @@ -223,6 +234,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() { makeNativeMethod( "enableBackgroundExecutor", JReactNativeFeatureFlagsCxxInterop::enableBackgroundExecutor), + makeNativeMethod( + "enableCleanTextInputYogaNode", + JReactNativeFeatureFlagsCxxInterop::enableCleanTextInputYogaNode), makeNativeMethod( "enableCustomDrawOrderFabric", JReactNativeFeatureFlagsCxxInterop::enableCustomDrawOrderFabric), 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 b13b25ee9fd..45964a13648 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<> + * @generated SignedSource<> */ /** @@ -39,6 +39,9 @@ class JReactNativeFeatureFlagsCxxInterop static bool enableBackgroundExecutor( facebook::jni::alias_ref); + static bool enableCleanTextInputYogaNode( + facebook::jni::alias_ref); + static bool enableCustomDrawOrderFabric( 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 39568ff1176..d948fc35345 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<<05aace8ad7171ff940f014643e050ff0>> + * @generated SignedSource<> */ /** @@ -33,6 +33,10 @@ bool ReactNativeFeatureFlags::enableBackgroundExecutor() { return getAccessor().enableBackgroundExecutor(); } +bool ReactNativeFeatureFlags::enableCleanTextInputYogaNode() { + return getAccessor().enableCleanTextInputYogaNode(); +} + bool ReactNativeFeatureFlags::enableCustomDrawOrderFabric() { return getAccessor().enableCustomDrawOrderFabric(); } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h index d25b5c1b99f..84561bb855d 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<<730c667fb34f911b92318c26cfa32cf5>> + * @generated SignedSource<<881b149aca14f4f73e45e02089787a88>> */ /** @@ -52,6 +52,11 @@ class ReactNativeFeatureFlags { */ RN_EXPORT static bool enableBackgroundExecutor(); + /** + * Clean yoga node when does not change. + */ + RN_EXPORT static bool enableCleanTextInputYogaNode(); + /** * When enabled, Fabric will use customDrawOrder in ReactViewGroup (similar to old architecture). */ diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp index 1c3e5c8161b..1faf1ee7bca 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<> */ /** @@ -83,6 +83,24 @@ bool ReactNativeFeatureFlagsAccessor::enableBackgroundExecutor() { return flagValue.value(); } +bool ReactNativeFeatureFlagsAccessor::enableCleanTextInputYogaNode() { + auto flagValue = enableCleanTextInputYogaNode_.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(3, "enableCleanTextInputYogaNode"); + + flagValue = currentProvider_->enableCleanTextInputYogaNode(); + enableCleanTextInputYogaNode_ = flagValue; + } + + return flagValue.value(); +} + bool ReactNativeFeatureFlagsAccessor::enableCustomDrawOrderFabric() { auto flagValue = enableCustomDrawOrderFabric_.load(); @@ -92,7 +110,7 @@ bool ReactNativeFeatureFlagsAccessor::enableCustomDrawOrderFabric() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(3, "enableCustomDrawOrderFabric"); + markFlagAsAccessed(4, "enableCustomDrawOrderFabric"); flagValue = currentProvider_->enableCustomDrawOrderFabric(); enableCustomDrawOrderFabric_ = flagValue; @@ -110,7 +128,7 @@ bool ReactNativeFeatureFlagsAccessor::enableFixForClippedSubviewsCrash() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(4, "enableFixForClippedSubviewsCrash"); + markFlagAsAccessed(5, "enableFixForClippedSubviewsCrash"); flagValue = currentProvider_->enableFixForClippedSubviewsCrash(); enableFixForClippedSubviewsCrash_ = flagValue; @@ -128,7 +146,7 @@ bool ReactNativeFeatureFlagsAccessor::enableMicrotasks() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(5, "enableMicrotasks"); + markFlagAsAccessed(6, "enableMicrotasks"); flagValue = currentProvider_->enableMicrotasks(); enableMicrotasks_ = flagValue; @@ -146,7 +164,7 @@ bool ReactNativeFeatureFlagsAccessor::enableMountHooksAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(6, "enableMountHooksAndroid"); + markFlagAsAccessed(7, "enableMountHooksAndroid"); flagValue = currentProvider_->enableMountHooksAndroid(); enableMountHooksAndroid_ = flagValue; @@ -164,7 +182,7 @@ bool ReactNativeFeatureFlagsAccessor::enableSpannableBuildingUnification() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(7, "enableSpannableBuildingUnification"); + markFlagAsAccessed(8, "enableSpannableBuildingUnification"); flagValue = currentProvider_->enableSpannableBuildingUnification(); enableSpannableBuildingUnification_ = flagValue; @@ -182,7 +200,7 @@ bool ReactNativeFeatureFlagsAccessor::enableSynchronousStateUpdates() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(8, "enableSynchronousStateUpdates"); + markFlagAsAccessed(9, "enableSynchronousStateUpdates"); flagValue = currentProvider_->enableSynchronousStateUpdates(); enableSynchronousStateUpdates_ = flagValue; @@ -200,7 +218,7 @@ bool ReactNativeFeatureFlagsAccessor::enableUIConsistency() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(9, "enableUIConsistency"); + markFlagAsAccessed(10, "enableUIConsistency"); flagValue = currentProvider_->enableUIConsistency(); enableUIConsistency_ = flagValue; @@ -218,7 +236,7 @@ bool ReactNativeFeatureFlagsAccessor::inspectorEnableCxxInspectorPackagerConnect // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(10, "inspectorEnableCxxInspectorPackagerConnection"); + markFlagAsAccessed(11, "inspectorEnableCxxInspectorPackagerConnection"); flagValue = currentProvider_->inspectorEnableCxxInspectorPackagerConnection(); inspectorEnableCxxInspectorPackagerConnection_ = flagValue; @@ -236,7 +254,7 @@ bool ReactNativeFeatureFlagsAccessor::inspectorEnableModernCDPRegistry() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(11, "inspectorEnableModernCDPRegistry"); + markFlagAsAccessed(12, "inspectorEnableModernCDPRegistry"); flagValue = currentProvider_->inspectorEnableModernCDPRegistry(); inspectorEnableModernCDPRegistry_ = flagValue; @@ -254,7 +272,7 @@ bool ReactNativeFeatureFlagsAccessor::useModernRuntimeScheduler() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(12, "useModernRuntimeScheduler"); + markFlagAsAccessed(13, "useModernRuntimeScheduler"); flagValue = currentProvider_->useModernRuntimeScheduler(); useModernRuntimeScheduler_ = flagValue; @@ -272,7 +290,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(13, "useNativeViewConfigsInBridgelessMode"); + markFlagAsAccessed(14, "useNativeViewConfigsInBridgelessMode"); flagValue = currentProvider_->useNativeViewConfigsInBridgelessMode(); useNativeViewConfigsInBridgelessMode_ = flagValue; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h index 95a5dd61c15..f24364ae184 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<> + * @generated SignedSource<<48b454c264577c4e85eb6b9b46d5d2c5>> */ /** @@ -34,6 +34,7 @@ class ReactNativeFeatureFlagsAccessor { bool commonTestFlag(); bool batchRenderingUpdatesInEventLoop(); bool enableBackgroundExecutor(); + bool enableCleanTextInputYogaNode(); bool enableCustomDrawOrderFabric(); bool enableFixForClippedSubviewsCrash(); bool enableMicrotasks(); @@ -55,11 +56,12 @@ class ReactNativeFeatureFlagsAccessor { std::unique_ptr currentProvider_; bool wasOverridden_; - std::array, 14> accessedFeatureFlags_; + std::array, 15> accessedFeatureFlags_; std::atomic> commonTestFlag_; std::atomic> batchRenderingUpdatesInEventLoop_; std::atomic> enableBackgroundExecutor_; + std::atomic> enableCleanTextInputYogaNode_; std::atomic> enableCustomDrawOrderFabric_; std::atomic> enableFixForClippedSubviewsCrash_; std::atomic> enableMicrotasks_; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h index b3e76499ca8..904ff75fa02 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<<82ad92aa5bd70e278b4c2aceb2cb4859>> + * @generated SignedSource<<6b07d06ca1f100cca35e2b8b108f1993>> */ /** @@ -39,6 +39,10 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider { return false; } + bool enableCleanTextInputYogaNode() override { + return false; + } + bool enableCustomDrawOrderFabric() override { return false; } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h index 75719562905..4f8f7b9350b 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<<388fefb77dab0a5229417412d4f4a21c>> + * @generated SignedSource<<633090e21068e67cff5aa9b0d4f9e323>> */ /** @@ -28,6 +28,7 @@ class ReactNativeFeatureFlagsProvider { virtual bool commonTestFlag() = 0; virtual bool batchRenderingUpdatesInEventLoop() = 0; virtual bool enableBackgroundExecutor() = 0; + virtual bool enableCleanTextInputYogaNode() = 0; virtual bool enableCustomDrawOrderFabric() = 0; virtual bool enableFixForClippedSubviewsCrash() = 0; virtual bool enableMicrotasks() = 0; diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp index d81c98ddab8..5987d51c3a1 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<<2c451878b4abdfd143fdc00f3a8f1159>> + * @generated SignedSource<<8b20f7b7385c91e54cd385d6af54691b>> */ /** @@ -52,6 +52,11 @@ bool NativeReactNativeFeatureFlags::enableBackgroundExecutor( return ReactNativeFeatureFlags::enableBackgroundExecutor(); } +bool NativeReactNativeFeatureFlags::enableCleanTextInputYogaNode( + jsi::Runtime& /*runtime*/) { + return ReactNativeFeatureFlags::enableCleanTextInputYogaNode(); +} + bool NativeReactNativeFeatureFlags::enableCustomDrawOrderFabric( jsi::Runtime& /*runtime*/) { return ReactNativeFeatureFlags::enableCustomDrawOrderFabric(); diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h index 502b642cf2d..2666f2a0600 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<> + * @generated SignedSource<<0dcfc928ff0eca1cb37766170d9b4379>> */ /** @@ -41,6 +41,8 @@ class NativeReactNativeFeatureFlags bool enableBackgroundExecutor(jsi::Runtime& runtime); + bool enableCleanTextInputYogaNode(jsi::Runtime& runtime); + bool enableCustomDrawOrderFabric(jsi::Runtime& runtime); bool enableFixForClippedSubviewsCrash(jsi::Runtime& runtime); diff --git a/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.cpp index 3e9e0ad9ed1..1f60bd8d60f 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -26,6 +27,24 @@ namespace facebook::react { extern const char AndroidTextInputComponentName[] = "AndroidTextInput"; +AndroidTextInputShadowNode::AndroidTextInputShadowNode( + const ShadowNode& sourceShadowNode, + const ShadowNodeFragment& fragment) + : ConcreteViewShadowNode(sourceShadowNode, fragment) { + auto& sourceTextInputShadowNode = + static_cast(sourceShadowNode); + + if (ReactNativeFeatureFlags::enableCleanTextInputYogaNode()) { + if (!fragment.children && !fragment.props && + sourceTextInputShadowNode.getIsLayoutClean()) { + // This ParagraphShadowNode was cloned but did not change + // in a way that affects its layout. Let's mark it clean + // to stop Yoga from traversing it. + cleanLayout(); + } + } +} + void AndroidTextInputShadowNode::setContextContainer( ContextContainer* contextContainer) { ensureUnsealed(); diff --git a/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.h index 42b5769c550..e72e639e9b4 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.h @@ -37,6 +37,10 @@ class AndroidTextInputShadowNode final : public ConcreteViewShadowNode< using ConcreteViewShadowNode::ConcreteViewShadowNode; + AndroidTextInputShadowNode( + const ShadowNode& sourceShadowNode, + const ShadowNodeFragment& fragment); + void setContextContainer(ContextContainer* contextContainer); /* diff --git a/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/ios/react/renderer/components/iostextinput/TextInputShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/ios/react/renderer/components/iostextinput/TextInputShadowNode.cpp index dad61c26f2f..34d630911b0 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/ios/react/renderer/components/iostextinput/TextInputShadowNode.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/ios/react/renderer/components/iostextinput/TextInputShadowNode.cpp @@ -8,6 +8,7 @@ #include "TextInputShadowNode.h" #include +#include #include #include #include @@ -19,6 +20,24 @@ namespace facebook::react { extern const char TextInputComponentName[] = "TextInput"; +TextInputShadowNode::TextInputShadowNode( + const ShadowNode& sourceShadowNode, + const ShadowNodeFragment& fragment) + : ConcreteViewShadowNode(sourceShadowNode, fragment) { + auto& sourceTextInputShadowNode = + static_cast(sourceShadowNode); + + if (ReactNativeFeatureFlags::enableCleanTextInputYogaNode()) { + if (!fragment.children && !fragment.props && + sourceTextInputShadowNode.getIsLayoutClean()) { + // This ParagraphShadowNode was cloned but did not change + // in a way that affects its layout. Let's mark it clean + // to stop Yoga from traversing it. + cleanLayout(); + } + } +} + AttributedStringBox TextInputShadowNode::attributedStringBoxToMeasure( const LayoutContext& layoutContext) const { bool hasMeaningfulState = diff --git a/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/ios/react/renderer/components/iostextinput/TextInputShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/ios/react/renderer/components/iostextinput/TextInputShadowNode.h index 2b0377f7f3b..59e2db0ed56 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/ios/react/renderer/components/iostextinput/TextInputShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/ios/react/renderer/components/iostextinput/TextInputShadowNode.h @@ -32,6 +32,10 @@ class TextInputShadowNode final : public ConcreteViewShadowNode< public: using ConcreteViewShadowNode::ConcreteViewShadowNode; + TextInputShadowNode( + const ShadowNode& sourceShadowNode, + const ShadowNodeFragment& fragment); + static ShadowNodeTraits BaseTraits() { auto traits = ConcreteViewShadowNode::BaseTraits(); traits.set(ShadowNodeTraits::Trait::LeafYogaNode); diff --git a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js index 962af4fb1eb..94358314efb 100644 --- a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js +++ b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js @@ -42,6 +42,10 @@ const definitions: FeatureFlagDefinitions = { description: 'Enables the use of a background executor to compute layout and commit updates on Fabric (this system is deprecated and should not be used).', }, + enableCleanTextInputYogaNode: { + defaultValue: false, + description: 'Clean yoga node when does not change.', + }, enableCustomDrawOrderFabric: { defaultValue: false, description: diff --git a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js index 212e7c78e76..d5d2323a20d 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<<1d670e4e74d58e40c3e5c9dba2ceb560>> + * @generated SignedSource<> * @flow strict-local */ @@ -43,6 +43,7 @@ export type ReactNativeFeatureFlags = { commonTestFlag: Getter, batchRenderingUpdatesInEventLoop: Getter, enableBackgroundExecutor: Getter, + enableCleanTextInputYogaNode: Getter, enableCustomDrawOrderFabric: Getter, enableFixForClippedSubviewsCrash: Getter, enableMicrotasks: Getter, @@ -108,6 +109,10 @@ export const batchRenderingUpdatesInEventLoop: Getter = createNativeFla * Enables the use of a background executor to compute layout and commit updates on Fabric (this system is deprecated and should not be used). */ export const enableBackgroundExecutor: Getter = createNativeFlagGetter('enableBackgroundExecutor', false); +/** + * Clean yoga node when does not change. + */ +export const enableCleanTextInputYogaNode: Getter = createNativeFlagGetter('enableCleanTextInputYogaNode', false); /** * When enabled, Fabric will use customDrawOrder in ReactViewGroup (similar to old architecture). */ diff --git a/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js index 3d11c2b1975..af5f017effc 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<<9e0489da8f2a77565018ee983f7fae7e>> * @flow strict-local */ @@ -26,6 +26,7 @@ export interface Spec extends TurboModule { +commonTestFlag?: () => boolean; +batchRenderingUpdatesInEventLoop?: () => boolean; +enableBackgroundExecutor?: () => boolean; + +enableCleanTextInputYogaNode?: () => boolean; +enableCustomDrawOrderFabric?: () => boolean; +enableFixForClippedSubviewsCrash?: () => boolean; +enableMicrotasks?: () => boolean;