From 3e46cb906777ee6ab8a26f79d8d43f3fade98e41 Mon Sep 17 00:00:00 2001 From: stasoid Date: Fri, 3 Jan 2025 21:19:46 +0500 Subject: [PATCH] LibWebView+ImageDecoder+RequestServer+WebContent: Add init_transport --- Libraries/LibImageDecoderClient/Client.h | 2 ++ Libraries/LibRequests/RequestClient.h | 2 ++ Libraries/LibWebView/HelperProcess.cpp | 5 +++++ Libraries/LibWebView/WebContentClient.h | 2 ++ Services/ImageDecoder/ConnectionFromClient.cpp | 9 +++++++++ Services/ImageDecoder/ConnectionFromClient.h | 1 + Services/ImageDecoder/ImageDecoderServer.ipc | 1 + Services/RequestServer/ConnectionFromClient.cpp | 9 +++++++++ Services/RequestServer/ConnectionFromClient.h | 1 + Services/RequestServer/RequestServer.ipc | 1 + Services/WebContent/ConnectionFromClient.cpp | 9 +++++++++ Services/WebContent/ConnectionFromClient.h | 1 + Services/WebContent/WebContentServer.ipc | 1 + Services/WebContent/main.cpp | 8 ++++++++ 14 files changed, 52 insertions(+) diff --git a/Libraries/LibImageDecoderClient/Client.h b/Libraries/LibImageDecoderClient/Client.h index 49da13b942b..7dbf61fa0d3 100644 --- a/Libraries/LibImageDecoderClient/Client.h +++ b/Libraries/LibImageDecoderClient/Client.h @@ -34,6 +34,8 @@ class Client final C_OBJECT_ABSTRACT(Client); public: + using InitTransport = Messages::ImageDecoderServer::InitTransport; + Client(IPC::Transport); NonnullRefPtr> decode_image(ReadonlyBytes, Function(DecodedImage&)> on_resolved, Function on_rejected, Optional ideal_size = {}, Optional mime_type = {}); diff --git a/Libraries/LibRequests/RequestClient.h b/Libraries/LibRequests/RequestClient.h index 6d82a616755..09e8d5dd12b 100644 --- a/Libraries/LibRequests/RequestClient.h +++ b/Libraries/LibRequests/RequestClient.h @@ -24,6 +24,8 @@ class RequestClient final C_OBJECT_ABSTRACT(RequestClient) public: + using InitTransport = Messages::RequestServer::InitTransport; + explicit RequestClient(IPC::Transport); virtual ~RequestClient() override; diff --git a/Libraries/LibWebView/HelperProcess.cpp b/Libraries/LibWebView/HelperProcess.cpp index 311fa1fa7b8..30aa7daf905 100644 --- a/Libraries/LibWebView/HelperProcess.cpp +++ b/Libraries/LibWebView/HelperProcess.cpp @@ -53,6 +53,11 @@ static ErrorOr> launch_server_process( if constexpr (requires { client->set_pid(pid_t {}); }) client->set_pid(process.pid()); + if constexpr (requires { client->transport().set_peer_pid(0); } && !IsSame) { + auto response = client->template send_sync(Core::System::getpid()); + client->transport().set_peer_pid(response->peer_pid()); + } + WebView::Application::the().add_child_process(move(process)); if (chrome_options.profile_helper_process == process_type) { diff --git a/Libraries/LibWebView/WebContentClient.h b/Libraries/LibWebView/WebContentClient.h index acabd17b3da..6d4de74f8bf 100644 --- a/Libraries/LibWebView/WebContentClient.h +++ b/Libraries/LibWebView/WebContentClient.h @@ -29,6 +29,8 @@ class WebContentClient final C_OBJECT_ABSTRACT(WebContentClient); public: + using InitTransport = Messages::WebContentServer::InitTransport; + static Optional view_for_pid_and_page_id(pid_t pid, u64 page_id); template Callback> diff --git a/Services/ImageDecoder/ConnectionFromClient.cpp b/Services/ImageDecoder/ConnectionFromClient.cpp index 9da8bbf6190..da0b1db1955 100644 --- a/Services/ImageDecoder/ConnectionFromClient.cpp +++ b/Services/ImageDecoder/ConnectionFromClient.cpp @@ -40,6 +40,15 @@ void ConnectionFromClient::die() } } +Messages::ImageDecoderServer::InitTransportResponse ConnectionFromClient::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(); +} + ErrorOr ConnectionFromClient::connect_new_client() { int socket_fds[2] {}; diff --git a/Services/ImageDecoder/ConnectionFromClient.h b/Services/ImageDecoder/ConnectionFromClient.h index 3dea9b9e7ce..8c6a09bd842 100644 --- a/Services/ImageDecoder/ConnectionFromClient.h +++ b/Services/ImageDecoder/ConnectionFromClient.h @@ -43,6 +43,7 @@ private: virtual Messages::ImageDecoderServer::DecodeImageResponse decode_image(Core::AnonymousBuffer const&, Optional const& ideal_size, Optional const& mime_type) override; virtual void cancel_decoding(i64 image_id) override; virtual Messages::ImageDecoderServer::ConnectNewClientsResponse connect_new_clients(size_t count) override; + virtual Messages::ImageDecoderServer::InitTransportResponse init_transport(int peer_pid) override; ErrorOr connect_new_client(); diff --git a/Services/ImageDecoder/ImageDecoderServer.ipc b/Services/ImageDecoder/ImageDecoderServer.ipc index cd6408ee59f..8866099f389 100644 --- a/Services/ImageDecoder/ImageDecoderServer.ipc +++ b/Services/ImageDecoder/ImageDecoderServer.ipc @@ -2,6 +2,7 @@ endpoint ImageDecoderServer { + init_transport(int peer_pid) => (int peer_pid) decode_image(Core::AnonymousBuffer data, Optional ideal_size, Optional mime_type) => (i64 image_id) cancel_decoding(i64 image_id) =| diff --git a/Services/RequestServer/ConnectionFromClient.cpp b/Services/RequestServer/ConnectionFromClient.cpp index c81a1a66112..7ed6dd906fc 100644 --- a/Services/RequestServer/ConnectionFromClient.cpp +++ b/Services/RequestServer/ConnectionFromClient.cpp @@ -279,6 +279,15 @@ void ConnectionFromClient::die() Core::EventLoop::current().quit(0); } +Messages::RequestServer::InitTransportResponse ConnectionFromClient::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(); +} + Messages::RequestServer::ConnectNewClientResponse ConnectionFromClient::connect_new_client() { static_assert(IsSame, "Need to handle other IPC transports here"); diff --git a/Services/RequestServer/ConnectionFromClient.h b/Services/RequestServer/ConnectionFromClient.h index 3129c720297..429133e8616 100644 --- a/Services/RequestServer/ConnectionFromClient.h +++ b/Services/RequestServer/ConnectionFromClient.h @@ -43,6 +43,7 @@ public: private: explicit ConnectionFromClient(IPC::Transport); + virtual Messages::RequestServer::InitTransportResponse init_transport(int peer_pid) override; virtual Messages::RequestServer::ConnectNewClientResponse connect_new_client() override; virtual Messages::RequestServer::IsSupportedProtocolResponse is_supported_protocol(ByteString const&) override; virtual void set_dns_server(ByteString const& host_or_address, u16 port, bool use_tls) override; diff --git a/Services/RequestServer/RequestServer.ipc b/Services/RequestServer/RequestServer.ipc index c95879bfaf7..64a43833842 100644 --- a/Services/RequestServer/RequestServer.ipc +++ b/Services/RequestServer/RequestServer.ipc @@ -5,6 +5,7 @@ endpoint RequestServer { + init_transport(int peer_pid) => (int peer_pid) connect_new_client() => (IPC::File client_socket) // use_tls: enable DNS over TLS diff --git a/Services/WebContent/ConnectionFromClient.cpp b/Services/WebContent/ConnectionFromClient.cpp index 160a7eb1d42..bc6deddb253 100644 --- a/Services/WebContent/ConnectionFromClient.cpp +++ b/Services/WebContent/ConnectionFromClient.cpp @@ -70,6 +70,15 @@ void ConnectionFromClient::die() Web::Platform::EventLoopPlugin::the().quit(); } +Messages::WebContentServer::InitTransportResponse ConnectionFromClient::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(); +} + Optional ConnectionFromClient::page(u64 index, SourceLocation location) { if (auto page = m_page_host->page(index); page.has_value()) diff --git a/Services/WebContent/ConnectionFromClient.h b/Services/WebContent/ConnectionFromClient.h index d0909eea382..09974471448 100644 --- a/Services/WebContent/ConnectionFromClient.h +++ b/Services/WebContent/ConnectionFromClient.h @@ -53,6 +53,7 @@ private: Optional page(u64 index, SourceLocation = SourceLocation::current()); Optional page(u64 index, SourceLocation = SourceLocation::current()) const; + virtual Messages::WebContentServer::InitTransportResponse init_transport(int peer_pid) override; virtual void close_server() override; virtual Messages::WebContentServer::GetWindowHandleResponse get_window_handle(u64 page_id) override; virtual void set_window_handle(u64 page_id, String const& handle) override; diff --git a/Services/WebContent/WebContentServer.ipc b/Services/WebContent/WebContentServer.ipc index b42df548746..30c275779ec 100644 --- a/Services/WebContent/WebContentServer.ipc +++ b/Services/WebContent/WebContentServer.ipc @@ -16,6 +16,7 @@ endpoint WebContentServer { + init_transport(int peer_pid) => (int peer_pid) close_server() =| get_window_handle(u64 page_id) => (String handle) diff --git a/Services/WebContent/main.cpp b/Services/WebContent/main.cpp index 9d49a803a24..6f10b26c722 100644 --- a/Services/WebContent/main.cpp +++ b/Services/WebContent/main.cpp @@ -280,6 +280,10 @@ ErrorOr initialize_resource_loader(GC::Heap& heap, int request_server_sock TRY(socket->set_blocking(true)); auto request_client = TRY(try_make_ref_counted(IPC::Transport(move(socket)))); +#ifdef AK_OS_WINDOWS + auto response = request_client->send_sync(Core::System::getpid()); + request_client->transport().set_peer_pid(response->peer_pid()); +#endif Web::ResourceLoader::initialize(heap, move(request_client)); return {}; @@ -292,6 +296,10 @@ ErrorOr initialize_image_decoder(int image_decoder_socket) TRY(socket->set_blocking(true)); auto new_client = TRY(try_make_ref_counted(IPC::Transport(move(socket)))); +#ifdef AK_OS_WINDOWS + auto response = new_client->send_sync(Core::System::getpid()); + new_client->transport().set_peer_pid(response->peer_pid()); +#endif Web::Platform::ImageCodecPlugin::install(*new WebView::ImageCodecPlugin(move(new_client)));