#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(); }