/* * Copyright (c) 2018-2025, Andreas Kling * Copyright (c) 2021-2025, Sam Atkins * Copyright (c) 2021, Tobias Christiansen * Copyright (c) 2022-2023, MacDue * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Web::CSS { ColorResolutionContext ColorResolutionContext::for_element(DOM::AbstractElement const& element) { auto color_scheme = element.computed_properties()->color_scheme(element.document().page().preferred_color_scheme(), element.document().supported_color_schemes()); CalculationResolutionContext calculation_resolution_context { .length_resolution_context = Length::ResolutionContext::for_element(element) }; return { .color_scheme = color_scheme, .current_color = element.computed_properties()->color_or_fallback(PropertyID::Color, { color_scheme, CSS::InitialValues::color(), element.document(), calculation_resolution_context }, CSS::InitialValues::color()), .document = element.document(), .calculation_resolution_context = calculation_resolution_context }; } ColorResolutionContext ColorResolutionContext::for_layout_node_with_style(Layout::NodeWithStyle const& layout_node) { return { .color_scheme = layout_node.computed_values().color_scheme(), .current_color = layout_node.computed_values().color(), .document = layout_node.document(), .calculation_resolution_context = { .length_resolution_context = Length::ResolutionContext::for_layout_node(layout_node) }, }; } StyleValue::StyleValue(Type type) : m_type(type) { } AbstractImageStyleValue const& StyleValue::as_abstract_image() const { VERIFY(is_abstract_image()); return static_cast(*this); } DimensionStyleValue const& StyleValue::as_dimension() const { VERIFY(is_dimension()); return static_cast(*this); } #define __ENUMERATE_CSS_STYLE_VALUE_TYPE(title_case, snake_case, style_value_class_name) \ style_value_class_name const& StyleValue::as_##snake_case() const \ { \ VERIFY(is_##snake_case()); \ return static_cast(*this); \ } ENUMERATE_CSS_STYLE_VALUE_TYPES #undef __ENUMERATE_CSS_STYLE_VALUE_TYPE ValueComparingNonnullRefPtr StyleValue::absolutized(ComputationContext const&) const { return *this; } bool StyleValue::has_auto() const { return is_keyword() && as_keyword().keyword() == Keyword::Auto; } Vector StyleValue::tokenize() const { // This is an inefficient way of producing ComponentValues, but it's guaranteed to work for types that round-trip. // FIXME: Implement better versions in the subclasses. return Parser::Parser::create(Parser::ParsingParams {}, to_string(SerializationMode::Normal)).parse_as_list_of_component_values(); } // https://drafts.css-houdini.org/css-typed-om-1/#reify-as-a-cssstylevalue GC::Ref StyleValue::reify(JS::Realm& realm, FlyString const& associated_property) const { // 1. Return a new CSSStyleValue object representing value whose [[associatedProperty]] internal slot is set to property. return CSSStyleValue::create(realm, associated_property, *this); } }