diff --git a/packages/react-native/React-Core.podspec b/packages/react-native/React-Core.podspec index 667b1f607ff..5de8cef1c9e 100644 --- a/packages/react-native/React-Core.podspec +++ b/packages/react-native/React-Core.podspec @@ -95,6 +95,8 @@ Pod::Spec.new do |s| end ss.exclude_files = exclude_files ss.private_header_files = "React/Cxx*/*.h" + + ss.dependency "React-jsinspector", version end s.subspec "DevSupport" do |ss| diff --git a/packages/react-native/React/Base/RCTBridge.mm b/packages/react-native/React/Base/RCTBridge.mm index 7551195d31d..50cf8c676f2 100644 --- a/packages/react-native/React/Base/RCTBridge.mm +++ b/packages/react-native/React/Base/RCTBridge.mm @@ -14,6 +14,10 @@ #if RCT_ENABLE_INSPECTOR #import "RCTInspectorDevServerHelper.h" #endif +#import +#import +#import +#import #import "RCTDevLoadingViewProtocol.h" #import "RCTJSThread.h" #import "RCTLog.h" @@ -189,6 +193,9 @@ void RCTUIManagerSetDispatchAccessibilityManagerInitOntoMain(BOOL enabled) @implementation RCTBridge { NSURL *_delegateBundleURL; + + std::unique_ptr _inspectorTarget; + std::optional _inspectorPageId; } + (void)initialize @@ -252,6 +259,11 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init) * RCTAssertMainQueue(); */ [self invalidate]; + if (_inspectorPageId.has_value()) { + facebook::react::jsinspector_modern::getInspectorInstance().removePage(*_inspectorPageId); + _inspectorPageId.reset(); + _inspectorTarget.reset(); + } } - (void)setRCTTurboModuleRegistry:(id)turboModuleRegistry @@ -377,6 +389,29 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init) [_performanceLogger markStartForTag:RCTPLBridgeStartup]; [_performanceLogger markStartForTag:RCTPLTTI]; + auto &inspectorFlags = facebook::react::jsinspector_modern::InspectorFlags::getInstance(); + if (inspectorFlags.getEnableModernCDPRegistry() && !_inspectorPageId.has_value()) { + _inspectorTarget = std::make_unique(); + __weak RCTBridge *weakSelf = self; + _inspectorPageId = facebook::react::jsinspector_modern::getInspectorInstance().addPage( + "React Native Bridge (Experimental)", + /* vm */ "", + [weakSelf](std::unique_ptr remote) + -> std::unique_ptr { + RCTBridge *strongSelf = weakSelf; + if (!strongSelf) { + // This can happen if we're about to be dealloc'd. Reject the connection. + return nullptr; + } + return strongSelf->_inspectorTarget->connect( + std::move(remote), + { + .integrationName = "iOS Bridge (RCTBridge)", + }); + }, + facebook::react::jsinspector_modern::InspectorPageType::Modern); + } + Class bridgeClass = self.bridgeClass; // Only update bundleURL from delegate if delegate bundleURL has changed