Browse Source

LibWeb: Add GC finalizer to DOM::NodeIterator

It's potentially unsafe to access `m_root` in the destructor since it
may have been swept, so move unregistration of the NodeIterator into a
GC finalizer instead.
Andreas Kling 2 years ago
parent
commit
eda566d112

+ 4 - 1
Userland/Libraries/LibWeb/DOM/NodeIterator.cpp

@@ -19,8 +19,11 @@ NodeIterator::NodeIterator(Node& root)
     root.document().register_node_iterator({}, *this);
 }
 
-NodeIterator::~NodeIterator()
+NodeIterator::~NodeIterator() = default;
+
+void NodeIterator::finalize()
 {
+    Base::finalize();
     m_root->document().unregister_node_iterator({}, *this);
 }
 

+ 1 - 0
Userland/Libraries/LibWeb/DOM/NodeIterator.h

@@ -38,6 +38,7 @@ private:
     explicit NodeIterator(Node& root);
 
     virtual void visit_edges(Cell::Visitor&) override;
+    virtual void finalize() override;
 
     enum class Direction {
         Next,