From 6b921a7be69d2146a56850542271ac2d215d973b Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Tue, 13 Oct 2026 01:38:32 -0700 Subject: [PATCH] Expose mounting pull-model flag; background image frameworks tier Summary: - Expose `enableMountingCoordinatorPullModelAndroid` through `ReactNativeFeatureFlags_DO_NOT_USE`. - Move `BackgroundImagePropsConversions.h` from private to "for frameworks" and include ``/`` instead of direct headers. Changelog: [General][Changed] - Expose `enableMountingCoordinatorPullModelAndroid` in public C++ feature flags and move `BackgroundImagePropsConversions.h` to "for frameworks" headers Differential Revision: D124958546 --- .../react/featureflags/ReactNativePublicFeatureFlags.cpp | 6 +++++- .../react/featureflags/ReactNativePublicFeatureFlags.h | 7 ++++++- .../components/view/BackgroundImagePropsConversions.h | 7 +++---- .../scripts/featureflags/ReactNativeFeatureFlags.config.js | 1 + .../cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api | 4 ++++ scripts/cxx-api/api-snapshots/ReactAppleFrameworksCxx.api | 4 ++++ scripts/cxx-api/api-snapshots/ReactCommonFrameworksCxx.api | 4 ++++ 7 files changed, 27 insertions(+), 6 deletions(-) diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.cpp index ee4ccaf72737..327373478a7b 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.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<<95f86b3476aeff097f532b10cabf067e>> + * @generated SignedSource<> */ /** @@ -34,6 +34,10 @@ bool ReactNativeFeatureFlags_DO_NOT_USE::enableExclusivePropsUpdateAndroid() { return ReactNativeFeatureFlags::enableExclusivePropsUpdateAndroid(); } +bool ReactNativeFeatureFlags_DO_NOT_USE::enableMountingCoordinatorPullModelAndroid() { + return ReactNativeFeatureFlags::enableMountingCoordinatorPullModelAndroid(); +} + bool ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing() { return ReactNativeFeatureFlags::enableNativeCSSParsing(); } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.h index f8c27e60c167..542d15a59baa 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.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<<39037a69a47b86d0c6643d90f4058002>> + * @generated SignedSource<> */ /** @@ -47,6 +47,11 @@ class ReactNativeFeatureFlags_DO_NOT_USE { */ RN_EXPORT static bool enableExclusivePropsUpdateAndroid(); + /** + * When enabled, Android mounts transactions with the pull model (like iOS): the commit thread no longer pulls and builds the mount batch in schedulerShouldRenderTransactions. Instead the UI thread pulls the transaction itself via a PullTransactionMountItem enqueued in the MountItemDispatcher, builds the IntBufferBatchMountItem, and applies it synchronously. Requires `enableAccumulatedUpdatesInRawPropsAndroid` to be enabled as well, since a single pull may collapse several commits into one diff and therefore needs complete accumulated rawProps; when used together with Props 2.0, also enable `enableExclusivePropsUpdateAndroid` and `enablePropsUpdateReconciliationAndroid`. + */ + RN_EXPORT static bool enableMountingCoordinatorPullModelAndroid(); + /** * Parse CSS strings using the Fabric CSS parser instead of ViewConfig processing */ diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.h index b35fcaa0d04a..c96ade256657 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.h @@ -7,12 +7,11 @@ #pragma once -#include +#include +#include +#include #include -#include -#include -#include namespace facebook::react { diff --git a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js index d0041ff5c50e..53a81b5480bf 100644 --- a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js +++ b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js @@ -512,6 +512,7 @@ const definitions: FeatureFlagDefinitions = { ossReleaseStage: 'none', }, enableMountingCoordinatorPullModelAndroid: { + dangerouslyExposeInPublicCppHeaders: true, defaultValue: false, metadata: { dateAdded: '2026-07-14', diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api index e1915564eeed..cfa28cbbb765 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api @@ -924,6 +924,7 @@ void facebook::react::fromRawValue(const facebook::react::PropsParserContext& co void facebook::react::fromRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::yoga::PositionType& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::yoga::Style::Length& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::yoga::Wrap& result); +void facebook::react::fromRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::AccessibilityValue& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::BlendMode& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::CornerInsets& result); @@ -947,7 +948,10 @@ void facebook::react::fromRawValueShared(const facebook::react::ContextContainer void facebook::react::fromString(const std::string& string, facebook::react::AccessibilityTraits& result); void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::TimePointFunction nowFunction); void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); +void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); +void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); +void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedTransformOriginString(const std::string& value, facebook::react::TransformOrigin& result); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleFrameworksCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleFrameworksCxx.api index 11c7e6873789..fd5b46d6f751 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleFrameworksCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleFrameworksCxx.api @@ -3711,6 +3711,7 @@ void facebook::react::fromRawValue(const facebook::react::PropsParserContext& co void facebook::react::fromRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::yoga::PositionType& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::yoga::Style::Length& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::yoga::Wrap& result); +void facebook::react::fromRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::AccessibilityValue& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::BlendMode& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::CornerInsets& result); @@ -3735,7 +3736,10 @@ void facebook::react::fromString(const std::string& string, facebook::react::Acc void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::TimePointFunction nowFunction); void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::installLegacyUIManagerConstantsProviderBinding(facebook::jsi::Runtime& runtime); +void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); +void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); +void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedTransformOriginString(const std::string& value, facebook::react::TransformOrigin& result); diff --git a/scripts/cxx-api/api-snapshots/ReactCommonFrameworksCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonFrameworksCxx.api index bcf1840858e3..609cd49fd499 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonFrameworksCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonFrameworksCxx.api @@ -490,6 +490,7 @@ void facebook::react::fromRawValue(const facebook::react::PropsParserContext& co void facebook::react::fromRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::yoga::PositionType& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::yoga::Style::Length& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::yoga::Wrap& result); +void facebook::react::fromRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::AccessibilityValue& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::BlendMode& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::CornerInsets& result); @@ -513,7 +514,10 @@ void facebook::react::fromRawValueShared(const facebook::react::ContextContainer void facebook::react::fromString(const std::string& string, facebook::react::AccessibilityTraits& result); void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::TimePointFunction nowFunction); void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); +void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); +void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); +void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedTransformOriginString(const std::string& value, facebook::react::TransformOrigin& result);