first commit

This commit is contained in:
2026-03-10 16:18:05 +00:00
commit 11f9c069b5
31635 changed files with 3187747 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
# 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.
cmake_minimum_required(VERSION 3.13)
set(CMAKE_VERBOSE_MAKEFILE on)
include(${REACT_COMMON_DIR}/cmake-utils/react-native-flags.cmake)
file(GLOB react_featureflags_SRC CONFIGURE_DEPENDS *.cpp)
add_library(react_featureflags OBJECT ${react_featureflags_SRC})
target_include_directories(react_featureflags PUBLIC ${REACT_COMMON_DIR})
target_link_libraries(react_featureflags folly_runtime)
target_compile_reactnative_options(react_featureflags PRIVATE)
target_compile_options(react_featureflags PRIVATE -Wpedantic)

View File

@@ -0,0 +1,44 @@
# 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.
require "json"
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "package.json")))
version = package['version']
source = { :git => 'https://github.com/facebook/react-native.git' }
if version == '1000.0.0'
# This is an unpublished version, use the latest commit hash of the react-native repo, which were presumably in.
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
else
source[:tag] = "v#{version}"
end
header_search_paths = []
if ENV['USE_FRAMEWORKS']
header_search_paths << "\"$(PODS_TARGET_SRCROOT)/../..\"" # this is needed to allow the feature flags access its own files
end
Pod::Spec.new do |s|
s.name = "React-featureflags"
s.version = version
s.summary = "React Native internal feature flags"
s.homepage = "https://reactnative.dev/"
s.license = package["license"]
s.author = "Meta Platforms, Inc. and its affiliates"
s.platforms = min_supported_versions
s.source = source
s.source_files = podspec_sources("*.{cpp,h}", "*.h")
s.header_dir = "react/featureflags"
s.pod_target_xcconfig = { "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(),
"HEADER_SEARCH_PATHS" => header_search_paths.join(' '),
"DEFINES_MODULE" => "YES" }
resolve_use_frameworks(s, header_mappings_dir: "../..", module_name: "React_featureflags")
add_rn_third_party_dependencies(s)
add_rncore_dependency(s)
end

View File

@@ -0,0 +1,397 @@
/*
* 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.
*
* @generated SignedSource<<6728f8cada1d0d9d21800b4fefe76b77>>
*/
/**
* IMPORTANT: Do NOT modify this file directly.
*
* To change the definition of the flags, edit
* packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js.
*
* To regenerate this code, run the following script from the repo root:
* yarn featureflags --update
*/
#include "ReactNativeFeatureFlags.h"
namespace facebook::react {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wglobal-constructors"
std::unique_ptr<ReactNativeFeatureFlagsAccessor> accessor_;
#pragma GCC diagnostic pop
bool ReactNativeFeatureFlags::commonTestFlag() {
return getAccessor().commonTestFlag();
}
bool ReactNativeFeatureFlags::cdpInteractionMetricsEnabled() {
return getAccessor().cdpInteractionMetricsEnabled();
}
bool ReactNativeFeatureFlags::cxxNativeAnimatedEnabled() {
return getAccessor().cxxNativeAnimatedEnabled();
}
bool ReactNativeFeatureFlags::cxxNativeAnimatedRemoveJsSync() {
return getAccessor().cxxNativeAnimatedRemoveJsSync();
}
bool ReactNativeFeatureFlags::disableEarlyViewCommandExecution() {
return getAccessor().disableEarlyViewCommandExecution();
}
bool ReactNativeFeatureFlags::disableFabricCommitInCXXAnimated() {
return getAccessor().disableFabricCommitInCXXAnimated();
}
bool ReactNativeFeatureFlags::disableMountItemReorderingAndroid() {
return getAccessor().disableMountItemReorderingAndroid();
}
bool ReactNativeFeatureFlags::disableOldAndroidAttachmentMetricsWorkarounds() {
return getAccessor().disableOldAndroidAttachmentMetricsWorkarounds();
}
bool ReactNativeFeatureFlags::disableTextLayoutManagerCacheAndroid() {
return getAccessor().disableTextLayoutManagerCacheAndroid();
}
bool ReactNativeFeatureFlags::enableAccessibilityOrder() {
return getAccessor().enableAccessibilityOrder();
}
bool ReactNativeFeatureFlags::enableAccumulatedUpdatesInRawPropsAndroid() {
return getAccessor().enableAccumulatedUpdatesInRawPropsAndroid();
}
bool ReactNativeFeatureFlags::enableAndroidLinearText() {
return getAccessor().enableAndroidLinearText();
}
bool ReactNativeFeatureFlags::enableAndroidTextMeasurementOptimizations() {
return getAccessor().enableAndroidTextMeasurementOptimizations();
}
bool ReactNativeFeatureFlags::enableBridgelessArchitecture() {
return getAccessor().enableBridgelessArchitecture();
}
bool ReactNativeFeatureFlags::enableCppPropsIteratorSetter() {
return getAccessor().enableCppPropsIteratorSetter();
}
bool ReactNativeFeatureFlags::enableCustomFocusSearchOnClippedElementsAndroid() {
return getAccessor().enableCustomFocusSearchOnClippedElementsAndroid();
}
bool ReactNativeFeatureFlags::enableDestroyShadowTreeRevisionAsync() {
return getAccessor().enableDestroyShadowTreeRevisionAsync();
}
bool ReactNativeFeatureFlags::enableDoubleMeasurementFixAndroid() {
return getAccessor().enableDoubleMeasurementFixAndroid();
}
bool ReactNativeFeatureFlags::enableEagerMainQueueModulesOnIOS() {
return getAccessor().enableEagerMainQueueModulesOnIOS();
}
bool ReactNativeFeatureFlags::enableEagerRootViewAttachment() {
return getAccessor().enableEagerRootViewAttachment();
}
bool ReactNativeFeatureFlags::enableFabricLogs() {
return getAccessor().enableFabricLogs();
}
bool ReactNativeFeatureFlags::enableFabricRenderer() {
return getAccessor().enableFabricRenderer();
}
bool ReactNativeFeatureFlags::enableFontScaleChangesUpdatingLayout() {
return getAccessor().enableFontScaleChangesUpdatingLayout();
}
bool ReactNativeFeatureFlags::enableIOSTextBaselineOffsetPerLine() {
return getAccessor().enableIOSTextBaselineOffsetPerLine();
}
bool ReactNativeFeatureFlags::enableIOSViewClipToPaddingBox() {
return getAccessor().enableIOSViewClipToPaddingBox();
}
bool ReactNativeFeatureFlags::enableImagePrefetchingAndroid() {
return getAccessor().enableImagePrefetchingAndroid();
}
bool ReactNativeFeatureFlags::enableImagePrefetchingOnUiThreadAndroid() {
return getAccessor().enableImagePrefetchingOnUiThreadAndroid();
}
bool ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges() {
return getAccessor().enableImmediateUpdateModeForContentOffsetChanges();
}
bool ReactNativeFeatureFlags::enableImperativeFocus() {
return getAccessor().enableImperativeFocus();
}
bool ReactNativeFeatureFlags::enableInteropViewManagerClassLookUpOptimizationIOS() {
return getAccessor().enableInteropViewManagerClassLookUpOptimizationIOS();
}
bool ReactNativeFeatureFlags::enableIntersectionObserverByDefault() {
return getAccessor().enableIntersectionObserverByDefault();
}
bool ReactNativeFeatureFlags::enableKeyEvents() {
return getAccessor().enableKeyEvents();
}
bool ReactNativeFeatureFlags::enableLayoutAnimationsOnAndroid() {
return getAccessor().enableLayoutAnimationsOnAndroid();
}
bool ReactNativeFeatureFlags::enableLayoutAnimationsOnIOS() {
return getAccessor().enableLayoutAnimationsOnIOS();
}
bool ReactNativeFeatureFlags::enableMainQueueCoordinatorOnIOS() {
return getAccessor().enableMainQueueCoordinatorOnIOS();
}
bool ReactNativeFeatureFlags::enableModuleArgumentNSNullConversionIOS() {
return getAccessor().enableModuleArgumentNSNullConversionIOS();
}
bool ReactNativeFeatureFlags::enableNativeCSSParsing() {
return getAccessor().enableNativeCSSParsing();
}
bool ReactNativeFeatureFlags::enableNetworkEventReporting() {
return getAccessor().enableNetworkEventReporting();
}
bool ReactNativeFeatureFlags::enablePreparedTextLayout() {
return getAccessor().enablePreparedTextLayout();
}
bool ReactNativeFeatureFlags::enablePropsUpdateReconciliationAndroid() {
return getAccessor().enablePropsUpdateReconciliationAndroid();
}
bool ReactNativeFeatureFlags::enableResourceTimingAPI() {
return getAccessor().enableResourceTimingAPI();
}
bool ReactNativeFeatureFlags::enableSwiftUIBasedFilters() {
return getAccessor().enableSwiftUIBasedFilters();
}
bool ReactNativeFeatureFlags::enableViewCulling() {
return getAccessor().enableViewCulling();
}
bool ReactNativeFeatureFlags::enableViewRecycling() {
return getAccessor().enableViewRecycling();
}
bool ReactNativeFeatureFlags::enableViewRecyclingForImage() {
return getAccessor().enableViewRecyclingForImage();
}
bool ReactNativeFeatureFlags::enableViewRecyclingForScrollView() {
return getAccessor().enableViewRecyclingForScrollView();
}
bool ReactNativeFeatureFlags::enableViewRecyclingForText() {
return getAccessor().enableViewRecyclingForText();
}
bool ReactNativeFeatureFlags::enableViewRecyclingForView() {
return getAccessor().enableViewRecyclingForView();
}
bool ReactNativeFeatureFlags::enableVirtualViewClippingWithoutScrollViewClipping() {
return getAccessor().enableVirtualViewClippingWithoutScrollViewClipping();
}
bool ReactNativeFeatureFlags::enableVirtualViewContainerStateExperimental() {
return getAccessor().enableVirtualViewContainerStateExperimental();
}
bool ReactNativeFeatureFlags::enableVirtualViewDebugFeatures() {
return getAccessor().enableVirtualViewDebugFeatures();
}
bool ReactNativeFeatureFlags::enableVirtualViewRenderState() {
return getAccessor().enableVirtualViewRenderState();
}
bool ReactNativeFeatureFlags::enableVirtualViewWindowFocusDetection() {
return getAccessor().enableVirtualViewWindowFocusDetection();
}
bool ReactNativeFeatureFlags::enableWebPerformanceAPIsByDefault() {
return getAccessor().enableWebPerformanceAPIsByDefault();
}
bool ReactNativeFeatureFlags::fixMappingOfEventPrioritiesBetweenFabricAndReact() {
return getAccessor().fixMappingOfEventPrioritiesBetweenFabricAndReact();
}
bool ReactNativeFeatureFlags::fuseboxAssertSingleHostState() {
return getAccessor().fuseboxAssertSingleHostState();
}
bool ReactNativeFeatureFlags::fuseboxEnabledRelease() {
return getAccessor().fuseboxEnabledRelease();
}
bool ReactNativeFeatureFlags::fuseboxNetworkInspectionEnabled() {
return getAccessor().fuseboxNetworkInspectionEnabled();
}
bool ReactNativeFeatureFlags::hideOffscreenVirtualViewsOnIOS() {
return getAccessor().hideOffscreenVirtualViewsOnIOS();
}
bool ReactNativeFeatureFlags::overrideBySynchronousMountPropsAtMountingAndroid() {
return getAccessor().overrideBySynchronousMountPropsAtMountingAndroid();
}
bool ReactNativeFeatureFlags::perfIssuesEnabled() {
return getAccessor().perfIssuesEnabled();
}
bool ReactNativeFeatureFlags::perfMonitorV2Enabled() {
return getAccessor().perfMonitorV2Enabled();
}
double ReactNativeFeatureFlags::preparedTextCacheSize() {
return getAccessor().preparedTextCacheSize();
}
bool ReactNativeFeatureFlags::preventShadowTreeCommitExhaustion() {
return getAccessor().preventShadowTreeCommitExhaustion();
}
bool ReactNativeFeatureFlags::shouldPressibilityUseW3CPointerEventsForHover() {
return getAccessor().shouldPressibilityUseW3CPointerEventsForHover();
}
bool ReactNativeFeatureFlags::shouldTriggerResponderTransferOnScrollAndroid() {
return getAccessor().shouldTriggerResponderTransferOnScrollAndroid();
}
bool ReactNativeFeatureFlags::skipActivityIdentityAssertionOnHostPause() {
return getAccessor().skipActivityIdentityAssertionOnHostPause();
}
bool ReactNativeFeatureFlags::sweepActiveTouchOnChildNativeGesturesAndroid() {
return getAccessor().sweepActiveTouchOnChildNativeGesturesAndroid();
}
bool ReactNativeFeatureFlags::traceTurboModulePromiseRejectionsOnAndroid() {
return getAccessor().traceTurboModulePromiseRejectionsOnAndroid();
}
bool ReactNativeFeatureFlags::updateRuntimeShadowNodeReferencesOnCommit() {
return getAccessor().updateRuntimeShadowNodeReferencesOnCommit();
}
bool ReactNativeFeatureFlags::useAlwaysAvailableJSErrorHandling() {
return getAccessor().useAlwaysAvailableJSErrorHandling();
}
bool ReactNativeFeatureFlags::useFabricInterop() {
return getAccessor().useFabricInterop();
}
bool ReactNativeFeatureFlags::useNativeEqualsInNativeReadableArrayAndroid() {
return getAccessor().useNativeEqualsInNativeReadableArrayAndroid();
}
bool ReactNativeFeatureFlags::useNativeTransformHelperAndroid() {
return getAccessor().useNativeTransformHelperAndroid();
}
bool ReactNativeFeatureFlags::useNativeViewConfigsInBridgelessMode() {
return getAccessor().useNativeViewConfigsInBridgelessMode();
}
bool ReactNativeFeatureFlags::useOptimizedEventBatchingOnAndroid() {
return getAccessor().useOptimizedEventBatchingOnAndroid();
}
bool ReactNativeFeatureFlags::useRawPropsJsiValue() {
return getAccessor().useRawPropsJsiValue();
}
bool ReactNativeFeatureFlags::useShadowNodeStateOnClone() {
return getAccessor().useShadowNodeStateOnClone();
}
bool ReactNativeFeatureFlags::useSharedAnimatedBackend() {
return getAccessor().useSharedAnimatedBackend();
}
bool ReactNativeFeatureFlags::useTraitHiddenOnAndroid() {
return getAccessor().useTraitHiddenOnAndroid();
}
bool ReactNativeFeatureFlags::useTurboModuleInterop() {
return getAccessor().useTurboModuleInterop();
}
bool ReactNativeFeatureFlags::useTurboModules() {
return getAccessor().useTurboModules();
}
double ReactNativeFeatureFlags::viewCullingOutsetRatio() {
return getAccessor().viewCullingOutsetRatio();
}
double ReactNativeFeatureFlags::virtualViewHysteresisRatio() {
return getAccessor().virtualViewHysteresisRatio();
}
double ReactNativeFeatureFlags::virtualViewPrerenderRatio() {
return getAccessor().virtualViewPrerenderRatio();
}
void ReactNativeFeatureFlags::override(
std::unique_ptr<ReactNativeFeatureFlagsProvider> provider) {
getAccessor().override(std::move(provider));
}
void ReactNativeFeatureFlags::dangerouslyReset() {
accessor_ = std::make_unique<ReactNativeFeatureFlagsAccessor>();
}
std::optional<std::string> ReactNativeFeatureFlags::dangerouslyForceOverride(
std::unique_ptr<ReactNativeFeatureFlagsProvider> provider) {
auto accessor = std::make_unique<ReactNativeFeatureFlagsAccessor>();
accessor->override(std::move(provider));
std::swap(accessor_, accessor);
// Now accessor is the old accessor
return accessor == nullptr ? std::nullopt
: accessor->getAccessedFeatureFlagNames();
}
ReactNativeFeatureFlagsAccessor& ReactNativeFeatureFlags::getAccessor() {
if (accessor_ == nullptr) {
accessor_ = std::make_unique<ReactNativeFeatureFlagsAccessor>();
}
return *accessor_;
}
} // namespace facebook::react

