Bläddra i källkod

LibWeb: Let HTML::EventLoop keep track of live DOM::Document objects

This will be used by the event loop processing model.
Andreas Kling 3 år sedan
förälder
incheckning
ae71e5f99b

+ 6 - 0
Userland/Libraries/LibWeb/DOM/Document.cpp

@@ -34,6 +34,7 @@
 #include <LibWeb/DOM/Window.h>
 #include <LibWeb/Dump.h>
 #include <LibWeb/HTML/AttributeNames.h>
+#include <LibWeb/HTML/EventLoop/EventLoop.h>
 #include <LibWeb/HTML/EventNames.h>
 #include <LibWeb/HTML/HTMLAnchorElement.h>
 #include <LibWeb/HTML/HTMLAreaElement.h>
@@ -70,6 +71,8 @@ Document::Document(const AK::URL& url)
     , m_implementation(DOMImplementation::create(*this))
     , m_history(HTML::History::create(*this))
 {
+    HTML::main_thread_event_loop().register_document({}, *this);
+
     m_style_update_timer = Core::Timer::create_single_shot(0, [this] {
         update_style();
     });
@@ -131,6 +134,9 @@ void Document::removed_last_ref()
 
     m_in_removed_last_ref = false;
     m_deletion_has_begun = true;
+
+    HTML::main_thread_event_loop().unregister_document({}, *this);
+
     delete this;
 }
 

+ 22 - 0
Userland/Libraries/LibWeb/HTML/EventLoop/EventLoop.cpp

@@ -8,6 +8,7 @@
 #include <LibCore/Timer.h>
 #include <LibJS/Runtime/VM.h>
 #include <LibWeb/Bindings/MainThreadVM.h>
+#include <LibWeb/DOM/Document.h>
 #include <LibWeb/HTML/EventLoop/EventLoop.h>
 
 namespace Web::HTML {
@@ -242,4 +243,25 @@ void EventLoop::perform_a_microtask_checkpoint()
     m_performing_a_microtask_checkpoint = false;
 }
 
+NonnullRefPtrVector<DOM::Document> EventLoop::documents_in_this_event_loop() const
+{
+    NonnullRefPtrVector<DOM::Document> documents;
+    for (auto& document : m_documents) {
+        VERIFY(document);
+        documents.append(*document);
+    }
+    return documents;
+}
+
+void EventLoop::register_document(Badge<DOM::Document>, DOM::Document& document)
+{
+    m_documents.append(&document);
+}
+
+void EventLoop::unregister_document(Badge<DOM::Document>, DOM::Document& document)
+{
+    bool did_remove = m_documents.remove_first_matching([&](auto& entry) { return entry.ptr() == &document; });
+    VERIFY(did_remove);
+}
+
 }

+ 8 - 0
Userland/Libraries/LibWeb/HTML/EventLoop/EventLoop.h

@@ -7,6 +7,7 @@
 #pragma once
 
 #include <AK/Function.h>
+#include <AK/WeakPtr.h>
 #include <LibCore/Forward.h>
 #include <LibJS/Forward.h>
 #include <LibWeb/HTML/EventLoop/TaskQueue.h>
@@ -49,6 +50,11 @@ public:
 
     void perform_a_microtask_checkpoint();
 
+    void register_document(Badge<DOM::Document>, DOM::Document&);
+    void unregister_document(Badge<DOM::Document>, DOM::Document&);
+
+    NonnullRefPtrVector<DOM::Document> documents_in_this_event_loop() const;
+
 private:
     Type m_type { Type::Window };
 
@@ -64,6 +70,8 @@ private:
 
     // https://html.spec.whatwg.org/#performing-a-microtask-checkpoint
     bool m_performing_a_microtask_checkpoint { false };
+
+    Vector<WeakPtr<DOM::Document>> m_documents;
 };
 
 EventLoop& main_thread_event_loop();