1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 14:57:35 +00:00

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
2 changed files with 17 additions and 5 deletions

View file

@ -84,15 +84,22 @@ u32 ParentNode::child_element_count() const
return count; 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 // https://dom.spec.whatwg.org/#dom-parentnode-children
JS::NonnullGCPtr<HTMLCollection> ParentNode::children() JS::NonnullGCPtr<HTMLCollection> ParentNode::children()
{ {
// The children getter steps are to return an HTMLCollection collection rooted at this matching only element 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, if (!m_children) {
// but that would cause a reference cycle since HTMLCollection refs the root. m_children = HTMLCollection::create(*this, [this](Element const& element) {
return HTMLCollection::create(*this, [this](Element const& element) { return is_parent_of(element);
return is_parent_of(element); });
}); }
return *m_children;
} }
// https://dom.spec.whatwg.org/#concept-getelementsbytagname // https://dom.spec.whatwg.org/#concept-getelementsbytagname

View file

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