View File

@@ -0,0 +1,522 @@
/*
* 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.
*
* @generated SignedSource<<4b8574d0682b5e9644affc89559393ac>>
*/
/**
* IMPORTANT: Do NOT modify this file directly.
*
* To change the definition of the flags, edit
* packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js.
*
* To regenerate this code, run the following script from the repo root:
* yarn featureflags --update
*/
#pragma once
#include <react/featureflags/ReactNativeFeatureFlagsAccessor.h>
#include <react/featureflags/ReactNativeFeatureFlagsProvider.h>
#include <memory>
#include <optional>
#include <string>
#ifndef RN_EXPORT
#define RN_EXPORT __attribute__((visibility("default")))
#endif
namespace facebook::react {
/**
* This class provides access to internal React Native feature flags.
*
* All the methods are thread-safe (as long as the methods in the overridden
* provider are).
*/
class ReactNativeFeatureFlags {
public:
/**
* Common flag for testing. Do NOT modify.
*/
RN_EXPORT static bool commonTestFlag();
/**
* Enable emitting of InteractionEntry live metrics to the debugger. Requires `enableBridgelessArchitecture`.
*/
RN_EXPORT static bool cdpInteractionMetricsEnabled();
/**
* Use a C++ implementation of Native Animated instead of the platform implementation.
*/
RN_EXPORT static bool cxxNativeAnimatedEnabled();
/**
* Removes JS sync at end of native animation
*/
RN_EXPORT static bool cxxNativeAnimatedRemoveJsSync();
/**
* Dispatch view commands in mount item order.
*/
RN_EXPORT static bool disableEarlyViewCommandExecution();
/**
* Prevents use of Fabric commit in C++ Animated implementation
*/
RN_EXPORT static bool disableFabricCommitInCXXAnimated();
/**
* Prevent FabricMountingManager from reordering mountItems, which may lead to invalid state on the UI thread
*/
RN_EXPORT static bool disableMountItemReorderingAndroid();
/**
* Disable some workarounds for old Android versions in TextLayoutManager logic for retrieving attachment metrics
*/
RN_EXPORT static bool disableOldAndroidAttachmentMetricsWorkarounds();
/**
* Turns off the global measurement cache used by TextLayoutManager on Android.
*/
RN_EXPORT static bool disableTextLayoutManagerCacheAndroid();
/**
* When enabled, the accessibilityOrder prop will propagate to native platforms and define the accessibility order.
*/
RN_EXPORT static bool enableAccessibilityOrder();
/**
* When enabled, Android will accumulate updates in rawProps to reduce the number of mounting instructions for cascading re-renders.
*/
RN_EXPORT static bool enableAccumulatedUpdatesInRawPropsAndroid();
/**
* Enables linear text rendering on Android wherever subpixel text rendering is enabled
*/
RN_EXPORT static bool enableAndroidLinearText();
/**
* Enables various optimizations throughout the path of measuring text on Android.
*/
RN_EXPORT static bool enableAndroidTextMeasurementOptimizations();
/**
* Feature flag to enable the new bridgeless architecture. Note: Enabling this will force enable the following flags: `useTurboModules` & `enableFabricRenderer`.
*/
RN_EXPORT static bool enableBridgelessArchitecture();
/**
* Enable prop iterator setter-style construction of Props in C++ (this flag is not used in Java).
*/
RN_EXPORT static bool enableCppPropsIteratorSetter();
/**
* This enables the fabric implementation of focus search so that we can focus clipped elements
*/
RN_EXPORT static bool enableCustomFocusSearchOnClippedElementsAndroid();
/**
* Enables destructor calls for ShadowTreeRevision in the background to reduce UI thread work.
*/
RN_EXPORT static bool enableDestroyShadowTreeRevisionAsync();
/**
* When enabled a subset of components will avoid double measurement on Android.
*/
RN_EXPORT static bool enableDoubleMeasurementFixAndroid();
/**
* This infra allows native modules to initialize on the main thread, during React Native init.
*/
RN_EXPORT static bool enableEagerMainQueueModulesOnIOS();
/**
* Feature flag to configure eager attachment of the root view/initialisation of the JS code.
*/
RN_EXPORT static bool enableEagerRootViewAttachment();
/**
* This feature flag enables logs for Fabric.
*/
RN_EXPORT static bool enableFabricLogs();
/**
* Enables the use of the Fabric renderer in the whole app.
*/
RN_EXPORT static bool enableFabricRenderer();
/**
* Enables font scale changes updating layout for measurable nodes.
*/
RN_EXPORT static bool enableFontScaleChangesUpdatingLayout();
/**
* Applies base offset for each line of text separately on iOS.
*/
RN_EXPORT static bool enableIOSTextBaselineOffsetPerLine();
/**
* iOS Views will clip to their padding box vs border box
*/
RN_EXPORT static bool enableIOSViewClipToPaddingBox();
/**
* When enabled, Android will build and initiate image prefetch requests on ImageShadowNode::layout
*/
RN_EXPORT static bool enableImagePrefetchingAndroid();
/**
* When enabled, Android will initiate image prefetch requested on ImageShadowNode::layout on the UI thread
*/
RN_EXPORT static bool enableImagePrefetchingOnUiThreadAndroid();
/**
* Dispatches state updates for content offset changes synchronously on the main thread.
*/
RN_EXPORT static bool enableImmediateUpdateModeForContentOffsetChanges();
/**
* Enable ref.focus() and ref.blur() for all views, not just TextInput.
*/
RN_EXPORT static bool enableImperativeFocus();
/**
* This is to fix the issue with interop view manager where component descriptor lookup is causing ViewManager to preload.
*/
RN_EXPORT static bool enableInteropViewManagerClassLookUpOptimizationIOS();
/**
* Enables the IntersectionObserver Web API in React Native.
*/
RN_EXPORT static bool enableIntersectionObserverByDefault();
/**
* Enables key up/down/press events to be sent to JS from components
*/
RN_EXPORT static bool enableKeyEvents();
/**
* When enabled, LayoutAnimations API will animate state changes on Android.
*/
RN_EXPORT static bool enableLayoutAnimationsOnAndroid();
/**
* When enabled, LayoutAnimations API will animate state changes on iOS.
*/
RN_EXPORT static bool enableLayoutAnimationsOnIOS();
/**
* Make RCTUnsafeExecuteOnMainQueueSync less likely to deadlock, when used in conjuction with sync rendering/events.
*/
RN_EXPORT static bool enableMainQueueCoordinatorOnIOS();
/**
* Enable NSNull conversion when handling module arguments on iOS
*/
RN_EXPORT static bool enableModuleArgumentNSNullConversionIOS();
/**
* Parse CSS strings using the Fabric CSS parser instead of ViewConfig processing
*/
RN_EXPORT static bool enableNativeCSSParsing();
/**
* Enable network event reporting hooks in each native platform through `NetworkReporter`. This flag should be combined with `enableResourceTimingAPI` and `fuseboxNetworkInspectionEnabled` to enable end-to-end reporting behaviour via the Web Performance API and CDP debugging respectively.
*/
RN_EXPORT static bool enableNetworkEventReporting();
/**
* Enables caching text layout artifacts for later reuse
*/
RN_EXPORT static bool enablePreparedTextLayout();
/**
* When enabled, Android will receive prop updates based on the differences between the last rendered shadow node and the last committed shadow node.
*/
RN_EXPORT static bool enablePropsUpdateReconciliationAndroid();
/**
* Enables the reporting of network resource timings through `PerformanceObserver`.
*/
RN_EXPORT static bool enableResourceTimingAPI();
/**
* When enabled, it will use SwiftUI for filter effects like blur on iOS.
*/
RN_EXPORT static bool enableSwiftUIBasedFilters();
/**
* Enables View Culling: as soon as a view goes off screen, it can be reused anywhere in the UI and pieced together with other items to create new UI elements.
*/
RN_EXPORT static bool enableViewCulling();
/**
* Enables View Recycling. When enabled, individual ViewManagers must still opt-in.
*/
RN_EXPORT static bool enableViewRecycling();
/**
* Enables View Recycling for <Image> via ReactViewGroup/ReactViewManager.
*/
RN_EXPORT static bool enableViewRecyclingForImage();
/**
* Enables View Recycling for <ScrollView> via ReactViewGroup/ReactViewManager.
*/
RN_EXPORT static bool enableViewRecyclingForScrollView();
/**
* Enables View Recycling for <Text> via ReactTextView/ReactTextViewManager.
*/
RN_EXPORT static bool enableViewRecyclingForText();
/**
* Enables View Recycling for <View> via ReactViewGroup/ReactViewManager.
*/
RN_EXPORT static bool enableViewRecyclingForView();
/**
* Set clipping to drawingRect of ScrollView.
*/
RN_EXPORT static bool enableVirtualViewClippingWithoutScrollViewClipping();
/**
* Enables the experimental version of `VirtualViewContainerState`.
*/
RN_EXPORT static bool enableVirtualViewContainerStateExperimental();
/**
* Enables VirtualView debug features such as logging and overlays.
*/
RN_EXPORT static bool enableVirtualViewDebugFeatures();
/**
* Enables reading render state when dispatching VirtualView events.
*/
RN_EXPORT static bool enableVirtualViewRenderState();
/**
* Enables window focus detection for prioritizing VirtualView events.
*/
RN_EXPORT static bool enableVirtualViewWindowFocusDetection();
/**
* Enable Web Performance APIs (Performance Timeline, User Timings, etc.) by default.
*/
RN_EXPORT static bool enableWebPerformanceAPIsByDefault();
/**
* Uses the default event priority instead of the discreet event priority by default when dispatching events from Fabric to React.
*/
RN_EXPORT static bool fixMappingOfEventPrioritiesBetweenFabricAndReact();
/**
* Enable system assertion validating that Fusebox is configured with a single host. When set, the CDP backend will dynamically disable features (Perf and Network) in the event that multiple hosts are registered (undefined behaviour), and broadcast this over `ReactNativeApplication.systemStateChanged`.
*/
RN_EXPORT static bool fuseboxAssertSingleHostState();
/**
* Flag determining if the React Native DevTools (Fusebox) CDP backend should be enabled in release builds. This flag is global and should not be changed across React Host lifetimes.
*/
RN_EXPORT static bool fuseboxEnabledRelease();
/**
* Enable network inspection support in the React Native DevTools CDP backend. Requires `enableBridgelessArchitecture`. This flag is global and should not be changed across React Host lifetimes.
*/
RN_EXPORT static bool fuseboxNetworkInspectionEnabled();
/**
* Hides offscreen VirtualViews on iOS by setting hidden = YES to avoid extra cost of views
*/
RN_EXPORT static bool hideOffscreenVirtualViewsOnIOS();
/**
* Override props at mounting with synchronously mounted (i.e. direct manipulation) props from Native Animated.
*/
RN_EXPORT static bool overrideBySynchronousMountPropsAtMountingAndroid();
/**
* Enable reporting Performance Issues (`detail.rnPerfIssue`). Displayed in the V2 Performance Monitor and the "Performance Issues" sub-panel in DevTools.
*/
RN_EXPORT static bool perfIssuesEnabled();
/**
* Enable the V2 in-app Performance Monitor. This flag is global and should not be changed across React Host lifetimes.
*/
RN_EXPORT static bool perfMonitorV2Enabled();
/**
* Number cached PreparedLayouts in TextLayoutManager cache
*/
RN_EXPORT static double preparedTextCacheSize();
/**
* Enables a new mechanism in ShadowTree to prevent problems caused by multiple threads trying to commit concurrently. If a thread tries to commit a few times unsuccessfully, it will acquire a lock and try again.
*/
RN_EXPORT static bool preventShadowTreeCommitExhaustion();
/**
* Function used to enable / disable Pressibility from using W3C Pointer Events for its hover callbacks
*/
RN_EXPORT static bool shouldPressibilityUseW3CPointerEventsForHover();
/**
* Do not emit touchcancel from Android ScrollView, instead native topScroll event will trigger responder transfer and terminate in RN renderer.
*/
RN_EXPORT static bool shouldTriggerResponderTransferOnScrollAndroid();
/**
* Skip activity identity assertion in ReactHostImpl::onHostPause()
*/
RN_EXPORT static bool skipActivityIdentityAssertionOnHostPause();
/**
* A flag to tell Fabric to sweep active touches from JSTouchDispatcher in Android when a child native gesture is started.
*/
RN_EXPORT static bool sweepActiveTouchOnChildNativeGesturesAndroid();
/**
* Enables storing js caller stack when creating promise in native module. This is useful in case of Promise rejection and tracing the cause.
*/
RN_EXPORT static bool traceTurboModulePromiseRejectionsOnAndroid();
/**
* When enabled, runtime shadow node references will be updated during the commit. This allows running RSNRU from any thread without corrupting the renderer state.
*/
RN_EXPORT static bool updateRuntimeShadowNodeReferencesOnCommit();
/**
* In Bridgeless mode, use the always available javascript error reporting pipeline.
*/
RN_EXPORT static bool useAlwaysAvailableJSErrorHandling();
/**
* Should this application enable the Fabric Interop Layer for Android? If yes, the application will behave so that it can accept non-Fabric components and render them on Fabric. This toggle is controlling extra logic such as custom event dispatching that are needed for the Fabric Interop Layer to work correctly.
*/
RN_EXPORT static bool useFabricInterop();
/**
* Use a native implementation of equals in NativeReadableArray.
*/
RN_EXPORT static bool useNativeEqualsInNativeReadableArrayAndroid();
/**
* Use a native implementation of TransformHelper
*/
RN_EXPORT static bool useNativeTransformHelperAndroid();
/**
* When enabled, the native view configs are used in bridgeless mode.
*/
RN_EXPORT static bool useNativeViewConfigsInBridgelessMode();
/**
* Uses an optimized mechanism for event batching on Android that does not need to wait for a Choreographer frame callback.
*/
RN_EXPORT static bool useOptimizedEventBatchingOnAndroid();
/**
* Instead of using folly::dynamic as internal representation in RawProps and RawValue, use jsi::Value
*/
RN_EXPORT static bool useRawPropsJsiValue();
/**
* Use the state stored on the source shadow node when cloning it instead of reading in the most recent state on the shadow node family.
*/
RN_EXPORT static bool useShadowNodeStateOnClone();
/**
* Use shared animation backend in C++ Animated
*/
RN_EXPORT static bool useSharedAnimatedBackend();
/**
* Use Trait::hidden on Android
*/
RN_EXPORT static bool useTraitHiddenOnAndroid();
/**
* In Bridgeless mode, should legacy NativeModules use the TurboModule system?
*/
RN_EXPORT static bool useTurboModuleInterop();
/**
* When enabled, NativeModules will be executed by using the TurboModule system
*/
RN_EXPORT static bool useTurboModules();
/**
* Outset the culling context frame with the provided ratio. The culling context frame size will be outset by width * ratio on the left and right, and height * ratio on the top and bottom.
*/
RN_EXPORT static double viewCullingOutsetRatio();
/**
* Sets a hysteresis window for transition between prerender and hidden modes.
*/
RN_EXPORT static double virtualViewHysteresisRatio();
/**
* Initial prerender ratio for VirtualView.
*/
RN_EXPORT static double virtualViewPrerenderRatio();
/**
* Overrides the feature flags with the ones provided by the given provider
* (generally one that extends `ReactNativeFeatureFlagsDefaults`).
*
* This method must be called before you initialize the React Native runtime.
*
* @example
*
* ```
* class MyReactNativeFeatureFlags : public ReactNativeFeatureFlagsDefaults {
* public:
* bool someFlag() override;
* };
*
* ReactNativeFeatureFlags.override(
* std::make_unique<MyReactNativeFeatureFlags>());
* ```
*/
RN_EXPORT static void override(
std::unique_ptr<ReactNativeFeatureFlagsProvider> provider);
/**
* Removes the overridden feature flags and makes the API return default
* values again.
*
* This is **dangerous**. Use it only if you really understand the
* implications of this method.
*
* This should only be called if you destroy the React Native runtime and
* need to create a new one with different overrides. In that case,
* call `dangerouslyReset` after destroying the runtime and `override` again
* before initializing the new one.
*/
RN_EXPORT static void dangerouslyReset();
/**
* This is a combination of `dangerouslyReset` and `override` that reduces
* the likeliness of a race condition between the two calls.
*
* This is **dangerous** because it can introduce consistency issues that will
* be much harder to debug. For example, it could hide the fact that feature
* flags are read before you set the values you want to use everywhere. It
* could also cause a workflow to suddenly have different feature flags for
* behaviors that were configured with different values before.
*
* Please see the documentation of `dangerouslyReset` for additional details.
*/
RN_EXPORT static std::optional<std::string> dangerouslyForceOverride(
std::unique_ptr<ReactNativeFeatureFlagsProvider> provider);
private:
ReactNativeFeatureFlags() = delete;
static ReactNativeFeatureFlagsAccessor& getAccessor();
};
} // namespace facebook::react

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,220 @@
/*
* 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.
*
* @generated SignedSource<<b88e97176f25900602b0821e16af4d12>>
*/
/**
* IMPORTANT: Do NOT modify this file directly.
*
* To change the definition of the flags, edit
* packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js.
*
* To regenerate this code, run the following script from the repo root:
* yarn featureflags --update
*/
#pragma once
#include <react/featureflags/ReactNativeFeatureFlagsProvider.h>
#include <array>
#include <atomic>
#include <memory>
#include <optional>
#include <string>
namespace facebook::react {
class ReactNativeFeatureFlagsAccessor {
public:
ReactNativeFeatureFlagsAccessor();
bool commonTestFlag();
bool cdpInteractionMetricsEnabled();
bool cxxNativeAnimatedEnabled();
bool cxxNativeAnimatedRemoveJsSync();
bool disableEarlyViewCommandExecution();
bool disableFabricCommitInCXXAnimated();
bool disableMountItemReorderingAndroid();
bool disableOldAndroidAttachmentMetricsWorkarounds();
bool disableTextLayoutManagerCacheAndroid();
bool enableAccessibilityOrder();
bool enableAccumulatedUpdatesInRawPropsAndroid();
bool enableAndroidLinearText();
bool enableAndroidTextMeasurementOptimizations();
bool enableBridgelessArchitecture();
bool enableCppPropsIteratorSetter();
bool enableCustomFocusSearchOnClippedElementsAndroid();
bool enableDestroyShadowTreeRevisionAsync();
bool enableDoubleMeasurementFixAndroid();
bool enableEagerMainQueueModulesOnIOS();
bool enableEagerRootViewAttachment();
bool enableFabricLogs();
bool enableFabricRenderer();
bool enableFontScaleChangesUpdatingLayout();
bool enableIOSTextBaselineOffsetPerLine();
bool enableIOSViewClipToPaddingBox();
bool enableImagePrefetchingAndroid();
bool enableImagePrefetchingOnUiThreadAndroid();
bool enableImmediateUpdateModeForContentOffsetChanges();
bool enableImperativeFocus();
bool enableInteropViewManagerClassLookUpOptimizationIOS();
bool enableIntersectionObserverByDefault();
bool enableKeyEvents();
bool enableLayoutAnimationsOnAndroid();
bool enableLayoutAnimationsOnIOS();
bool enableMainQueueCoordinatorOnIOS();
bool enableModuleArgumentNSNullConversionIOS();
bool enableNativeCSSParsing();
bool enableNetworkEventReporting();
bool enablePreparedTextLayout();
bool enablePropsUpdateReconciliationAndroid();
bool enableResourceTimingAPI();
bool enableSwiftUIBasedFilters();
bool enableViewCulling();
bool enableViewRecycling();
bool enableViewRecyclingForImage();
bool enableViewRecyclingForScrollView();
bool enableViewRecyclingForText();
bool enableViewRecyclingForView();
bool enableVirtualViewClippingWithoutScrollViewClipping();
bool enableVirtualViewContainerStateExperimental();
bool enableVirtualViewDebugFeatures();
bool enableVirtualViewRenderState();
bool enableVirtualViewWindowFocusDetection();
bool enableWebPerformanceAPIsByDefault();
bool fixMappingOfEventPrioritiesBetweenFabricAndReact();
bool fuseboxAssertSingleHostState();
bool fuseboxEnabledRelease();
bool fuseboxNetworkInspectionEnabled();
bool hideOffscreenVirtualViewsOnIOS();
bool overrideBySynchronousMountPropsAtMountingAndroid();
bool perfIssuesEnabled();
bool perfMonitorV2Enabled();
double preparedTextCacheSize();
bool preventShadowTreeCommitExhaustion();
bool shouldPressibilityUseW3CPointerEventsForHover();
bool shouldTriggerResponderTransferOnScrollAndroid();
bool skipActivityIdentityAssertionOnHostPause();
bool sweepActiveTouchOnChildNativeGesturesAndroid();
bool traceTurboModulePromiseRejectionsOnAndroid();
bool updateRuntimeShadowNodeReferencesOnCommit();
bool useAlwaysAvailableJSErrorHandling();
bool useFabricInterop();
bool useNativeEqualsInNativeReadableArrayAndroid();
bool useNativeTransformHelperAndroid();
bool useNativeViewConfigsInBridgelessMode();
bool useOptimizedEventBatchingOnAndroid();
bool useRawPropsJsiValue();
bool useShadowNodeStateOnClone();
bool useSharedAnimatedBackend();
bool useTraitHiddenOnAndroid();
bool useTurboModuleInterop();
bool useTurboModules();
double viewCullingOutsetRatio();
double virtualViewHysteresisRatio();
double virtualViewPrerenderRatio();
void override(std::unique_ptr<ReactNativeFeatureFlagsProvider> provider);
std::optional<std::string> getAccessedFeatureFlagNames() const;
private:
void markFlagAsAccessed(int position, const char* flagName);
void ensureFlagsNotAccessed();
std::unique_ptr<ReactNativeFeatureFlagsProvider> currentProvider_;
bool wasOverridden_;
std::array<std::atomic<const char*>, 85> accessedFeatureFlags_;
std::atomic<std::optional<bool>> commonTestFlag_;
std::atomic<std::optional<bool>> cdpInteractionMetricsEnabled_;
std::atomic<std::optional<bool>> cxxNativeAnimatedEnabled_;
std::atomic<std::optional<bool>> cxxNativeAnimatedRemoveJsSync_;
std::atomic<std::optional<bool>> disableEarlyViewCommandExecution_;
std::atomic<std::optional<bool>> disableFabricCommitInCXXAnimated_;
std::atomic<std::optional<bool>> disableMountItemReorderingAndroid_;
std::atomic<std::optional<bool>> disableOldAndroidAttachmentMetricsWorkarounds_;
std::atomic<std::optional<bool>> disableTextLayoutManagerCacheAndroid_;
std::atomic<std::optional<bool>> enableAccessibilityOrder_;
std::atomic<std::optional<bool>> enableAccumulatedUpdatesInRawPropsAndroid_;
std::atomic<std::optional<bool>> enableAndroidLinearText_;
std::atomic<std::optional<bool>> enableAndroidTextMeasurementOptimizations_;
std::atomic<std::optional<bool>> enableBridgelessArchitecture_;
std::atomic<std::optional<bool>> enableCppPropsIteratorSetter_;
std::atomic<std::optional<bool>> enableCustomFocusSearchOnClippedElementsAndroid_;
std::atomic<std::optional<bool>> enableDestroyShadowTreeRevisionAsync_;
std::atomic<std::optional<bool>> enableDoubleMeasurementFixAndroid_;
std::atomic<std::optional<bool>> enableEagerMainQueueModulesOnIOS_;
std::atomic<std::optional<bool>> enableEagerRootViewAttachment_;
std::atomic<std::optional<bool>> enableFabricLogs_;
std::atomic<std::optional<bool>> enableFabricRenderer_;
std::atomic<std::optional<bool>> enableFontScaleChangesUpdatingLayout_;
std::atomic<std::optional<bool>> enableIOSTextBaselineOffsetPerLine_;
std::atomic<std::optional<bool>> enableIOSViewClipToPaddingBox_;
std::atomic<std::optional<bool>> enableImagePrefetchingAndroid_;
std::atomic<std::optional<bool>> enableImagePrefetchingOnUiThreadAndroid_;
std::atomic<std::optional<bool>> enableImmediateUpdateModeForContentOffsetChanges_;
std::atomic<std::optional<bool>> enableImperativeFocus_;
std::atomic<std::optional<bool>> enableInteropViewManagerClassLookUpOptimizationIOS_;
std::atomic<std::optional<bool>> enableIntersectionObserverByDefault_;
std::atomic<std::optional<bool>> enableKeyEvents_;
std::atomic<std::optional<bool>> enableLayoutAnimationsOnAndroid_;
std::atomic<std::optional<bool>> enableLayoutAnimationsOnIOS_;
std::atomic<std::optional<bool>> enableMainQueueCoordinatorOnIOS_;
std::atomic<std::optional<bool>> enableModuleArgumentNSNullConversionIOS_;
std::atomic<std::optional<bool>> enableNativeCSSParsing_;
std::atomic<std::optional<bool>> enableNetworkEventReporting_;
std::atomic<std::optional<bool>> enablePreparedTextLayout_;
std::atomic<std::optional<bool>> enablePropsUpdateReconciliationAndroid_;
std::atomic<std::optional<bool>> enableResourceTimingAPI_;
std::atomic<std::optional<bool>> enableSwiftUIBasedFilters_;
std::atomic<std::optional<bool>> enableViewCulling_;
std::atomic<std::optional<bool>> enableViewRecycling_;
std::atomic<std::optional<bool>> enableViewRecyclingForImage_;
std::atomic<std::optional<bool>> enableViewRecyclingForScrollView_;
std::atomic<std::optional<bool>> enableViewRecyclingForText_;
std::atomic<std::optional<bool>> enableViewRecyclingForView_;
std::atomic<std::optional<bool>> enableVirtualViewClippingWithoutScrollViewClipping_;
std::atomic<std::optional<bool>> enableVirtualViewContainerStateExperimental_;
std::atomic<std::optional<bool>> enableVirtualViewDebugFeatures_;
std::atomic<std::optional<bool>> enableVirtualViewRenderState_;
std::atomic<std::optional<bool>> enableVirtualViewWindowFocusDetection_;
std::atomic<std::optional<bool>> enableWebPerformanceAPIsByDefault_;
std::atomic<std::optional<bool>> fixMappingOfEventPrioritiesBetweenFabricAndReact_;
std::atomic<std::optional<bool>> fuseboxAssertSingleHostState_;
std::atomic<std::optional<bool>> fuseboxEnabledRelease_;
std::atomic<std::optional<bool>> fuseboxNetworkInspectionEnabled_;
std::atomic<std::optional<bool>> hideOffscreenVirtualViewsOnIOS_;
std::atomic<std::optional<bool>> overrideBySynchronousMountPropsAtMountingAndroid_;
std::atomic<std::optional<bool>> perfIssuesEnabled_;
std::atomic<std::optional<bool>> perfMonitorV2Enabled_;
std::atomic<std::optional<double>> preparedTextCacheSize_;
std::atomic<std::optional<bool>> preventShadowTreeCommitExhaustion_;
std::atomic<std::optional<bool>> shouldPressibilityUseW3CPointerEventsForHover_;
std::atomic<std::optional<bool>> shouldTriggerResponderTransferOnScrollAndroid_;
std::atomic<std::optional<bool>> skipActivityIdentityAssertionOnHostPause_;
std::atomic<std::optional<bool>> sweepActiveTouchOnChildNativeGesturesAndroid_;
std::atomic<std::optional<bool>> traceTurboModulePromiseRejectionsOnAndroid_;
std::atomic<std::optional<bool>> updateRuntimeShadowNodeReferencesOnCommit_;
std::atomic<std::optional<bool>> useAlwaysAvailableJSErrorHandling_;
std::atomic<std::optional<bool>> useFabricInterop_;
std::atomic<std::optional<bool>> useNativeEqualsInNativeReadableArrayAndroid_;
std::atomic<std::optional<bool>> useNativeTransformHelperAndroid_;
std::atomic<std::optional<bool>> useNativeViewConfigsInBridgelessMode_;
std::atomic<std::optional<bool>> useOptimizedEventBatchingOnAndroid_;
std::atomic<std::optional<bool>> useRawPropsJsiValue_;
std::atomic<std::optional<bool>> useShadowNodeStateOnClone_;
std::atomic<std::optional<bool>> useSharedAnimatedBackend_;
std::atomic<std::optional<bool>> useTraitHiddenOnAndroid_;
std::atomic<std::optional<bool>> useTurboModuleInterop_;
std::atomic<std::optional<bool>> useTurboModules_;
std::atomic<std::optional<double>> viewCullingOutsetRatio_;
std::atomic<std::optional<double>> virtualViewHysteresisRatio_;
std::atomic<std::optional<double>> virtualViewPrerenderRatio_;
};
} // namespace facebook::react

