diff --git a/Libraries/LibWeb/HTML/WorkerAgentParent.cpp b/Libraries/LibWeb/HTML/WorkerAgentParent.cpp index 60a2a88e7bf..446c3ad1370 100644 --- a/Libraries/LibWeb/HTML/WorkerAgentParent.cpp +++ b/Libraries/LibWeb/HTML/WorkerAgentParent.cpp @@ -49,10 +49,20 @@ void WorkerAgentParent::initialize(JS::Realm& realm) auto transport = make(move(worker_socket)); m_worker_ipc = make_ref_counted(move(transport)); + setup_worker_ipc_callbacks(realm); m_worker_ipc->async_start_worker(m_url, m_worker_options.type, m_worker_options.credentials, m_worker_options.name, move(data_holder), m_outside_settings->serialize(), m_agent_type); } +void WorkerAgentParent::setup_worker_ipc_callbacks(JS::Realm& realm) +{ + // NOTE: As long as WorkerAgentParent is alive, realm and m_worker_ipc will be alive. + m_worker_ipc->on_request_cookie = [realm = GC::RawRef { realm }](URL::URL const& url, Cookie::Source source) { + auto& client = Bindings::principal_host_defined_page(realm).client(); + return client.page_did_request_cookie(url, source); + }; +} + void WorkerAgentParent::visit_edges(Cell::Visitor& visitor) { Base::visit_edges(visitor); diff --git a/Libraries/LibWeb/HTML/WorkerAgentParent.h b/Libraries/LibWeb/HTML/WorkerAgentParent.h index 693bc7e12a4..987200f5288 100644 --- a/Libraries/LibWeb/HTML/WorkerAgentParent.h +++ b/Libraries/LibWeb/HTML/WorkerAgentParent.h @@ -31,6 +31,8 @@ protected: virtual void visit_edges(Cell::Visitor&) override; private: + void setup_worker_ipc_callbacks(JS::Realm&); + WorkerOptions m_worker_options; Bindings::AgentType m_agent_type { Bindings::AgentType::DedicatedWorker }; URL::URL m_url; diff --git a/Libraries/LibWeb/Worker/WebWorkerClient.cpp b/Libraries/LibWeb/Worker/WebWorkerClient.cpp index 1778595ff39..1ac491624a8 100644 --- a/Libraries/LibWeb/Worker/WebWorkerClient.cpp +++ b/Libraries/LibWeb/Worker/WebWorkerClient.cpp @@ -20,6 +20,13 @@ void WebWorkerClient::did_close_worker() on_worker_close(); } +Messages::WebWorkerClient::DidRequestCookieResponse WebWorkerClient::did_request_cookie(URL::URL url, Cookie::Source source) +{ + if (on_request_cookie) + return on_request_cookie(url, source); + return String {}; +} + WebWorkerClient::WebWorkerClient(NonnullOwnPtr transport) : IPC::ConnectionToServer(*this, move(transport)) { diff --git a/Libraries/LibWeb/Worker/WebWorkerClient.h b/Libraries/LibWeb/Worker/WebWorkerClient.h index ecaffd5d1f2..884c0499463 100644 --- a/Libraries/LibWeb/Worker/WebWorkerClient.h +++ b/Libraries/LibWeb/Worker/WebWorkerClient.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include #include @@ -22,8 +23,10 @@ public: explicit WebWorkerClient(NonnullOwnPtr); virtual void did_close_worker() override; + virtual Messages::WebWorkerClient::DidRequestCookieResponse did_request_cookie(URL::URL, Cookie::Source) override; Function on_worker_close; + Function on_request_cookie; IPC::File clone_transport(); diff --git a/Libraries/LibWeb/Worker/WebWorkerClient.ipc b/Libraries/LibWeb/Worker/WebWorkerClient.ipc index 4a6d849a14a..23db83cdd82 100644 --- a/Libraries/LibWeb/Worker/WebWorkerClient.ipc +++ b/Libraries/LibWeb/Worker/WebWorkerClient.ipc @@ -1,3 +1,7 @@ +#include +#include + endpoint WebWorkerClient { did_close_worker() =| + did_request_cookie(URL::URL url, Web::Cookie::Source source) => (String cookie) } diff --git a/Services/WebWorker/PageHost.cpp b/Services/WebWorker/PageHost.cpp index 048ca39aee1..c321186219a 100644 --- a/Services/WebWorker/PageHost.cpp +++ b/Services/WebWorker/PageHost.cpp @@ -77,6 +77,11 @@ Web::CSS::PreferredMotion PageHost::preferred_motion() const return Web::CSS::PreferredMotion::Auto; } +String PageHost::page_did_request_cookie(URL::URL const& url, Web::Cookie::Source source) +{ + return m_client.did_request_cookie(url, source); +} + void PageHost::request_file(Web::FileRequest request) { m_client.request_file(move(request)); diff --git a/Services/WebWorker/PageHost.h b/Services/WebWorker/PageHost.h index d4834802f9d..813895f0c9c 100644 --- a/Services/WebWorker/PageHost.h +++ b/Services/WebWorker/PageHost.h @@ -32,6 +32,7 @@ public: virtual Web::CSS::PreferredColorScheme preferred_color_scheme() const override; virtual Web::CSS::PreferredContrast preferred_contrast() const override; virtual Web::CSS::PreferredMotion preferred_motion() const override; + virtual String page_did_request_cookie(URL::URL const&, Web::Cookie::Source) override; virtual void request_file(Web::FileRequest) override; virtual Web::DisplayListPlayerType display_list_player_type() const override { VERIFY_NOT_REACHED(); } virtual bool is_headless() const override { VERIFY_NOT_REACHED(); }