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 {