View File

@@ -0,0 +1,371 @@
/*
* 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.
*
* @generated SignedSource<<f8c2279957d1c654502ea5aa0f66beba>>
*/
/**
* IMPORTANT: Do NOT modify this file directly.
*
* To change the definition of the flags, edit
* packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js.
*
* To regenerate this code, run the following script from the repo root:
* yarn featureflags --update
*/
#pragma once
#include <react/featureflags/ReactNativeFeatureFlagsProvider.h>
namespace facebook::react {
class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider {
public:
ReactNativeFeatureFlagsDefaults() = default;
bool commonTestFlag() override {
return false;
}
bool cdpInteractionMetricsEnabled() override {
return false;
}
bool cxxNativeAnimatedEnabled() override {
return false;
}
bool cxxNativeAnimatedRemoveJsSync() override {
return false;
}
bool disableEarlyViewCommandExecution() override {
return false;
}
bool disableFabricCommitInCXXAnimated() override {
return false;
}
bool disableMountItemReorderingAndroid() override {
return false;
}
bool disableOldAndroidAttachmentMetricsWorkarounds() override {
return true;
}
bool disableTextLayoutManagerCacheAndroid() override {
return false;
}
bool enableAccessibilityOrder() override {
return false;
}
bool enableAccumulatedUpdatesInRawPropsAndroid() override {
return false;
}
bool enableAndroidLinearText() override {
return false;
}
bool enableAndroidTextMeasurementOptimizations() override {
return false;
}
bool enableBridgelessArchitecture() override {
return false;
}
bool enableCppPropsIteratorSetter() override {
return false;
}
bool enableCustomFocusSearchOnClippedElementsAndroid() override {
return true;
}
bool enableDestroyShadowTreeRevisionAsync() override {
return false;
}
bool enableDoubleMeasurementFixAndroid() override {
return false;
}
bool enableEagerMainQueueModulesOnIOS() override {
return false;
}
bool enableEagerRootViewAttachment() override {
return false;
}
bool enableFabricLogs() override {
return false;
}
bool enableFabricRenderer() override {
return false;
}
bool enableFontScaleChangesUpdatingLayout() override {
return true;
}
bool enableIOSTextBaselineOffsetPerLine() override {
return false;
}
bool enableIOSViewClipToPaddingBox() override {
return false;
}
bool enableImagePrefetchingAndroid() override {
return false;
}
bool enableImagePrefetchingOnUiThreadAndroid() override {
return false;
}
bool enableImmediateUpdateModeForContentOffsetChanges() override {
return false;
}
bool enableImperativeFocus() override {
return false;
}
bool enableInteropViewManagerClassLookUpOptimizationIOS() override {
return false;
}
bool enableIntersectionObserverByDefault() override {
return false;
}
bool enableKeyEvents() override {
return false;
}
bool enableLayoutAnimationsOnAndroid() override {
return false;
}
bool enableLayoutAnimationsOnIOS() override {
return true;
}
bool enableMainQueueCoordinatorOnIOS() override {
return false;
}
bool enableModuleArgumentNSNullConversionIOS() override {
return false;
}
bool enableNativeCSSParsing() override {
return false;
}
bool enableNetworkEventReporting() override {
return true;
}
bool enablePreparedTextLayout() override {
return false;
}
bool enablePropsUpdateReconciliationAndroid() override {
return false;
}
bool enableResourceTimingAPI() override {
return true;
}
bool enableSwiftUIBasedFilters() override {
return false;
}
bool enableViewCulling() override {
return false;
}
bool enableViewRecycling() override {
return false;
}
bool enableViewRecyclingForImage() override {
return true;
}
bool enableViewRecyclingForScrollView() override {
return false;
}
bool enableViewRecyclingForText() override {
return true;
}
bool enableViewRecyclingForView() override {
return true;
}
bool enableVirtualViewClippingWithoutScrollViewClipping() override {
return true;
}
bool enableVirtualViewContainerStateExperimental() override {
return false;
}
bool enableVirtualViewDebugFeatures() override {
return false;
}
bool enableVirtualViewRenderState() override {
return true;
}
bool enableVirtualViewWindowFocusDetection() override {
return false;
}
bool enableWebPerformanceAPIsByDefault() override {
return true;
}
bool fixMappingOfEventPrioritiesBetweenFabricAndReact() override {
return false;
}
bool fuseboxAssertSingleHostState() override {
return true;
}
bool fuseboxEnabledRelease() override {
return false;
}
bool fuseboxNetworkInspectionEnabled() override {
return true;
}
bool hideOffscreenVirtualViewsOnIOS() override {
return false;
}
bool overrideBySynchronousMountPropsAtMountingAndroid() override {
return false;
}
bool perfIssuesEnabled() override {
return false;
}
bool perfMonitorV2Enabled() override {
return false;
}
double preparedTextCacheSize() override {
return 200.0;
}
bool preventShadowTreeCommitExhaustion() override {
return false;
}
bool shouldPressibilityUseW3CPointerEventsForHover() override {
return false;
}
bool shouldTriggerResponderTransferOnScrollAndroid() override {
return false;
}
bool skipActivityIdentityAssertionOnHostPause() override {
return false;
}
bool sweepActiveTouchOnChildNativeGesturesAndroid() override {
return true;
}
bool traceTurboModulePromiseRejectionsOnAndroid() override {
return false;
}
bool updateRuntimeShadowNodeReferencesOnCommit() override {
return false;
}
bool useAlwaysAvailableJSErrorHandling() override {
return false;
}
bool useFabricInterop() override {
return true;
}
bool useNativeEqualsInNativeReadableArrayAndroid() override {
return true;
}
bool useNativeTransformHelperAndroid() override {
return true;
}
bool useNativeViewConfigsInBridgelessMode() override {
return false;
}
bool useOptimizedEventBatchingOnAndroid() override {
return false;
}
bool useRawPropsJsiValue() override {
return true;
}
bool useShadowNodeStateOnClone() override {
return false;
}
bool useSharedAnimatedBackend() override {
return false;
}
bool useTraitHiddenOnAndroid() override {
return false;
}
bool useTurboModuleInterop() override {
return false;
}
bool useTurboModules() override {
return false;
}
double viewCullingOutsetRatio() override {
return 0.0;
}
double virtualViewHysteresisRatio() override {
return 0.0;
}
double virtualViewPrerenderRatio() override {
return 5.0;
}
};
} // namespace facebook::react

