mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-14 21:11:57 +00:00
LibWeb: Split out SimilarOriginWindowAgent from HTML::Agent
To allow for adding the concept of a WorkerAgent to be reused between shared and dedicated workers. An event loop is the commonality between the different agent types, though, there are some differences between those event loops which we customize on the construction of the HTML::EventLoop.
This commit is contained in:
parent
939bb10828
commit
084cceab5c
Notes:
github-actions[bot]
2025-04-25 14:45:55 +00:00
Author: https://github.com/shannonbooth
Commit: 084cceab5c
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4453
11 changed files with 103 additions and 54 deletions
|
@ -11,12 +11,6 @@
|
|||
|
||||
namespace Web::HTML {
|
||||
|
||||
bool Agent::can_block() const
|
||||
{
|
||||
// similar-origin window agents can not block, see: https://html.spec.whatwg.org/multipage/webappapis.html#obtain-similar-origin-window-agent
|
||||
return false;
|
||||
}
|
||||
|
||||
void Agent::spin_event_loop_until(GC::Root<GC::Function<bool()>> goal_condition)
|
||||
{
|
||||
Platform::EventLoopPlugin::the().spin_until(move(goal_condition));
|
||||
|
|
|
@ -6,45 +6,20 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <AK/OwnPtr.h>
|
||||
#include <AK/Vector.h>
|
||||
#include <LibGC/Root.h>
|
||||
#include <LibJS/Forward.h>
|
||||
#include <LibJS/Runtime/Agent.h>
|
||||
#include <LibWeb/DOM/MutationObserver.h>
|
||||
#include <LibWeb/Forward.h>
|
||||
#include <LibWeb/HTML/CustomElements/CustomElementReactionsStack.h>
|
||||
|
||||
namespace Web::HTML {
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/webappapis.html#similar-origin-window-agent
|
||||
struct Agent : public JS::Agent {
|
||||
// https://html.spec.whatwg.org/multipage/webappapis.html#window-event-loop
|
||||
// The event loop of a similar-origin window agent is known as a window event loop.
|
||||
// The event loop of a dedicated worker agent, shared worker agent, or service worker agent is known as a worker event loop.
|
||||
// And the event loop of a worklet agent is known as a worklet event loop.
|
||||
GC::Root<HTML::EventLoop> event_loop;
|
||||
|
||||
// FIXME: These should only be on similar-origin window agents, but we don't currently differentiate agent types.
|
||||
|
||||
// https://dom.spec.whatwg.org/#mutation-observer-compound-microtask-queued-flag
|
||||
bool mutation_observer_microtask_queued { false };
|
||||
|
||||
// https://dom.spec.whatwg.org/#mutation-observer-list
|
||||
DOM::MutationObserver::List mutation_observers;
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/custom-elements.html#custom-element-reactions-stack
|
||||
// Each similar-origin window agent has a custom element reactions stack, which is initially empty.
|
||||
CustomElementReactionsStack custom_element_reactions_stack {};
|
||||
|
||||
// https://dom.spec.whatwg.org/#signal-slot-list
|
||||
// Each similar-origin window agent has signal slots (a set of slots), which is initially empty. [HTML]
|
||||
Vector<GC::Root<HTML::HTMLSlotElement>> signal_slots;
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/custom-elements.html#current-element-queue
|
||||
// A similar-origin window agent's current element queue is the element queue at the top of its custom element reactions stack.
|
||||
Vector<GC::Root<DOM::Element>>& current_element_queue() { return custom_element_reactions_stack.element_queue_stack.last(); }
|
||||
Vector<GC::Root<DOM::Element>> const& current_element_queue() const { return custom_element_reactions_stack.element_queue_stack.last(); }
|
||||
|
||||
// [[CanBlock]]
|
||||
virtual bool can_block() const override;
|
||||
|
||||
virtual void spin_event_loop_until(GC::Root<GC::Function<bool()>> goal_condition) override;
|
||||
};
|
||||
|
||||
|
|
28
Libraries/LibWeb/HTML/Scripting/SimilarOriginWindowAgent.cpp
Normal file
28
Libraries/LibWeb/HTML/Scripting/SimilarOriginWindowAgent.cpp
Normal file
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* Copyright (c) 2025, Shannon Booth <shannon@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <LibWeb/Bindings/MainThreadVM.h>
|
||||
#include <LibWeb/HTML/Scripting/Environments.h>
|
||||
#include <LibWeb/HTML/Scripting/SimilarOriginWindowAgent.h>
|
||||
#include <LibWeb/Platform/EventLoopPlugin.h>
|
||||
|
||||
namespace Web::HTML {
|
||||
|
||||
bool SimilarOriginWindowAgent::can_block() const
|
||||
{
|
||||
// similar-origin window agents can not block, see: https://html.spec.whatwg.org/multipage/webappapis.html#obtain-similar-origin-window-agent
|
||||
return false;
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/webappapis.html#relevant-agent
|
||||
SimilarOriginWindowAgent& relevant_similar_origin_window_agent(JS::Object const& object)
|
||||
{
|
||||
// The relevant agent for a platform object platformObject is platformObject's relevant Realm's agent.
|
||||
// Spec Note: This pointer is not yet defined in the JavaScript specification; see tc39/ecma262#1357.
|
||||
return as<SimilarOriginWindowAgent>(*relevant_realm(object).vm().agent());
|
||||
}
|
||||
|
||||
}
|
50
Libraries/LibWeb/HTML/Scripting/SimilarOriginWindowAgent.h
Normal file
50
Libraries/LibWeb/HTML/Scripting/SimilarOriginWindowAgent.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Copyright (c) 2025, Shannon Booth <shannon@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/OwnPtr.h>
|
||||
#include <AK/Vector.h>
|
||||
#include <LibGC/Root.h>
|
||||
#include <LibJS/Forward.h>
|
||||
#include <LibJS/Runtime/Agent.h>
|
||||
#include <LibWeb/DOM/MutationObserver.h>
|
||||
#include <LibWeb/Forward.h>
|
||||
#include <LibWeb/HTML/CustomElements/CustomElementReactionsStack.h>
|
||||
#include <LibWeb/HTML/Scripting/Agent.h>
|
||||
|
||||
namespace Web::HTML {
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/webappapis.html#similar-origin-window-agent
|
||||
struct SimilarOriginWindowAgent : public Agent {
|
||||
// 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 };
|
||||
|
||||
// https://dom.spec.whatwg.org/#mutation-observer-list
|
||||
// Each similar-origin window agent also has pending mutation observers (a set of zero or more MutationObserver objects), which is initially empty.
|
||||
DOM::MutationObserver::List mutation_observers;
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/custom-elements.html#custom-element-reactions-stack
|
||||
// Each similar-origin window agent has a custom element reactions stack, which is initially empty.
|
||||
CustomElementReactionsStack custom_element_reactions_stack {};
|
||||
|
||||
// https://dom.spec.whatwg.org/#signal-slot-list
|
||||
// Each similar-origin window agent has signal slots (a set of slots), which is initially empty. [HTML]
|
||||
Vector<GC::Root<HTML::HTMLSlotElement>> signal_slots;
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/custom-elements.html#current-element-queue
|
||||
// A similar-origin window agent's current element queue is the element queue at the top of its custom element reactions stack.
|
||||
Vector<GC::Root<DOM::Element>>& current_element_queue() { return custom_element_reactions_stack.element_queue_stack.last(); }
|
||||
Vector<GC::Root<DOM::Element>> const& current_element_queue() const { return custom_element_reactions_stack.element_queue_stack.last(); }
|
||||
|
||||
// [[CanBlock]]
|
||||
virtual bool can_block() const override;
|
||||
};
|
||||
|
||||
SimilarOriginWindowAgent& relevant_similar_origin_window_agent(JS::Object const&);
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue