Sfoglia il codice sorgente

LibWeb: Implement Element.getElementsBy{Tag,Class}Name()

Just like the Document variants, but using the given Element as
for_each_in_subtree_of_type() root.
Linus Groh 4 anni fa
parent
commit
79bab28f5e

+ 28 - 0
Userland/Libraries/LibWeb/DOM/Element.cpp

@@ -46,6 +46,7 @@
 #include <LibWeb/Layout/TableRowGroupBox.h>
 #include <LibWeb/Layout/TreeBuilder.h>
 #include <LibWeb/Layout/WidgetBox.h>
+#include <LibWeb/Namespace.h>
 
 namespace Web::DOM {
 
@@ -344,4 +345,31 @@ bool Element::is_focused() const
     return document().focused_element() == this;
 }
 
+NonnullRefPtrVector<Element> Element::get_elements_by_tag_name(const FlyString& tag_name) const
+{
+    // FIXME: Support "*" for tag_name
+    // https://dom.spec.whatwg.org/#concept-getelementsbytagname
+    NonnullRefPtrVector<Element> elements;
+    for_each_in_subtree_of_type<Element>([&](auto& element) {
+        if (element.namespace_() == Namespace::HTML
+                ? element.local_name().to_lowercase() == tag_name.to_lowercase()
+                : element.local_name() == tag_name) {
+            elements.append(element);
+        }
+        return IterationDecision::Continue;
+    });
+    return elements;
+}
+
+NonnullRefPtrVector<Element> Element::get_elements_by_class_name(const FlyString& class_name) const
+{
+    NonnullRefPtrVector<Element> elements;
+    for_each_in_subtree_of_type<Element>([&](auto& element) {
+        if (element.has_class(class_name, m_document->in_quirks_mode() ? CaseSensitivity::CaseInsensitive : CaseSensitivity::CaseSensitive))
+            elements.append(element);
+        return IterationDecision::Continue;
+    });
+    return elements;
+}
+
 }

+ 3 - 0
Userland/Libraries/LibWeb/DOM/Element.h

@@ -98,6 +98,9 @@ public:
     bool is_focused() const;
     virtual bool is_focusable() const { return false; }
 
+    NonnullRefPtrVector<Element> get_elements_by_tag_name(const FlyString&) const;
+    NonnullRefPtrVector<Element> get_elements_by_class_name(const FlyString&) const;
+
 protected:
     RefPtr<Layout::Node> create_layout_node() override;
 

+ 3 - 0
Userland/Libraries/LibWeb/DOM/Element.idl

@@ -8,6 +8,9 @@ interface Element : Node {
     boolean hasAttribute(DOMString qualifiedName);
     boolean hasAttributes();
 
+    ArrayFromVector getElementsByTagName(DOMString tagName);
+    ArrayFromVector getElementsByClassName(DOMString className);
+
     readonly attribute Element? firstElementChild;
     readonly attribute Element? lastElementChild;