mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-06-23 10:41:52 +00:00
LibWebView+ImageDecoder+RequestServer+WebContent: Add init_transport
This commit is contained in:
parent
652af318db
commit
3e46cb9067
Notes:
github-actions[bot]
2025-02-13 11:46:18 +00:00
Author: https://github.com/stasoid
Commit: 3e46cb9067
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/3179
Reviewed-by: https://github.com/ADKaster ✅
14 changed files with 52 additions and 0 deletions
|
@ -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 = {});
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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] {};
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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) =|
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)));
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue