mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 05:08:13 +00:00
LibWeb: Expose ParentNode.{first,last}ElementChild
I needed these to write the event dispatcher test.
This commit is contained in:
parent
e8b3a65581
commit
c5e15d9282
6 changed files with 41 additions and 1 deletions
|
@ -8,8 +8,12 @@ interface Document : Node {
|
||||||
readonly attribute DOMString contentType;
|
readonly attribute DOMString contentType;
|
||||||
|
|
||||||
Element? getElementById(DOMString id);
|
Element? getElementById(DOMString id);
|
||||||
Element? querySelector(DOMString selectors);
|
|
||||||
ArrayFromVector getElementsByTagName(DOMString tagName);
|
ArrayFromVector getElementsByTagName(DOMString tagName);
|
||||||
|
|
||||||
|
readonly attribute Element? firstElementChild;
|
||||||
|
readonly attribute Element? lastElementChild;
|
||||||
|
|
||||||
|
Element? querySelector(DOMString selectors);
|
||||||
ArrayFromVector querySelectorAll(DOMString selectors);
|
ArrayFromVector querySelectorAll(DOMString selectors);
|
||||||
|
|
||||||
Element createElement(DOMString tagName);
|
Element createElement(DOMString tagName);
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
interface DocumentFragment : Node {
|
interface DocumentFragment : Node {
|
||||||
|
|
||||||
Element? getElementById(DOMString id);
|
Element? getElementById(DOMString id);
|
||||||
|
|
||||||
|
readonly attribute Element? firstElementChild;
|
||||||
|
readonly attribute Element? lastElementChild;
|
||||||
|
|
||||||
Element? querySelector(DOMString selectors);
|
Element? querySelector(DOMString selectors);
|
||||||
ArrayFromVector querySelectorAll(DOMString selectors);
|
ArrayFromVector querySelectorAll(DOMString selectors);
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,9 @@ interface Element : Node {
|
||||||
DOMString? getAttribute(DOMString qualifiedName);
|
DOMString? getAttribute(DOMString qualifiedName);
|
||||||
void setAttribute(DOMString qualifiedName, DOMString value);
|
void setAttribute(DOMString qualifiedName, DOMString value);
|
||||||
|
|
||||||
|
readonly attribute Element? firstElementChild;
|
||||||
|
readonly attribute Element? lastElementChild;
|
||||||
|
|
||||||
Element? querySelector(DOMString selectors);
|
Element? querySelector(DOMString selectors);
|
||||||
ArrayFromVector querySelectorAll(DOMString selectors);
|
ArrayFromVector querySelectorAll(DOMString selectors);
|
||||||
|
|
||||||
|
|
|
@ -70,4 +70,14 @@ NonnullRefPtrVector<Element> ParentNode::query_selector_all(const StringView& se
|
||||||
return elements;
|
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>();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,9 @@ public:
|
||||||
template<typename F>
|
template<typename F>
|
||||||
void for_each_child(F);
|
void for_each_child(F);
|
||||||
|
|
||||||
|
RefPtr<Element> first_element_child();
|
||||||
|
RefPtr<Element> last_element_child();
|
||||||
|
|
||||||
RefPtr<Element> query_selector(const StringView&);
|
RefPtr<Element> query_selector(const StringView&);
|
||||||
NonnullRefPtrVector<Element> query_selector_all(const StringView&);
|
NonnullRefPtrVector<Element> query_selector_all(const StringView&);
|
||||||
|
|
||||||
|
|
|
@ -255,6 +255,12 @@ public:
|
||||||
return const_cast<TreeNode*>(this)->template first_child_of_type<U>();
|
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>
|
template<typename U>
|
||||||
U* first_child_of_type()
|
U* first_child_of_type()
|
||||||
{
|
{
|
||||||
|
@ -265,6 +271,16 @@ public:
|
||||||
return nullptr;
|
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>
|
template<typename U>
|
||||||
const U* first_ancestor_of_type() const
|
const U* first_ancestor_of_type() const
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue