LibWeb: Make ParentNode.children vend the same HTMLCollection every time

Instead of creating a new HTMLCollection every time you access
.children, we now follow the spec and vend the same object.

This was annoyingly difficult before, and trivial now that the DOM is
garbage-collected. :^)
This commit is contained in:
Andreas Kling 2022-09-18 00:42:33 +02:00
parent 6b3293a74b
commit dc6e625680
Notes: sideshowbarker 2024-07-17 09:39:38 +09:00
2 changed files with 17 additions and 5 deletions

View file

@ -84,15 +84,22 @@ u32 ParentNode::child_element_count() const
return count;
}
void ParentNode::visit_edges(Cell::Visitor& visitor)
{
Base::visit_edges(visitor);
visitor.visit(m_children);
}
// https://dom.spec.whatwg.org/#dom-parentnode-children
JS::NonnullGCPtr<HTMLCollection> ParentNode::children()
{
// The children getter steps are to return an HTMLCollection collection rooted at this matching only element children.
// FIXME: This should return the same HTMLCollection object every time,
// but that would cause a reference cycle since HTMLCollection refs the root.
return HTMLCollection::create(*this, [this](Element const& element) {
return is_parent_of(element);
});
if (!m_children) {
m_children = HTMLCollection::create(*this, [this](Element const& element) {
return is_parent_of(element);
});
}
return *m_children;
}
// https://dom.spec.whatwg.org/#concept-getelementsbytagname

View file

@ -45,6 +45,11 @@ protected:
: Node(document, type)
{
}
virtual void visit_edges(Cell::Visitor&) override;
private:
JS::GCPtr<HTMLCollection> m_children;
};
template<>