Skip to content

Commit f150134

Browse files
committed
LibHTML: Make Node::create_layout_node() virtual
Instead of branching on the Node type, let subclasses decide how their layout nodes get constructed. This will allow elements to create custom layout nodes if they want.
1 parent 09dccb3 commit f150134

File tree

8 files changed

+36
-27
lines changed

8 files changed

+36
-27
lines changed

Libraries/LibHTML/DOM/Document.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,3 +125,8 @@ URL Document::complete_url(const String& string) const
125125
url.set_path(fspath.string());
126126
return url;
127127
}
128+
129+
RefPtr<LayoutNode> Document::create_layout_node(const StyleResolver&, const StyleProperties*) const
130+
{
131+
return adopt(*new LayoutDocument(*this, StyleProperties::create()));
132+
}

Libraries/LibHTML/DOM/Document.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ class Document : public ParentNode {
5555
Color background_color() const;
5656

5757
private:
58+
virtual RefPtr<LayoutNode> create_layout_node(const StyleResolver&, const StyleProperties* parent_properties) const override;
59+
5860
OwnPtr<StyleResolver> m_style_resolver;
5961
NonnullRefPtrVector<StyleSheet> m_sheets;
6062
RefPtr<Node> m_hovered_node;

Libraries/LibHTML/DOM/Element.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <LibHTML/CSS/StyleResolver.h>
12
#include <LibHTML/DOM/Element.h>
23
#include <LibHTML/Layout/LayoutBlock.h>
34
#include <LibHTML/Layout/LayoutInline.h>
@@ -34,7 +35,7 @@ String Element::attribute(const String& name) const
3435
{
3536
if (auto* attribute = find_attribute(name))
3637
return attribute->value();
37-
return { };
38+
return {};
3839
}
3940

4041
void Element::set_attribute(const String& name, const String& value)
@@ -62,3 +63,20 @@ bool Element::has_class(const StringView& class_name) const
6263
}
6364
return false;
6465
}
66+
67+
RefPtr<LayoutNode> Element::create_layout_node(const StyleResolver& resolver, const StyleProperties* parent_properties) const
68+
{
69+
auto style_properties = resolver.resolve_style(*this, parent_properties);
70+
71+
auto display_property = style_properties->property("display");
72+
String display = display_property.has_value() ? display_property.release_value()->to_string() : "inline";
73+
74+
if (display == "none")
75+
return nullptr;
76+
if (display == "block" || display == "list-item")
77+
return adopt(*new LayoutBlock(this, move(style_properties)));
78+
if (display == "inline")
79+
return adopt(*new LayoutInline(*this, move(style_properties)));
80+
81+
ASSERT_NOT_REACHED();
82+
}

Libraries/LibHTML/DOM/Element.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ class Element : public ParentNode {
4545
virtual void apply_presentational_hints(StyleProperties&) const {}
4646

4747
private:
48+
RefPtr<LayoutNode> create_layout_node(const StyleResolver&, const StyleProperties* parent_properties) const override;
49+
4850
Attribute* find_attribute(const String& name);
4951
const Attribute* find_attribute(const String& name) const;
5052

Libraries/LibHTML/DOM/Node.cpp

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,31 +19,6 @@ Node::~Node()
1919
{
2020
}
2121

22-
RefPtr<LayoutNode> Node::create_layout_node(const StyleResolver& resolver, const StyleProperties* parent_properties) const
23-
{
24-
if (is_document())
25-
return adopt(*new LayoutDocument(static_cast<const Document&>(*this), StyleProperties::create()));
26-
27-
if (is_text())
28-
return adopt(*new LayoutText(static_cast<const Text&>(*this)));
29-
30-
ASSERT(is_element());
31-
32-
auto style_properties = resolver.resolve_style(static_cast<const Element&>(*this), parent_properties);
33-
34-
auto display_property = style_properties->property("display");
35-
String display = display_property.has_value() ? display_property.release_value()->to_string() : "inline";
36-
37-
if (display == "none")
38-
return nullptr;
39-
if (display == "block" || display == "list-item")
40-
return adopt(*new LayoutBlock(this, move(style_properties)));
41-
if (display == "inline")
42-
return adopt(*new LayoutInline(*this, move(style_properties)));
43-
44-
ASSERT_NOT_REACHED();
45-
}
46-
4722
RefPtr<LayoutNode> Node::create_layout_tree(const StyleResolver& resolver, const StyleProperties* parent_properties) const
4823
{
4924
auto layout_node = create_layout_node(resolver, parent_properties);

Libraries/LibHTML/DOM/Node.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class Node : public TreeNode<Node> {
3131
bool is_document() const { return type() == NodeType::DOCUMENT_NODE; }
3232
bool is_parent_node() const { return is_element() || is_document(); }
3333

34-
RefPtr<LayoutNode> create_layout_node(const StyleResolver&, const StyleProperties* parent_properties) const;
34+
virtual RefPtr<LayoutNode> create_layout_node(const StyleResolver&, const StyleProperties* parent_properties) const = 0;
3535
RefPtr<LayoutNode> create_layout_tree(const StyleResolver&, const StyleProperties* parent_properties) const;
3636

3737
virtual String tag_name() const = 0;

Libraries/LibHTML/DOM/Text.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,8 @@ Text::Text(Document& document, const String& data)
1010
Text::~Text()
1111
{
1212
}
13+
14+
RefPtr<LayoutNode> Text::create_layout_node(const StyleResolver&, const StyleProperties*) const
15+
{
16+
return adopt(*new LayoutText(*this));
17+
}

Libraries/LibHTML/DOM/Text.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,7 @@ class Text final : public Node {
1515
virtual String text_content() const override { return m_data; }
1616

1717
private:
18+
virtual RefPtr<LayoutNode> create_layout_node(const StyleResolver&, const StyleProperties* parent_properties) const override;
19+
1820
String m_data;
1921
};

0 commit comments

Comments
 (0)