mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-20 11:36:10 +00:00
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:
parent
15103d172c
commit
42bc83a9d0
Notes:
github-actions[bot]
2025-03-27 17:48:21 +00:00
Author: https://github.com/Lubrsi Commit: https://github.com/LadybirdBrowser/ladybird/commit/42bc83a9d07 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4121
2 changed files with 33 additions and 2 deletions
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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 {};
|
||||
|
|
Loading…
Add table
Reference in a new issue