diff --git a/Libraries/LibHTML/DOM/Document.cpp b/Libraries/LibHTML/DOM/Document.cpp
index da43fa7b15..14d5c56f24 100644
--- a/Libraries/LibHTML/DOM/Document.cpp
+++ b/Libraries/LibHTML/DOM/Document.cpp
@@ -239,6 +239,11 @@ const LayoutDocument* Document::layout_node() const
return static_cast(Node::layout_node());
}
+LayoutDocument* Document::layout_node()
+{
+ return static_cast(Node::layout_node());
+}
+
void Document::set_hovered_node(Node* node)
{
if (m_hovered_node == node)
diff --git a/Libraries/LibHTML/DOM/Document.h b/Libraries/LibHTML/DOM/Document.h
index 95046894fc..e75c2d9066 100644
--- a/Libraries/LibHTML/DOM/Document.h
+++ b/Libraries/LibHTML/DOM/Document.h
@@ -78,6 +78,7 @@ public:
virtual bool is_child_allowed(const Node&) const override;
const LayoutDocument* layout_node() const;
+ LayoutDocument* layout_node();
void schedule_style_update();
diff --git a/Libraries/LibHTML/Layout/LayoutNode.cpp b/Libraries/LibHTML/Layout/LayoutNode.cpp
index 49e28bed18..b1ed18b827 100644
--- a/Libraries/LibHTML/Layout/LayoutNode.cpp
+++ b/Libraries/LibHTML/Layout/LayoutNode.cpp
@@ -63,6 +63,26 @@ const Document& LayoutNode::document() const
return node()->document();
}
+Document& LayoutNode::document()
+{
+ if (is_anonymous())
+ return parent()->document();
+ // FIXME: Remove this const_cast once we give up on the idea of a const link from layout tree to DOM tree.
+ return const_cast(node())->document();
+}
+
+const LayoutDocument& LayoutNode::root() const
+{
+ ASSERT(document().layout_node());
+ return *document().layout_node();
+}
+
+LayoutDocument& LayoutNode::root()
+{
+ ASSERT(document().layout_node());
+ return *document().layout_node();
+}
+
void LayoutNode::split_into_lines(LayoutBlock& container)
{
for_each_child([&](auto& child) {
diff --git a/Libraries/LibHTML/Layout/LayoutNode.h b/Libraries/LibHTML/Layout/LayoutNode.h
index a3dc1e2050..ad504df269 100644
--- a/Libraries/LibHTML/Layout/LayoutNode.h
+++ b/Libraries/LibHTML/Layout/LayoutNode.h
@@ -11,6 +11,7 @@
class Document;
class Element;
class LayoutBlock;
+class LayoutDocument;
class LayoutNode;
class LayoutNodeWithStyle;
class LineBoxFragment;
@@ -29,8 +30,12 @@ public:
bool is_anonymous() const { return !m_node; }
const Node* node() const { return m_node; }
+ Document& document();
const Document& document() const;
+ const LayoutDocument& root() const;
+ LayoutDocument& root();
+
template
inline void for_each_child(Callback callback) const
{