diff --git a/Libraries/LibWebView/HelperProcess.cpp b/Libraries/LibWebView/HelperProcess.cpp index 330440d558d..124c247d852 100644 --- a/Libraries/LibWebView/HelperProcess.cpp +++ b/Libraries/LibWebView/HelperProcess.cpp @@ -171,9 +171,13 @@ ErrorOr> launch_web_worker_process() { Vector 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("WebWorker"sv, move(arguments)); } diff --git a/Services/WebWorker/main.cpp b/Services/WebWorker/main.cpp index b987d5a7db7..b7ac54c632b 100644 --- a/Services/WebWorker/main.cpp +++ b/Services/WebWorker/main.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,7 @@ # include #endif +static ErrorOr initialize_image_decoder(int image_decoder_socket); static ErrorOr initialize_resource_loader(GC::Heap&, int request_server_socket); ErrorOr serenity_main(Main::Arguments arguments) @@ -36,12 +38,14 @@ ErrorOr 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 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 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 serenity_main(Main::Arguments arguments) return event_loop.exec(); } +static ErrorOr initialize_image_decoder(int image_decoder_socket) +{ + static_assert(IsSame, "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(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))); + + return {}; +} + static ErrorOr initialize_resource_loader(GC::Heap& heap, int request_server_socket) { static_assert(IsSame, "Need to handle other IPC transports here"); @@ -79,6 +102,10 @@ static ErrorOr initialize_resource_loader(GC::Heap& heap, int request_serv 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 {};