View File

@@ -0,0 +1,814 @@
/*
* 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.
*
* @generated SignedSource<<b4abe68bba3cca50754f060a278f9896>>
*/
/**
* IMPORTANT: Do NOT modify this file directly.
*
* To change the definition of the flags, edit
* packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js.
*
* To regenerate this code, run the following script from the repo root:
* yarn featureflags --update
*/
#pragma once
#include <folly/dynamic.h>
#include <react/featureflags/ReactNativeFeatureFlagsDefaults.h>
namespace facebook::react {
/**
* This class is a ReactNativeFeatureFlags provider that takes the values for
* feature flags from a folly::dynamic object (e.g. from a JSON object), if
* they are defined. For the flags not defined in the object, it falls back to
* the default values defined in ReactNativeFeatureFlagsDefaults.
*
* The API is strict about typing. It ignores null values from the
* folly::dynamic object, but if the key is defined, the value must have the
* correct type or otherwise throws an exception.
*/
class ReactNativeFeatureFlagsDynamicProvider : public ReactNativeFeatureFlagsDefaults {
private:
folly::dynamic values_;
public:
ReactNativeFeatureFlagsDynamicProvider(folly::dynamic values): values_(std::move(values)) {
if (!values_.isObject()) {
throw std::invalid_argument("ReactNativeFeatureFlagsDynamicProvider: values must be an object");
}
}
bool commonTestFlag() override {
auto value = values_["commonTestFlag"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::commonTestFlag();
}
bool cdpInteractionMetricsEnabled() override {
auto value = values_["cdpInteractionMetricsEnabled"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::cdpInteractionMetricsEnabled();
}
bool cxxNativeAnimatedEnabled() override {
auto value = values_["cxxNativeAnimatedEnabled"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::cxxNativeAnimatedEnabled();
}
bool cxxNativeAnimatedRemoveJsSync() override {
auto value = values_["cxxNativeAnimatedRemoveJsSync"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::cxxNativeAnimatedRemoveJsSync();
}
bool disableEarlyViewCommandExecution() override {
auto value = values_["disableEarlyViewCommandExecution"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::disableEarlyViewCommandExecution();
}
bool disableFabricCommitInCXXAnimated() override {
auto value = values_["disableFabricCommitInCXXAnimated"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::disableFabricCommitInCXXAnimated();
}
bool disableMountItemReorderingAndroid() override {
auto value = values_["disableMountItemReorderingAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::disableMountItemReorderingAndroid();
}
bool disableOldAndroidAttachmentMetricsWorkarounds() override {
auto value = values_["disableOldAndroidAttachmentMetricsWorkarounds"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::disableOldAndroidAttachmentMetricsWorkarounds();
}
bool disableTextLayoutManagerCacheAndroid() override {
auto value = values_["disableTextLayoutManagerCacheAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::disableTextLayoutManagerCacheAndroid();
}
bool enableAccessibilityOrder() override {
auto value = values_["enableAccessibilityOrder"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableAccessibilityOrder();
}
bool enableAccumulatedUpdatesInRawPropsAndroid() override {
auto value = values_["enableAccumulatedUpdatesInRawPropsAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableAccumulatedUpdatesInRawPropsAndroid();
}
bool enableAndroidLinearText() override {
auto value = values_["enableAndroidLinearText"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableAndroidLinearText();
}
bool enableAndroidTextMeasurementOptimizations() override {
auto value = values_["enableAndroidTextMeasurementOptimizations"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableAndroidTextMeasurementOptimizations();
}
bool enableBridgelessArchitecture() override {
auto value = values_["enableBridgelessArchitecture"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableBridgelessArchitecture();
}
bool enableCppPropsIteratorSetter() override {
auto value = values_["enableCppPropsIteratorSetter"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableCppPropsIteratorSetter();
}
bool enableCustomFocusSearchOnClippedElementsAndroid() override {
auto value = values_["enableCustomFocusSearchOnClippedElementsAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableCustomFocusSearchOnClippedElementsAndroid();
}
bool enableDestroyShadowTreeRevisionAsync() override {
auto value = values_["enableDestroyShadowTreeRevisionAsync"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableDestroyShadowTreeRevisionAsync();
}
bool enableDoubleMeasurementFixAndroid() override {
auto value = values_["enableDoubleMeasurementFixAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableDoubleMeasurementFixAndroid();
}
bool enableEagerMainQueueModulesOnIOS() override {
auto value = values_["enableEagerMainQueueModulesOnIOS"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableEagerMainQueueModulesOnIOS();
}
bool enableEagerRootViewAttachment() override {
auto value = values_["enableEagerRootViewAttachment"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableEagerRootViewAttachment();
}
bool enableFabricLogs() override {
auto value = values_["enableFabricLogs"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableFabricLogs();
}
bool enableFabricRenderer() override {
auto value = values_["enableFabricRenderer"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableFabricRenderer();
}
bool enableFontScaleChangesUpdatingLayout() override {
auto value = values_["enableFontScaleChangesUpdatingLayout"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableFontScaleChangesUpdatingLayout();
}
bool enableIOSTextBaselineOffsetPerLine() override {
auto value = values_["enableIOSTextBaselineOffsetPerLine"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableIOSTextBaselineOffsetPerLine();
}
bool enableIOSViewClipToPaddingBox() override {
auto value = values_["enableIOSViewClipToPaddingBox"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableIOSViewClipToPaddingBox();
}
bool enableImagePrefetchingAndroid() override {
auto value = values_["enableImagePrefetchingAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableImagePrefetchingAndroid();
}
bool enableImagePrefetchingOnUiThreadAndroid() override {
auto value = values_["enableImagePrefetchingOnUiThreadAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableImagePrefetchingOnUiThreadAndroid();
}
bool enableImmediateUpdateModeForContentOffsetChanges() override {
auto value = values_["enableImmediateUpdateModeForContentOffsetChanges"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableImmediateUpdateModeForContentOffsetChanges();
}
bool enableImperativeFocus() override {
auto value = values_["enableImperativeFocus"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableImperativeFocus();
}
bool enableInteropViewManagerClassLookUpOptimizationIOS() override {
auto value = values_["enableInteropViewManagerClassLookUpOptimizationIOS"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableInteropViewManagerClassLookUpOptimizationIOS();
}
bool enableIntersectionObserverByDefault() override {
auto value = values_["enableIntersectionObserverByDefault"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableIntersectionObserverByDefault();
}
bool enableKeyEvents() override {
auto value = values_["enableKeyEvents"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableKeyEvents();
}
bool enableLayoutAnimationsOnAndroid() override {
auto value = values_["enableLayoutAnimationsOnAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableLayoutAnimationsOnAndroid();
}
bool enableLayoutAnimationsOnIOS() override {
auto value = values_["enableLayoutAnimationsOnIOS"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableLayoutAnimationsOnIOS();
}
bool enableMainQueueCoordinatorOnIOS() override {
auto value = values_["enableMainQueueCoordinatorOnIOS"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableMainQueueCoordinatorOnIOS();
}
bool enableModuleArgumentNSNullConversionIOS() override {
auto value = values_["enableModuleArgumentNSNullConversionIOS"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableModuleArgumentNSNullConversionIOS();
}
bool enableNativeCSSParsing() override {
auto value = values_["enableNativeCSSParsing"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableNativeCSSParsing();
}
bool enableNetworkEventReporting() override {
auto value = values_["enableNetworkEventReporting"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableNetworkEventReporting();
}
bool enablePreparedTextLayout() override {
auto value = values_["enablePreparedTextLayout"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enablePreparedTextLayout();
}
bool enablePropsUpdateReconciliationAndroid() override {
auto value = values_["enablePropsUpdateReconciliationAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enablePropsUpdateReconciliationAndroid();
}
bool enableResourceTimingAPI() override {
auto value = values_["enableResourceTimingAPI"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableResourceTimingAPI();
}
bool enableSwiftUIBasedFilters() override {
auto value = values_["enableSwiftUIBasedFilters"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableSwiftUIBasedFilters();
}
bool enableViewCulling() override {
auto value = values_["enableViewCulling"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableViewCulling();
}
bool enableViewRecycling() override {
auto value = values_["enableViewRecycling"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableViewRecycling();
}
bool enableViewRecyclingForImage() override {
auto value = values_["enableViewRecyclingForImage"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableViewRecyclingForImage();
}
bool enableViewRecyclingForScrollView() override {
auto value = values_["enableViewRecyclingForScrollView"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableViewRecyclingForScrollView();
}
bool enableViewRecyclingForText() override {
auto value = values_["enableViewRecyclingForText"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableViewRecyclingForText();
}
bool enableViewRecyclingForView() override {
auto value = values_["enableViewRecyclingForView"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableViewRecyclingForView();
}
bool enableVirtualViewClippingWithoutScrollViewClipping() override {
auto value = values_["enableVirtualViewClippingWithoutScrollViewClipping"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableVirtualViewClippingWithoutScrollViewClipping();
}
bool enableVirtualViewContainerStateExperimental() override {
auto value = values_["enableVirtualViewContainerStateExperimental"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableVirtualViewContainerStateExperimental();
}
bool enableVirtualViewDebugFeatures() override {
auto value = values_["enableVirtualViewDebugFeatures"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableVirtualViewDebugFeatures();
}
bool enableVirtualViewRenderState() override {
auto value = values_["enableVirtualViewRenderState"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableVirtualViewRenderState();
}
bool enableVirtualViewWindowFocusDetection() override {
auto value = values_["enableVirtualViewWindowFocusDetection"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableVirtualViewWindowFocusDetection();
}
bool enableWebPerformanceAPIsByDefault() override {
auto value = values_["enableWebPerformanceAPIsByDefault"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::enableWebPerformanceAPIsByDefault();
}
bool fixMappingOfEventPrioritiesBetweenFabricAndReact() override {
auto value = values_["fixMappingOfEventPrioritiesBetweenFabricAndReact"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::fixMappingOfEventPrioritiesBetweenFabricAndReact();
}
bool fuseboxAssertSingleHostState() override {
auto value = values_["fuseboxAssertSingleHostState"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::fuseboxAssertSingleHostState();
}
bool fuseboxEnabledRelease() override {
auto value = values_["fuseboxEnabledRelease"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::fuseboxEnabledRelease();
}
bool fuseboxNetworkInspectionEnabled() override {
auto value = values_["fuseboxNetworkInspectionEnabled"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::fuseboxNetworkInspectionEnabled();
}
bool hideOffscreenVirtualViewsOnIOS() override {
auto value = values_["hideOffscreenVirtualViewsOnIOS"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::hideOffscreenVirtualViewsOnIOS();
}
bool overrideBySynchronousMountPropsAtMountingAndroid() override {
auto value = values_["overrideBySynchronousMountPropsAtMountingAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::overrideBySynchronousMountPropsAtMountingAndroid();
}
bool perfIssuesEnabled() override {
auto value = values_["perfIssuesEnabled"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::perfIssuesEnabled();
}
bool perfMonitorV2Enabled() override {
auto value = values_["perfMonitorV2Enabled"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::perfMonitorV2Enabled();
}
double preparedTextCacheSize() override {
auto value = values_["preparedTextCacheSize"];
if (!value.isNull()) {
return value.getDouble();
}
return ReactNativeFeatureFlagsDefaults::preparedTextCacheSize();
}
bool preventShadowTreeCommitExhaustion() override {
auto value = values_["preventShadowTreeCommitExhaustion"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::preventShadowTreeCommitExhaustion();
}
bool shouldPressibilityUseW3CPointerEventsForHover() override {
auto value = values_["shouldPressibilityUseW3CPointerEventsForHover"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::shouldPressibilityUseW3CPointerEventsForHover();
}
bool shouldTriggerResponderTransferOnScrollAndroid() override {
auto value = values_["shouldTriggerResponderTransferOnScrollAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::shouldTriggerResponderTransferOnScrollAndroid();
}
bool skipActivityIdentityAssertionOnHostPause() override {
auto value = values_["skipActivityIdentityAssertionOnHostPause"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::skipActivityIdentityAssertionOnHostPause();
}
bool sweepActiveTouchOnChildNativeGesturesAndroid() override {
auto value = values_["sweepActiveTouchOnChildNativeGesturesAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::sweepActiveTouchOnChildNativeGesturesAndroid();
}
bool traceTurboModulePromiseRejectionsOnAndroid() override {
auto value = values_["traceTurboModulePromiseRejectionsOnAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::traceTurboModulePromiseRejectionsOnAndroid();
}
bool updateRuntimeShadowNodeReferencesOnCommit() override {
auto value = values_["updateRuntimeShadowNodeReferencesOnCommit"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::updateRuntimeShadowNodeReferencesOnCommit();
}
bool useAlwaysAvailableJSErrorHandling() override {
auto value = values_["useAlwaysAvailableJSErrorHandling"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::useAlwaysAvailableJSErrorHandling();
}
bool useFabricInterop() override {
auto value = values_["useFabricInterop"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::useFabricInterop();
}
bool useNativeEqualsInNativeReadableArrayAndroid() override {
auto value = values_["useNativeEqualsInNativeReadableArrayAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::useNativeEqualsInNativeReadableArrayAndroid();
}
bool useNativeTransformHelperAndroid() override {
auto value = values_["useNativeTransformHelperAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::useNativeTransformHelperAndroid();
}
bool useNativeViewConfigsInBridgelessMode() override {
auto value = values_["useNativeViewConfigsInBridgelessMode"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::useNativeViewConfigsInBridgelessMode();
}
bool useOptimizedEventBatchingOnAndroid() override {
auto value = values_["useOptimizedEventBatchingOnAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::useOptimizedEventBatchingOnAndroid();
}
bool useRawPropsJsiValue() override {
auto value = values_["useRawPropsJsiValue"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::useRawPropsJsiValue();
}
bool useShadowNodeStateOnClone() override {
auto value = values_["useShadowNodeStateOnClone"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::useShadowNodeStateOnClone();
}
bool useSharedAnimatedBackend() override {
auto value = values_["useSharedAnimatedBackend"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::useSharedAnimatedBackend();
}
bool useTraitHiddenOnAndroid() override {
auto value = values_["useTraitHiddenOnAndroid"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::useTraitHiddenOnAndroid();
}
bool useTurboModuleInterop() override {
auto value = values_["useTurboModuleInterop"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::useTurboModuleInterop();
}
bool useTurboModules() override {
auto value = values_["useTurboModules"];
if (!value.isNull()) {
return value.getBool();
}
return ReactNativeFeatureFlagsDefaults::useTurboModules();
}
double viewCullingOutsetRatio() override {
auto value = values_["viewCullingOutsetRatio"];
if (!value.isNull()) {
return value.getDouble();
}
return ReactNativeFeatureFlagsDefaults::viewCullingOutsetRatio();
}
double virtualViewHysteresisRatio() override {
auto value = values_["virtualViewHysteresisRatio"];
if (!value.isNull()) {
return value.getDouble();
}
return ReactNativeFeatureFlagsDefaults::virtualViewHysteresisRatio();
}
double virtualViewPrerenderRatio() override {
auto value = values_["virtualViewPrerenderRatio"];
if (!value.isNull()) {
return value.getDouble();
}
return ReactNativeFeatureFlagsDefaults::virtualViewPrerenderRatio();
}
};
} // namespace facebook::react

View File

@@ -0,0 +1,55 @@
/*
* 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.
*
* @generated SignedSource<<1b2061068e0d6c9ca362ceddd97862da>>
*/
/**
* IMPORTANT: Do NOT modify this file directly.
*
* To change the definition of the flags, edit
* packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js.
*
* To regenerate this code, run the following script from the repo root:
* yarn featureflags --update
*/
#pragma once
#include <react/featureflags/ReactNativeFeatureFlagsOverridesOSSStable.h>
namespace facebook::react {
class ReactNativeFeatureFlagsOverridesOSSCanary : public ReactNativeFeatureFlagsOverridesOSSStable {
public:
ReactNativeFeatureFlagsOverridesOSSCanary() = default;
bool enableBridgelessArchitecture() override {
return true;
}
bool enableFabricRenderer() override {
return true;
}
bool enableIntersectionObserverByDefault() override {
return true;
}
bool useNativeViewConfigsInBridgelessMode() override {
return true;
}
bool useTurboModuleInterop() override {
return true;
}
bool useTurboModules() override {
return true;
}
};
} // namespace facebook::react

View File

@@ -0,0 +1,43 @@
/*
* 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.
*
* @generated SignedSource<<c5b1dc86ec11d40e5d26ae8a6f0ee6ff>>
*/
/**
* IMPORTANT: Do NOT modify this file directly.
*
* To change the definition of the flags, edit
* packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js.
*
* To regenerate this code, run the following script from the repo root:
* yarn featureflags --update
*/
#pragma once
#include <react/featureflags/ReactNativeFeatureFlagsOverridesOSSCanary.h>
namespace facebook::react {
class ReactNativeFeatureFlagsOverridesOSSExperimental : public ReactNativeFeatureFlagsOverridesOSSCanary {
public:
ReactNativeFeatureFlagsOverridesOSSExperimental() = default;
bool enableAccessibilityOrder() override {
return true;
}
bool enableSwiftUIBasedFilters() override {
return true;
}
bool preventShadowTreeCommitExhaustion() override {
return true;
}
};
} // namespace facebook::react

View File

@@ -0,0 +1,37 @@
/*
* 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.
*/
#pragma once
#include <react/featureflags/ReactNativeFeatureFlagsDefaults.h>
namespace facebook::react {
class ReactNativeFeatureFlagsOverridesOSSStable : public ReactNativeFeatureFlagsDefaults {
public:
bool enableBridgelessArchitecture() override
{
return true;
}
bool enableFabricRenderer() override
{
return true;
}
bool useTurboModules() override
{
return true;
}
bool useNativeViewConfigsInBridgelessMode() override
{
return true;
}
bool useShadowNodeStateOnClone() override
{
return true;
}
};
} // namespace facebook::react

View File

@@ -0,0 +1,115 @@
/*
* 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.
*
* @generated SignedSource<<06c6740fe7d613f235ae791da750bd52>>
*/
/**
* IMPORTANT: Do NOT modify this file directly.
*
* To change the definition of the flags, edit
* packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js.
*
* To regenerate this code, run the following script from the repo root:
* yarn featureflags --update
*/
#pragma once
namespace facebook::react {
class ReactNativeFeatureFlagsProvider {
public:
virtual ~ReactNativeFeatureFlagsProvider() = default;
virtual bool commonTestFlag() = 0;
virtual bool cdpInteractionMetricsEnabled() = 0;
virtual bool cxxNativeAnimatedEnabled() = 0;
virtual bool cxxNativeAnimatedRemoveJsSync() = 0;
virtual bool disableEarlyViewCommandExecution() = 0;
virtual bool disableFabricCommitInCXXAnimated() = 0;
virtual bool disableMountItemReorderingAndroid() = 0;
virtual bool disableOldAndroidAttachmentMetricsWorkarounds() = 0;
virtual bool disableTextLayoutManagerCacheAndroid() = 0;
virtual bool enableAccessibilityOrder() = 0;
virtual bool enableAccumulatedUpdatesInRawPropsAndroid() = 0;
virtual bool enableAndroidLinearText() = 0;
virtual bool enableAndroidTextMeasurementOptimizations() = 0;
virtual bool enableBridgelessArchitecture() = 0;
virtual bool enableCppPropsIteratorSetter() = 0;
virtual bool enableCustomFocusSearchOnClippedElementsAndroid() = 0;
virtual bool enableDestroyShadowTreeRevisionAsync() = 0;
virtual bool enableDoubleMeasurementFixAndroid() = 0;
virtual bool enableEagerMainQueueModulesOnIOS() = 0;
virtual bool enableEagerRootViewAttachment() = 0;
virtual bool enableFabricLogs() = 0;
virtual bool enableFabricRenderer() = 0;
virtual bool enableFontScaleChangesUpdatingLayout() = 0;
virtual bool enableIOSTextBaselineOffsetPerLine() = 0;
virtual bool enableIOSViewClipToPaddingBox() = 0;
virtual bool enableImagePrefetchingAndroid() = 0;
virtual bool enableImagePrefetchingOnUiThreadAndroid() = 0;
virtual bool enableImmediateUpdateModeForContentOffsetChanges() = 0;
virtual bool enableImperativeFocus() = 0;
virtual bool enableInteropViewManagerClassLookUpOptimizationIOS() = 0;
virtual bool enableIntersectionObserverByDefault() = 0;
virtual bool enableKeyEvents() = 0;
virtual bool enableLayoutAnimationsOnAndroid() = 0;
virtual bool enableLayoutAnimationsOnIOS() = 0;
virtual bool enableMainQueueCoordinatorOnIOS() = 0;
virtual bool enableModuleArgumentNSNullConversionIOS() = 0;
virtual bool enableNativeCSSParsing() = 0;
virtual bool enableNetworkEventReporting() = 0;
virtual bool enablePreparedTextLayout() = 0;
virtual bool enablePropsUpdateReconciliationAndroid() = 0;
virtual bool enableResourceTimingAPI() = 0;
virtual bool enableSwiftUIBasedFilters() = 0;
virtual bool enableViewCulling() = 0;
virtual bool enableViewRecycling() = 0;
virtual bool enableViewRecyclingForImage() = 0;
virtual bool enableViewRecyclingForScrollView() = 0;
virtual bool enableViewRecyclingForText() = 0;
virtual bool enableViewRecyclingForView() = 0;
virtual bool enableVirtualViewClippingWithoutScrollViewClipping() = 0;
virtual bool enableVirtualViewContainerStateExperimental() = 0;
virtual bool enableVirtualViewDebugFeatures() = 0;
virtual bool enableVirtualViewRenderState() = 0;
virtual bool enableVirtualViewWindowFocusDetection() = 0;
virtual bool enableWebPerformanceAPIsByDefault() = 0;
virtual bool fixMappingOfEventPrioritiesBetweenFabricAndReact() = 0;
virtual bool fuseboxAssertSingleHostState() = 0;
virtual bool fuseboxEnabledRelease() = 0;
virtual bool fuseboxNetworkInspectionEnabled() = 0;
virtual bool hideOffscreenVirtualViewsOnIOS() = 0;
virtual bool overrideBySynchronousMountPropsAtMountingAndroid() = 0;
virtual bool perfIssuesEnabled() = 0;
virtual bool perfMonitorV2Enabled() = 0;
virtual double preparedTextCacheSize() = 0;
virtual bool preventShadowTreeCommitExhaustion() = 0;
virtual bool shouldPressibilityUseW3CPointerEventsForHover() = 0;
virtual bool shouldTriggerResponderTransferOnScrollAndroid() = 0;
virtual bool skipActivityIdentityAssertionOnHostPause() = 0;
virtual bool sweepActiveTouchOnChildNativeGesturesAndroid() = 0;
virtual bool traceTurboModulePromiseRejectionsOnAndroid() = 0;
virtual bool updateRuntimeShadowNodeReferencesOnCommit() = 0;
virtual bool useAlwaysAvailableJSErrorHandling() = 0;
virtual bool useFabricInterop() = 0;
virtual bool useNativeEqualsInNativeReadableArrayAndroid() = 0;
virtual bool useNativeTransformHelperAndroid() = 0;
virtual bool useNativeViewConfigsInBridgelessMode() = 0;
virtual bool useOptimizedEventBatchingOnAndroid() = 0;
virtual bool useRawPropsJsiValue() = 0;
virtual bool useShadowNodeStateOnClone() = 0;
virtual bool useSharedAnimatedBackend() = 0;
virtual bool useTraitHiddenOnAndroid() = 0;
virtual bool useTurboModuleInterop() = 0;
virtual bool useTurboModules() = 0;
virtual double viewCullingOutsetRatio() = 0;
virtual double virtualViewHysteresisRatio() = 0;
virtual double virtualViewPrerenderRatio() = 0;
};
} // namespace facebook::react

View File

@@ -0,0 +1,78 @@
/*
* 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.
*/
#include <gtest/gtest.h>
#include <react/featureflags/ReactNativeFeatureFlags.h>
#include <react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h>
namespace facebook::react {
class ReactNativeFeatureFlagsDynamicProviderTest : public testing::Test {
protected:
void TearDown() override {
ReactNativeFeatureFlags::dangerouslyReset();
}
};
TEST_F(ReactNativeFeatureFlagsDynamicProviderTest, providesDefaults) {
auto values = folly::dynamic::object();
ReactNativeFeatureFlags::override(
std::make_unique<ReactNativeFeatureFlagsDynamicProvider>(
std::move(values)));
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), false);
}
TEST_F(ReactNativeFeatureFlagsDynamicProviderTest, providesDynamicOverrides) {
folly::dynamic values = folly::dynamic::object();
values["commonTestFlag"] = true;
ReactNativeFeatureFlags::override(
std::make_unique<ReactNativeFeatureFlagsDynamicProvider>(values));
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), true);
}
TEST_F(
ReactNativeFeatureFlagsDynamicProviderTest,
throwsWithIncorrectFlagTypes) {
folly::dynamic values = folly::dynamic::object();
values["commonTestFlag"] = 12;
ReactNativeFeatureFlags::override(
std::make_unique<ReactNativeFeatureFlagsDynamicProvider>(values));
try {
ReactNativeFeatureFlags::commonTestFlag();
FAIL()
<< "Expected ReactNativeFeatureFlags::commonTestFlag() to throw an exception";
} catch (const std::runtime_error& e) {
EXPECT_STREQ(
"TypeError: expected dynamic type 'boolean', but had type 'int64'",
e.what());
}
}
TEST_F(ReactNativeFeatureFlagsDynamicProviderTest, throwsWithNonObjectValues) {
folly::dynamic values = folly::dynamic("string");
try {
auto provider =
std::make_unique<ReactNativeFeatureFlagsDynamicProvider>(values);
FAIL()
<< "Expected ReactNativeFeatureFlagsDynamicProvider constructor to throw an exception";
} catch (const std::invalid_argument& e) {
EXPECT_STREQ(
"ReactNativeFeatureFlagsDynamicProvider: values must be an object",
e.what());
}
}
} // namespace facebook::react

View File

@@ -0,0 +1,147 @@
/*
* 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.
*/
#include <gtest/gtest.h>
#include <react/featureflags/ReactNativeFeatureFlags.h>
#include <react/featureflags/ReactNativeFeatureFlagsDefaults.h>
#include <stdexcept>
namespace facebook::react {
uint overrideAccessCount = 0;
class ReactNativeFeatureFlagsTestOverrides
: public ReactNativeFeatureFlagsDefaults {
public:
bool commonTestFlag() override {
overrideAccessCount++;
return true;
}
};
class ReactNativeFeatureFlagsTest : public testing::Test {
protected:
void SetUp() override {
overrideAccessCount = 0;
}
void TearDown() override {
ReactNativeFeatureFlags::dangerouslyReset();
}
};
TEST_F(ReactNativeFeatureFlagsTest, providesDefaults) {
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), false);
}
TEST_F(ReactNativeFeatureFlagsTest, providesOverriddenValues) {
ReactNativeFeatureFlags::override(
std::make_unique<ReactNativeFeatureFlagsTestOverrides>());
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), true);
}
TEST_F(ReactNativeFeatureFlagsTest, preventsOverridingAfterAccess) {
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), false);
try {
ReactNativeFeatureFlags::override(
std::make_unique<ReactNativeFeatureFlagsTestOverrides>());
FAIL()
<< "Expected ReactNativeFeatureFlags::override() to throw an exception";
} catch (const std::runtime_error& e) {
EXPECT_STREQ(
"Feature flags were accessed before being overridden: commonTestFlag",
e.what());
}
// Overrides shouldn't be applied after they've been accessed
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), false);
}
TEST_F(ReactNativeFeatureFlagsTest, preventsOverridingAfterOverride) {
ReactNativeFeatureFlags::override(
std::make_unique<ReactNativeFeatureFlagsTestOverrides>());
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), true);
try {
ReactNativeFeatureFlags::override(
std::make_unique<ReactNativeFeatureFlagsTestOverrides>());
FAIL()
<< "Expected ReactNativeFeatureFlags::override() to throw an exception";
} catch (const std::runtime_error& e) {
EXPECT_STREQ("Feature flags cannot be overridden more than once", e.what());
}
// Original overrides should still work
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), true);
}
TEST_F(ReactNativeFeatureFlagsTest, cachesValuesFromOverride) {
ReactNativeFeatureFlags::override(
std::make_unique<ReactNativeFeatureFlagsTestOverrides>());
EXPECT_EQ(overrideAccessCount, 0);
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), true);
EXPECT_EQ(overrideAccessCount, 1);
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), true);
EXPECT_EQ(overrideAccessCount, 1);
}
TEST_F(
ReactNativeFeatureFlagsTest,
providesDefaulValuesAgainWhenResettingAfterAnOverride) {
ReactNativeFeatureFlags::override(
std::make_unique<ReactNativeFeatureFlagsTestOverrides>());
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), true);
ReactNativeFeatureFlags::dangerouslyReset();
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), false);
}
TEST_F(ReactNativeFeatureFlagsTest, allowsOverridingAgainAfterReset) {
ReactNativeFeatureFlags::override(
std::make_unique<ReactNativeFeatureFlagsTestOverrides>());
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), true);
ReactNativeFeatureFlags::dangerouslyReset();
ReactNativeFeatureFlags::override(
std::make_unique<ReactNativeFeatureFlagsTestOverrides>());
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), true);
}
TEST_F(
ReactNativeFeatureFlagsTest,
allowsDangerouslyForcingOverridesWhenValuesHaveNotBeenAccessed) {
auto accessedFlags = ReactNativeFeatureFlags::dangerouslyForceOverride(
std::make_unique<ReactNativeFeatureFlagsTestOverrides>());
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), true);
EXPECT_EQ(accessedFlags.has_value(), false);
}
TEST_F(
ReactNativeFeatureFlagsTest,
allowsDangerouslyForcingOverridesWhenValuesHaveBeenAccessed) {
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), false);
auto accessedFlags = ReactNativeFeatureFlags::dangerouslyForceOverride(
std::make_unique<ReactNativeFeatureFlagsTestOverrides>());
EXPECT_EQ(ReactNativeFeatureFlags::commonTestFlag(), true);
EXPECT_EQ(accessedFlags.has_value(), true);
EXPECT_EQ(accessedFlags.value(), "commonTestFlag");
}
} // namespace facebook::react