#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
Document::Document()
    : ParentNode(*this, NodeType::DOCUMENT_NODE)
{
}
Document::~Document()
{
}
StyleResolver& Document::style_resolver()
{
    if (!m_style_resolver)
        m_style_resolver = make(*this);
    return *m_style_resolver;
}
void Document::normalize()
{
    if (first_child() != nullptr && first_child()->is_element()) {
        const Element& el = static_cast(*first_child());
        if (el.tag_name() == "html")
            return;
    }
    NonnullRefPtr body = adopt(*new Element(*this, "body"));
    NonnullRefPtr html = adopt(*new Element(*this, "html"));
    html->append_child(body);
    this->donate_all_children_to(body);
    this->append_child(html);
}
const HTMLHtmlElement* Document::document_element() const
{
    return static_cast(first_child_with_tag_name("html"));
}
const HTMLHeadElement* Document::head() const
{
    auto* html = document_element();
    if (!html)
        return nullptr;
    return static_cast(html->first_child_with_tag_name("head"));
}
String Document::title() const
{
    auto* head_element = head();
    if (!head_element)
        return {};
    auto* title_element = static_cast(head_element->first_child_with_tag_name("title"));
    if (!title_element)
        return {};
    return title_element->text_content();
}