Parcourir la source

LibWeb: Split IdentifierStyleValue out of StyleValue.{h,cpp}

Sam Atkins il y a 2 ans
Parent
commit
76de017a51

+ 1 - 0
Userland/Libraries/LibWeb/CMakeLists.txt

@@ -82,6 +82,7 @@ set(SOURCES
     CSS/StyleValues/GridTrackPlacementStyleValue.cpp
     CSS/StyleValues/GridTrackPlacementShorthandStyleValue.cpp
     CSS/StyleValues/GridTrackSizeStyleValue.cpp
+    CSS/StyleValues/IdentifierStyleValue.cpp
     CSS/Supports.cpp
     CSS/SyntaxHighlighter/SyntaxHighlighter.cpp
     CSS/Time.cpp

+ 1 - 0
Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp

@@ -48,6 +48,7 @@
 #include <LibWeb/CSS/StyleValues/GridTrackPlacementShorthandStyleValue.h>
 #include <LibWeb/CSS/StyleValues/GridTrackPlacementStyleValue.h>
 #include <LibWeb/CSS/StyleValues/GridTrackSizeStyleValue.h>
+#include <LibWeb/CSS/StyleValues/IdentifierStyleValue.h>
 #include <LibWeb/DOM/Document.h>
 #include <LibWeb/Dump.h>
 #include <LibWeb/Infra/Strings.h>

+ 1 - 0
Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp

@@ -22,6 +22,7 @@
 #include <LibWeb/CSS/StyleValues/GridTrackPlacementShorthandStyleValue.h>
 #include <LibWeb/CSS/StyleValues/GridTrackPlacementStyleValue.h>
 #include <LibWeb/CSS/StyleValues/GridTrackSizeStyleValue.h>
+#include <LibWeb/CSS/StyleValues/IdentifierStyleValue.h>
 #include <LibWeb/DOM/Document.h>
 #include <LibWeb/DOM/Element.h>
 #include <LibWeb/Layout/Viewport.h>

+ 1 - 0
Userland/Libraries/LibWeb/CSS/StyleComputer.cpp

@@ -37,6 +37,7 @@
 #include <LibWeb/CSS/StyleValues/GridAreaShorthandStyleValue.h>
 #include <LibWeb/CSS/StyleValues/GridTrackPlacementShorthandStyleValue.h>
 #include <LibWeb/CSS/StyleValues/GridTrackPlacementStyleValue.h>
+#include <LibWeb/CSS/StyleValues/IdentifierStyleValue.h>
 #include <LibWeb/DOM/Document.h>
 #include <LibWeb/DOM/Element.h>
 #include <LibWeb/FontCache.h>

+ 1 - 200
Userland/Libraries/LibWeb/CSS/StyleValue.cpp

@@ -30,6 +30,7 @@
 #include <LibWeb/CSS/StyleValues/GridTrackPlacementShorthandStyleValue.h>
 #include <LibWeb/CSS/StyleValues/GridTrackPlacementStyleValue.h>
 #include <LibWeb/CSS/StyleValues/GridTrackSizeStyleValue.h>
+#include <LibWeb/CSS/StyleValues/IdentifierStyleValue.h>
 #include <LibWeb/DOM/Document.h>
 #include <LibWeb/HTML/BrowsingContext.h>
 #include <LibWeb/Loader/LoadRequest.h>
@@ -1032,206 +1033,6 @@ CalculatedStyleValue::CalculationResult CalculatedStyleValue::CalcNumberSumPartW
     return value->resolve(layout_node, percentage_basis);
 }
 
