#include #include #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(*this); } URL Document::complete_url(const String& string) const { URL url(string); if (url.is_valid()) return url; FileSystemPath fspath(m_url.path()); StringBuilder builder; builder.append('/'); for (int i = 0; i < fspath.parts().size(); ++i) { if (i == fspath.parts().size() - 1) break; builder.append(fspath.parts()[i]); builder.append('/'); } builder.append(string); auto built = builder.to_string(); fspath = FileSystemPath(built); url = m_url; url.set_path(fspath.string()); return url; } RefPtr Document::create_layout_node(const StyleResolver&, const StyleProperties*) const { return adopt(*new LayoutDocument(*this, StyleProperties::create())); } void Document::set_link_color(Color color) { m_link_color = color; } void Document::set_active_link_color(Color color) { m_active_link_color = color; } void Document::set_visited_link_color(Color color) { m_visited_link_color = color; }