diff --git a/Userland/Libraries/LibWeb/CSS/CSSStyleValue.cpp b/Userland/Libraries/LibWeb/CSS/CSSStyleValue.cpp index 2dfef14ea56..5276ab6fc6e 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSStyleValue.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSStyleValue.cpp @@ -35,8 +35,6 @@ #include #include #include -#include -#include #include #include #include @@ -48,7 +46,6 @@ #include #include #include -#include #include #include #include @@ -59,7 +56,6 @@ #include #include #include -#include namespace Web::CSS { @@ -218,18 +214,6 @@ ImageStyleValue const& CSSStyleValue::as_image() const return static_cast(*this); } -InheritStyleValue const& CSSStyleValue::as_inherit() const -{ - VERIFY(is_inherit()); - return static_cast(*this); -} - -InitialStyleValue const& CSSStyleValue::as_initial() const -{ - VERIFY(is_initial()); - return static_cast(*this); -} - IntegerStyleValue const& CSSStyleValue::as_integer() const { VERIFY(is_integer()); @@ -296,12 +280,6 @@ ResolutionStyleValue const& CSSStyleValue::as_resolution() const return static_cast(*this); } -RevertStyleValue const& CSSStyleValue::as_revert() const -{ - VERIFY(is_revert()); - return static_cast(*this); -} - ScrollbarGutterStyleValue const& CSSStyleValue::as_scrollbar_gutter() const { VERIFY(is_scrollbar_gutter()); @@ -350,12 +328,6 @@ UnresolvedStyleValue const& CSSStyleValue::as_unresolved() const return static_cast(*this); } -UnsetStyleValue const& CSSStyleValue::as_unset() const -{ - VERIFY(is_unset()); - return static_cast(*this); -} - URLStyleValue const& CSSStyleValue::as_url() const { VERIFY(is_url()); diff --git a/Userland/Libraries/LibWeb/CSS/CSSStyleValue.h b/Userland/Libraries/LibWeb/CSS/CSSStyleValue.h index c1151968c74..479ff2db64f 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSStyleValue.h +++ b/Userland/Libraries/LibWeb/CSS/CSSStyleValue.h @@ -111,8 +111,6 @@ public: GridTrackPlacement, GridTrackSizeList, Image, - Inherit, - Initial, Integer, Keyword, Length, @@ -125,7 +123,6 @@ public: Ratio, Rect, Resolution, - Revert, ScrollbarGutter, Shadow, Shorthand, @@ -134,7 +131,6 @@ public: Transformation, Transition, Unresolved, - Unset, URL, ValueList, }; @@ -240,14 +236,6 @@ public: ImageStyleValue const& as_image() const; ImageStyleValue& as_image() { return const_cast(const_cast(*this).as_image()); } - bool is_inherit() const { return type() == Type::Inherit; } - InheritStyleValue const& as_inherit() const; - InheritStyleValue& as_inherit() { return const_cast(const_cast(*this).as_inherit()); } - - bool is_initial() const { return type() == Type::Initial; } - InitialStyleValue const& as_initial() const; - InitialStyleValue& as_initial() { return const_cast(const_cast(*this).as_initial()); } - bool is_integer() const { return type() == Type::Integer; } IntegerStyleValue const& as_integer() const; IntegerStyleValue& as_integer() { return const_cast(const_cast(*this).as_integer()); } @@ -296,10 +284,6 @@ public: ResolutionStyleValue const& as_resolution() const; ResolutionStyleValue& as_resolution() { return const_cast(const_cast(*this).as_resolution()); } - bool is_revert() const { return type() == Type::Revert; } - RevertStyleValue const& as_revert() const; - RevertStyleValue& as_revert() { return const_cast(const_cast(*this).as_revert()); } - bool is_scrollbar_gutter() const { return type() == Type::ScrollbarGutter; } ScrollbarGutterStyleValue const& as_scrollbar_gutter() const; ScrollbarGutterStyleValue& as_scrollbar_gutter() { return const_cast(const_cast(*this).as_scrollbar_gutter()); } @@ -332,10 +316,6 @@ public: UnresolvedStyleValue const& as_unresolved() const; UnresolvedStyleValue& as_unresolved() { return const_cast(const_cast(*this).as_unresolved()); } - bool is_unset() const { return type() == Type::Unset; } - UnsetStyleValue const& as_unset() const; - UnsetStyleValue& as_unset() { return const_cast(const_cast(*this).as_unset()); } - bool is_url() const { return type() == Type::URL; } URLStyleValue const& as_url() const; URLStyleValue& as_url() { return const_cast(const_cast(*this).as_url()); } @@ -347,6 +327,10 @@ public: // https://www.w3.org/TR/css-values-4/#common-keywords // https://drafts.csswg.org/css-cascade-4/#valdef-all-revert bool is_css_wide_keyword() const { return is_inherit() || is_initial() || is_revert() || is_unset(); } + bool is_inherit() const { return to_keyword() == Keyword::Inherit; } + bool is_initial() const { return to_keyword() == Keyword::Initial; } + bool is_revert() const { return to_keyword() == Keyword::Revert; } + bool is_unset() const { return to_keyword() == Keyword::Unset; } bool has_auto() const; virtual bool has_color() const { return false; } diff --git a/Userland/Libraries/LibWeb/CSS/Keywords.json b/Userland/Libraries/LibWeb/CSS/Keywords.json index f8bb85149c2..f2f60c8d898 100644 --- a/Userland/Libraries/LibWeb/CSS/Keywords.json +++ b/Userland/Libraries/LibWeb/CSS/Keywords.json @@ -186,6 +186,8 @@ "infinite", "infobackground", "infotext", + "inherit", + "initial", "initial-only", "inline", "inline-block", @@ -290,6 +292,7 @@ "repeat-x", "repeat-y", "reverse", + "revert", "ridge", "right", "round", @@ -378,6 +381,7 @@ "ultra-expanded", "underline", "unsafe", + "unset", "up", "upper-alpha", "upper-latin", diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index f6951318502..4ee9c6f0dde 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -59,8 +59,6 @@ #include #include #include -#include -#include #include #include #include @@ -70,7 +68,6 @@ #include #include #include -#include #include #include #include @@ -81,7 +78,6 @@ #include #include #include -#include #include #include #include @@ -1626,19 +1622,19 @@ RefPtr Parser::parse_builtin_value(TokenStream& t auto ident = component_value.token().ident(); if (ident.equals_ignoring_ascii_case("inherit"sv)) { transaction.commit(); - return InheritStyleValue::the(); + return CSSKeywordValue::create(Keyword::Inherit); } if (ident.equals_ignoring_ascii_case("initial"sv)) { transaction.commit(); - return InitialStyleValue::the(); + return CSSKeywordValue::create(Keyword::Initial); } if (ident.equals_ignoring_ascii_case("unset"sv)) { transaction.commit(); - return UnsetStyleValue::the(); + return CSSKeywordValue::create(Keyword::Unset); } if (ident.equals_ignoring_ascii_case("revert"sv)) { transaction.commit(); - return RevertStyleValue::the(); + return CSSKeywordValue::create(Keyword::Revert); } // FIXME: Implement `revert-layer` from CSS-CASCADE-5. } @@ -7947,18 +7943,18 @@ NonnullRefPtr Parser::resolve_unresolved_style_value(DOM::Element HashMap> dependencies; if (!expand_variables(element, pseudo_element, string_from_property_id(property_id), dependencies, unresolved_values_without_variables_expanded, values_with_variables_expanded)) - return UnsetStyleValue::the(); + return CSSKeywordValue::create(Keyword::Unset); TokenStream unresolved_values_with_variables_expanded { values_with_variables_expanded }; Vector expanded_values; if (!expand_unresolved_values(element, string_from_property_id(property_id), unresolved_values_with_variables_expanded, expanded_values)) - return UnsetStyleValue::the(); + return CSSKeywordValue::create(Keyword::Unset); auto expanded_value_tokens = TokenStream { expanded_values }; if (auto parsed_value = parse_css_value(property_id, expanded_value_tokens); !parsed_value.is_error()) return parsed_value.release_value(); - return UnsetStyleValue::the(); + return CSSKeywordValue::create(Keyword::Unset); } static RefPtr get_custom_property(DOM::Element const& element, Optional pseudo_element, FlyString const& custom_property_name) diff --git a/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp b/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp index dfa109087fc..01dcffb0040 100644 --- a/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp +++ b/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include diff --git a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp index 24a5f3581fd..4a479544e75 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp @@ -61,7 +61,6 @@ #include #include #include -#include #include #include #include @@ -1869,7 +1868,7 @@ NonnullRefPtr StyleComputer::get_inherit_value(JS::Realm& i void StyleComputer::compute_defaulted_property_value(StyleProperties& style, DOM::Element const* element, CSS::PropertyID property_id, Optional pseudo_element) const { - // FIXME: If we don't know the correct initial value for a property, we fall back to InitialStyleValue. + // FIXME: If we don't know the correct initial value for a property, we fall back to `initial`. auto& value_slot = style.m_property_values[to_underlying(property_id)]; if (!value_slot) { diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/CSSKeywordValue.h b/Userland/Libraries/LibWeb/CSS/StyleValues/CSSKeywordValue.h index be9eefbbe3b..099fb7ea1f9 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValues/CSSKeywordValue.h +++ b/Userland/Libraries/LibWeb/CSS/StyleValues/CSSKeywordValue.h @@ -15,11 +15,31 @@ namespace Web::CSS { // https://drafts.css-houdini.org/css-typed-om-1/#csskeywordvalue -class CSSKeywordValue final : public StyleValueWithDefaultOperators { +class CSSKeywordValue : public StyleValueWithDefaultOperators { public: static ValueComparingNonnullRefPtr create(Keyword keyword) { - return adopt_ref(*new (nothrow) CSSKeywordValue(keyword)); + // NOTE: We'll have to be much more careful with caching once we expose CSSKeywordValue to JS, as it's mutable. + switch (keyword) { + case Keyword::Inherit: { + static ValueComparingNonnullRefPtr const inherit_instance = adopt_ref(*new (nothrow) CSSKeywordValue(Keyword::Inherit)); + return inherit_instance; + } + case Keyword::Initial: { + static ValueComparingNonnullRefPtr const initial_instance = adopt_ref(*new (nothrow) CSSKeywordValue(Keyword::Initial)); + return initial_instance; + } + case Keyword::Revert: { + static ValueComparingNonnullRefPtr const revert_instance = adopt_ref(*new (nothrow) CSSKeywordValue(Keyword::Revert)); + return revert_instance; + } + case Keyword::Unset: { + static ValueComparingNonnullRefPtr const unset_instance = adopt_ref(*new (nothrow) CSSKeywordValue(Keyword::Unset)); + return unset_instance; + } + default: + return adopt_ref(*new (nothrow) CSSKeywordValue(keyword)); + } } virtual ~CSSKeywordValue() override = default; diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/InheritStyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValues/InheritStyleValue.h deleted file mode 100644 index 35b0c8f9779..00000000000 --- a/Userland/Libraries/LibWeb/CSS/StyleValues/InheritStyleValue.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2022-2023, Sam Atkins - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include - -namespace Web::CSS { - -class InheritStyleValue final : public StyleValueWithDefaultOperators { -public: - static ValueComparingNonnullRefPtr the() - { - static ValueComparingNonnullRefPtr instance = adopt_ref(*new (nothrow) InheritStyleValue); - return instance; - } - virtual ~InheritStyleValue() override = default; - - String to_string() const override { return "inherit"_string; } - - bool properties_equal(InheritStyleValue const&) const { return true; } - -private: - InheritStyleValue() - : StyleValueWithDefaultOperators(Type::Inherit) - { - } -}; - -} diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/InitialStyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValues/InitialStyleValue.h deleted file mode 100644 index ac81e73d443..00000000000 --- a/Userland/Libraries/LibWeb/CSS/StyleValues/InitialStyleValue.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2022-2023, Sam Atkins - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include - -namespace Web::CSS { - -class InitialStyleValue final : public StyleValueWithDefaultOperators { -public: - static ValueComparingNonnullRefPtr the() - { - static ValueComparingNonnullRefPtr instance = adopt_ref(*new (nothrow) InitialStyleValue); - return instance; - } - virtual ~InitialStyleValue() override = default; - - String to_string() const override { return "initial"_string; } - - bool properties_equal(InitialStyleValue const&) const { return true; } - -private: - InitialStyleValue() - : StyleValueWithDefaultOperators(Type::Initial) - { - } -}; - -} diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/RevertStyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValues/RevertStyleValue.h deleted file mode 100644 index 6bb5998b7b2..00000000000 --- a/Userland/Libraries/LibWeb/CSS/StyleValues/RevertStyleValue.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2023, Andreas Kling - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include - -namespace Web::CSS { - -class RevertStyleValue final : public StyleValueWithDefaultOperators { -public: - static ValueComparingNonnullRefPtr the() - { - static ValueComparingNonnullRefPtr instance = adopt_ref(*new (nothrow) RevertStyleValue); - return instance; - } - virtual ~RevertStyleValue() override = default; - - String to_string() const override { return "revert"_string; } - - bool properties_equal(RevertStyleValue const&) const { return true; } - -private: - RevertStyleValue() - : StyleValueWithDefaultOperators(Type::Revert) - { - } -}; - -} diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/UnsetStyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValues/UnsetStyleValue.h deleted file mode 100644 index 977ded9dd91..00000000000 --- a/Userland/Libraries/LibWeb/CSS/StyleValues/UnsetStyleValue.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2018-2020, Andreas Kling - * Copyright (c) 2021, Tobias Christiansen - * Copyright (c) 2021-2023, Sam Atkins - * Copyright (c) 2022-2023, MacDue - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include - -namespace Web::CSS { - -class UnsetStyleValue final : public StyleValueWithDefaultOperators { -public: - static ValueComparingNonnullRefPtr the() - { - static ValueComparingNonnullRefPtr instance = adopt_ref(*new (nothrow) UnsetStyleValue); - return instance; - } - virtual ~UnsetStyleValue() override = default; - - String to_string() const override { return "unset"_string; } - - bool properties_equal(UnsetStyleValue const&) const { return true; } - -private: - UnsetStyleValue() - : StyleValueWithDefaultOperators(Type::Unset) - { - } -}; - -} diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 4863e52d9c4..1404cad5add 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -152,8 +152,6 @@ class GridTrackPlacementStyleValue; class GridTrackSizeList; class GridTrackSizeListStyleValue; class ImageStyleValue; -class InheritStyleValue; -class InitialStyleValue; class IntegerOrCalculated; class IntegerStyleValue; class Length; @@ -184,7 +182,6 @@ class RectStyleValue; class Resolution; class ResolutionOrCalculated; class ResolutionStyleValue; -class RevertStyleValue; class Screen; class ScreenOrientation; class ScrollbarGutterStyleValue; @@ -209,7 +206,6 @@ class TransformationStyleValue; class TransitionStyleValue; class URLStyleValue; class UnresolvedStyleValue; -class UnsetStyleValue; class VisualViewport; enum class Keyword;