-ErrorOr<String> IdentifierStyleValue::to_string() const
-{
-    return String::from_utf8(CSS::string_from_value_id(m_id));
-}
-
-bool IdentifierStyleValue::has_color() const
-{
-    switch (m_id) {
-    case ValueID::Currentcolor:
-    case ValueID::LibwebLink:
-    case ValueID::LibwebPaletteActiveLink:
-    case ValueID::LibwebPaletteActiveWindowBorder1:
-    case ValueID::LibwebPaletteActiveWindowBorder2:
-    case ValueID::LibwebPaletteActiveWindowTitle:
-    case ValueID::LibwebPaletteBase:
-    case ValueID::LibwebPaletteBaseText:
-    case ValueID::LibwebPaletteButton:
-    case ValueID::LibwebPaletteButtonText:
-    case ValueID::LibwebPaletteDesktopBackground:
-    case ValueID::LibwebPaletteFocusOutline:
-    case ValueID::LibwebPaletteHighlightWindowBorder1:
-    case ValueID::LibwebPaletteHighlightWindowBorder2:
-    case ValueID::LibwebPaletteHighlightWindowTitle:
-    case ValueID::LibwebPaletteHoverHighlight:
-    case ValueID::LibwebPaletteInactiveSelection:
-    case ValueID::LibwebPaletteInactiveSelectionText:
-    case ValueID::LibwebPaletteInactiveWindowBorder1:
-    case ValueID::LibwebPaletteInactiveWindowBorder2:
-    case ValueID::LibwebPaletteInactiveWindowTitle:
-    case ValueID::LibwebPaletteLink:
-    case ValueID::LibwebPaletteMenuBase:
-    case ValueID::LibwebPaletteMenuBaseText:
-    case ValueID::LibwebPaletteMenuSelection:
-    case ValueID::LibwebPaletteMenuSelectionText:
-    case ValueID::LibwebPaletteMenuStripe:
-    case ValueID::LibwebPaletteMovingWindowBorder1:
-    case ValueID::LibwebPaletteMovingWindowBorder2:
-    case ValueID::LibwebPaletteMovingWindowTitle:
-    case ValueID::LibwebPaletteRubberBandBorder:
-    case ValueID::LibwebPaletteRubberBandFill:
-    case ValueID::LibwebPaletteRuler:
-    case ValueID::LibwebPaletteRulerActiveText:
-    case ValueID::LibwebPaletteRulerBorder:
-    case ValueID::LibwebPaletteRulerInactiveText:
-    case ValueID::LibwebPaletteSelection:
-    case ValueID::LibwebPaletteSelectionText:
-    case ValueID::LibwebPaletteSyntaxComment:
-    case ValueID::LibwebPaletteSyntaxControlKeyword:
-    case ValueID::LibwebPaletteSyntaxIdentifier:
-    case ValueID::LibwebPaletteSyntaxKeyword:
-    case ValueID::LibwebPaletteSyntaxNumber:
-    case ValueID::LibwebPaletteSyntaxOperator:
-    case ValueID::LibwebPaletteSyntaxPreprocessorStatement:
-    case ValueID::LibwebPaletteSyntaxPreprocessorValue:
-    case ValueID::LibwebPaletteSyntaxPunctuation:
-    case ValueID::LibwebPaletteSyntaxString:
-    case ValueID::LibwebPaletteSyntaxType:
-    case ValueID::LibwebPaletteTextCursor:
-    case ValueID::LibwebPaletteThreedHighlight:
-    case ValueID::LibwebPaletteThreedShadow1:
-    case ValueID::LibwebPaletteThreedShadow2:
-    case ValueID::LibwebPaletteVisitedLink:
-    case ValueID::LibwebPaletteWindow:
-    case ValueID::LibwebPaletteWindowText:
-        return true;
-    default:
-        return false;
-    }
-}
-
-Color IdentifierStyleValue::to_color(Layout::NodeWithStyle const& node) const
-{
-    if (id() == CSS::ValueID::Currentcolor) {
-        if (!node.has_style())
-            return Color::Black;
-        return node.computed_values().color();
-    }
-
-    auto& document = node.document();
-    if (id() == CSS::ValueID::LibwebLink)
-        return document.link_color();
-
-    if (!document.page())
-        return {};
-
-    auto palette = document.page()->palette();
-    switch (id()) {
-    case CSS::ValueID::LibwebPaletteDesktopBackground:
-        return palette.color(ColorRole::DesktopBackground);
-    case CSS::ValueID::LibwebPaletteActiveWindowBorder1:
-        return palette.color(ColorRole::ActiveWindowBorder1);
-    case CSS::ValueID::LibwebPaletteActiveWindowBorder2:
-        return palette.color(ColorRole::ActiveWindowBorder2);
-    case CSS::ValueID::LibwebPaletteActiveWindowTitle:
-        return palette.color(ColorRole::ActiveWindowTitle);
-    case CSS::ValueID::LibwebPaletteInactiveWindowBorder1:
-        return palette.color(ColorRole::InactiveWindowBorder1);
-    case CSS::ValueID::LibwebPaletteInactiveWindowBorder2:
-        return palette.color(ColorRole::InactiveWindowBorder2);
-    case CSS::ValueID::LibwebPaletteInactiveWindowTitle:
-        return palette.color(ColorRole::InactiveWindowTitle);
-    case CSS::ValueID::LibwebPaletteMovingWindowBorder1:
-        return palette.color(ColorRole::MovingWindowBorder1);
-    case CSS::ValueID::LibwebPaletteMovingWindowBorder2:
-        return palette.color(ColorRole::MovingWindowBorder2);
-    case CSS::ValueID::LibwebPaletteMovingWindowTitle:
-        return palette.color(ColorRole::MovingWindowTitle);
-    case CSS::ValueID::LibwebPaletteHighlightWindowBorder1:
-        return palette.color(ColorRole::HighlightWindowBorder1);
-    case CSS::ValueID::LibwebPaletteHighlightWindowBorder2:
-        return palette.color(ColorRole::HighlightWindowBorder2);
-    case CSS::ValueID::LibwebPaletteHighlightWindowTitle:
-        return palette.color(ColorRole::HighlightWindowTitle);
-    case CSS::ValueID::LibwebPaletteMenuStripe:
-        return palette.color(ColorRole::MenuStripe);
-    case CSS::ValueID::LibwebPaletteMenuBase:
-        return palette.color(ColorRole::MenuBase);
-    case CSS::ValueID::LibwebPaletteMenuBaseText:
-        return palette.color(ColorRole::MenuBaseText);
-    case CSS::ValueID::LibwebPaletteMenuSelection:
-        return palette.color(ColorRole::MenuSelection);
-    case CSS::ValueID::LibwebPaletteMenuSelectionText:
-        return palette.color(ColorRole::MenuSelectionText);
-    case CSS::ValueID::LibwebPaletteWindow:
-        return palette.color(ColorRole::Window);
-    case CSS::ValueID::LibwebPaletteWindowText:
-        return palette.color(ColorRole::WindowText);
-    case CSS::ValueID::LibwebPaletteButton:
-        return palette.color(ColorRole::Button);
-    case CSS::ValueID::LibwebPaletteButtonText:
-        return palette.color(ColorRole::ButtonText);
-    case CSS::ValueID::LibwebPaletteBase:
-        return palette.color(ColorRole::Base);
-    case CSS::ValueID::LibwebPaletteBaseText:
-        return palette.color(ColorRole::BaseText);
-    case CSS::ValueID::LibwebPaletteThreedHighlight:
-        return palette.color(ColorRole::ThreedHighlight);
-    case CSS::ValueID::LibwebPaletteThreedShadow1:
-        return palette.color(ColorRole::ThreedShadow1);
-    case CSS::ValueID::LibwebPaletteThreedShadow2:
-        return palette.color(ColorRole::ThreedShadow2);
-    case CSS::ValueID::LibwebPaletteHoverHighlight:
-        return palette.color(ColorRole::HoverHighlight);
-    case CSS::ValueID::LibwebPaletteSelection:
-        return palette.color(ColorRole::Selection);
-    case CSS::ValueID::LibwebPaletteSelectionText:
-        return palette.color(ColorRole::SelectionText);
-    case CSS::ValueID::LibwebPaletteInactiveSelection:
-        return palette.color(ColorRole::InactiveSelection);
-    case CSS::ValueID::LibwebPaletteInactiveSelectionText:
-        return palette.color(ColorRole::InactiveSelectionText);
-    case CSS::ValueID::LibwebPaletteRubberBandFill:
-        return palette.color(ColorRole::RubberBandFill);
-    case CSS::ValueID::LibwebPaletteRubberBandBorder:
-        return palette.color(ColorRole::RubberBandBorder);
-    case CSS::ValueID::LibwebPaletteLink:
-        return palette.color(ColorRole::Link);
-    case CSS::ValueID::LibwebPaletteActiveLink:
-        return palette.color(ColorRole::ActiveLink);
-    case CSS::ValueID::LibwebPaletteVisitedLink:
-        return palette.color(ColorRole::VisitedLink);
-    case CSS::ValueID::LibwebPaletteRuler:
-        return palette.color(ColorRole::Ruler);
-    case CSS::ValueID::LibwebPaletteRulerBorder:
-        return palette.color(ColorRole::RulerBorder);
-    case CSS::ValueID::LibwebPaletteRulerActiveText:
-        return palette.color(ColorRole::RulerActiveText);
-    case CSS::ValueID::LibwebPaletteRulerInactiveText:
-        return palette.color(ColorRole::RulerInactiveText);
-    case CSS::ValueID::LibwebPaletteTextCursor:
-        return palette.color(ColorRole::TextCursor);
-    case CSS::ValueID::LibwebPaletteFocusOutline:
-        return palette.color(ColorRole::FocusOutline);
-    case CSS::ValueID::LibwebPaletteSyntaxComment:
-        return palette.color(ColorRole::SyntaxComment);
-    case CSS::ValueID::LibwebPaletteSyntaxNumber:
-        return palette.color(ColorRole::SyntaxNumber);
-    case CSS::ValueID::LibwebPaletteSyntaxString:
-        return palette.color(ColorRole::SyntaxString);
-    case CSS::ValueID::LibwebPaletteSyntaxType:
-        return palette.color(ColorRole::SyntaxType);
-    case CSS::ValueID::LibwebPaletteSyntaxPunctuation:
-        return palette.color(ColorRole::SyntaxPunctuation);
-    case CSS::ValueID::LibwebPaletteSyntaxOperator:
-        return palette.color(ColorRole::SyntaxOperator);
-    case CSS::ValueID::LibwebPaletteSyntaxKeyword:
-        return palette.color(ColorRole::SyntaxKeyword);
-    case CSS::ValueID::LibwebPaletteSyntaxControlKeyword:
-        return palette.color(ColorRole::SyntaxControlKeyword);
-    case CSS::ValueID::LibwebPaletteSyntaxIdentifier:
-        return palette.color(ColorRole::SyntaxIdentifier);
-    case CSS::ValueID::LibwebPaletteSyntaxPreprocessorStatement:
-        return palette.color(ColorRole::SyntaxPreprocessorStatement);
-    case CSS::ValueID::LibwebPaletteSyntaxPreprocessorValue:
-        return palette.color(ColorRole::SyntaxPreprocessorValue);
-    default:
-        return {};
-    }
-}
-
 ImageStyleValue::ImageStyleValue(AK::URL const& url)
     : AbstractImageStyleValue(Type::Image)
     , m_url(url)

