diff --git a/Services/Compositor/CompositorWebContentServer.ipc b/Services/Compositor/CompositorWebContentServer.ipc index cbc5e35e9e..0795f319d9 100644 --- a/Services/Compositor/CompositorWebContentServer.ipc +++ b/Services/Compositor/CompositorWebContentServer.ipc @@ -13,6 +13,8 @@ endpoint CompositorWebContentServer { + init_transport(int peer_pid) => (int compositor_pid) + set_presentation_mode(Web::Compositor::CompositorContextId context_id, Web::Compositor::PresentationMode presentation_mode) =| destroy_context(Web::Compositor::CompositorContextId context_id) =| diff --git a/Services/Compositor/ConnectionFromWebContent.cpp b/Services/Compositor/ConnectionFromWebContent.cpp index c0b1adfd8a..2deadda1a0 100644 --- a/Services/Compositor/ConnectionFromWebContent.cpp +++ b/Services/Compositor/ConnectionFromWebContent.cpp @@ -5,6 +5,7 @@ */ #include +#include #include namespace Compositor { @@ -28,6 +29,15 @@ void ConnectionFromWebContent::notify_compositor_lost() async_did_lose_compositor(); } +Messages::CompositorWebContentServer::InitTransportResponse ConnectionFromWebContent::init_transport([[maybe_unused]] int peer_pid) +{ +#ifdef AK_OS_WINDOWS + m_transport->set_peer_pid(peer_pid); + return Core::System::getpid(); +#endif + VERIFY_NOT_REACHED(); +} + void ConnectionFromWebContent::request_rendering_update() { async_request_rendering_update(); diff --git a/Services/Compositor/ConnectionFromWebContent.h b/Services/Compositor/ConnectionFromWebContent.h index 74c96164d4..9b4776a3bc 100644 --- a/Services/Compositor/ConnectionFromWebContent.h +++ b/Services/Compositor/ConnectionFromWebContent.h @@ -31,6 +31,7 @@ private: virtual void die() override; + virtual Messages::CompositorWebContentServer::InitTransportResponse init_transport(int peer_pid) override; virtual void set_presentation_mode(Web::Compositor::CompositorContextId, Web::Compositor::PresentationMode) override; virtual void destroy_context(Web::Compositor::CompositorContextId) override; virtual void update_display_list(Web::Compositor::CompositorContextId, NonnullRefPtr, Web::Painting::AccumulatedVisualContextTree, Web::Painting::DisplayListResourceTransaction, Web::Painting::ScrollStateSnapshot) override; diff --git a/Services/WebContent/ConnectionFromClient.cpp b/Services/WebContent/ConnectionFromClient.cpp index a6043606a2..c71789ec51 100644 --- a/Services/WebContent/ConnectionFromClient.cpp +++ b/Services/WebContent/ConnectionFromClient.cpp @@ -201,6 +201,14 @@ void ConnectionFromClient::connect_to_compositor_process(IPC::TransportHandle ha m_compositor_connection->on_mouse_event = [this](u64 page_id, Web::MouseEvent event) { mouse_event(page_id, move(event)); }; + +#ifdef AK_OS_WINDOWS + // Perform Windows peer PID handshake before any other IPC + if constexpr (requires { m_compositor_connection->transport().set_peer_pid(0); }) { + auto response = m_compositor_connection->send_sync(Core::System::getpid()); + m_compositor_connection->transport().set_peer_pid(response->compositor_pid()); + } +#endif } void ConnectionFromClient::compositor_process_reconnected()