mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-09-03 16:16:43 +00:00
LibWeb+WebContent: Add IPC to re-establish RequestServer connections
This commit is contained in:
parent
6f4be4791a
commit
b1b218596f
Notes:
github-actions[bot]
2025-08-10 09:04:11 +00:00
Author: https://github.com/trflynn89
Commit: b1b218596f
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/5796
7 changed files with 65 additions and 13 deletions
|
@ -53,6 +53,17 @@ ResourceLoader::ResourceLoader(GC::Heap& heap, NonnullRefPtr<Requests::RequestCl
|
|||
, m_preferred_languages({ "en-US"_string })
|
||||
, m_navigator_compatibility_mode(default_navigator_compatibility_mode)
|
||||
{
|
||||
m_request_client->on_request_server_died = [this]() {
|
||||
m_request_client = nullptr;
|
||||
};
|
||||
}
|
||||
|
||||
void ResourceLoader::set_client(NonnullRefPtr<Requests::RequestClient> request_client)
|
||||
{
|
||||
m_request_client = move(request_client);
|
||||
m_request_client->on_request_server_died = [this]() {
|
||||
m_request_client = nullptr;
|
||||
};
|
||||
}
|
||||
|
||||
void ResourceLoader::prefetch_dns(URL::URL const& url)
|
||||
|
@ -65,7 +76,9 @@ void ResourceLoader::prefetch_dns(URL::URL const& url)
|
|||
return;
|
||||
}
|
||||
|
||||
m_request_client->ensure_connection(url, RequestServer::CacheLevel::ResolveOnly);
|
||||
// FIXME: We could put this request in a queue until the client connection is re-established.
|
||||
if (m_request_client)
|
||||
m_request_client->ensure_connection(url, RequestServer::CacheLevel::ResolveOnly);
|
||||
}
|
||||
|
||||
void ResourceLoader::preconnect(URL::URL const& url)
|
||||
|
@ -78,7 +91,9 @@ void ResourceLoader::preconnect(URL::URL const& url)
|
|||
return;
|
||||
}
|
||||
|
||||
m_request_client->ensure_connection(url, RequestServer::CacheLevel::CreateConnection);
|
||||
// FIXME: We could put this request in a queue until the client connection is re-established.
|
||||
if (m_request_client)
|
||||
m_request_client->ensure_connection(url, RequestServer::CacheLevel::CreateConnection);
|
||||
}
|
||||
|
||||
static HashMap<LoadRequest, NonnullRefPtr<Resource>> s_resource_cache;
|
||||
|
@ -531,6 +546,12 @@ RefPtr<Requests::Request> ResourceLoader::start_network_request(LoadRequest cons
|
|||
if (!headers.contains("User-Agent"))
|
||||
headers.set("User-Agent", m_user_agent.to_byte_string());
|
||||
|
||||
// FIXME: We could put this request in a queue until the client connection is re-established.
|
||||
if (!m_request_client) {
|
||||
log_failure(request, "RequestServer is currently unavailable"sv);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto protocol_request = m_request_client->start_request(request.method(), request.url().value(), headers, request.body(), proxy);
|
||||
if (!protocol_request) {
|
||||
log_failure(request, "Failed to initiate load"sv);
|
||||
|
|
|
@ -24,6 +24,8 @@ public:
|
|||
static void initialize(GC::Heap&, NonnullRefPtr<Requests::RequestClient>);
|
||||
static ResourceLoader& the();
|
||||
|
||||
void set_client(NonnullRefPtr<Requests::RequestClient>);
|
||||
|
||||
RefPtr<Resource> load_resource(Resource::Type, LoadRequest&);
|
||||
|
||||
using SuccessCallback = GC::Function<void(ReadonlyBytes, Requests::RequestTimingInfo const&, HTTP::HeaderMap const& response_headers, Optional<u32> status_code, Optional<String> const& reason_phrase)>;
|
||||
|
@ -38,7 +40,7 @@ public:
|
|||
|
||||
void load_unbuffered(LoadRequest&, GC::Root<OnHeadersReceived>, GC::Root<OnDataReceived>, GC::Root<OnComplete>);
|
||||
|
||||
Requests::RequestClient& request_client() { return *m_request_client; }
|
||||
RefPtr<Requests::RequestClient>& request_client() { return m_request_client; }
|
||||
|
||||
void prefetch_dns(URL::URL const&);
|
||||
void preconnect(URL::URL const&);
|
||||
|
@ -81,7 +83,7 @@ private:
|
|||
int m_pending_loads { 0 };
|
||||
|
||||
GC::Heap& m_heap;
|
||||
NonnullRefPtr<Requests::RequestClient> m_request_client;
|
||||
RefPtr<Requests::RequestClient> m_request_client;
|
||||
HashTable<NonnullRefPtr<Requests::Request>> m_active_requests;
|
||||
|
||||
String m_user_agent;
|
||||
|
|
|
@ -215,7 +215,13 @@ ErrorOr<void> WebSocket::establish_web_socket_connection(URL::URL const& url_rec
|
|||
|
||||
additional_headers.set("User-Agent", ResourceLoader::the().user_agent().to_byte_string());
|
||||
|
||||
m_websocket = ResourceLoader::the().request_client().websocket_connect(url_record, origin_string, protocol_byte_strings, {}, additional_headers);
|
||||
auto request_client = ResourceLoader::the().request_client();
|
||||
|
||||
// FIXME: We could put this request in a queue until the client connection is re-established.
|
||||
if (!request_client)
|
||||
return Error::from_string_literal("RequestServer is currently unavailable");
|
||||
|
||||
m_websocket = request_client->websocket_connect(url_record, origin_string, protocol_byte_strings, {}, additional_headers);
|
||||
|
||||
m_websocket->on_open = [weak_this = make_weak_ptr<WebSocket>()] {
|
||||
if (!weak_this)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) =|
|
||||
|
|
|
@ -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 {};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue