From 3e9cdb2cf4e42952a28ed40b2d74be5d8dff377d Mon Sep 17 00:00:00 2001 From: Callum Law Date: Sat, 7 Feb 2026 21:40:54 +1300 Subject: [PATCH] LibWeb: Store whether sheet being parsed is a UA stylesheet UA stylesheets allow some things that regular stylesheets don't, for instance allowing use of "non-overridable" `@counter-style` names. --- Libraries/LibWeb/CSS/Parser/Parser.cpp | 7 +++++++ Libraries/LibWeb/CSS/Parser/Parser.h | 8 ++++++++ Libraries/LibWeb/CSS/StyleScope.cpp | 8 ++++---- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Libraries/LibWeb/CSS/Parser/Parser.cpp index 740e5d128b1..6f913c25b35 100644 --- a/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -50,6 +50,12 @@ ParsingParams::ParsingParams(JS::Realm& realm, ParsingMode mode) { } +ParsingParams::ParsingParams(JS::Realm& realm, IsUAStyleSheet is_ua_style_sheet) + : realm(realm) + , is_ua_style_sheet(is_ua_style_sheet) +{ +} + ParsingParams::ParsingParams(DOM::Document const& document, ParsingMode mode) : realm(const_cast(document.realm())) , document(&document) @@ -67,6 +73,7 @@ Parser::Parser(ParsingParams const& context, Vector tokens) : m_document(context.document) , m_realm(context.realm) , m_parsing_mode(context.mode) + , m_is_ua_style_sheet(context.is_ua_style_sheet) , m_tokens(move(tokens)) , m_token_stream(m_tokens) , m_value_context(move(context.value_context)) diff --git a/Libraries/LibWeb/CSS/Parser/Parser.h b/Libraries/LibWeb/CSS/Parser/Parser.h index 51c4ed06cc0..289184206f0 100644 --- a/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Libraries/LibWeb/CSS/Parser/Parser.h @@ -92,14 +92,21 @@ enum class ParsingMode { SVGPresentationAttribute, // See https://svgwg.org/svg2-draft/types.html#presentation-attribute-css-value }; +enum class IsUAStyleSheet { + Yes, + No, +}; + struct ParsingParams { explicit ParsingParams(ParsingMode = ParsingMode::Normal); explicit ParsingParams(JS::Realm&, ParsingMode = ParsingMode::Normal); + explicit ParsingParams(JS::Realm&, IsUAStyleSheet); explicit ParsingParams(DOM::Document const&, ParsingMode = ParsingMode::Normal); GC::Ptr realm; GC::Ptr document; ParsingMode mode { ParsingMode::Normal }; + IsUAStyleSheet is_ua_style_sheet { IsUAStyleSheet::No }; Vector value_context; Vector rule_context; @@ -599,6 +606,7 @@ private: GC::Ptr m_document; GC::Ptr m_realm; ParsingMode m_parsing_mode { ParsingMode::Normal }; + IsUAStyleSheet m_is_ua_style_sheet { IsUAStyleSheet::No }; Vector m_tokens; TokenStream m_token_stream; diff --git a/Libraries/LibWeb/CSS/StyleScope.cpp b/Libraries/LibWeb/CSS/StyleScope.cpp index 16653cc8b5d..fa0cc8798e3 100644 --- a/Libraries/LibWeb/CSS/StyleScope.cpp +++ b/Libraries/LibWeb/CSS/StyleScope.cpp @@ -142,7 +142,7 @@ static CSSStyleSheet& default_stylesheet() static GC::Root sheet; if (!sheet.cell()) { extern String default_stylesheet_source; - sheet = GC::make_root(parse_css_stylesheet(CSS::Parser::ParsingParams(internal_css_realm()), default_stylesheet_source)); + sheet = GC::make_root(parse_css_stylesheet(CSS::Parser::ParsingParams(internal_css_realm(), Parser::IsUAStyleSheet::Yes), default_stylesheet_source)); } return *sheet; } @@ -152,7 +152,7 @@ static CSSStyleSheet& quirks_mode_stylesheet() static GC::Root sheet; if (!sheet.cell()) { extern String quirks_mode_stylesheet_source; - sheet = GC::make_root(parse_css_stylesheet(CSS::Parser::ParsingParams(internal_css_realm()), quirks_mode_stylesheet_source)); + sheet = GC::make_root(parse_css_stylesheet(CSS::Parser::ParsingParams(internal_css_realm(), Parser::IsUAStyleSheet::Yes), quirks_mode_stylesheet_source)); } return *sheet; } @@ -162,7 +162,7 @@ static CSSStyleSheet& mathml_stylesheet() static GC::Root sheet; if (!sheet.cell()) { extern String mathml_stylesheet_source; - sheet = GC::make_root(parse_css_stylesheet(CSS::Parser::ParsingParams(internal_css_realm()), mathml_stylesheet_source)); + sheet = GC::make_root(parse_css_stylesheet(CSS::Parser::ParsingParams(internal_css_realm(), Parser::IsUAStyleSheet::Yes), mathml_stylesheet_source)); } return *sheet; } @@ -172,7 +172,7 @@ static CSSStyleSheet& svg_stylesheet() static GC::Root sheet; if (!sheet.cell()) { extern String svg_stylesheet_source; - sheet = GC::make_root(parse_css_stylesheet(CSS::Parser::ParsingParams(internal_css_realm()), svg_stylesheet_source)); + sheet = GC::make_root(parse_css_stylesheet(CSS::Parser::ParsingParams(internal_css_realm(), Parser::IsUAStyleSheet::Yes), svg_stylesheet_source)); } return *sheet; }