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:
parent
2caec95d30
commit
fc127eb769
9 changed files with 33 additions and 17 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
};
|
};
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue