1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 13:17:35 +00:00

LibHTML: Let the layout tree own the style tree.

Each layout node is now constructed with an owning back-pointer to the style
tree node that originated it.
This commit is contained in:
Andreas Kling 2019-07-03 07:19:29 +02:00
parent e9ab282cfd
commit c7cf6f00fc
11 changed files with 21 additions and 17 deletions

View file

@ -61,14 +61,14 @@ void Frame::layout()
auto create_layout_node = [](const StyledNode& styled_node) -> RefPtr<LayoutNode> { auto create_layout_node = [](const StyledNode& styled_node) -> RefPtr<LayoutNode> {
if (styled_node.node() && styled_node.node()->is_document()) if (styled_node.node() && styled_node.node()->is_document())
return adopt(*new LayoutDocument(static_cast<const Document&>(*styled_node.node()))); return adopt(*new LayoutDocument(static_cast<const Document&>(*styled_node.node()), styled_node));
switch (styled_node.display()) { switch (styled_node.display()) {
case Display::None: case Display::None:
return nullptr; return nullptr;
case Display::Block: case Display::Block:
return adopt(*new LayoutBlock(*styled_node.node())); return adopt(*new LayoutBlock(*styled_node.node(), styled_node));
case Display::Inline: case Display::Inline:
return adopt(*new LayoutInline(*styled_node.node())); return adopt(*new LayoutInline(*styled_node.node(), styled_node));
default: default:
ASSERT_NOT_REACHED(); ASSERT_NOT_REACHED();
} }

View file

@ -1,8 +1,8 @@
#include <LibHTML/DOM/Element.h> #include <LibHTML/DOM/Element.h>
#include <LibHTML/Layout/LayoutBlock.h> #include <LibHTML/Layout/LayoutBlock.h>
LayoutBlock::LayoutBlock(const Node& node) LayoutBlock::LayoutBlock(const Node& node, const StyledNode& styled_node)
: LayoutNode(&node) : LayoutNode(&node, styled_node)
{ {
} }

View file

@ -6,7 +6,7 @@ class Element;
class LayoutBlock : public LayoutNode { class LayoutBlock : public LayoutNode {
public: public:
explicit LayoutBlock(const Node&); LayoutBlock(const Node&, const StyledNode&);
virtual ~LayoutBlock() override; virtual ~LayoutBlock() override;
virtual const char* class_name() const override { return "LayoutBlock"; } virtual const char* class_name() const override { return "LayoutBlock"; }

View file

@ -1,7 +1,7 @@
#include <LibHTML/Layout/LayoutDocument.h> #include <LibHTML/Layout/LayoutDocument.h>
LayoutDocument::LayoutDocument(const Document& document) LayoutDocument::LayoutDocument(const Document& document, const StyledNode& styled_node)
: LayoutBlock(document) : LayoutBlock(document, styled_node)
{ {
} }

View file

@ -5,7 +5,7 @@
class LayoutDocument final : public LayoutBlock { class LayoutDocument final : public LayoutBlock {
public: public:
explicit LayoutDocument(const Document&); LayoutDocument(const Document&, const StyledNode&);
virtual ~LayoutDocument() override; virtual ~LayoutDocument() override;
const Document& node() const { return static_cast<const Document&>(*LayoutNode::node()); } const Document& node() const { return static_cast<const Document&>(*LayoutNode::node()); }

View file

@ -1,8 +1,8 @@
#include <LibHTML/DOM/Element.h> #include <LibHTML/DOM/Element.h>
#include <LibHTML/Layout/LayoutInline.h> #include <LibHTML/Layout/LayoutInline.h>
LayoutInline::LayoutInline(const Node& node) LayoutInline::LayoutInline(const Node& node, const StyledNode& styled_node)
: LayoutNode(&node) : LayoutNode(&node, styled_node)
{ {
} }

View file

@ -6,7 +6,7 @@ class Element;
class LayoutInline : public LayoutNode { class LayoutInline : public LayoutNode {
public: public:
explicit LayoutInline(const Node&); LayoutInline(const Node&, const StyledNode&);
virtual ~LayoutInline() override; virtual ~LayoutInline() override;
virtual const char* class_name() const override { return "LayoutInline"; } virtual const char* class_name() const override { return "LayoutInline"; }

View file

@ -1,8 +1,10 @@
#include <LibHTML/Layout/LayoutBlock.h> #include <LibHTML/Layout/LayoutBlock.h>
#include <LibHTML/Layout/LayoutNode.h> #include <LibHTML/Layout/LayoutNode.h>
#include <LibHTML/CSS/StyledNode.h>
LayoutNode::LayoutNode(const Node* node) LayoutNode::LayoutNode(const Node* node, const StyledNode& styled_node)
: m_node(node) : m_node(node)
, m_styled_node(styled_node)
{ {
} }

View file

@ -8,6 +8,7 @@
class Node; class Node;
class LayoutBlock; class LayoutBlock;
class StyledNode;
class LayoutNode : public TreeNode<LayoutNode> { class LayoutNode : public TreeNode<LayoutNode> {
public: public:
@ -46,10 +47,11 @@ public:
const LayoutBlock* containing_block() const; const LayoutBlock* containing_block() const;
protected: protected:
explicit LayoutNode(const Node*); explicit LayoutNode(const Node*, const StyledNode&);
private: private:
const Node* m_node { nullptr }; const Node* m_node { nullptr };
NonnullRefPtr<StyledNode> m_styled_node;
LayoutStyle m_style; LayoutStyle m_style;
Rect m_rect; Rect m_rect;

View file

@ -1,8 +1,8 @@
#include <LibHTML/Layout/LayoutText.h> #include <LibHTML/Layout/LayoutText.h>
#include <ctype.h> #include <ctype.h>
LayoutText::LayoutText(const Text& text) LayoutText::LayoutText(const Text& text, const StyledNode& styled_node)
: LayoutNode(&text) : LayoutNode(&text, styled_node)
{ {
} }

View file

@ -5,7 +5,7 @@
class LayoutText : public LayoutNode { class LayoutText : public LayoutNode {
public: public:
explicit LayoutText(const Text&); LayoutText(const Text&, const StyledNode&);
virtual ~LayoutText() override; virtual ~LayoutText() override;
const Text& node() const { return static_cast<const Text&>(*LayoutNode::node()); } const Text& node() const { return static_cast<const Text&>(*LayoutNode::node()); }