summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Bugaev <bugaevc@gmail.com>2019-09-25 12:26:26 +0300
committerAndreas Kling <awesomekling@gmail.com>2019-09-28 18:29:42 +0200
commitc1ef63379c604242bdd17165d3e63c9793d55b95 (patch)
tree66f268311a09a59c67538cde34ceee3db44e3483
parent599edba7a34533e02aaf4218cc77add480674ea3 (diff)
downloadserenity-c1ef63379c604242bdd17165d3e63c9793d55b95.zip
LibHTML: Add Document::normalize()
This method wraps the document tree in <html> and <body> elements if needed.
-rw-r--r--Libraries/LibHTML/DOM/Document.cpp15
-rw-r--r--Libraries/LibHTML/DOM/Document.h2
-rw-r--r--Libraries/LibHTML/TreeNode.h19
3 files changed, 36 insertions, 0 deletions
diff --git a/Libraries/LibHTML/DOM/Document.cpp b/Libraries/LibHTML/DOM/Document.cpp
index 36c937e6d7..0e24019598 100644
--- a/Libraries/LibHTML/DOM/Document.cpp
+++ b/Libraries/LibHTML/DOM/Document.cpp
@@ -19,3 +19,18 @@ StyleResolver& Document::style_resolver()
m_style_resolver = make<StyleResolver>(*this);
return *m_style_resolver;
}
+
+void Document::normalize()
+{
+ if (first_child() != nullptr && first_child()->is_element()) {
+ const Element& el = static_cast<const Element&>(*first_child());
+ if (el.tag_name() == "html")
+ return;
+ }
+
+ NonnullRefPtr<Element> body = adopt(*new Element("body"));
+ NonnullRefPtr<Element> html = adopt(*new Element("html"));
+ html->append_child(body);
+ this->donate_all_children_to(body);
+ this->append_child(html);
+}
diff --git a/Libraries/LibHTML/DOM/Document.h b/Libraries/LibHTML/DOM/Document.h
index 3add23acd3..2b3c10e9bd 100644
--- a/Libraries/LibHTML/DOM/Document.h
+++ b/Libraries/LibHTML/DOM/Document.h
@@ -16,6 +16,8 @@ public:
Document();
virtual ~Document() override;
+ void normalize();
+
StyleResolver& style_resolver();
void add_sheet(const StyleSheet& sheet) { m_sheets.append(sheet); }
diff --git a/Libraries/LibHTML/TreeNode.h b/Libraries/LibHTML/TreeNode.h
index df3b67cdf7..a4da2f1f9b 100644
--- a/Libraries/LibHTML/TreeNode.h
+++ b/Libraries/LibHTML/TreeNode.h
@@ -34,6 +34,7 @@ public:
const T* last_child() const { return m_last_child; }
void append_child(NonnullRefPtr<T> node);
+ void donate_all_children_to(T& node);
protected:
TreeNode() { }
@@ -59,3 +60,21 @@ inline void TreeNode<T>::append_child(NonnullRefPtr<T> node)
if (!m_first_child)
m_first_child = m_last_child;
}
+
+template<typename T>
+inline void TreeNode<T>::donate_all_children_to(T& node)
+{
+ for (T* child = m_first_child; child != nullptr;) {
+ T* next_child = child->m_next_sibling;
+
+ child->m_parent = nullptr;
+ child->m_next_sibling = nullptr;
+ child->m_previous_sibling = nullptr;
+
+ node.append_child(adopt(*child));
+ child = next_child;
+ }
+
+ m_first_child = nullptr;
+ m_last_child = nullptr;
+}