diff --git a/Libraries/LibHTML/DOM/Document.cpp b/Libraries/LibHTML/DOM/Document.cpp
index 4cdceb6069..eaf005eb2a 100644
--- a/Libraries/LibHTML/DOM/Document.cpp
+++ b/Libraries/LibHTML/DOM/Document.cpp
@@ -125,3 +125,8 @@ URL Document::complete_url(const String& string) const
url.set_path(fspath.string());
return url;
}
+
+RefPtr Document::create_layout_node(const StyleResolver&, const StyleProperties*) const
+{
+ return adopt(*new LayoutDocument(*this, StyleProperties::create()));
+}
diff --git a/Libraries/LibHTML/DOM/Document.h b/Libraries/LibHTML/DOM/Document.h
index c66ebc6afa..7a13f813c6 100644
--- a/Libraries/LibHTML/DOM/Document.h
+++ b/Libraries/LibHTML/DOM/Document.h
@@ -55,6 +55,8 @@ public:
Color background_color() const;
private:
+ virtual RefPtr create_layout_node(const StyleResolver&, const StyleProperties* parent_properties) const override;
+
OwnPtr m_style_resolver;
NonnullRefPtrVector m_sheets;
RefPtr m_hovered_node;
diff --git a/Libraries/LibHTML/DOM/Element.cpp b/Libraries/LibHTML/DOM/Element.cpp
index 780dc1b08e..c60319c075 100644
--- a/Libraries/LibHTML/DOM/Element.cpp
+++ b/Libraries/LibHTML/DOM/Element.cpp
@@ -1,3 +1,4 @@
+#include
#include
#include
#include
@@ -34,7 +35,7 @@ String Element::attribute(const String& name) const
{
if (auto* attribute = find_attribute(name))
return attribute->value();
- return { };
+ return {};
}
void Element::set_attribute(const String& name, const String& value)
@@ -62,3 +63,20 @@ bool Element::has_class(const StringView& class_name) const
}
return false;
}
+
+RefPtr Element::create_layout_node(const StyleResolver& resolver, const StyleProperties* parent_properties) const
+{
+ auto style_properties = resolver.resolve_style(*this, parent_properties);
+
+ auto display_property = style_properties->property("display");
+ String display = display_property.has_value() ? display_property.release_value()->to_string() : "inline";
+
+ if (display == "none")
+ return nullptr;
+ if (display == "block" || display == "list-item")
+ return adopt(*new LayoutBlock(this, move(style_properties)));
+ if (display == "inline")
+ return adopt(*new LayoutInline(*this, move(style_properties)));
+
+ ASSERT_NOT_REACHED();
+}
diff --git a/Libraries/LibHTML/DOM/Element.h b/Libraries/LibHTML/DOM/Element.h
index c01b44d29c..a45f09ba4b 100644
--- a/Libraries/LibHTML/DOM/Element.h
+++ b/Libraries/LibHTML/DOM/Element.h
@@ -45,6 +45,8 @@ public:
virtual void apply_presentational_hints(StyleProperties&) const {}
private:
+ RefPtr create_layout_node(const StyleResolver&, const StyleProperties* parent_properties) const override;
+
Attribute* find_attribute(const String& name);
const Attribute* find_attribute(const String& name) const;
diff --git a/Libraries/LibHTML/DOM/Node.cpp b/Libraries/LibHTML/DOM/Node.cpp
index 5bfa99895f..700a26bcd7 100644
--- a/Libraries/LibHTML/DOM/Node.cpp
+++ b/Libraries/LibHTML/DOM/Node.cpp
@@ -19,31 +19,6 @@ Node::~Node()
{
}
-RefPtr Node::create_layout_node(const StyleResolver& resolver, const StyleProperties* parent_properties) const
-{
- if (is_document())
- return adopt(*new LayoutDocument(static_cast(*this), StyleProperties::create()));
-
- if (is_text())
- return adopt(*new LayoutText(static_cast(*this)));
-
- ASSERT(is_element());
-
- auto style_properties = resolver.resolve_style(static_cast(*this), parent_properties);
-
- auto display_property = style_properties->property("display");
- String display = display_property.has_value() ? display_property.release_value()->to_string() : "inline";
-
- if (display == "none")
- return nullptr;
- if (display == "block" || display == "list-item")
- return adopt(*new LayoutBlock(this, move(style_properties)));
- if (display == "inline")
- return adopt(*new LayoutInline(*this, move(style_properties)));
-
- ASSERT_NOT_REACHED();
-}
-
RefPtr Node::create_layout_tree(const StyleResolver& resolver, const StyleProperties* parent_properties) const
{
auto layout_node = create_layout_node(resolver, parent_properties);
diff --git a/Libraries/LibHTML/DOM/Node.h b/Libraries/LibHTML/DOM/Node.h
index 6c60717670..e43aa3b2f0 100644
--- a/Libraries/LibHTML/DOM/Node.h
+++ b/Libraries/LibHTML/DOM/Node.h
@@ -31,7 +31,7 @@ public:
bool is_document() const { return type() == NodeType::DOCUMENT_NODE; }
bool is_parent_node() const { return is_element() || is_document(); }
- RefPtr create_layout_node(const StyleResolver&, const StyleProperties* parent_properties) const;
+ virtual RefPtr create_layout_node(const StyleResolver&, const StyleProperties* parent_properties) const = 0;
RefPtr create_layout_tree(const StyleResolver&, const StyleProperties* parent_properties) const;
virtual String tag_name() const = 0;
diff --git a/Libraries/LibHTML/DOM/Text.cpp b/Libraries/LibHTML/DOM/Text.cpp
index 6b41f7c8f8..a066a767f6 100644
--- a/Libraries/LibHTML/DOM/Text.cpp
+++ b/Libraries/LibHTML/DOM/Text.cpp
@@ -10,3 +10,8 @@ Text::Text(Document& document, const String& data)
Text::~Text()
{
}
+
+RefPtr Text::create_layout_node(const StyleResolver&, const StyleProperties*) const
+{
+ return adopt(*new LayoutText(*this));
+}
diff --git a/Libraries/LibHTML/DOM/Text.h b/Libraries/LibHTML/DOM/Text.h
index adc5fcb265..46e29ba0c6 100644
--- a/Libraries/LibHTML/DOM/Text.h
+++ b/Libraries/LibHTML/DOM/Text.h
@@ -15,5 +15,7 @@ public:
virtual String text_content() const override { return m_data; }
private:
+ virtual RefPtr create_layout_node(const StyleResolver&, const StyleProperties* parent_properties) const override;
+
String m_data;
};