فهرست منبع

LibWeb: Return a NodeList from `document.getElementsByName()`

This aligns our implementation with the specification.
Tim Ledbetter 11 ماه پیش
والد
کامیت
bd1213d0c5

+ 6 - 3
Userland/Libraries/LibWeb/DOM/Document.cpp

@@ -47,6 +47,7 @@
 #include <LibWeb/DOM/ElementFactory.h>
 #include <LibWeb/DOM/Event.h>
 #include <LibWeb/DOM/HTMLCollection.h>
+#include <LibWeb/DOM/LiveNodeList.h>
 #include <LibWeb/DOM/NodeIterator.h>
 #include <LibWeb/DOM/ProcessingInstruction.h>
 #include <LibWeb/DOM/Range.h>
@@ -1394,10 +1395,12 @@ void Document::set_hovered_node(Node* node)
     }
 }
 
-JS::NonnullGCPtr<HTMLCollection> Document::get_elements_by_name(FlyString const& name)
+JS::NonnullGCPtr<NodeList> Document::get_elements_by_name(FlyString const& name)
 {
-    return HTMLCollection::create(*this, HTMLCollection::Scope::Descendants, [name](Element const& element) {
-        return element.name() == name;
+    return LiveNodeList::create(realm(), *this, LiveNodeList::Scope::Descendants, [name](auto const& node) {
+        if (!is<Element>(node))
+            return false;
+        return verify_cast<Element>(node).name() == name;
     });
 }
 

+ 1 - 1
Userland/Libraries/LibWeb/DOM/Document.h

@@ -248,7 +248,7 @@ public:
     void schedule_style_update();
     void schedule_layout_update();
 
-    JS::NonnullGCPtr<HTMLCollection> get_elements_by_name(FlyString const&);
+    JS::NonnullGCPtr<NodeList> get_elements_by_name(FlyString const&);
 
     JS::NonnullGCPtr<HTMLCollection> applets();
     JS::NonnullGCPtr<HTMLCollection> anchors();

+ 1 - 1
Userland/Libraries/LibWeb/DOM/Document.idl

@@ -73,7 +73,7 @@ interface Document : Node {
     readonly attribute Element? activeElement;
 
     Element? getElementById(DOMString id);
-    HTMLCollection getElementsByName([FlyString] DOMString name);
+    NodeList getElementsByName([FlyString] DOMString name);
     HTMLCollection getElementsByTagName([FlyString] DOMString tagName);
     HTMLCollection getElementsByTagNameNS([FlyString] DOMString? namespace, [FlyString] DOMString localName);
     HTMLCollection getElementsByClassName(DOMString className);