Przeglądaj źródła

LibWeb: Expose ParentNode.{first,last}ElementChild

I needed these to write the event dispatcher test.
Luke 4 lat temu
rodzic
commit
c5e15d9282

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

@@ -8,8 +8,12 @@ interface Document : Node {
     readonly attribute DOMString contentType;
 
     Element? getElementById(DOMString id);
-    Element? querySelector(DOMString selectors);
     ArrayFromVector getElementsByTagName(DOMString tagName);
+
+    readonly attribute Element? firstElementChild;
+    readonly attribute Element? lastElementChild;
+
+    Element? querySelector(DOMString selectors);
     ArrayFromVector querySelectorAll(DOMString selectors);
 
     Element createElement(DOMString tagName);

+ 4 - 0
Libraries/LibWeb/DOM/DocumentFragment.idl

@@ -1,6 +1,10 @@
 interface DocumentFragment : Node {
 
     Element? getElementById(DOMString id);
+
+    readonly attribute Element? firstElementChild;
+    readonly attribute Element? lastElementChild;
+
     Element? querySelector(DOMString selectors);
     ArrayFromVector querySelectorAll(DOMString selectors);
 

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

@@ -5,6 +5,9 @@ interface Element : Node {
     DOMString? getAttribute(DOMString qualifiedName);
     void setAttribute(DOMString qualifiedName, DOMString value);
 
+    readonly attribute Element? firstElementChild;
+    readonly attribute Element? lastElementChild;
+
     Element? querySelector(DOMString selectors);
     ArrayFromVector querySelectorAll(DOMString selectors);
 

+ 10 - 0
Libraries/LibWeb/DOM/ParentNode.cpp

@@ -70,4 +70,14 @@ NonnullRefPtrVector<Element> ParentNode::query_selector_all(const StringView& se
     return elements;
 }
 
+RefPtr<Element> ParentNode::first_element_child()
+{
+    return first_child_of_type<Element>();
+}
+
+RefPtr<Element> ParentNode::last_element_child()
+{
+    return last_child_of_type<Element>();
+}
+
 }

+ 3 - 0
Libraries/LibWeb/DOM/ParentNode.h

@@ -38,6 +38,9 @@ public:
     template<typename F>
     void for_each_child(F);
 
+    RefPtr<Element> first_element_child();
+    RefPtr<Element> last_element_child();
+
     RefPtr<Element> query_selector(const StringView&);
     NonnullRefPtrVector<Element> query_selector_all(const StringView&);
 

+ 16 - 0
Libraries/LibWeb/TreeNode.h

@@ -255,6 +255,12 @@ public:
         return const_cast<TreeNode*>(this)->template first_child_of_type<U>();
     }
 
+    template<typename U>
+    const U* last_child_of_type() const
+    {
+        return const_cast<TreeNode*>(this)->template last_child_of_type<U>();
+    }
+
     template<typename U>
     U* first_child_of_type()
     {
@@ -265,6 +271,16 @@ public:
         return nullptr;
     }
 
+    template<typename U>
+    U* last_child_of_type()
+    {
+        for (auto* child = last_child(); child; child = child->previous_sibling()) {
+            if (is<U>(*child))
+                return &downcast<U>(*child);
+        }
+        return nullptr;
+    }
+
     template<typename U>
     const U* first_ancestor_of_type() const
     {