diff --git a/Userland/Libraries/LibWeb/DOM/Node.cpp b/Userland/Libraries/LibWeb/DOM/Node.cpp index 57a756a1096..d249c0b1409 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.cpp +++ b/Userland/Libraries/LibWeb/DOM/Node.cpp @@ -872,6 +872,19 @@ ParentNode* Node::parent_or_shadow_host() return verify_cast(parent()); } +Element* Node::parent_or_shadow_host_element() +{ + if (is(*this)) + return static_cast(*this).host(); + if (!parent()) + return nullptr; + if (is(*parent())) + return static_cast(parent()); + if (is(*parent())) + return static_cast(*parent()).host(); + return nullptr; +} + JS::NonnullGCPtr Node::child_nodes() { if (!m_child_nodes) { diff --git a/Userland/Libraries/LibWeb/DOM/Node.h b/Userland/Libraries/LibWeb/DOM/Node.h index 7e0dd8ec0b1..a0dd4bda03f 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.h +++ b/Userland/Libraries/LibWeb/DOM/Node.h @@ -45,6 +45,9 @@ public: ParentNode* parent_or_shadow_host(); ParentNode const* parent_or_shadow_host() const { return const_cast(this)->parent_or_shadow_host(); } + Element* parent_or_shadow_host_element(); + Element const* parent_or_shadow_host_element() const { return const_cast(this)->parent_or_shadow_host_element(); } + virtual ~Node(); // FIXME: Move cleanup to the regular destructor.