LibWebView+WebWorker: Attach an image decoder to worker instances

The createImageBitmap API can programmatically decode arbitrary images
from JS, and it's exposed in Workers, so they need an ImageDecoder
instance.
This commit is contained in:
Luke Wilde 2025-03-27 15:31:47 +00:00 committed by Andreas Kling
parent 15103d172c
commit 42bc83a9d0
Notes: github-actions[bot] 2025-03-27 17:48:21 +00:00
2 changed files with 33 additions and 2 deletions

View file

@ -171,9 +171,13 @@ ErrorOr<NonnullRefPtr<Web::HTML::WebWorkerClient>> launch_web_worker_process()
{
Vector<ByteString> arguments;
auto socket = TRY(connect_new_request_server_client());
auto request_server_socket = TRY(connect_new_request_server_client());
arguments.append("--request-server-socket"sv);
arguments.append(ByteString::number(socket.fd()));
arguments.append(ByteString::number(request_server_socket.fd()));
auto image_decoder_socket = TRY(connect_new_image_decoder_client());
arguments.append("--image-decoder-socket"sv);
arguments.append(ByteString::number(image_decoder_socket.fd()));
return launch_server_process<Web::HTML::WebWorkerClient>("WebWorker"sv, move(arguments));
}

View file

@ -21,6 +21,7 @@
#include <LibWeb/WebSockets/WebSocket.h>
#include <LibWebView/HelperProcess.h>
#include <LibWebView/Plugins/FontPlugin.h>
#include <LibWebView/Plugins/ImageCodecPlugin.h>
#include <LibWebView/Utilities.h>
#include <WebWorker/ConnectionFromClient.h>
@ -29,6 +30,7 @@
# include <QCoreApplication>
#endif
static ErrorOr<void> initialize_image_decoder(int image_decoder_socket);
static ErrorOr<void> initialize_resource_loader(GC::Heap&, int request_server_socket);
ErrorOr<int> serenity_main(Main::Arguments arguments)
@ -36,12 +38,14 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
AK::set_rich_debug_enabled(true);
int request_server_socket { -1 };
int image_decoder_socket { -1 };
StringView serenity_resource_root;
Vector<ByteString> certificates;
bool wait_for_debugger = false;
Core::ArgsParser args_parser;
args_parser.add_option(request_server_socket, "File descriptor of the request server socket", "request-server-socket", 's', "request-server-socket");
args_parser.add_option(image_decoder_socket, "File descriptor of the socket for the ImageDecoder connection", "image-decoder-socket", 'i', "image_decoder_socket");
args_parser.add_option(serenity_resource_root, "Absolute path to directory for serenity resources", "serenity-resource-root", 'r', "serenity-resource-root");
args_parser.add_option(certificates, "Path to a certificate file", "certificate", 'C', "certificate");
args_parser.add_option(wait_for_debugger, "Wait for debugger", "wait-for-debugger");
@ -58,6 +62,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
WebView::platform_init();
TRY(initialize_image_decoder(image_decoder_socket));
Web::Platform::EventLoopPlugin::install(*new Web::Platform::EventLoopPluginSerenity);
Web::Platform::FontPlugin::install(*new WebView::FontPlugin(false));
@ -71,6 +77,23 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
return event_loop.exec();
}
static ErrorOr<void> initialize_image_decoder(int image_decoder_socket)
{
static_assert(IsSame<IPC::Transport, IPC::TransportSocket>, "Need to handle other IPC transports here");
auto socket = TRY(Core::LocalSocket::adopt_fd(image_decoder_socket));
TRY(socket->set_blocking(true));
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)));
return {};
}
static ErrorOr<void> initialize_resource_loader(GC::Heap& heap, int request_server_socket)
{
static_assert(IsSame<IPC::Transport, IPC::TransportSocket>, "Need to handle other IPC transports here");
@ -79,6 +102,10 @@ static ErrorOr<void> initialize_resource_loader(GC::Heap& heap, int request_serv
TRY(socket->set_blocking(true));
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));
return {};