diff options
Diffstat (limited to 'Libraries/LibHTML/DOM')
-rw-r--r-- | Libraries/LibHTML/DOM/Document.cpp | 26 | ||||
-rw-r--r-- | Libraries/LibHTML/DOM/Document.h | 4 | ||||
-rw-r--r-- | Libraries/LibHTML/DOM/Element.h | 5 | ||||
-rw-r--r-- | Libraries/LibHTML/DOM/HTMLBodyElement.cpp | 27 | ||||
-rw-r--r-- | Libraries/LibHTML/DOM/HTMLBodyElement.h | 11 | ||||
-rw-r--r-- | Libraries/LibHTML/DOM/Node.cpp | 2 | ||||
-rw-r--r-- | Libraries/LibHTML/DOM/Node.h | 6 |
7 files changed, 79 insertions, 2 deletions
diff --git a/Libraries/LibHTML/DOM/Document.cpp b/Libraries/LibHTML/DOM/Document.cpp index 45482fd91d..97e5873c4f 100644 --- a/Libraries/LibHTML/DOM/Document.cpp +++ b/Libraries/LibHTML/DOM/Document.cpp @@ -1,6 +1,7 @@ #include <LibHTML/CSS/StyleResolver.h> #include <LibHTML/DOM/Document.h> #include <LibHTML/DOM/Element.h> +#include <LibHTML/DOM/HTMLBodyElement.h> #include <LibHTML/DOM/HTMLHeadElement.h> #include <LibHTML/DOM/HTMLHtmlElement.h> #include <LibHTML/DOM/HTMLTitleElement.h> @@ -52,6 +53,14 @@ const HTMLHeadElement* Document::head() const return static_cast<const HTMLHeadElement*>(html->first_child_with_tag_name("head")); } +const HTMLBodyElement* Document::body() const +{ + auto* html = document_element(); + if (!html) + return nullptr; + return static_cast<const HTMLBodyElement*>(html->first_child_with_tag_name("body")); +} + String Document::title() const { auto* head_element = head(); @@ -73,3 +82,20 @@ void Document::attach_to_frame(Badge<Frame>, Frame& frame) void Document::detach_from_frame(Badge<Frame>, 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(); +} diff --git a/Libraries/LibHTML/DOM/Document.h b/Libraries/LibHTML/DOM/Document.h index 46d8fe1581..07ea5454b2 100644 --- a/Libraries/LibHTML/DOM/Document.h +++ b/Libraries/LibHTML/DOM/Document.h @@ -9,6 +9,7 @@ #include <LibHTML/DOM/ParentNode.h> class Frame; +class HTMLBodyElement; class HTMLHtmlElement; class HTMLHeadElement; class LayoutNode; @@ -35,6 +36,7 @@ public: const HTMLHtmlElement* document_element() const; const HTMLHeadElement* head() const; + const HTMLBodyElement* body() const; String title() const; @@ -44,6 +46,8 @@ public: Frame* frame() { return m_frame.ptr(); } const Frame* frame() const { return m_frame.ptr(); } + Color background_color() const; + private: OwnPtr<StyleResolver> m_style_resolver; NonnullRefPtrVector<StyleSheet> m_sheets; diff --git a/Libraries/LibHTML/DOM/Element.h b/Libraries/LibHTML/DOM/Element.h index 42e564ef2e..c01b44d29c 100644 --- a/Libraries/LibHTML/DOM/Element.h +++ b/Libraries/LibHTML/DOM/Element.h @@ -1,7 +1,7 @@ #pragma once -#include <LibHTML/DOM/ParentNode.h> #include <AK/String.h> +#include <LibHTML/DOM/ParentNode.h> class Attribute { public: @@ -42,6 +42,8 @@ public: bool has_class(const StringView&) const; + virtual void apply_presentational_hints(StyleProperties&) const {} + private: Attribute* find_attribute(const String& name); const Attribute* find_attribute(const String& name) const; @@ -49,4 +51,3 @@ private: String m_tag_name; Vector<Attribute> m_attributes; }; - diff --git a/Libraries/LibHTML/DOM/HTMLBodyElement.cpp b/Libraries/LibHTML/DOM/HTMLBodyElement.cpp new file mode 100644 index 0000000000..e993ce470e --- /dev/null +++ b/Libraries/LibHTML/DOM/HTMLBodyElement.cpp @@ -0,0 +1,27 @@ +#include <LibHTML/CSS/StyleProperties.h> +#include <LibHTML/CSS/StyleValue.h> +#include <LibHTML/DOM/HTMLBodyElement.h> + +HTMLBodyElement::HTMLBodyElement(Document& document, const String& tag_name) + : HTMLElement(document, tag_name) +{ +} + +HTMLBodyElement::~HTMLBodyElement() +{ +} + +void HTMLBodyElement::apply_presentational_hints(StyleProperties& style) const +{ + for_each_attribute([&](auto& name, auto& value) { + if (name == "bgcolor") { + auto color = Color::from_string(value); + if (color.has_value()) + style.set_property("background-color", ColorStyleValue::create(color.value())); + } else if (name == "text") { + auto color = Color::from_string(value); + if (color.has_value()) + style.set_property("color", ColorStyleValue::create(color.value())); + } + }); +} diff --git a/Libraries/LibHTML/DOM/HTMLBodyElement.h b/Libraries/LibHTML/DOM/HTMLBodyElement.h new file mode 100644 index 0000000000..2c3a5b3f62 --- /dev/null +++ b/Libraries/LibHTML/DOM/HTMLBodyElement.h @@ -0,0 +1,11 @@ +#pragma once + +#include <LibHTML/DOM/HTMLElement.h> + +class HTMLBodyElement : public HTMLElement { +public: + HTMLBodyElement(Document&, const String& tag_name); + virtual ~HTMLBodyElement() override; + + virtual void apply_presentational_hints(StyleProperties&) const override; +}; diff --git a/Libraries/LibHTML/DOM/Node.cpp b/Libraries/LibHTML/DOM/Node.cpp index b4203cc594..5bfa99895f 100644 --- a/Libraries/LibHTML/DOM/Node.cpp +++ b/Libraries/LibHTML/DOM/Node.cpp @@ -27,6 +27,8 @@ RefPtr<LayoutNode> Node::create_layout_node(const StyleResolver& resolver, const if (is_text()) return adopt(*new LayoutText(static_cast<const Text&>(*this))); + ASSERT(is_element()); + auto style_properties = resolver.resolve_style(static_cast<const Element&>(*this), parent_properties); auto display_property = style_properties->property("display"); diff --git a/Libraries/LibHTML/DOM/Node.h b/Libraries/LibHTML/DOM/Node.h index 2e53fe937a..6c60717670 100644 --- a/Libraries/LibHTML/DOM/Node.h +++ b/Libraries/LibHTML/DOM/Node.h @@ -58,9 +58,15 @@ public: virtual void inserted_into(Node&) {} virtual void removed_from(Node&) {} + const LayoutNode* layout_node() const { return m_layout_node; } + LayoutNode* layout_node() { return m_layout_node; } + + void set_layout_node(Badge<LayoutNode>, LayoutNode* layout_node) const { m_layout_node = layout_node; } + protected: Node(Document&, NodeType); Document& m_document; + mutable LayoutNode* m_layout_node { nullptr }; NodeType m_type { NodeType::INVALID }; }; |