diff --git a/packages/react-native/React/Base/RCTBridge.mm b/packages/react-native/React/Base/RCTBridge.mm index 20f079fd554..3d5520b9cb9 100644 --- a/packages/react-native/React/Base/RCTBridge.mm +++ b/packages/react-native/React/Base/RCTBridge.mm @@ -430,7 +430,7 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init) .integrationName = "iOS Bridge (RCTBridge)", }); }, - facebook::react::jsinspector_modern::InspectorPageType::Modern); + {.nativePageReloads = true}); } Class bridgeClass = self.bridgeClass; diff --git a/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp b/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp index b98cb113f72..b8ac15d7b91 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp @@ -24,6 +24,13 @@ IRemoteConnection::~IRemoteConnection() {} IInspector::~IInspector() {} IPageStatusListener::~IPageStatusListener() {} +const folly::dynamic targetCapabilitiesToDynamic( + const InspectorTargetCapabilities& capabilities) { + return folly::dynamic::object( + "nativePageReloads", capabilities.nativePageReloads)( + "nativeSourceCodeFetching", capabilities.nativeSourceCodeFetching); +} + namespace { class InspectorImpl : public IInspector { @@ -32,7 +39,7 @@ class InspectorImpl : public IInspector { const std::string& title, const std::string& vm, ConnectFunc connectFunc, - InspectorPageType type) override; + InspectorTargetCapabilities capabilities) override; void removePage(int pageId) override; std::vector getPages() const override; @@ -51,7 +58,7 @@ class InspectorImpl : public IInspector { const std::string& title, const std::string& vm, ConnectFunc connectFunc, - InspectorPageType type); + InspectorTargetCapabilities capabilities); operator InspectorPageDescription() const; ConnectFunc getConnectFunc() const; @@ -61,7 +68,7 @@ class InspectorImpl : public IInspector { std::string title_; std::string vm_; ConnectFunc connectFunc_; - InspectorPageType type_; + InspectorTargetCapabilities capabilities_; }; mutable std::mutex mutex_; int nextPageId_{1}; @@ -74,19 +81,19 @@ InspectorImpl::Page::Page( const std::string& title, const std::string& vm, ConnectFunc connectFunc, - InspectorPageType type) + InspectorTargetCapabilities capabilities) : id_(id), title_(title), vm_(vm), connectFunc_(std::move(connectFunc)), - type_(type) {} + capabilities_(std::move(capabilities)) {} InspectorImpl::Page::operator InspectorPageDescription() const { return InspectorPageDescription{ .id = id_, .title = title_, .vm = vm_, - .type = type_, + .capabilities = capabilities_, }; } @@ -98,12 +105,13 @@ int InspectorImpl::addPage( const std::string& title, const std::string& vm, ConnectFunc connectFunc, - InspectorPageType type) { + InspectorTargetCapabilities capabilities) { std::scoped_lock lock(mutex_); int pageId = nextPageId_++; assert(pages_.count(pageId) == 0 && "Unexpected duplicate page ID"); - pages_.emplace(pageId, Page{pageId, title, vm, std::move(connectFunc), type}); + pages_.emplace( + pageId, Page{pageId, title, vm, std::move(connectFunc), capabilities}); return pageId; } diff --git a/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.h b/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.h index 576fd9a662c..07591f194d5 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.h +++ b/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include @@ -31,25 +33,19 @@ class IDestructible { virtual ~IDestructible() = 0; }; -enum class InspectorPageType { - Legacy, - Modern, +struct InspectorTargetCapabilities { + const bool nativePageReloads = false; + const bool nativeSourceCodeFetching = false; }; -inline const char* pageTypeToString(InspectorPageType type) { - switch (type) { - case InspectorPageType::Legacy: - return "Legacy"; - case InspectorPageType::Modern: - return "Modern"; - } -} +const folly::dynamic targetCapabilitiesToDynamic( + const InspectorTargetCapabilities& capabilities); struct InspectorPageDescription { const int id; const std::string title; const std::string vm; - const InspectorPageType type; + const InspectorTargetCapabilities capabilities; }; // Alias for backwards compatibility. @@ -106,7 +102,7 @@ class JSINSPECTOR_EXPORT IInspector : public IDestructible { const std::string& title, const std::string& vm, ConnectFunc connectFunc, - InspectorPageType type = InspectorPageType::Legacy) = 0; + InspectorTargetCapabilities capabilities = {}) = 0; /// removePage is called by the VM to remove a page from the list of /// debuggable pages. diff --git a/packages/react-native/ReactCommon/jsinspector-modern/InspectorPackagerConnection.cpp b/packages/react-native/ReactCommon/jsinspector-modern/InspectorPackagerConnection.cpp index b98c01a6586..5d9712d1b44 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/InspectorPackagerConnection.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/InspectorPackagerConnection.cpp @@ -157,9 +157,15 @@ folly::dynamic InspectorPackagerConnection::Impl::pages() { folly::dynamic array = folly::dynamic::array(); for (const auto& page : pages) { - array.push_back(folly::dynamic::object("id", std::to_string(page.id))( - "title", page.title + " [C++ connection]")( - "app", app_)("vm", page.vm)("type", pageTypeToString(page.type))); + folly::dynamic pageDescription = folly::dynamic::object; + pageDescription["id"] = std::to_string(page.id); + pageDescription["title"] = page.title + " [C++ connection]"; + pageDescription["app"] = app_; + pageDescription["vm"] = page.vm; + pageDescription["capabilities"] = + targetCapabilitiesToDynamic(page.capabilities); + + array.push_back(pageDescription); } return array; } diff --git a/packages/react-native/ReactCommon/jsinspector-modern/tests/InspectorPackagerConnectionTest.cpp b/packages/react-native/ReactCommon/jsinspector-modern/tests/InspectorPackagerConnectionTest.cpp index 562f0310f89..6cc8d87c667 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/tests/InspectorPackagerConnectionTest.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/tests/InspectorPackagerConnectionTest.cpp @@ -203,7 +203,8 @@ TEST_F(InspectorPackagerConnectionTest, TestGetPages) { "mock-title", "mock-vm", localConnections_ - .lazily_make_unique>()); + .lazily_make_unique>(), + {.nativePageReloads = true}); // getPages now reports the page we registered. EXPECT_CALL( @@ -217,7 +218,10 @@ TEST_F(InspectorPackagerConnectionTest, TestGetPages) { AtJsonPtr("/title", Eq("mock-title [C++ connection]")), AtJsonPtr("/vm", Eq("mock-vm")), AtJsonPtr("/id", Eq(std::to_string(pageId))), - AtJsonPtr("/type", Eq("Legacy")))})))))) + AtJsonPtr("/capabilities/nativePageReloads", Eq(true)), + AtJsonPtr( + "/capabilities/nativeSourceCodeFetching", + Eq(false)))})))))) .RetiresOnSaturation(); webSockets_[0]->getDelegate().didReceiveMessage(R"({ "event": "getPages" diff --git a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm index b59f64427c4..01c1b499ff7 100644 --- a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm +++ b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm @@ -186,7 +186,7 @@ class RCTHostPageTargetDelegate : public facebook::react::jsinspector_modern::Pa .integrationName = "iOS Bridgeless (RCTHost)", }); }, - facebook::react::jsinspector_modern::InspectorPageType::Modern); + {.nativePageReloads = true}); } if (_instance) { RCTLogWarn(