From 0809eacd976abd85787b0a8f57cf6f09f89b3e5f Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Wed, 9 Jul 2025 10:39:22 +0100 Subject: [PATCH] LibWeb/CSS: Update definition for `cursor` property No functional changes. The main difference is renaming the cursor enum to match the spec term ``, which is a bit more verbose but clearer in meaning. Corresponds to https://github.com/w3c/csswg-drafts/commit/1a57a4025c8778dab45ef8d5fbd482e4d6c4ebce --- Libraries/LibWeb/CSS/ComputedProperties.cpp | 6 +- Libraries/LibWeb/CSS/ComputedValues.h | 4 +- Libraries/LibWeb/CSS/Enums.json | 2 +- .../LibWeb/CSS/Parser/PropertyParsing.cpp | 11 +-- Libraries/LibWeb/CSS/Properties.json | 3 +- Libraries/LibWeb/Page/EventHandler.cpp | 74 +++++++++---------- 6 files changed, 51 insertions(+), 49 deletions(-) diff --git a/Libraries/LibWeb/CSS/ComputedProperties.cpp b/Libraries/LibWeb/CSS/ComputedProperties.cpp index 35975404fb6..e257cee4020 100644 --- a/Libraries/LibWeb/CSS/ComputedProperties.cpp +++ b/Libraries/LibWeb/CSS/ComputedProperties.cpp @@ -1061,16 +1061,16 @@ Vector ComputedProperties::cursor() const continue; } - if (auto keyword = keyword_to_cursor(item->to_keyword()); keyword.has_value()) + if (auto keyword = keyword_to_cursor_predefined(item->to_keyword()); keyword.has_value()) cursors.append(keyword.release_value()); } } else if (value.is_keyword()) { - if (auto keyword = keyword_to_cursor(value.to_keyword()); keyword.has_value()) + if (auto keyword = keyword_to_cursor_predefined(value.to_keyword()); keyword.has_value()) cursors.append(keyword.release_value()); } if (cursors.is_empty()) - cursors.append(Cursor::Auto); + cursors.append(CursorPredefined::Auto); return cursors; } diff --git a/Libraries/LibWeb/CSS/ComputedValues.h b/Libraries/LibWeb/CSS/ComputedValues.h index caa93334443..5aebfe85060 100644 --- a/Libraries/LibWeb/CSS/ComputedValues.h +++ b/Libraries/LibWeb/CSS/ComputedValues.h @@ -86,7 +86,7 @@ struct ScrollbarColorData { Color track_color { Color::Transparent }; }; -using CursorData = Variant, Cursor>; +using CursorData = Variant, CursorPredefined>; using ListStyleType = Variant; @@ -105,7 +105,7 @@ public: static CSS::Clip clip() { return CSS::Clip::make_auto(); } static CSS::PreferredColorScheme color_scheme() { return CSS::PreferredColorScheme::Auto; } static CSS::ContentVisibility content_visibility() { return CSS::ContentVisibility::Visible; } - static CursorData cursor() { return { CSS::Cursor::Auto }; } + static CursorData cursor() { return { CSS::CursorPredefined::Auto }; } static CSS::WhiteSpaceCollapse white_space_collapse() { return CSS::WhiteSpaceCollapse::Collapse; } static CSS::WordBreak word_break() { return CSS::WordBreak::Normal; } static CSS::LengthOrCalculated word_spacing() { return CSS::Length::make_px(0); } diff --git a/Libraries/LibWeb/CSS/Enums.json b/Libraries/LibWeb/CSS/Enums.json index d00f92a97c7..f5493063bbc 100644 --- a/Libraries/LibWeb/CSS/Enums.json +++ b/Libraries/LibWeb/CSS/Enums.json @@ -150,7 +150,7 @@ "anonymous", "use-credentials" ], - "cursor": [ + "cursor-predefined": [ "auto", "default", "none", diff --git a/Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp b/Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp index ab4c8c0e778..eb94b756b51 100644 --- a/Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp @@ -1050,10 +1050,11 @@ RefPtr Parser::parse_counter_set_value(TokenStream Parser::parse_cursor_value(TokenStream& tokens) { - // [ [ [ ]?,]* ] + // #? + // = {2}? // So, any number of custom cursor definitions, and then a mandatory cursor name keyword, all comma-separated. auto transaction = tokens.begin_transaction(); @@ -1069,7 +1070,7 @@ RefPtr Parser::parse_cursor_value(TokenStreamto_keyword()).has_value()) + if (!keyword_value || !keyword_to_cursor_predefined(keyword_value->to_keyword()).has_value()) return {}; part_tokens.discard_whitespace(); @@ -1079,7 +1080,7 @@ RefPtr Parser::parse_cursor_value(TokenStream [ ]? + // = {2}? // "Conforming user agents may, instead of , support which is a superset." part_tokens.discard_whitespace(); @@ -1090,7 +1091,7 @@ RefPtr Parser::parse_cursor_value(TokenStream + // {2}, which are the x and y coordinates of the hotspot auto x = parse_number(part_tokens); part_tokens.discard_whitespace(); auto y = parse_number(part_tokens); diff --git a/Libraries/LibWeb/CSS/Properties.json b/Libraries/LibWeb/CSS/Properties.json index 99a7b9c82cc..1737c94e5b2 100644 --- a/Libraries/LibWeb/CSS/Properties.json +++ b/Libraries/LibWeb/CSS/Properties.json @@ -1386,7 +1386,8 @@ "initial": "auto", "valid-types": [ "url", - "cursor" + "cursor-predefined", + "number [-∞,∞]" ] }, "cx": { diff --git a/Libraries/LibWeb/Page/EventHandler.cpp b/Libraries/LibWeb/Page/EventHandler.cpp index 6acfb870f65..f0e50da35f8 100644 --- a/Libraries/LibWeb/Page/EventHandler.cpp +++ b/Libraries/LibWeb/Page/EventHandler.cpp @@ -98,62 +98,62 @@ static Gfx::Cursor resolve_cursor(Layout::NodeWithStyle const& layout_node, Vect { for (auto const& cursor : cursor_data) { auto result = cursor.visit( - [auto_cursor](CSS::Cursor css_cursor) -> Optional { + [auto_cursor](CSS::CursorPredefined css_cursor) -> Optional { switch (css_cursor) { - case CSS::Cursor::Crosshair: - case CSS::Cursor::Cell: + case CSS::CursorPredefined::Crosshair: + case CSS::CursorPredefined::Cell: return Gfx::StandardCursor::Crosshair; - case CSS::Cursor::Grab: - case CSS::Cursor::Grabbing: + case CSS::CursorPredefined::Grab: + case CSS::CursorPredefined::Grabbing: return Gfx::StandardCursor::Drag; - case CSS::Cursor::Pointer: + case CSS::CursorPredefined::Pointer: return Gfx::StandardCursor::Hand; - case CSS::Cursor::Help: + case CSS::CursorPredefined::Help: return Gfx::StandardCursor::Help; - case CSS::Cursor::None: + case CSS::CursorPredefined::None: return Gfx::StandardCursor::Hidden; - case CSS::Cursor::NotAllowed: + case CSS::CursorPredefined::NotAllowed: return Gfx::StandardCursor::Disallowed; - case CSS::Cursor::Text: - case CSS::Cursor::VerticalText: + case CSS::CursorPredefined::Text: + case CSS::CursorPredefined::VerticalText: return Gfx::StandardCursor::IBeam; - case CSS::Cursor::Move: - case CSS::Cursor::AllScroll: + case CSS::CursorPredefined::Move: + case CSS::CursorPredefined::AllScroll: return Gfx::StandardCursor::Move; - case CSS::Cursor::Progress: - case CSS::Cursor::Wait: + case CSS::CursorPredefined::Progress: + case CSS::CursorPredefined::Wait: return Gfx::StandardCursor::Wait; - case CSS::Cursor::ColResize: + case CSS::CursorPredefined::ColResize: return Gfx::StandardCursor::ResizeColumn; - case CSS::Cursor::EResize: - case CSS::Cursor::WResize: - case CSS::Cursor::EwResize: + case CSS::CursorPredefined::EResize: + case CSS::CursorPredefined::WResize: + case CSS::CursorPredefined::EwResize: return Gfx::StandardCursor::ResizeHorizontal; - case CSS::Cursor::RowResize: + case CSS::CursorPredefined::RowResize: return Gfx::StandardCursor::ResizeRow; - case CSS::Cursor::NResize: - case CSS::Cursor::SResize: - case CSS::Cursor::NsResize: + case CSS::CursorPredefined::NResize: + case CSS::CursorPredefined::SResize: + case CSS::CursorPredefined::NsResize: return Gfx::StandardCursor::ResizeVertical; - case CSS::Cursor::NeResize: - case CSS::Cursor::SwResize: - case CSS::Cursor::NeswResize: + case CSS::CursorPredefined::NeResize: + case CSS::CursorPredefined::SwResize: + case CSS::CursorPredefined::NeswResize: return Gfx::StandardCursor::ResizeDiagonalBLTR; - case CSS::Cursor::NwResize: - case CSS::Cursor::SeResize: - case CSS::Cursor::NwseResize: + case CSS::CursorPredefined::NwResize: + case CSS::CursorPredefined::SeResize: + case CSS::CursorPredefined::NwseResize: return Gfx::StandardCursor::ResizeDiagonalTLBR; - case CSS::Cursor::ZoomIn: - case CSS::Cursor::ZoomOut: + case CSS::CursorPredefined::ZoomIn: + case CSS::CursorPredefined::ZoomOut: return Gfx::StandardCursor::Zoom; - case CSS::Cursor::Auto: + case CSS::CursorPredefined::Auto: return auto_cursor; - case CSS::Cursor::ContextMenu: - case CSS::Cursor::Alias: - case CSS::Cursor::Copy: - case CSS::Cursor::NoDrop: + case CSS::CursorPredefined::ContextMenu: + case CSS::CursorPredefined::Alias: + case CSS::CursorPredefined::Copy: + case CSS::CursorPredefined::NoDrop: // FIXME: No corresponding GFX Standard Cursor, fallthrough to None - case CSS::Cursor::Default: + case CSS::CursorPredefined::Default: default: return Gfx::StandardCursor::None; }