#include
#include
#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"));
}
const HTMLBodyElement* Document::body() const
{
auto* html = document_element();
if (!html)
return nullptr;
return static_cast(html->first_child_with_tag_name("body"));
}
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();
}
void Document::attach_to_frame(Badge, Frame& frame)
{
m_frame = frame.make_weak_ptr();
}
void Document::detach_from_frame(Badge, Frame&)
{
}
Color Document::background_color() const
{
auto* body_element = body();
if (!body_element)
return Color::White;
auto* body_layout_node = body_element->layout_node();
if (!body_layout_node)
return Color::White;
auto background_color = body_layout_node->style().property("background-color");
if (!background_color.has_value() || !background_color.value()->is_color())
return Color::White;
return background_color.value()->to_color();
}