1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 13:18:13 +00:00

LibHTML: Create anonymous blocks around inline children of blocks.

This commit is contained in:
Andreas Kling 2019-07-08 17:42:23 +02:00
parent 2caec95d30
commit fc127eb769
9 changed files with 33 additions and 17 deletions

View file

@ -61,7 +61,7 @@ RefPtr<LayoutNode> Frame::generate_layout_tree(const StyledNode& styled_root)
case Display::None: case Display::None:
return nullptr; return nullptr;
case Display::Block: case Display::Block:
return adopt(*new LayoutBlock(*styled_node.node(), styled_node)); return adopt(*new LayoutBlock(styled_node.node(), &styled_node));
case Display::Inline: case Display::Inline:
return adopt(*new LayoutInline(*styled_node.node(), styled_node)); return adopt(*new LayoutInline(*styled_node.node(), styled_node));
default: default:
@ -74,17 +74,19 @@ RefPtr<LayoutNode> Frame::generate_layout_tree(const StyledNode& styled_root)
auto layout_node = create_layout_node(styled_node); auto layout_node = create_layout_node(styled_node);
if (!layout_node) if (!layout_node)
return nullptr; return nullptr;
if (styled_node.has_children()) { if (!styled_node.has_children())
for (auto* styled_child = styled_node.first_child(); styled_child; styled_child = styled_child->next_sibling()) { return layout_node;
auto layout_child = build_layout_tree(*styled_child); for (auto* styled_child = styled_node.first_child(); styled_child; styled_child = styled_child->next_sibling()) {
if (!layout_child) auto layout_child = build_layout_tree(*styled_child);
continue; if (!layout_child)
continue;
if (layout_child->is_inline())
layout_node->inline_wrapper().append_child(*layout_child);
else
layout_node->append_child(*layout_child); layout_node->append_child(*layout_child);
}
} }
return layout_node; return layout_node;
}; };
return build_layout_tree(styled_root); return build_layout_tree(styled_root);
} }

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, const StyledNode& styled_node) LayoutBlock::LayoutBlock(const Node* node, const StyledNode* styled_node)
: LayoutNode(&node, styled_node) : LayoutNode(node, styled_node)
{ {
} }
@ -10,6 +10,14 @@ LayoutBlock::~LayoutBlock()
{ {
} }
LayoutNode& LayoutBlock::inline_wrapper()
{
if (!last_child() || !last_child()->is_block()) {
append_child(adopt(*new LayoutBlock(nullptr, nullptr)));
}
return *last_child();
}
void LayoutBlock::layout() void LayoutBlock::layout()
{ {
compute_width(); compute_width();

View file

@ -6,13 +6,15 @@ class Element;
class LayoutBlock : public LayoutNode { class LayoutBlock : public LayoutNode {
public: public:
LayoutBlock(const Node&, const StyledNode&); 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"; }
virtual void layout() override; virtual void layout() override;
virtual LayoutNode& inline_wrapper() override;
private: private:
virtual bool is_block() const override { return true; } virtual bool is_block() const override { return true; }

View file

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

View file

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

View file

@ -10,6 +10,7 @@ public:
virtual ~LayoutInline() override; virtual ~LayoutInline() override;
virtual const char* class_name() const override { return "LayoutInline"; } virtual const char* class_name() const override { return "LayoutInline"; }
virtual bool is_inline() const override { return true; }
private: private:
}; };

View file

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

View file

@ -41,17 +41,20 @@ public:
virtual const char* class_name() const { return "LayoutNode"; } virtual const char* class_name() const { return "LayoutNode"; }
virtual bool is_text() const { return false; } virtual bool is_text() const { return false; }
virtual bool is_block() const { return false; } virtual bool is_block() const { return false; }
virtual bool is_inline() const { return false; }
virtual void layout(); virtual void layout();
const LayoutBlock* containing_block() const; const LayoutBlock* containing_block() const;
virtual LayoutNode& inline_wrapper() { return *this; }
protected: protected:
explicit LayoutNode(const Node*, const StyledNode&); explicit LayoutNode(const Node*, const StyledNode*);
private: private:
const Node* m_node { nullptr }; const Node* m_node { nullptr };
NonnullRefPtr<StyledNode> m_styled_node; RefPtr<StyledNode> m_styled_node;
ComputedStyle m_style; ComputedStyle m_style;
Rect m_rect; Rect m_rect;

View file

@ -2,7 +2,7 @@
#include <ctype.h> #include <ctype.h>
LayoutText::LayoutText(const Text& text, const StyledNode& styled_node) LayoutText::LayoutText(const Text& text, const StyledNode& styled_node)
: LayoutNode(&text, styled_node) : LayoutNode(&text, &styled_node)
{ {
} }