+ 0 - 29
Userland/Libraries/LibWeb/CSS/StyleValue.h

@@ -661,35 +661,6 @@ private:
     NonnullOwnPtr<CalcSum> m_expression;
 };
 
-class IdentifierStyleValue final : public StyleValueWithDefaultOperators<IdentifierStyleValue> {
-public:
-    static ValueComparingNonnullRefPtr<IdentifierStyleValue> create(CSS::ValueID id)
-    {
-        return adopt_ref(*new IdentifierStyleValue(id));
-    }
-    virtual ~IdentifierStyleValue() override = default;
-
-    CSS::ValueID id() const { return m_id; }
-
-    virtual bool has_auto() const override { return m_id == ValueID::Auto; }
-    virtual bool has_identifier() const override { return true; }
-    virtual CSS::ValueID to_identifier() const override { return m_id; }
-    virtual bool has_color() const override;
-    virtual Color to_color(Layout::NodeWithStyle const& node) const override;
-    virtual ErrorOr<String> to_string() const override;
-
-    bool properties_equal(IdentifierStyleValue const& other) const { return m_id == other.m_id; }
-
-private:
-    explicit IdentifierStyleValue(CSS::ValueID id)
-        : StyleValueWithDefaultOperators(Type::Identifier)
-        , m_id(id)
-    {
-    }
-
-    CSS::ValueID m_id { CSS::ValueID::Invalid };
-};
-
 class AbstractImageStyleValue : public StyleValue {
 public:
     using StyleValue::StyleValue;

+ 217 - 0
Userland/Libraries/LibWeb/CSS/StyleValues/IdentifierStyleValue.cpp

@@ -0,0 +1,217 @@
+/*
+ * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2021, Tobias Christiansen <tobyase@serenityos.org>
+ * Copyright (c) 2021-2023, Sam Atkins <atkinssj@serenityos.org>
+ * Copyright (c) 2022-2023, MacDue <macdue@dueutil.tech>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include "IdentifierStyleValue.h"
+#include <LibGfx/Palette.h>
+#include <LibWeb/DOM/Document.h>
+#include <LibWeb/Layout/Node.h>
+
+namespace Web::CSS {
+
+ErrorOr<String> IdentifierStyleValue::to_string() const
+{
+    return String::from_utf8(CSS::string_from_value_id(m_id));
+}
+
+bool IdentifierStyleValue::has_color() const
+{
+    switch (m_id) {
+    case ValueID::Currentcolor:
+    case ValueID::LibwebLink:
+    case ValueID::LibwebPaletteActiveLink:
+    case ValueID::LibwebPaletteActiveWindowBorder1:
+    case ValueID::LibwebPaletteActiveWindowBorder2:
+    case ValueID::LibwebPaletteActiveWindowTitle:
+    case ValueID::LibwebPaletteBase:
+    case ValueID::LibwebPaletteBaseText:
+    case ValueID::LibwebPaletteButton:
+    case ValueID::LibwebPaletteButtonText:
+    case ValueID::LibwebPaletteDesktopBackground:
+    case ValueID::LibwebPaletteFocusOutline:
+    case ValueID::LibwebPaletteHighlightWindowBorder1:
+    case ValueID::LibwebPaletteHighlightWindowBorder2:
+    case ValueID::LibwebPaletteHighlightWindowTitle:
+    case ValueID::LibwebPaletteHoverHighlight:
+    case ValueID::LibwebPaletteInactiveSelection:
+    case ValueID::LibwebPaletteInactiveSelectionText:
+    case ValueID::LibwebPaletteInactiveWindowBorder1:
+    case ValueID::LibwebPaletteInactiveWindowBorder2:
+    case ValueID::LibwebPaletteInactiveWindowTitle:
+    case ValueID::LibwebPaletteLink:
+    case ValueID::LibwebPaletteMenuBase:
+    case ValueID::LibwebPaletteMenuBaseText:
+    case ValueID::LibwebPaletteMenuSelection:
+    case ValueID::LibwebPaletteMenuSelectionText:
+    case ValueID::LibwebPaletteMenuStripe:
+    case ValueID::LibwebPaletteMovingWindowBorder1:
+    case ValueID::LibwebPaletteMovingWindowBorder2:
+    case ValueID::LibwebPaletteMovingWindowTitle:
+    case ValueID::LibwebPaletteRubberBandBorder:
+    case ValueID::LibwebPaletteRubberBandFill:
+    case ValueID::LibwebPaletteRuler:
+    case ValueID::LibwebPaletteRulerActiveText:
+    case ValueID::LibwebPaletteRulerBorder:
+    case ValueID::LibwebPaletteRulerInactiveText:
+    case ValueID::LibwebPaletteSelection:
+    case ValueID::LibwebPaletteSelectionText:
+    case ValueID::LibwebPaletteSyntaxComment:
+    case ValueID::LibwebPaletteSyntaxControlKeyword:
+    case ValueID::LibwebPaletteSyntaxIdentifier:
+    case ValueID::LibwebPaletteSyntaxKeyword:
+    case ValueID::LibwebPaletteSyntaxNumber:
+    case ValueID::LibwebPaletteSyntaxOperator:
+    case ValueID::LibwebPaletteSyntaxPreprocessorStatement:
+    case ValueID::LibwebPaletteSyntaxPreprocessorValue:
+    case ValueID::LibwebPaletteSyntaxPunctuation:
+    case ValueID::LibwebPaletteSyntaxString:
+    case ValueID::LibwebPaletteSyntaxType:
+    case ValueID::LibwebPaletteTextCursor:
+    case ValueID::LibwebPaletteThreedHighlight:
+    case ValueID::LibwebPaletteThreedShadow1:
+    case ValueID::LibwebPaletteThreedShadow2:
+    case ValueID::LibwebPaletteVisitedLink:
+    case ValueID::LibwebPaletteWindow:
+    case ValueID::LibwebPaletteWindowText:
+        return true;
+    default:
+        return false;
+    }
+}
+
+Color IdentifierStyleValue::to_color(Layout::NodeWithStyle const& node) const
+{
+    if (id() == CSS::ValueID::Currentcolor) {
+        if (!node.has_style())
+            return Color::Black;
+        return node.computed_values().color();
+    }
+
+    auto& document = node.document();
+    if (id() == CSS::ValueID::LibwebLink)
+        return document.link_color();
+
+    if (!document.page())
+        return {};
+
+    auto palette = document.page()->palette();
+    switch (id()) {
+    case CSS::ValueID::LibwebPaletteDesktopBackground:
+        return palette.color(ColorRole::DesktopBackground);
+    case CSS::ValueID::LibwebPaletteActiveWindowBorder1:
+        return palette.color(ColorRole::ActiveWindowBorder1);
+    case CSS::ValueID::LibwebPaletteActiveWindowBorder2:
+        return palette.color(ColorRole::ActiveWindowBorder2);
+    case CSS::ValueID::LibwebPaletteActiveWindowTitle:
+        return palette.color(ColorRole::ActiveWindowTitle);
+    case CSS::ValueID::LibwebPaletteInactiveWindowBorder1:
+        return palette.color(ColorRole::InactiveWindowBorder1);
+    case CSS::ValueID::LibwebPaletteInactiveWindowBorder2:
+        return palette.color(ColorRole::InactiveWindowBorder2);
+    case CSS::ValueID::LibwebPaletteInactiveWindowTitle:
+        return palette.color(ColorRole::InactiveWindowTitle);
+    case CSS::ValueID::LibwebPaletteMovingWindowBorder1:
+        return palette.color(ColorRole::MovingWindowBorder1);
+    case CSS::ValueID::LibwebPaletteMovingWindowBorder2:
+        return palette.color(ColorRole::MovingWindowBorder2);
+    case CSS::ValueID::LibwebPaletteMovingWindowTitle:
+        return palette.color(ColorRole::MovingWindowTitle);
+    case CSS::ValueID::LibwebPaletteHighlightWindowBorder1:
+        return palette.color(ColorRole::HighlightWindowBorder1);
+    case CSS::ValueID::LibwebPaletteHighlightWindowBorder2:
+        return palette.color(ColorRole::HighlightWindowBorder2);
+    case CSS::ValueID::LibwebPaletteHighlightWindowTitle:
+        return palette.color(ColorRole::HighlightWindowTitle);
+    case CSS::ValueID::LibwebPaletteMenuStripe:
+        return palette.color(ColorRole::MenuStripe);
+    case CSS::ValueID::LibwebPaletteMenuBase:
+        return palette.color(ColorRole::MenuBase);
+    case CSS::ValueID::LibwebPaletteMenuBaseText:
+        return palette.color(ColorRole::MenuBaseText);
+    case CSS::ValueID::LibwebPaletteMenuSelection:
+        return palette.color(ColorRole::MenuSelection);
+    case CSS::ValueID::LibwebPaletteMenuSelectionText:
+        return palette.color(ColorRole::MenuSelectionText);
+    case CSS::ValueID::LibwebPaletteWindow:
+        return palette.color(ColorRole::Window);
+    case CSS::ValueID::LibwebPaletteWindowText:
+        return palette.color(ColorRole::WindowText);
+    case CSS::ValueID::LibwebPaletteButton:
+        return palette.color(ColorRole::Button);
+    case CSS::ValueID::LibwebPaletteButtonText:
+        return palette.color(ColorRole::ButtonText);
+    case CSS::ValueID::LibwebPaletteBase:
+        return palette.color(ColorRole::Base);
+    case CSS::ValueID::LibwebPaletteBaseText:
+        return palette.color(ColorRole::BaseText);
+    case CSS::ValueID::LibwebPaletteThreedHighlight:
+        return palette.color(ColorRole::ThreedHighlight);
+    case CSS::ValueID::LibwebPaletteThreedShadow1:
+        return palette.color(ColorRole::ThreedShadow1);
+    case CSS::ValueID::LibwebPaletteThreedShadow2:
+        return palette.color(ColorRole::ThreedShadow2);
+    case CSS::ValueID::LibwebPaletteHoverHighlight:
+        return palette.color(ColorRole::HoverHighlight);
+    case CSS::ValueID::LibwebPaletteSelection:
+        return palette.color(ColorRole::Selection);
+    case CSS::ValueID::LibwebPaletteSelectionText:
+        return palette.color(ColorRole::SelectionText);
+    case CSS::ValueID::LibwebPaletteInactiveSelection:
+        return palette.color(ColorRole::InactiveSelection);
+    case CSS::ValueID::LibwebPaletteInactiveSelectionText:
+        return palette.color(ColorRole::InactiveSelectionText);
+    case CSS::ValueID::LibwebPaletteRubberBandFill:
+        return palette.color(ColorRole::RubberBandFill);
+    case CSS::ValueID::LibwebPaletteRubberBandBorder:
+        return palette.color(ColorRole::RubberBandBorder);
+    case CSS::ValueID::LibwebPaletteLink:
+        return palette.color(ColorRole::Link);
+    case CSS::ValueID::LibwebPaletteActiveLink:
+        return palette.color(ColorRole::ActiveLink);
+    case CSS::ValueID::LibwebPaletteVisitedLink:
+        return palette.color(ColorRole::VisitedLink);
+    case CSS::ValueID::LibwebPaletteRuler:
+        return palette.color(ColorRole::Ruler);
+    case CSS::ValueID::LibwebPaletteRulerBorder:
+        return palette.color(ColorRole::RulerBorder);
+    case CSS::ValueID::LibwebPaletteRulerActiveText:
+        return palette.color(ColorRole::RulerActiveText);
+    case CSS::ValueID::LibwebPaletteRulerInactiveText:
+        return palette.color(ColorRole::RulerInactiveText);
+    case CSS::ValueID::LibwebPaletteTextCursor:
+        return palette.color(ColorRole::TextCursor);
+    case CSS::ValueID::LibwebPaletteFocusOutline:
+        return palette.color(ColorRole::FocusOutline);
+    case CSS::ValueID::LibwebPaletteSyntaxComment:
+        return palette.color(ColorRole::SyntaxComment);
+    case CSS::ValueID::LibwebPaletteSyntaxNumber:
+        return palette.color(ColorRole::SyntaxNumber);
+    case CSS::ValueID::LibwebPaletteSyntaxString:
+        return palette.color(ColorRole::SyntaxString);
+    case CSS::ValueID::LibwebPaletteSyntaxType:
+        return palette.color(ColorRole::SyntaxType);
+    case CSS::ValueID::LibwebPaletteSyntaxPunctuation:
+        return palette.color(ColorRole::SyntaxPunctuation);
+    case CSS::ValueID::LibwebPaletteSyntaxOperator:
+        return palette.color(ColorRole::SyntaxOperator);
+    case CSS::ValueID::LibwebPaletteSyntaxKeyword:
+        return palette.color(ColorRole::SyntaxKeyword);
+    case CSS::ValueID::LibwebPaletteSyntaxControlKeyword:
+        return palette.color(ColorRole::SyntaxControlKeyword);
+    case CSS::ValueID::LibwebPaletteSyntaxIdentifier:
+        return palette.color(ColorRole::SyntaxIdentifier);
+    case CSS::ValueID::LibwebPaletteSyntaxPreprocessorStatement:
+        return palette.color(ColorRole::SyntaxPreprocessorStatement);
+    case CSS::ValueID::LibwebPaletteSyntaxPreprocessorValue:
+        return palette.color(ColorRole::SyntaxPreprocessorValue);
+    default:
+        return {};
+    }
+}
+
+}

+ 46 - 0
Userland/Libraries/LibWeb/CSS/StyleValues/IdentifierStyleValue.h

@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2021, Tobias Christiansen <tobyase@serenityos.org>
+ * Copyright (c) 2021-2023, Sam Atkins <atkinssj@serenityos.org>
+ * Copyright (c) 2022-2023, MacDue <macdue@dueutil.tech>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibWeb/CSS/StyleValue.h>
+#include <LibWeb/CSS/ValueID.h>
+
+namespace Web::CSS {
+
+class IdentifierStyleValue final : public StyleValueWithDefaultOperators<IdentifierStyleValue> {
+public:
+    static ValueComparingNonnullRefPtr<IdentifierStyleValue> create(ValueID id)
+    {
+        return adopt_ref(*new IdentifierStyleValue(id));
+    }
+    virtual ~IdentifierStyleValue() override = default;
+
+    ValueID id() const { return m_id; }
+
+    virtual bool has_auto() const override { return m_id == ValueID::Auto; }
+    virtual bool has_identifier() const override { return true; }
+    virtual ValueID to_identifier() const override { return m_id; }
+    virtual bool has_color() const override;
+    virtual Color to_color(Layout::NodeWithStyle const& node) const override;
+    virtual ErrorOr<String> to_string() const override;
+
+    bool properties_equal(IdentifierStyleValue const& other) const { return m_id == other.m_id; }
+
+private:
+    explicit IdentifierStyleValue(ValueID id)
+        : StyleValueWithDefaultOperators(Type::Identifier)
+        , m_id(id)
+    {
+    }
+
+    ValueID m_id { ValueID::Invalid };
+};
+
+}

+ 1 - 0
Userland/Libraries/LibWeb/HTML/HTMLHeadingElement.cpp

@@ -5,6 +5,7 @@
  */
 
 #include <LibWeb/Bindings/Intrinsics.h>
+#include <LibWeb/CSS/StyleValues/IdentifierStyleValue.h>
 #include <LibWeb/HTML/HTMLHeadingElement.h>
 
 namespace Web::HTML {

+ 1 - 0
Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp

@@ -6,6 +6,7 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
+#include <LibWeb/CSS/StyleValues/IdentifierStyleValue.h>
 #include <LibWeb/DOM/Document.h>
 #include <LibWeb/DOM/Event.h>
 #include <LibWeb/DOM/ShadowRoot.h>

+ 1 - 0
Userland/Libraries/LibWeb/HTML/HTMLParagraphElement.cpp

@@ -5,6 +5,7 @@
  */
 
 #include <LibWeb/Bindings/Intrinsics.h>
+#include <LibWeb/CSS/StyleValues/IdentifierStyleValue.h>
 #include <LibWeb/HTML/HTMLParagraphElement.h>
 
 namespace Web::HTML {

+ 1 - 0
Userland/Libraries/LibWeb/HTML/HTMLPreElement.cpp

@@ -5,6 +5,7 @@
  */
 
 #include <LibWeb/Bindings/Intrinsics.h>
+#include <LibWeb/CSS/StyleValues/IdentifierStyleValue.h>
 #include <LibWeb/HTML/HTMLPreElement.h>
 
 namespace Web::HTML {

+ 1 - 0
Userland/Libraries/LibWeb/HTML/HTMLTableCaptionElement.cpp

@@ -5,6 +5,7 @@
  */
 
 #include <LibWeb/Bindings/Intrinsics.h>
+#include <LibWeb/CSS/StyleValues/IdentifierStyleValue.h>
 #include <LibWeb/HTML/HTMLTableCaptionElement.h>
 
 namespace Web::HTML {

+ 1 - 0
Userland/Libraries/LibWeb/HTML/HTMLTableCellElement.cpp

@@ -7,6 +7,7 @@
 #include <LibWeb/Bindings/Intrinsics.h>
 #include <LibWeb/CSS/Parser/Parser.h>
 #include <LibWeb/CSS/StyleValues/ColorStyleValue.h>
+#include <LibWeb/CSS/StyleValues/IdentifierStyleValue.h>
 #include <LibWeb/HTML/HTMLTableCellElement.h>
 #include <LibWeb/HTML/Parser/HTMLParser.h>
 

+ 2 - 1
Userland/Libraries/LibWeb/Layout/TreeBuilder.cpp

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2018-2022, Andreas Kling <kling@serenityos.org>
- * Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
+ * Copyright (c) 2022-2023, Sam Atkins <atkinssj@serenityos.org>
  * Copyright (c) 2022, MacDue <macdue@dueutil.tech>
  *
  * SPDX-License-Identifier: BSD-2-Clause
@@ -9,6 +9,7 @@
 #include <AK/Error.h>
 #include <AK/Optional.h>
 #include <AK/TemporaryChange.h>
+#include <LibWeb/CSS/StyleValues/IdentifierStyleValue.h>
 #include <LibWeb/DOM/Document.h>
 #include <LibWeb/DOM/Element.h>
 #include <LibWeb/DOM/ParentNode.h>