LibWeb+WebContent: Add IPC to re-establish RequestServer connections

This commit is contained in:
Timothy Flynn 2025-08-09 13:07:57 -04:00 committed by Andreas Kling
parent 6f4be4791a
commit b1b218596f
Notes: github-actions[bot] 2025-08-10 09:04:11 +00:00
7 changed files with 65 additions and 13 deletions

View file

@ -140,6 +140,12 @@ void ConnectionFromClient::connect_to_image_decoder(IPC::File image_decoder_sock
on_image_decoder_connection(image_decoder_socket);
}
void ConnectionFromClient::connect_to_request_server(IPC::File request_server_socket)
{
if (on_request_server_connection)
on_request_server_connection(request_server_socket);
}
void ConnectionFromClient::update_system_theme(u64 page_id, Core::AnonymousBuffer theme_buffer)
{
auto page = this->page(page_id);

View file

@ -46,6 +46,7 @@ public:
PageHost& page_host() { return *m_page_host; }
PageHost const& page_host() const { return *m_page_host; }
Function<void(IPC::File const&)> on_request_server_connection;
Function<void(IPC::File const&)> on_image_decoder_connection;
Queue<Web::QueuedInputEvent>& input_event_queue() { return m_input_event_queue; }
@ -62,6 +63,7 @@ private:
virtual void set_window_handle(u64 page_id, String handle) override;
virtual void connect_to_webdriver(u64 page_id, ByteString webdriver_ipc_path) override;
virtual void connect_to_web_ui(u64 page_id, IPC::File web_ui_socket) override;
virtual void connect_to_request_server(IPC::File request_server_socket) override;
virtual void connect_to_image_decoder(IPC::File image_decoder_socket) override;
virtual void update_system_theme(u64 page_id, Core::AnonymousBuffer) override;
virtual void update_screen_rects(u64 page_id, Vector<Web::DevicePixelRect>, u32) override;

View file

@ -26,6 +26,7 @@ endpoint WebContentServer
connect_to_webdriver(u64 page_id, ByteString webdriver_ipc_path) =|
connect_to_web_ui(u64 page_id, IPC::File socket_fd) =|
connect_to_request_server(IPC::File request_server_socket) =|
connect_to_image_decoder(IPC::File socket_fd) =|
update_system_theme(u64 page_id, Core::AnonymousBuffer theme_buffer) =|

View file

@ -47,7 +47,10 @@
#endif
static ErrorOr<void> load_content_filters(StringView config_path);
static ErrorOr<void> initialize_resource_loader(GC::Heap&, int request_server_socket);
static ErrorOr<void> reinitialize_resource_loader(IPC::File const& image_decoder_socket);
static ErrorOr<void> initialize_image_decoder(int image_decoder_socket);
static ErrorOr<void> reinitialize_image_decoder(IPC::File const& image_decoder_socket);
@ -219,10 +222,13 @@ ErrorOr<int> ladybird_main(Main::Arguments arguments)
auto webcontent_socket = TRY(Core::take_over_socket_from_system_server("WebContent"sv));
auto webcontent_client = TRY(WebContent::ConnectionFromClient::try_create(make<IPC::Transport>(move(webcontent_socket))));
webcontent_client->on_image_decoder_connection = [&](auto& socket_file) {
auto maybe_error = reinitialize_image_decoder(socket_file);
if (maybe_error.is_error())
dbgln("Failed to reinitialize image decoder: {}", maybe_error.error());
webcontent_client->on_request_server_connection = [&](auto const& socket_file) {
if (auto result = reinitialize_resource_loader(socket_file); result.is_error())
dbgln("Failed to reinitialize resource loader: {}", result.error());
};
webcontent_client->on_image_decoder_connection = [&](auto const& socket_file) {
if (auto result = reinitialize_image_decoder(socket_file); result.is_error())
dbgln("Failed to reinitialize image decoder: {}", result.error());
};
return event_loop.exec();
@ -255,7 +261,6 @@ static ErrorOr<void> load_content_filters(StringView config_path)
ErrorOr<void> initialize_resource_loader(GC::Heap& heap, int request_server_socket)
{
// TODO: Mach IPC
auto socket = TRY(Core::LocalSocket::adopt_fd(request_server_socket));
TRY(socket->set_blocking(true));
@ -264,7 +269,19 @@ ErrorOr<void> initialize_resource_loader(GC::Heap& heap, int request_server_sock
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 {};
}
ErrorOr<void> reinitialize_resource_loader(IPC::File const& request_server_socket)
{
// TODO: Mach IPC
auto socket = TRY(Core::LocalSocket::adopt_fd(request_server_socket.take_fd()));
TRY(socket->set_blocking(true));
auto request_client = TRY(try_make_ref_counted<Requests::RequestClient>(make<IPC::Transport>(move(socket))));
Web::ResourceLoader::the().set_client(move(request_client));
return {};
}
@ -282,19 +299,16 @@ ErrorOr<void> initialize_image_decoder(int image_decoder_socket)
#endif
Web::Platform::ImageCodecPlugin::install(*new WebView::ImageCodecPlugin(move(new_client)));
return {};
}
ErrorOr<void> reinitialize_image_decoder(IPC::File const& image_decoder_socket)
{
// TODO: Mach IPC
auto socket = TRY(Core::LocalSocket::adopt_fd(image_decoder_socket.take_fd()));
TRY(socket->set_blocking(true));
auto new_client = TRY(try_make_ref_counted<ImageDecoderClient::Client>(make<IPC::Transport>(move(socket))));
static_cast<WebView::ImageCodecPlugin&>(Web::Platform::ImageCodecPlugin::the()).set_client(move(new_client));
return {};