diff options
-rw-r--r-- | Userland/Libraries/LibWeb/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/CSS/ComputedCSSStyleDeclaration.cpp | 110 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/CSS/ComputedCSSStyleDeclaration.h | 33 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Window.cpp | 6 |
4 files changed, 146 insertions, 4 deletions
diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 1affda761e..3bd037fe22 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -17,6 +17,7 @@ set(SOURCES CSS/CSSStyleDeclaration.cpp CSS/CSSStyleRule.cpp CSS/CSSStyleSheet.cpp + CSS/ComputedCSSStyleDeclaration.cpp CSS/DefaultStyleSheetSource.cpp CSS/Length.cpp CSS/MediaQueryList.cpp diff --git a/Userland/Libraries/LibWeb/CSS/ComputedCSSStyleDeclaration.cpp b/Userland/Libraries/LibWeb/CSS/ComputedCSSStyleDeclaration.cpp new file mode 100644 index 0000000000..2eb28c7021 --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/ComputedCSSStyleDeclaration.cpp @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2021, Andreas Kling <kling@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <LibWeb/CSS/ComputedCSSStyleDeclaration.h> +#include <LibWeb/CSS/StyleResolver.h> +#include <LibWeb/DOM/Document.h> +#include <LibWeb/DOM/Element.h> + +namespace Web::CSS { + +ComputedCSSStyleDeclaration::ComputedCSSStyleDeclaration(DOM::Element& element) + : m_element(element) +{ +} + +ComputedCSSStyleDeclaration::~ComputedCSSStyleDeclaration() +{ +} + +size_t ComputedCSSStyleDeclaration::length() const +{ + return 0; +} + +String ComputedCSSStyleDeclaration::item(size_t index) const +{ + (void)index; + return {}; +} + +static CSS::ValueID to_css_value_id(CSS::Display value) +{ + switch (value) { + case CSS::Display::None: + return CSS::ValueID::None; + case CSS::Display::Block: + return CSS::ValueID::Block; + case CSS::Display::Inline: + return CSS::ValueID::Inline; + case CSS::Display::InlineBlock: + return CSS::ValueID::InlineBlock; + case CSS::Display::ListItem: + return CSS::ValueID::ListItem; + case CSS::Display::Table: + return CSS::ValueID::Table; + case CSS::Display::TableRow: + return CSS::ValueID::TableRow; + case CSS::Display::TableCell: + return CSS::ValueID::TableCell; + case CSS::Display::TableHeaderGroup: + return CSS::ValueID::TableHeaderGroup; + case CSS::Display::TableRowGroup: + return CSS::ValueID::TableRowGroup; + case CSS::Display::TableFooterGroup: + return CSS::ValueID::TableFooterGroup; + case CSS::Display::TableColumn: + return CSS::ValueID::TableColumn; + case CSS::Display::TableColumnGroup: + return CSS::ValueID::TableColumnGroup; + case CSS::Display::TableCaption: + return CSS::ValueID::TableCaption; + case CSS::Display::Flex: + return CSS::ValueID::Flex; + } + VERIFY_NOT_REACHED(); +} + +Optional<StyleProperty> ComputedCSSStyleDeclaration::property(PropertyID property_id) const +{ + const_cast<DOM::Document&>(m_element->document()).force_layout(); + + if (!m_element->layout_node()) { + auto style = m_element->document().style_resolver().resolve_style(const_cast<DOM::Element&>(*m_element)); + if (auto maybe_property = style->property(property_id); maybe_property.has_value()) { + return StyleProperty { + .property_id = property_id, + .value = maybe_property.release_value(), + }; + } + return {}; + } + + auto& layout_node = *m_element->layout_node(); + + switch (property_id) { + case CSS::PropertyID::Color: + return StyleProperty { + .property_id = property_id, + .value = ColorStyleValue::create(layout_node.computed_values().color()), + }; + case CSS::PropertyID::Display: { + return StyleProperty { + .property_id = property_id, + .value = IdentifierStyleValue::create(to_css_value_id(layout_node.computed_values().display())), + }; + } + default: + return {}; + } +} + +bool ComputedCSSStyleDeclaration::set_property(PropertyID, StringView) +{ + return false; +} + +} diff --git a/Userland/Libraries/LibWeb/CSS/ComputedCSSStyleDeclaration.h b/Userland/Libraries/LibWeb/CSS/ComputedCSSStyleDeclaration.h new file mode 100644 index 0000000000..6f0533442d --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/ComputedCSSStyleDeclaration.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021, Andreas Kling <kling@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <LibWeb/CSS/CSSStyleDeclaration.h> + +namespace Web::CSS { + +class ComputedCSSStyleDeclaration final : public CSSStyleDeclaration { +public: + static NonnullRefPtr<ComputedCSSStyleDeclaration> create(DOM::Element& element) + { + return adopt_ref(*new ComputedCSSStyleDeclaration(element)); + } + + virtual ~ComputedCSSStyleDeclaration() override; + + virtual size_t length() const override; + virtual String item(size_t index) const override; + virtual Optional<StyleProperty> property(PropertyID) const override; + virtual bool set_property(PropertyID, StringView css_text) override; + +private: + explicit ComputedCSSStyleDeclaration(DOM::Element&); + + NonnullRefPtr<DOM::Element> m_element; +}; + +} diff --git a/Userland/Libraries/LibWeb/DOM/Window.cpp b/Userland/Libraries/LibWeb/DOM/Window.cpp index e3bbc741d5..8af72c6418 100644 --- a/Userland/Libraries/LibWeb/DOM/Window.cpp +++ b/Userland/Libraries/LibWeb/DOM/Window.cpp @@ -6,6 +6,7 @@ #include <LibGUI/DisplayLink.h> #include <LibJS/Runtime/FunctionObject.h> +#include <LibWeb/CSS/ComputedCSSStyleDeclaration.h> #include <LibWeb/DOM/Document.h> #include <LibWeb/DOM/Event.h> #include <LibWeb/DOM/EventDispatcher.h> @@ -189,10 +190,7 @@ Page const* Window::page() const NonnullRefPtr<CSS::CSSStyleDeclaration> Window::get_computed_style(DOM::Element& element) const { - dbgln("Generating CSS computed style for {} @ {:p}", element.node_name(), &element); - Vector<CSS::StyleProperty> properties; - HashMap<String, CSS::StyleProperty> custom_properties; - return CSS::PropertyOwningCSSStyleDeclaration::create(move(properties), move(custom_properties)); + return CSS::ComputedCSSStyleDeclaration::create(element); } NonnullRefPtr<CSS::MediaQueryList> Window::match_media(String media) |