mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-21 23:20:20 +00:00
LibWeb: Construct ResourceLoader with a GC Heap
This will allow us to easily make use of HeapFunctions instead of SafeFunction for all of the callbacks in ResourceLoader.
This commit is contained in:
parent
a8077f79cc
commit
e44702f090
Notes:
github-actions[bot]
2024-10-30 19:57:36 +00:00
Author: https://github.com/shannonbooth Commit: https://github.com/LadybirdBrowser/ladybird/commit/e44702f0907 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2062 Reviewed-by: https://github.com/kalenikaliaksandr ✅
6 changed files with 23 additions and 18 deletions
|
@ -48,7 +48,7 @@
|
||||||
|
|
||||||
static ErrorOr<void> load_content_filters(StringView config_path);
|
static ErrorOr<void> load_content_filters(StringView config_path);
|
||||||
static ErrorOr<void> load_autoplay_allowlist(StringView config_path);
|
static ErrorOr<void> load_autoplay_allowlist(StringView config_path);
|
||||||
static ErrorOr<void> initialize_resource_loader(int request_server_socket);
|
static ErrorOr<void> initialize_resource_loader(JS::Heap&, int request_server_socket);
|
||||||
static ErrorOr<void> initialize_image_decoder(int 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);
|
static ErrorOr<void> reinitialize_image_decoder(IPC::File const& image_decoder_socket);
|
||||||
|
|
||||||
|
@ -163,7 +163,6 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TRY(initialize_resource_loader(request_server_socket));
|
|
||||||
TRY(initialize_image_decoder(image_decoder_socket));
|
TRY(initialize_image_decoder(image_decoder_socket));
|
||||||
|
|
||||||
Web::HTML::Window::set_internals_object_exposed(expose_internals_object);
|
Web::HTML::Window::set_internals_object_exposed(expose_internals_object);
|
||||||
|
@ -172,6 +171,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
|
|
||||||
TRY(Web::Bindings::initialize_main_thread_vm(Web::HTML::EventLoop::Type::Window));
|
TRY(Web::Bindings::initialize_main_thread_vm(Web::HTML::EventLoop::Type::Window));
|
||||||
|
|
||||||
|
TRY(initialize_resource_loader(Web::Bindings::main_thread_vm().heap(), request_server_socket));
|
||||||
|
|
||||||
if (log_all_js_exceptions) {
|
if (log_all_js_exceptions) {
|
||||||
JS::g_log_all_js_exceptions = true;
|
JS::g_log_all_js_exceptions = true;
|
||||||
}
|
}
|
||||||
|
@ -191,7 +192,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
static_assert(IsSame<IPC::Transport, IPC::TransportSocket>, "Need to handle other IPC transports here");
|
static_assert(IsSame<IPC::Transport, IPC::TransportSocket>, "Need to handle other IPC transports here");
|
||||||
|
|
||||||
auto webcontent_socket = TRY(Core::take_over_socket_from_system_server("WebContent"sv));
|
auto webcontent_socket = TRY(Core::take_over_socket_from_system_server("WebContent"sv));
|
||||||
auto webcontent_client = TRY(WebContent::ConnectionFromClient::try_create(IPC::Transport(move(webcontent_socket))));
|
auto webcontent_client = TRY(WebContent::ConnectionFromClient::try_create(Web::Bindings::main_thread_vm().heap(), IPC::Transport(move(webcontent_socket))));
|
||||||
|
|
||||||
webcontent_client->on_image_decoder_connection = [&](auto& socket_file) {
|
webcontent_client->on_image_decoder_connection = [&](auto& socket_file) {
|
||||||
auto maybe_error = reinitialize_image_decoder(socket_file);
|
auto maybe_error = reinitialize_image_decoder(socket_file);
|
||||||
|
@ -250,7 +251,7 @@ static ErrorOr<void> load_autoplay_allowlist(StringView config_path)
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<void> initialize_resource_loader(int request_server_socket)
|
ErrorOr<void> initialize_resource_loader(JS::Heap& heap, int request_server_socket)
|
||||||
{
|
{
|
||||||
static_assert(IsSame<IPC::Transport, IPC::TransportSocket>, "Need to handle other IPC transports here");
|
static_assert(IsSame<IPC::Transport, IPC::TransportSocket>, "Need to handle other IPC transports here");
|
||||||
|
|
||||||
|
@ -258,7 +259,7 @@ ErrorOr<void> initialize_resource_loader(int request_server_socket)
|
||||||
TRY(socket->set_blocking(true));
|
TRY(socket->set_blocking(true));
|
||||||
|
|
||||||
auto request_client = TRY(try_make_ref_counted<Requests::RequestClient>(IPC::Transport(move(socket))));
|
auto request_client = TRY(try_make_ref_counted<Requests::RequestClient>(IPC::Transport(move(socket))));
|
||||||
Web::ResourceLoader::initialize(move(request_client));
|
Web::ResourceLoader::initialize(heap, move(request_client));
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
# include <QCoreApplication>
|
# include <QCoreApplication>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static ErrorOr<void> initialize_resource_loader(int request_server_socket);
|
static ErrorOr<void> initialize_resource_loader(JS::Heap&, int request_server_socket);
|
||||||
|
|
||||||
ErrorOr<int> serenity_main(Main::Arguments arguments)
|
ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
{
|
{
|
||||||
|
@ -62,16 +62,16 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
|
|
||||||
Web::Platform::FontPlugin::install(*new Ladybird::FontPlugin(false));
|
Web::Platform::FontPlugin::install(*new Ladybird::FontPlugin(false));
|
||||||
|
|
||||||
TRY(initialize_resource_loader(request_server_socket));
|
|
||||||
|
|
||||||
TRY(Web::Bindings::initialize_main_thread_vm(Web::HTML::EventLoop::Type::Worker));
|
TRY(Web::Bindings::initialize_main_thread_vm(Web::HTML::EventLoop::Type::Worker));
|
||||||
|
|
||||||
|
TRY(initialize_resource_loader(Web::Bindings::main_thread_vm().heap(), request_server_socket));
|
||||||
|
|
||||||
auto client = TRY(IPC::take_over_accepted_client_from_system_server<WebWorker::ConnectionFromClient>());
|
auto client = TRY(IPC::take_over_accepted_client_from_system_server<WebWorker::ConnectionFromClient>());
|
||||||
|
|
||||||
return event_loop.exec();
|
return event_loop.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
static ErrorOr<void> initialize_resource_loader(int request_server_socket)
|
static ErrorOr<void> initialize_resource_loader(JS::Heap& heap, int request_server_socket)
|
||||||
{
|
{
|
||||||
static_assert(IsSame<IPC::Transport, IPC::TransportSocket>, "Need to handle other IPC transports here");
|
static_assert(IsSame<IPC::Transport, IPC::TransportSocket>, "Need to handle other IPC transports here");
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ static ErrorOr<void> initialize_resource_loader(int request_server_socket)
|
||||||
TRY(socket->set_blocking(true));
|
TRY(socket->set_blocking(true));
|
||||||
|
|
||||||
auto request_client = TRY(try_make_ref_counted<Requests::RequestClient>(IPC::Transport(move(socket))));
|
auto request_client = TRY(try_make_ref_counted<Requests::RequestClient>(IPC::Transport(move(socket))));
|
||||||
Web::ResourceLoader::initialize(move(request_client));
|
Web::ResourceLoader::initialize(heap, move(request_client));
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,9 +30,9 @@ namespace Web {
|
||||||
|
|
||||||
static RefPtr<ResourceLoader> s_resource_loader;
|
static RefPtr<ResourceLoader> s_resource_loader;
|
||||||
|
|
||||||
void ResourceLoader::initialize(NonnullRefPtr<Requests::RequestClient> request_client)
|
void ResourceLoader::initialize(JS::Heap& heap, NonnullRefPtr<Requests::RequestClient> request_client)
|
||||||
{
|
{
|
||||||
s_resource_loader = adopt_ref(*new ResourceLoader(move(request_client)));
|
s_resource_loader = adopt_ref(*new ResourceLoader(heap, move(request_client)));
|
||||||
}
|
}
|
||||||
|
|
||||||
ResourceLoader& ResourceLoader::the()
|
ResourceLoader& ResourceLoader::the()
|
||||||
|
@ -44,8 +44,9 @@ ResourceLoader& ResourceLoader::the()
|
||||||
return *s_resource_loader;
|
return *s_resource_loader;
|
||||||
}
|
}
|
||||||
|
|
||||||
ResourceLoader::ResourceLoader(NonnullRefPtr<Requests::RequestClient> request_client)
|
ResourceLoader::ResourceLoader(JS::Heap& heap, NonnullRefPtr<Requests::RequestClient> request_client)
|
||||||
: m_request_client(move(request_client))
|
: m_heap(heap)
|
||||||
|
, m_request_client(move(request_client))
|
||||||
, m_user_agent(MUST(String::from_utf8(default_user_agent)))
|
, m_user_agent(MUST(String::from_utf8(default_user_agent)))
|
||||||
, m_platform(MUST(String::from_utf8(default_platform)))
|
, m_platform(MUST(String::from_utf8(default_platform)))
|
||||||
, m_preferred_languages({ "en-US"_string })
|
, m_preferred_languages({ "en-US"_string })
|
||||||
|
|
|
@ -22,7 +22,7 @@ namespace Web {
|
||||||
class ResourceLoader : public Core::EventReceiver {
|
class ResourceLoader : public Core::EventReceiver {
|
||||||
C_OBJECT_ABSTRACT(ResourceLoader)
|
C_OBJECT_ABSTRACT(ResourceLoader)
|
||||||
public:
|
public:
|
||||||
static void initialize(NonnullRefPtr<Requests::RequestClient>);
|
static void initialize(JS::Heap&, NonnullRefPtr<Requests::RequestClient>);
|
||||||
static ResourceLoader& the();
|
static ResourceLoader& the();
|
||||||
|
|
||||||
RefPtr<Resource> load_resource(Resource::Type, LoadRequest&);
|
RefPtr<Resource> load_resource(Resource::Type, LoadRequest&);
|
||||||
|
@ -74,8 +74,10 @@ public:
|
||||||
void clear_cache();
|
void clear_cache();
|
||||||
void evict_from_cache(LoadRequest const&);
|
void evict_from_cache(LoadRequest const&);
|
||||||
|
|
||||||
|
JS::Heap& heap() { return m_heap; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit ResourceLoader(NonnullRefPtr<Requests::RequestClient>);
|
explicit ResourceLoader(JS::Heap&, NonnullRefPtr<Requests::RequestClient>);
|
||||||
|
|
||||||
RefPtr<Requests::Request> start_network_request(LoadRequest const&);
|
RefPtr<Requests::Request> start_network_request(LoadRequest const&);
|
||||||
void handle_network_response_headers(LoadRequest const&, HTTP::HeaderMap const&);
|
void handle_network_response_headers(LoadRequest const&, HTTP::HeaderMap const&);
|
||||||
|
@ -83,6 +85,7 @@ private:
|
||||||
|
|
||||||
int m_pending_loads { 0 };
|
int m_pending_loads { 0 };
|
||||||
|
|
||||||
|
JS::Heap& m_heap;
|
||||||
NonnullRefPtr<Requests::RequestClient> m_request_client;
|
NonnullRefPtr<Requests::RequestClient> m_request_client;
|
||||||
HashTable<NonnullRefPtr<Requests::Request>> m_active_requests;
|
HashTable<NonnullRefPtr<Requests::Request>> m_active_requests;
|
||||||
|
|
||||||
|
|
|
@ -50,8 +50,8 @@ ErrorOr<int> serenity_main(Main::Arguments)
|
||||||
return Web::Platform::AudioCodecPluginAgnostic::create(move(loader));
|
return Web::Platform::AudioCodecPluginAgnostic::create(move(loader));
|
||||||
});
|
});
|
||||||
|
|
||||||
Web::ResourceLoader::initialize(TRY(WebView::RequestServerAdapter::try_create()));
|
|
||||||
TRY(Web::Bindings::initialize_main_thread_vm(Web::HTML::EventLoop::Type::Window));
|
TRY(Web::Bindings::initialize_main_thread_vm(Web::HTML::EventLoop::Type::Window));
|
||||||
|
Web::ResourceLoader::initialize(Web::Bindings::main_thread_vm().heap(), TRY(WebView::RequestServerAdapter::try_create()));
|
||||||
|
|
||||||
auto client = TRY(IPC::take_over_accepted_client_from_system_server<WebContent::ConnectionFromClient>());
|
auto client = TRY(IPC::take_over_accepted_client_from_system_server<WebContent::ConnectionFromClient>());
|
||||||
return event_loop.exec();
|
return event_loop.exec();
|
||||||
|
|
|
@ -35,8 +35,8 @@ ErrorOr<int> serenity_main(Main::Arguments)
|
||||||
Web::Platform::EventLoopPlugin::install(*new Web::Platform::EventLoopPluginSerenity);
|
Web::Platform::EventLoopPlugin::install(*new Web::Platform::EventLoopPluginSerenity);
|
||||||
Web::Platform::FontPlugin::install(*new Web::Platform::FontPluginSerenity);
|
Web::Platform::FontPlugin::install(*new Web::Platform::FontPluginSerenity);
|
||||||
|
|
||||||
Web::ResourceLoader::initialize(TRY(WebView::RequestServerAdapter::try_create()));
|
|
||||||
TRY(Web::Bindings::initialize_main_thread_vm(Web::HTML::EventLoop::Type::Worker));
|
TRY(Web::Bindings::initialize_main_thread_vm(Web::HTML::EventLoop::Type::Worker));
|
||||||
|
Web::ResourceLoader::initialize(Web::Bindings::main_thread_vm().heap(), TRY(WebView::RequestServerAdapter::try_create()));
|
||||||
|
|
||||||
auto client = TRY(IPC::take_over_accepted_client_from_system_server<WebWorker::ConnectionFromClient>());
|
auto client = TRY(IPC::take_over_accepted_client_from_system_server<WebWorker::ConnectionFromClient>());
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue