From cfa39c0a6993f94a716a97c01c586bbbe7632c35 Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Fri, 8 Mar 2024 07:29:22 -0800 Subject: [PATCH] Integrate CDPAgent into HermesRuntimeTargetDelegate behind flag (#43353) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/43353 ## Context We are migrating to the new Hermes `CDPAgent` and `CDPDebugAPI` APIs in the modern CDP server (previously `HermesCDPHandler`). ## This diff Integrates `HermesRuntimeAgentDelegateNew` (using the new Hermes `CDPAgent` setup) into `HermesRuntimeTargetDelegate` behind a new feature flag, `inspectorEnableHermesCDPAgent`. This completes the initial integration for all platforms. Changelog: [Internal] Reviewed By: motiz88 Differential Revision: D54586162 fbshipit-source-id: 5f26c28af4414d961b1c8c9cb4cd7135bd00b410 --- .../featureflags/ReactNativeFeatureFlags.kt | 8 +++- .../ReactNativeFeatureFlagsCxxAccessor.kt | 12 ++++- .../ReactNativeFeatureFlagsCxxInterop.kt | 4 +- .../ReactNativeFeatureFlagsDefaults.kt | 4 +- .../ReactNativeFeatureFlagsLocalAccessor.kt | 13 ++++- .../ReactNativeFeatureFlagsProvider.kt | 4 +- .../JReactNativeFeatureFlagsCxxInterop.cpp | 16 ++++++- .../JReactNativeFeatureFlagsCxxInterop.h | 5 +- .../chrome/HermesRuntimeTargetDelegate.cpp | 48 ++++++++++++++----- .../jsinspector-modern/InspectorFlags.cpp | 13 ++++- .../jsinspector-modern/InspectorFlags.h | 6 +++ .../featureflags/ReactNativeFeatureFlags.cpp | 6 ++- .../featureflags/ReactNativeFeatureFlags.h | 7 ++- .../ReactNativeFeatureFlagsAccessor.cpp | 26 ++++++++-- .../ReactNativeFeatureFlagsAccessor.h | 6 ++- .../ReactNativeFeatureFlagsDefaults.h | 6 ++- .../ReactNativeFeatureFlagsProvider.h | 3 +- .../NativeReactNativeFeatureFlags.cpp | 7 ++- .../NativeReactNativeFeatureFlags.h | 4 +- .../ReactNativeFeatureFlags.config.js | 5 ++ .../NativeReactNativeFeatureFlags.js | 3 +- .../featureflags/ReactNativeFeatureFlags.js | 7 ++- 22 files changed, 176 insertions(+), 37 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt index 975a7182c5b..e196d856d5a 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<62ec63a2aebd866803cde1c1ca7d44c6>> */ /** @@ -82,6 +82,12 @@ public object ReactNativeFeatureFlags { @JvmStatic public fun inspectorEnableCxxInspectorPackagerConnection(): Boolean = accessor.inspectorEnableCxxInspectorPackagerConnection() + /** + * Flag determining if the new Hermes CDPAgent API should be enabled in the modern CDP backend. This flag is global and should not be changed across React Host lifetimes. + */ + @JvmStatic + public fun inspectorEnableHermesCDPAgent(): Boolean = accessor.inspectorEnableHermesCDPAgent() + /** * Flag determining if the modern CDP backend should be enabled. This flag is global and should not be changed across React Host lifetimes. */ diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt index fc217774592..a6eac99fa29 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<8539cf7ba13ab52ca878efd2c4858d7a>> + * @generated SignedSource<> */ /** @@ -29,6 +29,7 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso private var enableMountHooksAndroidCache: Boolean? = null private var enableSpannableBuildingUnificationCache: Boolean? = null private var inspectorEnableCxxInspectorPackagerConnectionCache: Boolean? = null + private var inspectorEnableHermesCDPAgentCache: Boolean? = null private var inspectorEnableModernCDPRegistryCache: Boolean? = null private var skipMountHookNotificationsCache: Boolean? = null private var useModernRuntimeSchedulerCache: Boolean? = null @@ -114,6 +115,15 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso return cached } + override fun inspectorEnableHermesCDPAgent(): Boolean { + var cached = inspectorEnableHermesCDPAgentCache + if (cached == null) { + cached = ReactNativeFeatureFlagsCxxInterop.inspectorEnableHermesCDPAgent() + inspectorEnableHermesCDPAgentCache = cached + } + return cached + } + override fun inspectorEnableModernCDPRegistry(): Boolean { var cached = inspectorEnableModernCDPRegistryCache if (cached == null) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt index d97a2dd6b4a..16eee48dec1 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<9b38540981705aea015b0a5d0ac07c6e>> */ /** @@ -46,6 +46,8 @@ public object ReactNativeFeatureFlagsCxxInterop { @DoNotStrip @JvmStatic public external fun inspectorEnableCxxInspectorPackagerConnection(): Boolean + @DoNotStrip @JvmStatic public external fun inspectorEnableHermesCDPAgent(): Boolean + @DoNotStrip @JvmStatic public external fun inspectorEnableModernCDPRegistry(): Boolean @DoNotStrip @JvmStatic public external fun skipMountHookNotifications(): Boolean diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt index 006caa1e950..12fbeaeb870 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<99263973c4a06fdc91e7c9edf4aa4e19>> + * @generated SignedSource<> */ /** @@ -41,6 +41,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi override fun inspectorEnableCxxInspectorPackagerConnection(): Boolean = false + override fun inspectorEnableHermesCDPAgent(): Boolean = false + override fun inspectorEnableModernCDPRegistry(): Boolean = false override fun skipMountHookNotifications(): Boolean = false diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt index 88558da84c9..5cf84abc815 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<7e3e2b716f8f6caf60b888350041745e>> */ /** @@ -33,6 +33,7 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces private var enableMountHooksAndroidCache: Boolean? = null private var enableSpannableBuildingUnificationCache: Boolean? = null private var inspectorEnableCxxInspectorPackagerConnectionCache: Boolean? = null + private var inspectorEnableHermesCDPAgentCache: Boolean? = null private var inspectorEnableModernCDPRegistryCache: Boolean? = null private var skipMountHookNotificationsCache: Boolean? = null private var useModernRuntimeSchedulerCache: Boolean? = null @@ -127,6 +128,16 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces return cached } + override fun inspectorEnableHermesCDPAgent(): Boolean { + var cached = inspectorEnableHermesCDPAgentCache + if (cached == null) { + cached = currentProvider.inspectorEnableHermesCDPAgent() + accessedFeatureFlags.add("inspectorEnableHermesCDPAgent") + inspectorEnableHermesCDPAgentCache = cached + } + return cached + } + override fun inspectorEnableModernCDPRegistry(): Boolean { var cached = inspectorEnableModernCDPRegistryCache if (cached == null) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt index 905ee909744..92ef509d076 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<268a87860fea5f281567d2142f90b0d4>> + * @generated SignedSource<> */ /** @@ -41,6 +41,8 @@ public interface ReactNativeFeatureFlagsProvider { @DoNotStrip public fun inspectorEnableCxxInspectorPackagerConnection(): Boolean + @DoNotStrip public fun inspectorEnableHermesCDPAgent(): Boolean + @DoNotStrip public fun inspectorEnableModernCDPRegistry(): Boolean @DoNotStrip public fun skipMountHookNotifications(): Boolean diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp index fec585cacd0..1e8f4599349 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -93,6 +93,12 @@ class ReactNativeFeatureFlagsProviderHolder return method(javaProvider_); } + bool inspectorEnableHermesCDPAgent() override { + static const auto method = + getReactNativeFeatureFlagsProviderJavaClass()->getMethod("inspectorEnableHermesCDPAgent"); + return method(javaProvider_); + } + bool inspectorEnableModernCDPRegistry() override { static const auto method = getReactNativeFeatureFlagsProviderJavaClass()->getMethod("inspectorEnableModernCDPRegistry"); @@ -160,6 +166,11 @@ bool JReactNativeFeatureFlagsCxxInterop::inspectorEnableCxxInspectorPackagerConn return ReactNativeFeatureFlags::inspectorEnableCxxInspectorPackagerConnection(); } +bool JReactNativeFeatureFlagsCxxInterop::inspectorEnableHermesCDPAgent( + facebook::jni::alias_ref /*unused*/) { + return ReactNativeFeatureFlags::inspectorEnableHermesCDPAgent(); +} + bool JReactNativeFeatureFlagsCxxInterop::inspectorEnableModernCDPRegistry( facebook::jni::alias_ref /*unused*/) { return ReactNativeFeatureFlags::inspectorEnableModernCDPRegistry(); @@ -219,6 +230,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() { makeNativeMethod( "inspectorEnableCxxInspectorPackagerConnection", JReactNativeFeatureFlagsCxxInterop::inspectorEnableCxxInspectorPackagerConnection), + makeNativeMethod( + "inspectorEnableHermesCDPAgent", + JReactNativeFeatureFlagsCxxInterop::inspectorEnableHermesCDPAgent), makeNativeMethod( "inspectorEnableModernCDPRegistry", JReactNativeFeatureFlagsCxxInterop::inspectorEnableModernCDPRegistry), diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h index 45ccaf577a0..c10fc302342 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<24dfb31a32c16f44b9a0ed64d8fff25b>> */ /** @@ -57,6 +57,9 @@ class JReactNativeFeatureFlagsCxxInterop static bool inspectorEnableCxxInspectorPackagerConnection( facebook::jni::alias_ref); + static bool inspectorEnableHermesCDPAgent( + facebook::jni::alias_ref); + static bool inspectorEnableModernCDPRegistry( facebook::jni::alias_ref); diff --git a/packages/react-native/ReactCommon/hermes/inspector-modern/chrome/HermesRuntimeTargetDelegate.cpp b/packages/react-native/ReactCommon/hermes/inspector-modern/chrome/HermesRuntimeTargetDelegate.cpp index c9f651d75c5..fbbb1a51c37 100644 --- a/packages/react-native/ReactCommon/hermes/inspector-modern/chrome/HermesRuntimeTargetDelegate.cpp +++ b/packages/react-native/ReactCommon/hermes/inspector-modern/chrome/HermesRuntimeTargetDelegate.cpp @@ -5,8 +5,12 @@ * LICENSE file in the root directory of this source tree. */ -#include "HermesRuntimeTargetDelegate.h" +#include +#include + #include "HermesRuntimeAgentDelegate.h" +#include "HermesRuntimeAgentDelegateNew.h" +#include "HermesRuntimeTargetDelegate.h" #ifdef HERMES_ENABLE_DEBUGGER #include @@ -23,16 +27,21 @@ namespace facebook::react::jsinspector_modern { class HermesRuntimeTargetDelegate::Impl : public RuntimeTargetDelegate { public: #ifdef HERMES_ENABLE_DEBUGGER - explicit Impl(std::shared_ptr hermesRuntime) - : runtime_(std::move(hermesRuntime)), + explicit Impl( + HermesRuntimeTargetDelegate& delegate, + std::shared_ptr hermesRuntime) + : delegate_(delegate), + runtime_(std::move(hermesRuntime)), cdpDebugAPI_(CDPDebugAPI::create(*runtime_)) {} CDPDebugAPI& getCDPDebugAPI() { return *cdpDebugAPI_; } #else - explicit Impl(std::shared_ptr hermesRuntime) - : runtime_(std::move(hermesRuntime)) {} + explicit Impl( + HermesRuntimeTargetDelegate& delegate, + std::shared_ptr hermesRuntime) + : delegate_(delegate), runtime_(std::move(hermesRuntime)) {} #endif // RuntimeTargetDelegate methods @@ -44,16 +53,29 @@ class HermesRuntimeTargetDelegate::Impl : public RuntimeTargetDelegate { previouslyExportedState, const ExecutionContextDescription& executionContextDescription, RuntimeExecutor runtimeExecutor) override { - return std::unique_ptr(new HermesRuntimeAgentDelegate( - frontendChannel, - sessionState, - std::move(previouslyExportedState), - executionContextDescription, - runtime_, - std::move(runtimeExecutor))); + auto& inspectorFlags = InspectorFlags::getInstance(); + + return inspectorFlags.getEnableHermesCDPAgent() + ? std::unique_ptr( + new HermesRuntimeAgentDelegateNew( + frontendChannel, + sessionState, + std::move(previouslyExportedState), + executionContextDescription, + *runtime_, + delegate_, + std::move(runtimeExecutor))) + : std::unique_ptr(new HermesRuntimeAgentDelegate( + frontendChannel, + sessionState, + std::move(previouslyExportedState), + executionContextDescription, + runtime_, + std::move(runtimeExecutor))); } private: + HermesRuntimeTargetDelegate& delegate_; std::shared_ptr runtime_; #ifdef HERMES_ENABLE_DEBUGGER @@ -63,7 +85,7 @@ class HermesRuntimeTargetDelegate::Impl : public RuntimeTargetDelegate { HermesRuntimeTargetDelegate::HermesRuntimeTargetDelegate( std::shared_ptr hermesRuntime) - : impl_(std::make_unique(std::move(hermesRuntime))) {} + : impl_(std::make_unique(*this, std::move(hermesRuntime))) {} HermesRuntimeTargetDelegate::~HermesRuntimeTargetDelegate() = default; diff --git a/packages/react-native/ReactCommon/jsinspector-modern/InspectorFlags.cpp b/packages/react-native/ReactCommon/jsinspector-modern/InspectorFlags.cpp index 4a2c9df723a..b473ee70e2a 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/InspectorFlags.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/InspectorFlags.cpp @@ -22,7 +22,9 @@ InspectorFlags::InspectorFlags() ReactNativeFeatureFlags::inspectorEnableModernCDPRegistry()), enableCxxInspectorPackagerConnection_( ReactNativeFeatureFlags:: - inspectorEnableCxxInspectorPackagerConnection()) {} + inspectorEnableCxxInspectorPackagerConnection()), + enableHermesCDPAgent_( + ReactNativeFeatureFlags::inspectorEnableHermesCDPAgent()) {} bool InspectorFlags::getEnableModernCDPRegistry() const { assertFlagsMatchUpstream(); @@ -37,6 +39,11 @@ bool InspectorFlags::getEnableCxxInspectorPackagerConnection() const { enableModernCDPRegistry_; } +bool InspectorFlags::getEnableHermesCDPAgent() const { + assertFlagsMatchUpstream(); + return enableHermesCDPAgent_; +} + void InspectorFlags::dangerouslyResetFlags() { *this = InspectorFlags{}; } @@ -50,7 +57,9 @@ void InspectorFlags::assertFlagsMatchUpstream() const { ReactNativeFeatureFlags::inspectorEnableModernCDPRegistry() || enableCxxInspectorPackagerConnection_ != ReactNativeFeatureFlags:: - inspectorEnableCxxInspectorPackagerConnection()) { + inspectorEnableCxxInspectorPackagerConnection() || + ReactNativeFeatureFlags::inspectorEnableHermesCDPAgent() != + enableHermesCDPAgent_) { LOG(ERROR) << "[InspectorFlags] Error: One or more ReactNativeFeatureFlags values " << "have changed during the global app lifetime. This may lead to " diff --git a/packages/react-native/ReactCommon/jsinspector-modern/InspectorFlags.h b/packages/react-native/ReactCommon/jsinspector-modern/InspectorFlags.h index 596f98d1344..249ae167dd5 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/InspectorFlags.h +++ b/packages/react-native/ReactCommon/jsinspector-modern/InspectorFlags.h @@ -30,6 +30,11 @@ class InspectorFlags { */ bool getEnableCxxInspectorPackagerConnection() const; + /** + * Flag determining if the new Hermes CDPAgent API should be enabled. + */ + bool getEnableHermesCDPAgent() const; + /** * Reset flags to their upstream values. The caller must ensure any resources * that have read previous flag values have been cleaned up. @@ -44,6 +49,7 @@ class InspectorFlags { bool enableModernCDPRegistry_; bool enableCxxInspectorPackagerConnection_; + bool enableHermesCDPAgent_; mutable bool inconsistentFlagsStateLogged_{false}; void assertFlagsMatchUpstream() const; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp index 5a1a133ecea..0457dbc9cae 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -57,6 +57,10 @@ bool ReactNativeFeatureFlags::inspectorEnableCxxInspectorPackagerConnection() { return getAccessor().inspectorEnableCxxInspectorPackagerConnection(); } +bool ReactNativeFeatureFlags::inspectorEnableHermesCDPAgent() { + return getAccessor().inspectorEnableHermesCDPAgent(); +} + bool ReactNativeFeatureFlags::inspectorEnableModernCDPRegistry() { return getAccessor().inspectorEnableModernCDPRegistry(); } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h index f0c0c72b367..9e2bdc8cb7b 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -82,6 +82,11 @@ class ReactNativeFeatureFlags { */ RN_EXPORT static bool inspectorEnableCxxInspectorPackagerConnection(); + /** + * Flag determining if the new Hermes CDPAgent API should be enabled in the modern CDP backend. This flag is global and should not be changed across React Host lifetimes. + */ + RN_EXPORT static bool inspectorEnableHermesCDPAgent(); + /** * Flag determining if the modern CDP backend should be enabled. This flag is global and should not be changed across React Host lifetimes. */ diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp index f352ada4f91..81d098ee12a 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<6c1e6b6a51cd6fdddae40d3b61ae2b36>> + * @generated SignedSource<<940e03ab78a13e5486802c13861be739>> */ /** @@ -191,6 +191,24 @@ bool ReactNativeFeatureFlagsAccessor::inspectorEnableCxxInspectorPackagerConnect return flagValue.value(); } +bool ReactNativeFeatureFlagsAccessor::inspectorEnableHermesCDPAgent() { + auto flagValue = inspectorEnableHermesCDPAgent_.load(); + + if (!flagValue.has_value()) { + // This block is not exclusive but it is not necessary. + // If multiple threads try to initialize the feature flag, we would only + // be accessing the provider multiple times but the end state of this + // instance and the returned flag value would be the same. + + markFlagAsAccessed(9, "inspectorEnableHermesCDPAgent"); + + flagValue = currentProvider_->inspectorEnableHermesCDPAgent(); + inspectorEnableHermesCDPAgent_ = flagValue; + } + + return flagValue.value(); +} + bool ReactNativeFeatureFlagsAccessor::inspectorEnableModernCDPRegistry() { auto flagValue = inspectorEnableModernCDPRegistry_.load(); @@ -200,7 +218,7 @@ bool ReactNativeFeatureFlagsAccessor::inspectorEnableModernCDPRegistry() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(9, "inspectorEnableModernCDPRegistry"); + markFlagAsAccessed(10, "inspectorEnableModernCDPRegistry"); flagValue = currentProvider_->inspectorEnableModernCDPRegistry(); inspectorEnableModernCDPRegistry_ = flagValue; @@ -218,7 +236,7 @@ bool ReactNativeFeatureFlagsAccessor::skipMountHookNotifications() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(10, "skipMountHookNotifications"); + markFlagAsAccessed(11, "skipMountHookNotifications"); flagValue = currentProvider_->skipMountHookNotifications(); skipMountHookNotifications_ = flagValue; @@ -236,7 +254,7 @@ bool ReactNativeFeatureFlagsAccessor::useModernRuntimeScheduler() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(11, "useModernRuntimeScheduler"); + markFlagAsAccessed(12, "useModernRuntimeScheduler"); flagValue = currentProvider_->useModernRuntimeScheduler(); useModernRuntimeScheduler_ = flagValue; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h index 6e51c8fda83..e1d90051ae9 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<4c5446d5b72429d090e17523f2d544a7>> + * @generated SignedSource<> */ /** @@ -40,6 +40,7 @@ class ReactNativeFeatureFlagsAccessor { bool enableMountHooksAndroid(); bool enableSpannableBuildingUnification(); bool inspectorEnableCxxInspectorPackagerConnection(); + bool inspectorEnableHermesCDPAgent(); bool inspectorEnableModernCDPRegistry(); bool skipMountHookNotifications(); bool useModernRuntimeScheduler(); @@ -53,7 +54,7 @@ class ReactNativeFeatureFlagsAccessor { std::unique_ptr currentProvider_; bool wasOverridden_; - std::array, 12> accessedFeatureFlags_; + std::array, 13> accessedFeatureFlags_; std::atomic> commonTestFlag_; std::atomic> batchRenderingUpdatesInEventLoop_; @@ -64,6 +65,7 @@ class ReactNativeFeatureFlagsAccessor { std::atomic> enableMountHooksAndroid_; std::atomic> enableSpannableBuildingUnification_; std::atomic> inspectorEnableCxxInspectorPackagerConnection_; + std::atomic> inspectorEnableHermesCDPAgent_; std::atomic> inspectorEnableModernCDPRegistry_; std::atomic> skipMountHookNotifications_; std::atomic> useModernRuntimeScheduler_; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h index 3324b1239a1..9086c75f6b0 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<95e3fd7cf662623e3c09b093649d4ff2>> + * @generated SignedSource<> */ /** @@ -63,6 +63,10 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider { return false; } + bool inspectorEnableHermesCDPAgent() override { + return false; + } + bool inspectorEnableModernCDPRegistry() override { return false; } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h index a28f6e1c2ed..820c97c49f7 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<26990a0a11bb2d7cf8510773b6ece099>> + * @generated SignedSource<> */ /** @@ -34,6 +34,7 @@ class ReactNativeFeatureFlagsProvider { virtual bool enableMountHooksAndroid() = 0; virtual bool enableSpannableBuildingUnification() = 0; virtual bool inspectorEnableCxxInspectorPackagerConnection() = 0; + virtual bool inspectorEnableHermesCDPAgent() = 0; virtual bool inspectorEnableModernCDPRegistry() = 0; virtual bool skipMountHookNotifications() = 0; virtual bool useModernRuntimeScheduler() = 0; diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp index f2a21bbc09d..45e8c863235 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<4f7daa629ad90a9ab2fdc99e7c51e355>> + * @generated SignedSource<> */ /** @@ -82,6 +82,11 @@ bool NativeReactNativeFeatureFlags::inspectorEnableCxxInspectorPackagerConnectio return ReactNativeFeatureFlags::inspectorEnableCxxInspectorPackagerConnection(); } +bool NativeReactNativeFeatureFlags::inspectorEnableHermesCDPAgent( + jsi::Runtime& /*runtime*/) { + return ReactNativeFeatureFlags::inspectorEnableHermesCDPAgent(); +} + bool NativeReactNativeFeatureFlags::inspectorEnableModernCDPRegistry( jsi::Runtime& /*runtime*/) { return ReactNativeFeatureFlags::inspectorEnableModernCDPRegistry(); diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h index 47293751c29..827681e4f2d 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -54,6 +54,8 @@ class NativeReactNativeFeatureFlags bool inspectorEnableCxxInspectorPackagerConnection(jsi::Runtime& runtime); + bool inspectorEnableHermesCDPAgent(jsi::Runtime& runtime); + bool inspectorEnableModernCDPRegistry(jsi::Runtime& runtime); bool skipMountHookNotifications(jsi::Runtime& runtime); diff --git a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js index 1a10c53c020..ef84a26cf9d 100644 --- a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js +++ b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js @@ -72,6 +72,11 @@ const definitions: FeatureFlagDefinitions = { description: 'Flag determining if the C++ implementation of InspectorPackagerConnection should be used instead of the per-platform one. This flag is global and should not be changed across React Host lifetimes.', }, + inspectorEnableHermesCDPAgent: { + defaultValue: false, + description: + 'Flag determining if the new Hermes CDPAgent API should be enabled in the modern CDP backend. This flag is global and should not be changed across React Host lifetimes.', + }, inspectorEnableModernCDPRegistry: { defaultValue: false, description: diff --git a/packages/react-native/src/private/featureflags/NativeReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/NativeReactNativeFeatureFlags.js index 2fda50641c8..3223e8590bd 100644 --- a/packages/react-native/src/private/featureflags/NativeReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/NativeReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<6a401351e670388135bec038018d3fe8>> * @flow strict-local */ @@ -32,6 +32,7 @@ export interface Spec extends TurboModule { +enableMountHooksAndroid?: () => boolean; +enableSpannableBuildingUnification?: () => boolean; +inspectorEnableCxxInspectorPackagerConnection?: () => boolean; + +inspectorEnableHermesCDPAgent?: () => boolean; +inspectorEnableModernCDPRegistry?: () => boolean; +skipMountHookNotifications?: () => boolean; +useModernRuntimeScheduler?: () => boolean; diff --git a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js index 56d0b91cb34..f28b03b9bfa 100644 --- a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<5d1eca67ace8cccc336a6c6f65b40c99>> + * @generated SignedSource<<66678139be02293ff532e8e125ccc608>> * @flow strict-local */ @@ -49,6 +49,7 @@ export type ReactNativeFeatureFlags = { enableMountHooksAndroid: Getter, enableSpannableBuildingUnification: Getter, inspectorEnableCxxInspectorPackagerConnection: Getter, + inspectorEnableHermesCDPAgent: Getter, inspectorEnableModernCDPRegistry: Getter, skipMountHookNotifications: Getter, useModernRuntimeScheduler: Getter, @@ -130,6 +131,10 @@ export const enableSpannableBuildingUnification: Getter = createNativeF * Flag determining if the C++ implementation of InspectorPackagerConnection should be used instead of the per-platform one. This flag is global and should not be changed across React Host lifetimes. */ export const inspectorEnableCxxInspectorPackagerConnection: Getter = createNativeFlagGetter('inspectorEnableCxxInspectorPackagerConnection', false); +/** + * Flag determining if the new Hermes CDPAgent API should be enabled in the modern CDP backend. This flag is global and should not be changed across React Host lifetimes. + */ +export const inspectorEnableHermesCDPAgent: Getter = createNativeFlagGetter('inspectorEnableHermesCDPAgent', false); /** * Flag determining if the modern CDP backend should be enabled. This flag is global and should not be changed across React Host lifetimes. */