diff --git a/Libraries/LibWeb/Bindings/MainThreadVM.cpp b/Libraries/LibWeb/Bindings/MainThreadVM.cpp index dab56f526a8..8b59e435a05 100644 --- a/Libraries/LibWeb/Bindings/MainThreadVM.cpp +++ b/Libraries/LibWeb/Bindings/MainThreadVM.cpp @@ -675,7 +675,7 @@ void queue_mutation_observer_microtask(DOM::Document const& document) // 2. Let notifySet be a clone of the surrounding agent’s mutation observers. GC::RootVector notify_set(heap); for (auto& observer : surrounding_agent.mutation_observers) - notify_set.append(observer); + notify_set.append(&observer); // FIXME: 3. Let signalSet be a clone of the surrounding agent’s signal slots. diff --git a/Libraries/LibWeb/DOM/MutationObserver.cpp b/Libraries/LibWeb/DOM/MutationObserver.cpp index 63b6cf30da0..075360e9d65 100644 --- a/Libraries/LibWeb/DOM/MutationObserver.cpp +++ b/Libraries/LibWeb/DOM/MutationObserver.cpp @@ -35,9 +35,11 @@ MutationObserver::MutationObserver(JS::Realm& realm, GC::Ptr m_callback; @@ -64,6 +65,11 @@ private: // https://dom.spec.whatwg.org/#concept-mo-queue Vector> m_record_queue; + + IntrusiveListNode m_list_node; + +public: + using List = IntrusiveList<&MutationObserver::m_list_node>; }; // https://dom.spec.whatwg.org/#registered-observer diff --git a/Libraries/LibWeb/HTML/Scripting/Agent.h b/Libraries/LibWeb/HTML/Scripting/Agent.h index 4a69bbda1bb..7953231fb10 100644 --- a/Libraries/LibWeb/HTML/Scripting/Agent.h +++ b/Libraries/LibWeb/HTML/Scripting/Agent.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -25,8 +26,7 @@ struct Agent { bool mutation_observer_microtask_queued { false }; // https://dom.spec.whatwg.org/#mutation-observer-list - // FIXME: This should be a set. - Vector> mutation_observers; + 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.