LibWebView+ImageDecoder+RequestServer+WebContent: Add init_transport

This commit is contained in:
stasoid 2025-01-03 21:19:46 +05:00 committed by Andrew Kaster
parent 652af318db
commit 3e46cb9067
Notes: github-actions[bot] 2025-02-13 11:46:18 +00:00
14 changed files with 52 additions and 0 deletions

View file

@ -34,6 +34,8 @@ class Client final
C_OBJECT_ABSTRACT(Client); C_OBJECT_ABSTRACT(Client);
public: public:
using InitTransport = Messages::ImageDecoderServer::InitTransport;
Client(IPC::Transport); Client(IPC::Transport);
NonnullRefPtr<Core::Promise<DecodedImage>> decode_image(ReadonlyBytes, Function<ErrorOr<void>(DecodedImage&)> on_resolved, Function<void(Error&)> on_rejected, Optional<Gfx::IntSize> ideal_size = {}, Optional<ByteString> mime_type = {}); NonnullRefPtr<Core::Promise<DecodedImage>> decode_image(ReadonlyBytes, Function<ErrorOr<void>(DecodedImage&)> on_resolved, Function<void(Error&)> on_rejected, Optional<Gfx::IntSize> ideal_size = {}, Optional<ByteString> mime_type = {});

View file

@ -24,6 +24,8 @@ class RequestClient final
C_OBJECT_ABSTRACT(RequestClient) C_OBJECT_ABSTRACT(RequestClient)
public: public:
using InitTransport = Messages::RequestServer::InitTransport;
explicit RequestClient(IPC::Transport); explicit RequestClient(IPC::Transport);
virtual ~RequestClient() override; virtual ~RequestClient() override;

View file

