diff --git a/packages/react-native/React/Fabric/RCTScheduler.mm b/packages/react-native/React/Fabric/RCTScheduler.mm index 79d2b11e4dcc37..bd1d143ddbf6eb 100644 --- a/packages/react-native/React/Fabric/RCTScheduler.mm +++ b/packages/react-native/React/Fabric/RCTScheduler.mm @@ -172,7 +172,7 @@ - (const ComponentDescriptor *)findComponentDescriptorByHandle_DO_NOT_USE_THIS_I - (void)setupAnimationDriver:(const facebook::react::SurfaceHandler &)surfaceHandler { - surfaceHandler.getMountingCoordinator()->setMountingOverrideDelegate(_animationDriver); + surfaceHandler.getMountingCoordinator()->addMountingOverrideDelegate(_animationDriver); } - (void)onAnimationStarted diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp index 280ae463d33c84..70e57414fd6435 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp @@ -129,7 +129,7 @@ void Binding::startSurface( surfaceHandler.start(); - surfaceHandler.getMountingCoordinator()->setMountingOverrideDelegate( + surfaceHandler.getMountingCoordinator()->addMountingOverrideDelegate( animationDriver_); { @@ -197,7 +197,7 @@ void Binding::startSurfaceWithConstraints( surfaceHandler.start(); - surfaceHandler.getMountingCoordinator()->setMountingOverrideDelegate( + surfaceHandler.getMountingCoordinator()->addMountingOverrideDelegate( animationDriver_); { diff --git a/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.cpp b/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.cpp index 77cc62690b9f10..339f81d41ffc0f 100644 --- a/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.cpp +++ b/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.cpp @@ -104,31 +104,34 @@ std::optional MountingCoordinator::pullTransaction() } // Override case - auto mountingOverrideDelegate = mountingOverrideDelegate_.lock(); - auto shouldOverridePullTransaction = mountingOverrideDelegate && - mountingOverrideDelegate->shouldOverridePullTransaction(); - - if (shouldOverridePullTransaction) { - SystraceSection section2("MountingCoordinator::overridePullTransaction"); - - auto mutations = ShadowViewMutation::List{}; - auto telemetry = TransactionTelemetry{}; - - if (transaction.has_value()) { - mutations = transaction->getMutations(); - telemetry = transaction->getTelemetry(); - } else { - number_++; - telemetry.willLayout(); - telemetry.didLayout(); - telemetry.willCommit(); - telemetry.didCommit(); - telemetry.willDiff(); - telemetry.didDiff(); + for(const auto &delegate : mountingOverrideDelegates_) + { + auto mountingOverrideDelegate = delegate.lock(); + auto shouldOverridePullTransaction = mountingOverrideDelegate && + mountingOverrideDelegate->shouldOverridePullTransaction(); + + if (shouldOverridePullTransaction) { + SystraceSection section2("MountingCoordinator::overridePullTransaction"); + + auto mutations = ShadowViewMutation::List{}; + auto telemetry = TransactionTelemetry{}; + + if (transaction.has_value()) { + mutations = transaction->getMutations(); + telemetry = transaction->getTelemetry(); + } else { + number_++; + telemetry.willLayout(); + telemetry.didLayout(); + telemetry.willCommit(); + telemetry.didCommit(); + telemetry.willDiff(); + telemetry.didDiff(); + } + + transaction = mountingOverrideDelegate->pullTransaction( + surfaceId_, number_, telemetry, std::move(mutations)); } - - transaction = mountingOverrideDelegate->pullTransaction( - surfaceId_, number_, telemetry, std::move(mutations)); } #ifdef RN_SHADOW_TREE_INTROSPECTION @@ -200,10 +203,10 @@ ShadowTreeRevision MountingCoordinator::getBaseRevision() const { return baseRevision_; } -void MountingCoordinator::setMountingOverrideDelegate( +void MountingCoordinator::addMountingOverrideDelegate( std::weak_ptr delegate) const { std::scoped_lock lock(mutex_); - mountingOverrideDelegate_ = std::move(delegate); + mountingOverrideDelegates_.insert(mountingOverrideDelegates_.end(), std::move(delegate)); } } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.h b/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.h index 87078034076b6e..0759d2efabc2a8 100644 --- a/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.h +++ b/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.h @@ -89,7 +89,7 @@ class MountingCoordinator final { void updateBaseRevision(const ShadowTreeRevision& baseRevision) const; void resetLatestRevision() const; - void setMountingOverrideDelegate( + void addMountingOverrideDelegate( std::weak_ptr delegate) const; /* @@ -119,8 +119,8 @@ class MountingCoordinator final { mutable std::optional lastRevision_{}; mutable MountingTransaction::Number number_{0}; mutable std::condition_variable signal_; - mutable std::weak_ptr - mountingOverrideDelegate_; + mutable std::vector> + mountingOverrideDelegates_; TelemetryController telemetryController_;