1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 20:37:34 +00:00

LibHTML: Add a convenient way to get from any layout node to the root

This commit is contained in:
Andreas Kling 2019-11-04 19:37:52 +01:00
parent 2946b0e2d4
commit 715d7a8532
4 changed files with 31 additions and 0 deletions

View file

@ -239,6 +239,11 @@ const LayoutDocument* Document::layout_node() const
return static_cast<const LayoutDocument*>(Node::layout_node());
}
LayoutDocument* Document::layout_node()
{
return static_cast<LayoutDocument*>(Node::layout_node());
}
void Document::set_hovered_node(Node* node)
{
if (m_hovered_node == node)

View file

@ -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();

View file

@ -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*>(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) {

View file

@ -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<typename Callback>
inline void for_each_child(Callback callback) const
{