diff --git a/Source/JavaScriptCore/inspector/remote/RemoteInspectionTarget.cpp b/Source/JavaScriptCore/inspector/remote/RemoteInspectionTarget.cpp index b5a87b435ff6..dd1669f29029 100644 --- a/Source/JavaScriptCore/inspector/remote/RemoteInspectionTarget.cpp +++ b/Source/JavaScriptCore/inspector/remote/RemoteInspectionTarget.cpp @@ -111,6 +111,14 @@ void RemoteInspectionTarget::unpauseForInitializedInspector() RemoteInspector::singleton().setupCompleted(targetIdentifier()); } +void RemoteInspectionTarget::setPresentingApplicationPID(std::optional&& pid) +{ + m_presentingApplicationPID = pid; +#if PLATFORM(COCOA) + RemoteInspector::singleton().setUsePerTargetPresentingApplicationPIDs(true); +#endif +} + } // namespace Inspector #endif // ENABLE(REMOTE_INSPECTOR) diff --git a/Source/JavaScriptCore/inspector/remote/RemoteInspectionTarget.h b/Source/JavaScriptCore/inspector/remote/RemoteInspectionTarget.h index 7cd2abd61dcf..14098b3b7360 100644 --- a/Source/JavaScriptCore/inspector/remote/RemoteInspectionTarget.h +++ b/Source/JavaScriptCore/inspector/remote/RemoteInspectionTarget.h @@ -29,6 +29,7 @@ #include "JSRemoteInspector.h" #include "RemoteControllableTarget.h" +#include #include #include #include @@ -62,6 +63,9 @@ class JS_EXPORT_PRIVATE RemoteInspectionTarget : public RemoteControllableTarget // RemoteControllableTarget overrides. bool remoteControlAllowed() const final; + std::optional presentingApplicationPID() const { return m_presentingApplicationPID; } + void setPresentingApplicationPID(std::optional&&); + private: enum class Inspectable : uint8_t { Yes, @@ -76,6 +80,8 @@ class JS_EXPORT_PRIVATE RemoteInspectionTarget : public RemoteControllableTarget #if USE(CF) RetainPtr m_runLoop; #endif + + std::optional m_presentingApplicationPID; }; } // namespace Inspector diff --git a/Source/JavaScriptCore/inspector/remote/RemoteInspector.h b/Source/JavaScriptCore/inspector/remote/RemoteInspector.h index 7a014cc45530..0a9b3787d006 100644 --- a/Source/JavaScriptCore/inspector/remote/RemoteInspector.h +++ b/Source/JavaScriptCore/inspector/remote/RemoteInspector.h @@ -159,6 +159,9 @@ class JS_EXPORT_PRIVATE RemoteInspector final void setParentProcessInformation(ProcessID, RetainPtr auditData); void setParentProcessInfomationIsDelayed(); std::optional parentProcessAuditToken(); + + void setUsePerTargetPresentingApplicationPIDs(bool usePerTargetPresentingApplicationPIDs) { m_usePerTargetPresentingApplicationPIDs = usePerTargetPresentingApplicationPIDs; } + bool isSimulatingCustomerInstall() const { return m_simulateCustomerInstall; } #endif @@ -308,6 +311,7 @@ class JS_EXPORT_PRIVATE RemoteInspector final RetainPtr m_parentProcessAuditData; bool m_messageDataTypeChunkSupported { false }; bool m_simulateCustomerInstall { false }; + bool m_usePerTargetPresentingApplicationPIDs { false }; #endif bool m_shouldSendParentProcessInformation { false }; bool m_automaticInspectionEnabled WTF_GUARDED_BY_LOCK(m_mutex) { false }; diff --git a/Source/JavaScriptCore/inspector/remote/cocoa/RemoteInspectorCocoa.mm b/Source/JavaScriptCore/inspector/remote/cocoa/RemoteInspectorCocoa.mm index 6bc571115b6c..4fa972e0edc1 100644 --- a/Source/JavaScriptCore/inspector/remote/cocoa/RemoteInspectorCocoa.mm +++ b/Source/JavaScriptCore/inspector/remote/cocoa/RemoteInspectorCocoa.mm @@ -453,6 +453,12 @@ static bool canAccessWebInspectorMachPort() #pragma mark - Listings +static NSString* identifierForPID(ProcessID pid) +{ + // This format matches that used in the relay process. + return [NSString stringWithFormat:@"PID:%lu", (unsigned long)pid]; +} + RetainPtr RemoteInspector::listingForInspectionTarget(const RemoteInspectionTarget& target) const { // Must collect target information on the WebThread, Main, or Worker thread since RemoteTargets are @@ -493,6 +499,9 @@ static bool canAccessWebInspectorMachPort() break; } + if (auto presentingApplicationPID = target.presentingApplicationPID()) + [listing setObject:identifierForPID(presentingApplicationPID.value()) forKey:WIRHostApplicationIdentifierKey]; + if (auto* connectionToTarget = m_targetConnectionMap.get(target.targetIdentifier())) [listing setObject:connectionToTarget->connectionIdentifier() forKey:WIRConnectionIdentifierKey]; @@ -722,6 +731,11 @@ static bool canAccessWebInspectorMachPort() if (!m_relayConnection) return; + // Proxy applications using per-target `presentingApplicationPID`s do not require any additional setup. The remote + // relay will complete its setup when the inspectable target listing is sent to it. + if (m_usePerTargetPresentingApplicationPIDs) + return; + if (!m_parentProcessIdentifier || !m_parentProcessAuditData) { // We are a proxy application without parent process information. // Wait a bit for the information, but give up after a second. diff --git a/Source/WebKit/UIProcess/WebPageProxy.cpp b/Source/WebKit/UIProcess/WebPageProxy.cpp index 4ad63f505bda..2678c875d46f 100644 --- a/Source/WebKit/UIProcess/WebPageProxy.cpp +++ b/Source/WebKit/UIProcess/WebPageProxy.cpp @@ -580,6 +580,7 @@ WebPageProxy::WebPageProxy(PageClient& pageClient, WebProcessProxy& process, Ref #if ENABLE(REMOTE_INSPECTOR) m_inspectorDebuggable->setInspectable(JSRemoteInspectorGetInspectionEnabledByDefault()); + m_inspectorDebuggable->setPresentingApplicationPID(m_process->processPool().configuration().presentingApplicationPID()); m_inspectorDebuggable->init(); #endif m_inspectorController->init();