@ -53,6 +53,11 @@ static ErrorOr<NonnullRefPtr<ClientType>> launch_server_process(
if constexpr (requires { client->set_pid(pid_t {}); }) if constexpr (requires { client->set_pid(pid_t {}); })
client->set_pid(process.pid()); client->set_pid(process.pid());
if constexpr (requires { client->transport().set_peer_pid(0); } && !IsSame<ClientType, Web::HTML::WebWorkerClient>) {
auto response = client->template send_sync<typename ClientType::InitTransport>(Core::System::getpid());
client->transport().set_peer_pid(response->peer_pid());
}
WebView::Application::the().add_child_process(move(process)); WebView::Application::the().add_child_process(move(process));
if (chrome_options.profile_helper_process == process_type) { if (chrome_options.profile_helper_process == process_type) {

View file

@ -29,6 +29,8 @@ class WebContentClient final
C_OBJECT_ABSTRACT(WebContentClient); C_OBJECT_ABSTRACT(WebContentClient);
public: public:
using InitTransport = Messages::WebContentServer::InitTransport;
static Optional<ViewImplementation&> view_for_pid_and_page_id(pid_t pid, u64 page_id); static Optional<ViewImplementation&> view_for_pid_and_page_id(pid_t pid, u64 page_id);
template<CallableAs<IterationDecision, WebContentClient&> Callback> template<CallableAs<IterationDecision, WebContentClient&> Callback>

View file

@ -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<IPC::File> ConnectionFromClient::connect_new_client() ErrorOr<IPC::File> ConnectionFromClient::connect_new_client()
{ {
int socket_fds[2] {}; int socket_fds[2] {};

View file

@ -43,6 +43,7 @@ private:
virtual Messages::ImageDecoderServer::DecodeImageResponse decode_image(Core::AnonymousBuffer const&, Optional<Gfx::IntSize> const& ideal_size, Optional<ByteString> const& mime_type) override; virtual Messages::ImageDecoderServer::DecodeImageResponse decode_image(Core::AnonymousBuffer const&, Optional<Gfx::IntSize> const& ideal_size, Optional<ByteString> const& mime_type) override;
virtual void cancel_decoding(i64 image_id) override; virtual void cancel_decoding(i64 image_id) override;
virtual Messages::ImageDecoderServer::ConnectNewClientsResponse connect_new_clients(size_t count) override; virtual Messages::ImageDecoderServer::ConnectNewClientsResponse connect_new_clients(size_t count) override;
virtual Messages::ImageDecoderServer::InitTransportResponse init_transport(int peer_pid) override;
ErrorOr<IPC::File> connect_new_client(); ErrorOr<IPC::File> connect_new_client();

View file

@ -2,6 +2,7 @@
endpoint ImageDecoderServer endpoint ImageDecoderServer
{ {
init_transport(int peer_pid) => (int peer_pid)
decode_image(Core::AnonymousBuffer data, Optional<Gfx::IntSize> ideal_size, Optional<ByteString> mime_type) => (i64 image_id) decode_image(Core::AnonymousBuffer data, Optional<Gfx::IntSize> ideal_size, Optional<ByteString> mime_type) => (i64 image_id)
cancel_decoding(i64 image_id) =| cancel_decoding(i64 image_id) =|

View file

@ -279,6 +279,15 @@ void ConnectionFromClient::die()
Core::EventLoop::current().quit(0); 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() Messages::RequestServer::ConnectNewClientResponse ConnectionFromClient::connect_new_client()
{ {
static_assert(IsSame<IPC::Transport, IPC::TransportSocket>, "Need to handle other IPC transports here"); static_assert(IsSame<IPC::Transport, IPC::TransportSocket>, "Need to handle other IPC transports here");

View file

@ -43,6 +43,7 @@ public:
private: private:
explicit ConnectionFromClient(IPC::Transport); 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::ConnectNewClientResponse connect_new_client() override;
virtual Messages::RequestServer::IsSupportedProtocolResponse is_supported_protocol(ByteString const&) 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; virtual void set_dns_server(ByteString const& host_or_address, u16 port, bool use_tls) override;

View file

@ -5,6 +5,7 @@
endpoint RequestServer endpoint RequestServer
{ {
init_transport(int peer_pid) => (int peer_pid)
connect_new_client() => (IPC::File client_socket) connect_new_client() => (IPC::File client_socket)
// use_tls: enable DNS over TLS // use_tls: enable DNS over TLS

View file

@ -70,6 +70,15 @@ void ConnectionFromClient::die()
Web::Platform::EventLoopPlugin::the().quit(); 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<PageClient&> ConnectionFromClient::page(u64 index, SourceLocation location) Optional<PageClient&> ConnectionFromClient::page(u64 index, SourceLocation location)
{ {
if (auto page = m_page_host->page(index); page.has_value()) if (auto page = m_page_host->page(index); page.has_value())

View file

@ -53,6 +53,7 @@ private:
Optional<PageClient&> page(u64 index, SourceLocation = SourceLocation::current()); Optional<PageClient&> page(u64 index, SourceLocation = SourceLocation::current());
Optional<PageClient const&> page(u64 index, SourceLocation = SourceLocation::current()) const; Optional<PageClient const&> page(u64 index, SourceLocation = SourceLocation::current()) const;
virtual Messages::WebContentServer::InitTransportResponse init_transport(int peer_pid) override;
virtual void close_server() override; virtual void close_server() override;
virtual Messages::WebContentServer::GetWindowHandleResponse get_window_handle(u64 page_id) override; virtual Messages::WebContentServer::GetWindowHandleResponse get_window_handle(u64 page_id) override;
virtual void set_window_handle(u64 page_id, String const& handle) override; virtual void set_window_handle(u64 page_id, String const& handle) override;

View file

@ -16,6 +16,7 @@
endpoint WebContentServer endpoint WebContentServer
{ {
init_transport(int peer_pid) => (int peer_pid)
close_server() =| close_server() =|
get_window_handle(u64 page_id) => (String handle) get_window_handle(u64 page_id) => (String handle)

View file

@ -280,6 +280,10 @@ ErrorOr<void> initialize_resource_loader(GC::Heap& heap, int request_server_sock
TRY(socket->set_blocking(true)); TRY(socket->set_blocking(true));
auto request_client = TRY(try_make_ref_counted<Requests::RequestClient>(IPC::Transport(move(socket)))); auto request_client = TRY(try_make_ref_counted<Requests::RequestClient>(IPC::Transport(move(socket))));
#ifdef AK_OS_WINDOWS
auto response = request_client->send_sync<Messages::RequestServer::InitTransport>(Core::System::getpid());
request_client->transport().set_peer_pid(response->peer_pid());
#endif
Web::ResourceLoader::initialize(heap, move(request_client)); Web::ResourceLoader::initialize(heap, move(request_client));
return {}; return {};
@ -292,6 +296,10 @@ ErrorOr<void> initialize_image_decoder(int image_decoder_socket)
TRY(socket->set_blocking(true)); TRY(socket->set_blocking(true));
auto new_client = TRY(try_make_ref_counted<ImageDecoderClient::Client>(IPC::Transport(move(socket)))); auto new_client = TRY(try_make_ref_counted<ImageDecoderClient::Client>(IPC::Transport(move(socket))));
#ifdef AK_OS_WINDOWS
auto response = new_client->send_sync<Messages::ImageDecoderServer::InitTransport>(Core::System::getpid());
new_client->transport().set_peer_pid(response->peer_pid());
#endif
Web::Platform::ImageCodecPlugin::install(*new WebView::ImageCodecPlugin(move(new_client))); Web::Platform::ImageCodecPlugin::install(*new WebView::ImageCodecPlugin(move(new_client)));