diff --git a/Libraries/LibHTML/Layout/LayoutNode.h b/Libraries/LibHTML/Layout/LayoutNode.h
index e515de53d2d..0fc8f38ca77 100644
--- a/Libraries/LibHTML/Layout/LayoutNode.h
+++ b/Libraries/LibHTML/Layout/LayoutNode.h
@@ -67,6 +67,7 @@ public:
const StyleProperties& style() const;
+ LayoutNodeWithStyle* parent();
const LayoutNodeWithStyle* parent() const;
void inserted_into(LayoutNode&) {}
@@ -97,6 +98,12 @@ public:
template
T* first_child_of_type();
+ template
+ const T* first_ancestor_of_type() const;
+
+ template
+ T* first_ancestor_of_type();
+
protected:
explicit LayoutNode(const Node*);
@@ -157,6 +164,11 @@ inline const LayoutNodeWithStyle* LayoutNode::parent() const
return static_cast(TreeNode::parent());
}
+inline LayoutNodeWithStyle* LayoutNode::parent()
+{
+ return static_cast(TreeNode::parent());
+}
+
template
inline bool is(const LayoutNode&)
{
@@ -248,3 +260,23 @@ inline T* LayoutNode::first_child_of_type()
}
return nullptr;
}
+
+template
+inline const T* LayoutNode::first_ancestor_of_type() const
+{
+ for (auto* ancestor = parent(); ancestor; ancestor = ancestor->parent()) {
+ if (is(*ancestor))
+ return &to(*ancestor);
+ }
+ return nullptr;
+}
+
+template
+inline T* LayoutNode::first_ancestor_of_type()
+{
+ for (auto* ancestor = parent(); ancestor; ancestor = ancestor->parent()) {
+ if (is(*ancestor))
+ return &to(*ancestor);
+ }
+ return nullptr;
+}