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:
parent
6b3293a74b
commit
dc6e625680
Notes:
sideshowbarker
2024-07-17 09:39:38 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/dc6e625680
2 changed files with 17 additions and 5 deletions
|
@ -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
|
||||
|
|
|
@ -45,6 +45,11 @@ protected:
|
|||
: Node(document, type)
|
||||
{
|
||||
}
|
||||
|
||||
virtual void visit_edges(Cell::Visitor&) override;
|
||||
|
||||
private:
|
||||
JS::GCPtr<HTMLCollection> m_children;
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
Loading…
Add table
Reference in a new issue