Compositor+WebContent: Initialize WebContent transport peer pid

A WebContent display-list update can send compositor resource
attachments over the WebContent-to-compositor transport. On Windows,
serializing an attachment requires the destination process id, but this
secondary transport never exchanged peer pids before the first message.

That left TransportSocketWindows with m_peer_pid == -1 and hit the
serialize_attachments() verification when WebContent tried to send the
first attachment-bearing compositor update. Add InitTransport to this
endpoint and run it immediately after WebContent creates the compositor
connection, before any other IPC uses the channel.
This commit is contained in:
Aliaksandr Kalenik 2026-06-15 00:13:19 +02:00 committed by Alexander Kalenik
parent c39ff8eb81
commit 5d8880a899
4 changed files with 21 additions and 0 deletions

View file

@ -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) =|

View file

@ -5,6 +5,7 @@
*/
#include <Compositor/ConnectionFromWebContent.h>
#include <LibCore/System.h>
#include <LibWeb/Page/InputEvent.h>
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();

View file

@ -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::DisplayList>, Web::Painting::AccumulatedVisualContextTree, Web::Painting::DisplayListResourceTransaction, Web::Painting::ScrollStateSnapshot) override;

View file

@ -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<Messages::CompositorWebContentServer::InitTransport>(Core::System::getpid());
m_compositor_connection->transport().set_peer_pid(response->compositor_pid());
}
#endif
}
void ConnectionFromClient::compositor_process_reconnected()