diff --git a/packages/react-native/Libraries/Pressability/Pressability.js b/packages/react-native/Libraries/Pressability/Pressability.js index ff70d67148fb..eabfb8320feb 100644 --- a/packages/react-native/Libraries/Pressability/Pressability.js +++ b/packages/react-native/Libraries/Pressability/Pressability.js @@ -16,8 +16,8 @@ import type { MouseEvent, } from '../Types/CoreEventTypes'; +import * as ReactNativeFeatureFlags from '../../src/private/featureflags/ReactNativeFeatureFlags'; import SoundManager from '../Components/Sound/SoundManager'; -import ReactNativeFeatureFlags from '../ReactNative/ReactNativeFeatureFlags'; import UIManager from '../ReactNative/UIManager'; import {type RectOrSize, normalizeRect} from '../StyleSheet/Rect'; import {type PointerEvent} from '../Types/CoreEventTypes'; diff --git a/packages/react-native/Libraries/ReactNative/ReactNativeFeatureFlags.js b/packages/react-native/Libraries/ReactNative/ReactNativeFeatureFlags.js deleted file mode 100644 index e14f21fb3aea..000000000000 --- a/packages/react-native/Libraries/ReactNative/ReactNativeFeatureFlags.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @flow strict - * @format - */ - -export type FeatureFlags = { - /** - * Function used to enable / disable W3C pointer event emitting in React Native. - * If enabled you must also flip the equivalent native flags on each platform: - * iOS -> RCTSetDispatchW3CPointerEvents - * Android -> ReactFeatureFlags.dispatchPointerEvents - */ - shouldEmitW3CPointerEvents: () => boolean, - /** - * Function used to enable / disable Pressibility from using W3C Pointer Events - * for its hover callbacks - */ - shouldPressibilityUseW3CPointerEventsForHover: () => boolean, -}; - -const ReactNativeFeatureFlags: FeatureFlags = { - shouldEmitW3CPointerEvents: () => false, - shouldPressibilityUseW3CPointerEventsForHover: () => false, -}; - -export default ReactNativeFeatureFlags; 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 7f3d123ba515..aff1ed75e48e 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<> + * @generated SignedSource<<4ae3c4711777aebdf10bdf2957c6e9be>> */ /** @@ -318,6 +318,12 @@ public object ReactNativeFeatureFlags { @JvmStatic public fun releaseImageDataWhenConsumed(): Boolean = accessor.releaseImageDataWhenConsumed() + /** + * Function used to enable / disable Pressibility from using W3C Pointer Events for its hover callbacks + */ + @JvmStatic + public fun shouldPressibilityUseW3CPointerEventsForHover(): Boolean = accessor.shouldPressibilityUseW3CPointerEventsForHover() + /** * Skip activity identity assertion in ReactHostImpl::onHostPause() */ 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 6c26467ce681..42f50f1f7f79 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<<89a21ebdfc82ae89a4918192805dddc3>> */ /** @@ -68,6 +68,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces private var preparedTextCacheSizeCache: Double? = null private var preventShadowTreeCommitExhaustionWithLockingCache: Boolean? = null private var releaseImageDataWhenConsumedCache: Boolean? = null + private var shouldPressibilityUseW3CPointerEventsForHoverCache: Boolean? = null private var skipActivityIdentityAssertionOnHostPauseCache: Boolean? = null private var traceTurboModulePromiseRejectionsOnAndroidCache: Boolean? = null private var updateRuntimeShadowNodeReferencesOnCommitCache: Boolean? = null @@ -515,6 +516,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces return cached } + override fun shouldPressibilityUseW3CPointerEventsForHover(): Boolean { + var cached = shouldPressibilityUseW3CPointerEventsForHoverCache + if (cached == null) { + cached = ReactNativeFeatureFlagsCxxInterop.shouldPressibilityUseW3CPointerEventsForHover() + shouldPressibilityUseW3CPointerEventsForHoverCache = cached + } + return cached + } + override fun skipActivityIdentityAssertionOnHostPause(): Boolean { var cached = skipActivityIdentityAssertionOnHostPauseCache 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 be7cbb2a3ae1..0405da51a487 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<<96bf51052186f9ef4fe3bb7e16cbf97c>> */ /** @@ -124,6 +124,8 @@ public object ReactNativeFeatureFlagsCxxInterop { @DoNotStrip @JvmStatic public external fun releaseImageDataWhenConsumed(): Boolean + @DoNotStrip @JvmStatic public external fun shouldPressibilityUseW3CPointerEventsForHover(): Boolean + @DoNotStrip @JvmStatic public external fun skipActivityIdentityAssertionOnHostPause(): Boolean @DoNotStrip @JvmStatic public external fun traceTurboModulePromiseRejectionsOnAndroid(): 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 cded63ed7460..352144c3afc3 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<> + * @generated SignedSource<> */ /** @@ -119,6 +119,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi override fun releaseImageDataWhenConsumed(): Boolean = false + override fun shouldPressibilityUseW3CPointerEventsForHover(): Boolean = false + override fun skipActivityIdentityAssertionOnHostPause(): Boolean = false override fun traceTurboModulePromiseRejectionsOnAndroid(): 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 c3a787153071..d1664a5ec884 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<<23605f090bfbebe911caa9d3d834d3e8>> + * @generated SignedSource<> */ /** @@ -72,6 +72,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc private var preparedTextCacheSizeCache: Double? = null private var preventShadowTreeCommitExhaustionWithLockingCache: Boolean? = null private var releaseImageDataWhenConsumedCache: Boolean? = null + private var shouldPressibilityUseW3CPointerEventsForHoverCache: Boolean? = null private var skipActivityIdentityAssertionOnHostPauseCache: Boolean? = null private var traceTurboModulePromiseRejectionsOnAndroidCache: Boolean? = null private var updateRuntimeShadowNodeReferencesOnCommitCache: Boolean? = null @@ -567,6 +568,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc return cached } + override fun shouldPressibilityUseW3CPointerEventsForHover(): Boolean { + var cached = shouldPressibilityUseW3CPointerEventsForHoverCache + if (cached == null) { + cached = currentProvider.shouldPressibilityUseW3CPointerEventsForHover() + accessedFeatureFlags.add("shouldPressibilityUseW3CPointerEventsForHover") + shouldPressibilityUseW3CPointerEventsForHoverCache = cached + } + return cached + } + override fun skipActivityIdentityAssertionOnHostPause(): Boolean { var cached = skipActivityIdentityAssertionOnHostPauseCache 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 626f532a4966..3eb6b304fc5f 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<<780793412b76f101be1569d7a866c435>> + * @generated SignedSource<> */ /** @@ -119,6 +119,8 @@ public interface ReactNativeFeatureFlagsProvider { @DoNotStrip public fun releaseImageDataWhenConsumed(): Boolean + @DoNotStrip public fun shouldPressibilityUseW3CPointerEventsForHover(): Boolean + @DoNotStrip public fun skipActivityIdentityAssertionOnHostPause(): Boolean @DoNotStrip public fun traceTurboModulePromiseRejectionsOnAndroid(): 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 c6b7230a902c..2c7b9a02edeb 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<<1c3be6a8e7e298c649449d87349f1979>> */ /** @@ -327,6 +327,12 @@ class ReactNativeFeatureFlagsJavaProvider return method(javaProvider_); } + bool shouldPressibilityUseW3CPointerEventsForHover() override { + static const auto method = + getReactNativeFeatureFlagsProviderJavaClass()->getMethod("shouldPressibilityUseW3CPointerEventsForHover"); + return method(javaProvider_); + } + bool skipActivityIdentityAssertionOnHostPause() override { static const auto method = getReactNativeFeatureFlagsProviderJavaClass()->getMethod("skipActivityIdentityAssertionOnHostPause"); @@ -655,6 +661,11 @@ bool JReactNativeFeatureFlagsCxxInterop::releaseImageDataWhenConsumed( return ReactNativeFeatureFlags::releaseImageDataWhenConsumed(); } +bool JReactNativeFeatureFlagsCxxInterop::shouldPressibilityUseW3CPointerEventsForHover( + facebook::jni::alias_ref /*unused*/) { + return ReactNativeFeatureFlags::shouldPressibilityUseW3CPointerEventsForHover(); +} + bool JReactNativeFeatureFlagsCxxInterop::skipActivityIdentityAssertionOnHostPause( facebook::jni::alias_ref /*unused*/) { return ReactNativeFeatureFlags::skipActivityIdentityAssertionOnHostPause(); @@ -900,6 +911,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() { makeNativeMethod( "releaseImageDataWhenConsumed", JReactNativeFeatureFlagsCxxInterop::releaseImageDataWhenConsumed), + makeNativeMethod( + "shouldPressibilityUseW3CPointerEventsForHover", + JReactNativeFeatureFlagsCxxInterop::shouldPressibilityUseW3CPointerEventsForHover), makeNativeMethod( "skipActivityIdentityAssertionOnHostPause", JReactNativeFeatureFlagsCxxInterop::skipActivityIdentityAssertionOnHostPause), 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 40d1f051cb12..f87f238f9087 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<<8c1da07c0b7d2053f7fdaac4326c3ac1>> + * @generated SignedSource<> */ /** @@ -174,6 +174,9 @@ class JReactNativeFeatureFlagsCxxInterop static bool releaseImageDataWhenConsumed( facebook::jni::alias_ref); + static bool shouldPressibilityUseW3CPointerEventsForHover( + facebook::jni::alias_ref); + static bool skipActivityIdentityAssertionOnHostPause( 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 42b02f369b29..feedf05e2ae3 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<<355265aa8f13e3f307d6e30db6b80d41>> + * @generated SignedSource<<9667b86753e001ed65e1cedd061dd4da>> */ /** @@ -218,6 +218,10 @@ bool ReactNativeFeatureFlags::releaseImageDataWhenConsumed() { return getAccessor().releaseImageDataWhenConsumed(); } +bool ReactNativeFeatureFlags::shouldPressibilityUseW3CPointerEventsForHover() { + return getAccessor().shouldPressibilityUseW3CPointerEventsForHover(); +} + bool ReactNativeFeatureFlags::skipActivityIdentityAssertionOnHostPause() { return getAccessor().skipActivityIdentityAssertionOnHostPause(); } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h index a9c4098a9a31..acf505f52c73 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<> + * @generated SignedSource<<2cac67b3e2b7fbb61081addad31fe2fa>> */ /** @@ -279,6 +279,11 @@ class ReactNativeFeatureFlags { */ RN_EXPORT static bool releaseImageDataWhenConsumed(); + /** + * Function used to enable / disable Pressibility from using W3C Pointer Events for its hover callbacks + */ + RN_EXPORT static bool shouldPressibilityUseW3CPointerEventsForHover(); + /** * Skip activity identity assertion in ReactHostImpl::onHostPause() */ diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp index bd652a756da8..d7adf39ca990 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<<606de55629b17a25a43f64fc34037fc2>> */ /** @@ -893,6 +893,24 @@ bool ReactNativeFeatureFlagsAccessor::releaseImageDataWhenConsumed() { return flagValue.value(); } +bool ReactNativeFeatureFlagsAccessor::shouldPressibilityUseW3CPointerEventsForHover() { + auto flagValue = shouldPressibilityUseW3CPointerEventsForHover_.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(48, "shouldPressibilityUseW3CPointerEventsForHover"); + + flagValue = currentProvider_->shouldPressibilityUseW3CPointerEventsForHover(); + shouldPressibilityUseW3CPointerEventsForHover_ = flagValue; + } + + return flagValue.value(); +} + bool ReactNativeFeatureFlagsAccessor::skipActivityIdentityAssertionOnHostPause() { auto flagValue = skipActivityIdentityAssertionOnHostPause_.load(); @@ -902,7 +920,7 @@ bool ReactNativeFeatureFlagsAccessor::skipActivityIdentityAssertionOnHostPause() // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(48, "skipActivityIdentityAssertionOnHostPause"); + markFlagAsAccessed(49, "skipActivityIdentityAssertionOnHostPause"); flagValue = currentProvider_->skipActivityIdentityAssertionOnHostPause(); skipActivityIdentityAssertionOnHostPause_ = flagValue; @@ -920,7 +938,7 @@ bool ReactNativeFeatureFlagsAccessor::traceTurboModulePromiseRejectionsOnAndroid // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(49, "traceTurboModulePromiseRejectionsOnAndroid"); + markFlagAsAccessed(50, "traceTurboModulePromiseRejectionsOnAndroid"); flagValue = currentProvider_->traceTurboModulePromiseRejectionsOnAndroid(); traceTurboModulePromiseRejectionsOnAndroid_ = flagValue; @@ -938,7 +956,7 @@ bool ReactNativeFeatureFlagsAccessor::updateRuntimeShadowNodeReferencesOnCommit( // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(50, "updateRuntimeShadowNodeReferencesOnCommit"); + markFlagAsAccessed(51, "updateRuntimeShadowNodeReferencesOnCommit"); flagValue = currentProvider_->updateRuntimeShadowNodeReferencesOnCommit(); updateRuntimeShadowNodeReferencesOnCommit_ = flagValue; @@ -956,7 +974,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(51, "useAlwaysAvailableJSErrorHandling"); + markFlagAsAccessed(52, "useAlwaysAvailableJSErrorHandling"); flagValue = currentProvider_->useAlwaysAvailableJSErrorHandling(); useAlwaysAvailableJSErrorHandling_ = flagValue; @@ -974,7 +992,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(52, "useFabricInterop"); + markFlagAsAccessed(53, "useFabricInterop"); flagValue = currentProvider_->useFabricInterop(); useFabricInterop_ = flagValue; @@ -992,7 +1010,7 @@ bool ReactNativeFeatureFlagsAccessor::useNativeEqualsInNativeReadableArrayAndroi // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(53, "useNativeEqualsInNativeReadableArrayAndroid"); + markFlagAsAccessed(54, "useNativeEqualsInNativeReadableArrayAndroid"); flagValue = currentProvider_->useNativeEqualsInNativeReadableArrayAndroid(); useNativeEqualsInNativeReadableArrayAndroid_ = flagValue; @@ -1010,7 +1028,7 @@ bool ReactNativeFeatureFlagsAccessor::useNativeTransformHelperAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(54, "useNativeTransformHelperAndroid"); + markFlagAsAccessed(55, "useNativeTransformHelperAndroid"); flagValue = currentProvider_->useNativeTransformHelperAndroid(); useNativeTransformHelperAndroid_ = flagValue; @@ -1028,7 +1046,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(55, "useNativeViewConfigsInBridgelessMode"); + markFlagAsAccessed(56, "useNativeViewConfigsInBridgelessMode"); flagValue = currentProvider_->useNativeViewConfigsInBridgelessMode(); useNativeViewConfigsInBridgelessMode_ = flagValue; @@ -1046,7 +1064,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(56, "useOptimizedEventBatchingOnAndroid"); + markFlagAsAccessed(57, "useOptimizedEventBatchingOnAndroid"); flagValue = currentProvider_->useOptimizedEventBatchingOnAndroid(); useOptimizedEventBatchingOnAndroid_ = flagValue; @@ -1064,7 +1082,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(57, "useRawPropsJsiValue"); + markFlagAsAccessed(58, "useRawPropsJsiValue"); flagValue = currentProvider_->useRawPropsJsiValue(); useRawPropsJsiValue_ = flagValue; @@ -1082,7 +1100,7 @@ bool ReactNativeFeatureFlagsAccessor::useShadowNodeStateOnClone() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(58, "useShadowNodeStateOnClone"); + markFlagAsAccessed(59, "useShadowNodeStateOnClone"); flagValue = currentProvider_->useShadowNodeStateOnClone(); useShadowNodeStateOnClone_ = flagValue; @@ -1100,7 +1118,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(59, "useTurboModuleInterop"); + markFlagAsAccessed(60, "useTurboModuleInterop"); flagValue = currentProvider_->useTurboModuleInterop(); useTurboModuleInterop_ = flagValue; @@ -1118,7 +1136,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(60, "useTurboModules"); + markFlagAsAccessed(61, "useTurboModules"); flagValue = currentProvider_->useTurboModules(); useTurboModules_ = flagValue; @@ -1136,7 +1154,7 @@ double ReactNativeFeatureFlagsAccessor::virtualViewPrerenderRatio() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(61, "virtualViewPrerenderRatio"); + markFlagAsAccessed(62, "virtualViewPrerenderRatio"); flagValue = currentProvider_->virtualViewPrerenderRatio(); virtualViewPrerenderRatio_ = flagValue; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h index fb5de307bf71..3d999cfffc1a 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<> */ /** @@ -80,6 +80,7 @@ class ReactNativeFeatureFlagsAccessor { double preparedTextCacheSize(); bool preventShadowTreeCommitExhaustionWithLocking(); bool releaseImageDataWhenConsumed(); + bool shouldPressibilityUseW3CPointerEventsForHover(); bool skipActivityIdentityAssertionOnHostPause(); bool traceTurboModulePromiseRejectionsOnAndroid(); bool updateRuntimeShadowNodeReferencesOnCommit(); @@ -105,7 +106,7 @@ class ReactNativeFeatureFlagsAccessor { std::unique_ptr currentProvider_; bool wasOverridden_; - std::array, 62> accessedFeatureFlags_; + std::array, 63> accessedFeatureFlags_; std::atomic> commonTestFlag_; std::atomic> cxxNativeAnimatedEnabled_; @@ -155,6 +156,7 @@ class ReactNativeFeatureFlagsAccessor { std::atomic> preparedTextCacheSize_; std::atomic> preventShadowTreeCommitExhaustionWithLocking_; std::atomic> releaseImageDataWhenConsumed_; + std::atomic> shouldPressibilityUseW3CPointerEventsForHover_; std::atomic> skipActivityIdentityAssertionOnHostPause_; std::atomic> traceTurboModulePromiseRejectionsOnAndroid_; std::atomic> updateRuntimeShadowNodeReferencesOnCommit_; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h index b90760e874f8..5263e5ae3ff7 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<<614fe0894f6235d879a0b29e7dab7759>> + * @generated SignedSource<> */ /** @@ -219,6 +219,10 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider { return false; } + bool shouldPressibilityUseW3CPointerEventsForHover() override { + return false; + } + bool skipActivityIdentityAssertionOnHostPause() override { return false; } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h index 7e3a4b7acfbd..2f5464d7f2b3 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<<6502c090532e1d7d2ac67cf6e711d9f4>> + * @generated SignedSource<<0c0f09e9761d64995750cac8cd7c3291>> */ /** @@ -477,6 +477,15 @@ class ReactNativeFeatureFlagsDynamicProvider : public ReactNativeFeatureFlagsDef return ReactNativeFeatureFlagsDefaults::releaseImageDataWhenConsumed(); } + bool shouldPressibilityUseW3CPointerEventsForHover() override { + auto value = values_["shouldPressibilityUseW3CPointerEventsForHover"]; + if (!value.isNull()) { + return value.getBool(); + } + + return ReactNativeFeatureFlagsDefaults::shouldPressibilityUseW3CPointerEventsForHover(); + } + bool skipActivityIdentityAssertionOnHostPause() override { auto value = values_["skipActivityIdentityAssertionOnHostPause"]; if (!value.isNull()) { diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h index a17afc70ea90..0b6568528db4 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<> + * @generated SignedSource<<9bd7869f8fd649975cccc10694e73800>> */ /** @@ -73,6 +73,7 @@ class ReactNativeFeatureFlagsProvider { virtual double preparedTextCacheSize() = 0; virtual bool preventShadowTreeCommitExhaustionWithLocking() = 0; virtual bool releaseImageDataWhenConsumed() = 0; + virtual bool shouldPressibilityUseW3CPointerEventsForHover() = 0; virtual bool skipActivityIdentityAssertionOnHostPause() = 0; virtual bool traceTurboModulePromiseRejectionsOnAndroid() = 0; virtual bool updateRuntimeShadowNodeReferencesOnCommit() = 0; diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp index baf92be1b714..3d2c97561c7c 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<> + * @generated SignedSource<<49f1cce8d55c4957e3a2152ff249b7ea>> */ /** @@ -284,6 +284,11 @@ bool NativeReactNativeFeatureFlags::releaseImageDataWhenConsumed( return ReactNativeFeatureFlags::releaseImageDataWhenConsumed(); } +bool NativeReactNativeFeatureFlags::shouldPressibilityUseW3CPointerEventsForHover( + jsi::Runtime& /*runtime*/) { + return ReactNativeFeatureFlags::shouldPressibilityUseW3CPointerEventsForHover(); +} + bool NativeReactNativeFeatureFlags::skipActivityIdentityAssertionOnHostPause( jsi::Runtime& /*runtime*/) { return ReactNativeFeatureFlags::skipActivityIdentityAssertionOnHostPause(); diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h index 23df7ab93f0d..401ae4afb77f 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<> */ /** @@ -132,6 +132,8 @@ class NativeReactNativeFeatureFlags bool releaseImageDataWhenConsumed(jsi::Runtime& runtime); + bool shouldPressibilityUseW3CPointerEventsForHover(jsi::Runtime& runtime); + bool skipActivityIdentityAssertionOnHostPause(jsi::Runtime& runtime); bool traceTurboModulePromiseRejectionsOnAndroid(jsi::Runtime& runtime); diff --git a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js index e23dafa744f3..0d3fd9dc4663 100644 --- a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js +++ b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js @@ -558,6 +558,16 @@ const definitions: FeatureFlagDefinitions = { }, ossReleaseStage: 'none', }, + shouldPressibilityUseW3CPointerEventsForHover: { + defaultValue: false, + metadata: { + description: + 'Function used to enable / disable Pressibility from using W3C Pointer Events for its hover callbacks', + expectedReleaseValue: true, + purpose: 'release', + }, + ossReleaseStage: 'none', + }, skipActivityIdentityAssertionOnHostPause: { defaultValue: false, metadata: { diff --git a/packages/react-native/src/private/devsupport/devmenu/elementinspector/ReactDevToolsOverlay.js b/packages/react-native/src/private/devsupport/devmenu/elementinspector/ReactDevToolsOverlay.js index 8c5bd2b24396..e2b00f935654 100644 --- a/packages/react-native/src/private/devsupport/devmenu/elementinspector/ReactDevToolsOverlay.js +++ b/packages/react-native/src/private/devsupport/devmenu/elementinspector/ReactDevToolsOverlay.js @@ -15,8 +15,8 @@ import type {ReactDevToolsAgent} from '../../../../../Libraries/Types/ReactDevTo import type {InspectedElement} from './Inspector'; import View from '../../../../../Libraries/Components/View/View'; -import ReactNativeFeatureFlags from '../../../../../Libraries/ReactNative/ReactNativeFeatureFlags'; import StyleSheet from '../../../../../Libraries/StyleSheet/StyleSheet'; +import * as ReactNativeFeatureFlags from '../../../../../src/private/featureflags/ReactNativeFeatureFlags'; import ElementBox from './ElementBox'; import * as React from 'react'; @@ -129,7 +129,7 @@ export default function ReactDevToolsOverlay({ if (isInspecting) { const events = // Pointer events only work on fabric - ReactNativeFeatureFlags.shouldEmitW3CPointerEvents() + ReactNativeFeatureFlags.shouldPressibilityUseW3CPointerEventsForHover() ? { onPointerMove, onPointerDown: onPointerMove, diff --git a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js index 110148e3c1a0..f2cfcce401f3 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<> + * @generated SignedSource<<3f35149de427b2ee7338a3fddd268083>> * @flow strict * @noformat */ @@ -94,6 +94,7 @@ export type ReactNativeFeatureFlags = $ReadOnly<{ preparedTextCacheSize: Getter, preventShadowTreeCommitExhaustionWithLocking: Getter, releaseImageDataWhenConsumed: Getter, + shouldPressibilityUseW3CPointerEventsForHover: Getter, skipActivityIdentityAssertionOnHostPause: Getter, traceTurboModulePromiseRejectionsOnAndroid: Getter, updateRuntimeShadowNodeReferencesOnCommit: Getter, @@ -361,6 +362,10 @@ export const preventShadowTreeCommitExhaustionWithLocking: Getter = cre * Releases the cached image data when it is consumed by the observers. */ export const releaseImageDataWhenConsumed: Getter = createNativeFlagGetter('releaseImageDataWhenConsumed', false); +/** + * Function used to enable / disable Pressibility from using W3C Pointer Events for its hover callbacks + */ +export const shouldPressibilityUseW3CPointerEventsForHover: Getter = createNativeFlagGetter('shouldPressibilityUseW3CPointerEventsForHover', false); /** * Skip activity identity assertion in ReactHostImpl::onHostPause() */ diff --git a/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js index 9a95c16f32a3..b9753fa58cd2 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<<45c98e5f4b5f3d3a8a0ded4c5148b549>> + * @generated SignedSource<<3674c9c74d27616fd2970e7b7d45b50e>> * @flow strict * @noformat */ @@ -73,6 +73,7 @@ export interface Spec extends TurboModule { +preparedTextCacheSize?: () => number; +preventShadowTreeCommitExhaustionWithLocking?: () => boolean; +releaseImageDataWhenConsumed?: () => boolean; + +shouldPressibilityUseW3CPointerEventsForHover?: () => boolean; +skipActivityIdentityAssertionOnHostPause?: () => boolean; +traceTurboModulePromiseRejectionsOnAndroid?: () => boolean; +updateRuntimeShadowNodeReferencesOnCommit?: () => boolean; diff --git a/packages/rn-tester/js/examples/Pressable/PressableExample.js b/packages/rn-tester/js/examples/Pressable/PressableExample.js index f9b60c11f76b..b385cf275f35 100644 --- a/packages/rn-tester/js/examples/Pressable/PressableExample.js +++ b/packages/rn-tester/js/examples/Pressable/PressableExample.js @@ -10,6 +10,7 @@ import type {RNTesterModule} from '../../types/RNTesterTypes'; +import * as PressableExampleFbInternal from './PressableExampleFbInternal'; import * as React from 'react'; import { Alert, @@ -21,7 +22,6 @@ import { Text, View, } from 'react-native'; -import ReactNativeFeatureFlags from 'react-native/Libraries/ReactNative/ReactNativeFeatureFlags'; const {useEffect, useRef, useState} = React; @@ -274,25 +274,6 @@ function PressableDisabled() { ); } -function PressableHoverStyle() { - const [hovered, setHovered] = useState(false); - return ( - - setHovered(true)} - onHoverOut={() => setHovered(false)}> - Hover Me - - - ); -} - const styles = StyleSheet.create({ row: { justifyContent: 'center', @@ -587,17 +568,9 @@ const examples = [ return ; }, }, + ...PressableExampleFbInternal.examples, ]; -if (ReactNativeFeatureFlags.shouldPressibilityUseW3CPointerEventsForHover()) { - examples.push({ - title: 'Change style based on Hover', - render(): React.Node { - return ; - }, - }); -} - module.exports = ({ title: 'Pressable', documentationURL: 'https://reactnative.dev/docs/pressable', diff --git a/packages/rn-tester/js/examples/Pressable/PressableExampleFbInternal.js b/packages/rn-tester/js/examples/Pressable/PressableExampleFbInternal.js new file mode 100644 index 000000000000..aa09fc9aa705 --- /dev/null +++ b/packages/rn-tester/js/examples/Pressable/PressableExampleFbInternal.js @@ -0,0 +1,12 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +// $FlowFixMe +export const examples: Array = []; diff --git a/packages/rn-tester/js/utils/RNTesterList.android.js b/packages/rn-tester/js/utils/RNTesterList.android.js index 1977135a57ba..faa05dcf302a 100644 --- a/packages/rn-tester/js/utils/RNTesterList.android.js +++ b/packages/rn-tester/js/utils/RNTesterList.android.js @@ -13,7 +13,6 @@ import type {RNTesterModule, RNTesterModuleInfo} from '../types/RNTesterTypes'; import * as RNTesterListFbInternal from './RNTesterListFbInternal'; -import ReactNativeFeatureFlags from 'react-native/Libraries/ReactNative/ReactNativeFeatureFlags'; const Components: Array = [ { @@ -371,14 +370,6 @@ const APIs: Array = ([ ...RNTesterListFbInternal.APIs, ]: Array).filter(Boolean); -if (ReactNativeFeatureFlags.shouldEmitW3CPointerEvents()) { - APIs.push({ - key: 'W3C PointerEvents', - category: 'Experimental', - module: require('../examples/Experimental/W3CPointerEventsExample').default, - }); -} - const Playgrounds: Array = [ { key: 'PlaygroundExample', diff --git a/packages/rn-tester/js/utils/RNTesterList.ios.js b/packages/rn-tester/js/utils/RNTesterList.ios.js index fa5968d9697b..870b4b445716 100644 --- a/packages/rn-tester/js/utils/RNTesterList.ios.js +++ b/packages/rn-tester/js/utils/RNTesterList.ios.js @@ -11,7 +11,6 @@ import type {RNTesterModule, RNTesterModuleInfo} from '../types/RNTesterTypes'; import * as RNTesterListFbInternal from './RNTesterListFbInternal'; -import ReactNativeFeatureFlags from 'react-native/Libraries/ReactNative/ReactNativeFeatureFlags'; const Components: Array = [ { @@ -345,14 +344,6 @@ const APIs: Array = ([ ...RNTesterListFbInternal.APIs, ]: Array).filter(Boolean); -if (ReactNativeFeatureFlags.shouldEmitW3CPointerEvents()) { - APIs.push({ - key: 'W3C PointerEvents', - category: 'Experimental', - module: require('../examples/Experimental/W3CPointerEventsExample').default, - }); -} - const Playgrounds: Array = [ { key: 'PlaygroundExample',