diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 33fcfdb547..0f4c91d823 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -1407,7 +1407,9 @@ RefPtr Parser::parse_builtin_value(ParsingContext const&, StyleCompo return InheritStyleValue::the(); if (ident.equals_ignoring_case("initial")) return InitialStyleValue::the(); - // FIXME: Implement `unset` keyword + if (ident.equals_ignoring_case("unset")) + return UnsetStyleValue::the(); + // FIXME: Implement `revert` and `revert-layer` keywords, from Cascade4 and Cascade5 respectively } return {}; diff --git a/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp b/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp index c6067abe68..51618ea1fd 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp @@ -71,6 +71,13 @@ Optional> StyleProperties::property(CSS::PropertyID id return fetch_initial(id); if (value->is_inherit()) return fetch_inherited(id); + if (value->is_unset()) { + if (is_inherited_property(id)) { + return fetch_inherited(id); + } else { + return fetch_initial(id); + } + } return value; } diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValue.h index fb53235286..1ff81ecfca 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.h +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.h @@ -219,6 +219,7 @@ public: Invalid, Inherit, Initial, + Unset, String, Length, Color, @@ -245,6 +246,7 @@ public: bool is_inherit() const { return type() == Type::Inherit; } bool is_initial() const { return type() == Type::Initial; } + bool is_unset() const { return type() == Type::Unset; } bool is_color() const { return type() == Type::Color; } bool is_identifier() const { return type() == Type::Identifier || is_auto(); } bool is_image() const { return type() == Type::Image; } @@ -266,11 +268,11 @@ public: bool is_overflow() const { return type() == Type::Overflow; } bool is_text_decoration() const { return type() == Type::TextDecoration; } - bool is_builtin() const { return is_inherit() || is_initial(); } + bool is_builtin() const { return is_inherit() || is_initial() || is_unset(); } bool is_builtin_or_dynamic() const { - return is_inherit() || is_initial() || is_custom_property() || is_calculated(); + return is_builtin() || is_custom_property() || is_calculated(); } virtual String to_string() const = 0; @@ -568,6 +570,24 @@ private: } }; +class UnsetStyleValue final : public StyleValue { +public: + static NonnullRefPtr the() + { + static NonnullRefPtr instance = adopt_ref(*new UnsetStyleValue); + return instance; + } + virtual ~UnsetStyleValue() override { } + + String to_string() const override { return "unset"; } + +private: + UnsetStyleValue() + : StyleValue(Type::Unset) + { + } +}; + class ColorStyleValue : public StyleValue { public: static NonnullRefPtr create(Color color)