Bläddra i källkod

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.
Luke Wilde 3 år sedan
förälder
incheckning
6a7739c645

+ 12 - 2
Userland/Libraries/LibWeb/DOM/Node.cpp

@@ -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;
 

+ 2 - 1
Userland/Libraries/LibWeb/DOM/Node.h

@@ -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();
 

+ 1 - 2
Userland/Libraries/LibWeb/DOM/Node.idl

@@ -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;