diff --git a/Libraries/LibWeb/CSS/Parser/CSSParser.cpp b/Libraries/LibWeb/CSS/Parser/CSSParser.cpp index 88780b6f1b..4caafd9098 100644 --- a/Libraries/LibWeb/CSS/Parser/CSSParser.cpp +++ b/Libraries/LibWeb/CSS/Parser/CSSParser.cpp @@ -464,6 +464,14 @@ static Optional value_id_from_string(const String& string) return CSS::ValueID::FullWidth; if (string.equals_ignoring_case("full-size-kana")) return CSS::ValueID::FullSizeKana; + if (string.equals_ignoring_case("disc")) + return CSS::ValueID::Disc; + if (string.equals_ignoring_case("circle")) + return CSS::ValueID::Circle; + if (string.equals_ignoring_case("square")) + return CSS::ValueID::Square; + if (string.equals_ignoring_case("decimal")) + return CSS::ValueID::Decimal; if (string.starts_with("-libweb-palette-", CaseSensitivity::CaseInsensitive)) return value_id_for_palette_string(string.substring_view(16, string.length() - 16)); return {}; diff --git a/Libraries/LibWeb/CSS/StyleProperties.cpp b/Libraries/LibWeb/CSS/StyleProperties.cpp index a0ee588764..7a3a0071db 100644 --- a/Libraries/LibWeb/CSS/StyleProperties.cpp +++ b/Libraries/LibWeb/CSS/StyleProperties.cpp @@ -453,4 +453,26 @@ Optional StyleProperties::text_transform() const } } +Optional StyleProperties::list_style_type() const +{ + auto value = property(CSS::PropertyID::ListStyleType); + if (!value.has_value()) + return {}; + + switch (value.value()->to_identifier()) { + case CSS::ValueID::None: + return CSS::ListStyleType::None; + case CSS::ValueID::Disc: + return CSS::ListStyleType::Disc; + case CSS::ValueID::Circle: + return CSS::ListStyleType::Circle; + case CSS::ValueID::Square: + return CSS::ListStyleType::Square; + case CSS::ValueID::Decimal: + return CSS::ListStyleType::Decimal; + default: + return {}; + } +} + } diff --git a/Libraries/LibWeb/CSS/StyleProperties.h b/Libraries/LibWeb/CSS/StyleProperties.h index 4273edea35..d4aff74804 100644 --- a/Libraries/LibWeb/CSS/StyleProperties.h +++ b/Libraries/LibWeb/CSS/StyleProperties.h @@ -68,6 +68,7 @@ public: Optional line_style(CSS::PropertyID) const; Optional text_decoration_line() const; Optional text_transform() const; + Optional list_style_type() const; const Gfx::Font& font() const { diff --git a/Libraries/LibWeb/CSS/StyleValue.h b/Libraries/LibWeb/CSS/StyleValue.h index 6523ff1a7b..52b724c57c 100644 --- a/Libraries/LibWeb/CSS/StyleValue.h +++ b/Libraries/LibWeb/CSS/StyleValue.h @@ -156,6 +156,10 @@ enum class ValueID { Lowercase, FullWidth, FullSizeKana, + Disc, + Circle, + Square, + Decimal, }; enum class Position { @@ -239,6 +243,14 @@ enum class LineStyle { Outset, }; +enum class ListStyleType { + None, + Disc, + Circle, + Square, + Decimal, +}; + class StyleValue : public RefCounted { public: virtual ~StyleValue(); diff --git a/Libraries/LibWeb/Layout/LayoutStyle.h b/Libraries/LibWeb/Layout/LayoutStyle.h index 55b2d02566..dda76b5285 100644 --- a/Libraries/LibWeb/Layout/LayoutStyle.h +++ b/Libraries/LibWeb/Layout/LayoutStyle.h @@ -43,6 +43,7 @@ public: static CSS::TextTransform text_transform() { return CSS::TextTransform::None; } static Color color() { return Color::Black; } static Color background_color() { return Color::Transparent; } + static CSS::ListStyleType list_style_type() { return CSS::ListStyleType::Disc; } }; struct BorderData { @@ -81,6 +82,8 @@ public: Color color() const { return m_color; } Color background_color() const { return m_background_color; } + CSS::ListStyleType list_style_type() const { return m_list_style_type; } + protected: CSS::Float m_float { InitialValues::float_() }; CSS::Clear m_clear { InitialValues::clear() }; @@ -105,6 +108,7 @@ protected: BorderData m_border_bottom; Color m_color { InitialValues::color() }; Color m_background_color { InitialValues::background_color() }; + CSS::ListStyleType m_list_style_type { InitialValues::list_style_type() }; }; class ImmutableLayoutStyle final : public LayoutStyle { @@ -131,6 +135,7 @@ public: void set_offset(const CSS::LengthBox& offset) { m_offset = offset; } void set_margin(const CSS::LengthBox& margin) { m_margin = margin; } void set_padding(const CSS::LengthBox& padding) { m_padding = padding; } + void set_list_style_type(CSS::ListStyleType value) { m_list_style_type = value; } BorderData& border_left() { return m_border_left; } BorderData& border_top() { return m_border_top; } BorderData& border_right() { return m_border_right; } diff --git a/Libraries/LibWeb/Layout/ListItemBox.cpp b/Libraries/LibWeb/Layout/ListItemBox.cpp index 5e8f683c7f..e210cfe3bd 100644 --- a/Libraries/LibWeb/Layout/ListItemBox.cpp +++ b/Libraries/LibWeb/Layout/ListItemBox.cpp @@ -45,7 +45,7 @@ void ListItemBox::layout_marker() m_marker = nullptr; } - if (specified_style().string_or_fallback(CSS::PropertyID::ListStyleType, "disc") == "none") + if (style().list_style_type() == CSS::ListStyleType::None) return; if (!m_marker) { diff --git a/Libraries/LibWeb/Layout/Node.cpp b/Libraries/LibWeb/Layout/Node.cpp index 0434cd1bc5..2e41191e5a 100644 --- a/Libraries/LibWeb/Layout/Node.cpp +++ b/Libraries/LibWeb/Layout/Node.cpp @@ -247,6 +247,9 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& specified_style) if (text_transform.has_value()) style.set_text_transform(text_transform.value()); + if (auto list_style_type = specified_style.list_style_type(); list_style_type.has_value()) + style.set_list_style_type(list_style_type.value()); + style.set_color(specified_style.color_or_fallback(CSS::PropertyID::Color, document(), Color::Transparent)); style.set_background_color(specified_style.color_or_fallback(CSS::PropertyID::BackgroundColor, document(), Color::Transparent));