From 5290ebfe19b0475770256ee9ff9f11e7d6d945ff Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Thu, 24 Apr 2025 16:16:08 +1200 Subject: [PATCH] LibJS: Switch Agent [[CanBlock]] slot to a enum member It turns out it was a mistake to make this a virtual since ServiceWorkerAgents are effectively the exact same as DedicatedWorkerAgents and SharedWorkerAgents just with [[CanBlock]] set to false. --- Libraries/LibJS/Runtime/Agent.cpp | 2 +- Libraries/LibJS/Runtime/Agent.h | 18 ++++++++++++++++-- Libraries/LibWeb/Bindings/MainThreadVM.cpp | 2 +- Libraries/LibWeb/HTML/Scripting/Agent.h | 3 +++ .../Scripting/SimilarOriginWindowAgent.cpp | 6 +++--- .../HTML/Scripting/SimilarOriginWindowAgent.h | 9 +++++++-- 6 files changed, 31 insertions(+), 9 deletions(-) diff --git a/Libraries/LibJS/Runtime/Agent.cpp b/Libraries/LibJS/Runtime/Agent.cpp index 05fedb687af..519263003eb 100644 --- a/Libraries/LibJS/Runtime/Agent.cpp +++ b/Libraries/LibJS/Runtime/Agent.cpp @@ -22,7 +22,7 @@ bool agent_can_suspend(VM const& vm) // NOTE: We default to true if no agent has been provided (standalone LibJS with no embedder). if (!agent) return true; - return agent->can_block(); + return agent->can_block() == Agent::CanBlock::Yes; } } diff --git a/Libraries/LibJS/Runtime/Agent.h b/Libraries/LibJS/Runtime/Agent.h index f63324cd308..87f05eb94ed 100644 --- a/Libraries/LibJS/Runtime/Agent.h +++ b/Libraries/LibJS/Runtime/Agent.h @@ -16,12 +16,26 @@ namespace JS { // https://tc39.es/ecma262/#sec-agents class Agent { public: + enum class CanBlock { + Yes, + No, + }; + virtual ~Agent(); - // [[CanBlock]] - virtual bool can_block() const = 0; + CanBlock can_block() const { return m_can_block; } virtual void spin_event_loop_until(GC::Root> goal_condition) = 0; + +protected: + explicit Agent(CanBlock can_block) + : m_can_block(can_block) + { + } + +private: + // [[CanBlock]] + CanBlock m_can_block { false }; }; bool agent_can_suspend(VM const&); diff --git a/Libraries/LibWeb/Bindings/MainThreadVM.cpp b/Libraries/LibWeb/Bindings/MainThreadVM.cpp index 83a9843487b..cbab212b00b 100644 --- a/Libraries/LibWeb/Bindings/MainThreadVM.cpp +++ b/Libraries/LibWeb/Bindings/MainThreadVM.cpp @@ -77,7 +77,7 @@ void initialize_main_thread_vm(HTML::EventLoop::Type type) VERIFY(!s_main_thread_vm); s_main_thread_vm = JS::VM::create(); - s_main_thread_vm->set_agent(make()); + s_main_thread_vm->set_agent(HTML::SimilarOriginWindowAgent::create()); auto& agent = as(*s_main_thread_vm->agent()); agent.event_loop = s_main_thread_vm->heap().allocate(type); diff --git a/Libraries/LibWeb/HTML/Scripting/Agent.h b/Libraries/LibWeb/HTML/Scripting/Agent.h index 13303c55918..4ad31ca0b70 100644 --- a/Libraries/LibWeb/HTML/Scripting/Agent.h +++ b/Libraries/LibWeb/HTML/Scripting/Agent.h @@ -21,6 +21,9 @@ struct Agent : public JS::Agent { GC::Root event_loop; virtual void spin_event_loop_until(GC::Root> goal_condition) override; + +protected: + using JS::Agent::Agent; }; Agent& relevant_agent(JS::Object const&); diff --git a/Libraries/LibWeb/HTML/Scripting/SimilarOriginWindowAgent.cpp b/Libraries/LibWeb/HTML/Scripting/SimilarOriginWindowAgent.cpp index 95e64a3016b..40d324873b9 100644 --- a/Libraries/LibWeb/HTML/Scripting/SimilarOriginWindowAgent.cpp +++ b/Libraries/LibWeb/HTML/Scripting/SimilarOriginWindowAgent.cpp @@ -11,10 +11,10 @@ namespace Web::HTML { -bool SimilarOriginWindowAgent::can_block() const +NonnullOwnPtr SimilarOriginWindowAgent::create() { - // similar-origin window agents can not block, see: https://html.spec.whatwg.org/multipage/webappapis.html#obtain-similar-origin-window-agent - return false; + // See 'creating an agent' step in: https://html.spec.whatwg.org/multipage/webappapis.html#obtain-similar-origin-window-agent + return adopt_own(*new SimilarOriginWindowAgent(CanBlock::No)); } // https://html.spec.whatwg.org/multipage/webappapis.html#relevant-agent diff --git a/Libraries/LibWeb/HTML/Scripting/SimilarOriginWindowAgent.h b/Libraries/LibWeb/HTML/Scripting/SimilarOriginWindowAgent.h index 7e1ffd16b56..51cb491a236 100644 --- a/Libraries/LibWeb/HTML/Scripting/SimilarOriginWindowAgent.h +++ b/Libraries/LibWeb/HTML/Scripting/SimilarOriginWindowAgent.h @@ -20,6 +20,8 @@ namespace Web::HTML { // https://html.spec.whatwg.org/multipage/webappapis.html#similar-origin-window-agent struct SimilarOriginWindowAgent : public Agent { + static NonnullOwnPtr create(); + // https://dom.spec.whatwg.org/#mutation-observer-compound-microtask-queued-flag // Each similar-origin window agent has a mutation observer microtask queued (a boolean), which is initially false. [HTML] bool mutation_observer_microtask_queued { false }; @@ -41,8 +43,11 @@ struct SimilarOriginWindowAgent : public Agent { Vector>& current_element_queue() { return custom_element_reactions_stack.element_queue_stack.last(); } Vector> const& current_element_queue() const { return custom_element_reactions_stack.element_queue_stack.last(); } - // [[CanBlock]] - virtual bool can_block() const override; +private: + explicit SimilarOriginWindowAgent(CanBlock can_block) + : Agent(can_block) + { + } }; SimilarOriginWindowAgent& relevant_similar_origin_window_agent(JS::Object const&);