LibWeb: Convert Node.childNodes to NodeList

This changes the old child_nodes implementation to children_as_vector
so that can still be used in insert_before.
This commit is contained in:
Luke Wilde 2021-10-02 20:37:45 +01:00 committed by Andreas Kling
parent 2f7fb1fe63
commit 6a7739c645
Notes: sideshowbarker 2024-07-18 03:11:11 +09:00
3 changed files with 15 additions and 5 deletions

View file

@ -20,6 +20,7 @@
#include <LibWeb/DOM/Event.h>
#include <LibWeb/DOM/EventDispatcher.h>
#include <LibWeb/DOM/EventListener.h>
#include <LibWeb/DOM/LiveNodeList.h>
#include <LibWeb/DOM/Node.h>
#include <LibWeb/DOM/ProcessingInstruction.h>
#include <LibWeb/DOM/ShadowRoot.h>
@ -258,7 +259,7 @@ void Node::insert_before(NonnullRefPtr<Node> node, RefPtr<Node> child, bool supp
{
NonnullRefPtrVector<Node> nodes;
if (is<DocumentFragment>(*node))
nodes = verify_cast<DocumentFragment>(*node).child_nodes();
nodes = verify_cast<DocumentFragment>(*node).children_as_vector();
else
nodes.append(node);
@ -591,7 +592,16 @@ ParentNode* Node::parent_or_shadow_host()
return verify_cast<ParentNode>(parent());
}
NonnullRefPtrVector<Node> Node::child_nodes() const
NonnullRefPtr<NodeList> Node::child_nodes()
{
// FIXME: This should return the same LiveNodeList object every time,
// but that would cause a reference cycle since NodeList refs the root.
return LiveNodeList::create(*this, [this](auto& node) {
return is_parent_of(node);
});
}
NonnullRefPtrVector<Node> Node::children_as_vector() const
{
NonnullRefPtrVector<Node> nodes;

View file

@ -96,7 +96,8 @@ public:
// NOTE: This is intended for the JS bindings.
bool has_child_nodes() const { return has_children(); }
NonnullRefPtrVector<Node> child_nodes() const;
NonnullRefPtr<NodeList> child_nodes();
NonnullRefPtrVector<Node> children_as_vector() const;
virtual RefPtr<Layout::Node> create_layout_node();

View file

@ -4,8 +4,7 @@ interface Node : EventTarget {
readonly attribute DOMString nodeName;
boolean hasChildNodes();
// FIXME: This should be a NodeList
readonly attribute ArrayFromVector childNodes;
[SameObject] readonly attribute NodeList childNodes;
readonly attribute Node? firstChild;
readonly attribute Node? lastChild;
readonly attribute Node? previousSibling;