diff --git a/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Libraries/LibWeb/CSS/Parser/Parser.cpp index 9f5b3bcc91a..cf1e4e8593b 100644 --- a/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -441,6 +441,7 @@ Optional Parser::consume_an_at_rule(TokenStream& input, Nested nested .name = ((Token)input.consume_a_token()).at_keyword(), .prelude = {}, .child_rules_and_lists_of_declarations = {}, + .is_block_rule = false, }; // Process input: @@ -479,6 +480,7 @@ Optional Parser::consume_an_at_rule(TokenStream& input, Nested nested // Consume a block from input, and assign the result to rule’s child rules. m_rule_context.append(rule_context_type_for_at_rule(rule.name)); rule.child_rules_and_lists_of_declarations = consume_a_block(input); + rule.is_block_rule = true; m_rule_context.take_last(); // If rule is valid in the current context, return it. Otherwise, return nothing. diff --git a/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp b/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp index 6eb2c69c6c5..d0be36eea6d 100644 --- a/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp @@ -288,7 +288,7 @@ Optional Parser::parse_layer_name(TokenStream& tokens GC::Ptr Parser::convert_to_layer_rule(AtRule const& rule, Nested nested) { // https://drafts.csswg.org/css-cascade-5/#at-layer - if (!rule.child_rules_and_lists_of_declarations.is_empty()) { + if (rule.is_block_rule) { // CSSLayerBlockRule // @layer ? { // diff --git a/Libraries/LibWeb/CSS/Parser/Types.h b/Libraries/LibWeb/CSS/Parser/Types.h index 285c6174f99..c6af2e6b13b 100644 --- a/Libraries/LibWeb/CSS/Parser/Types.h +++ b/Libraries/LibWeb/CSS/Parser/Types.h @@ -31,6 +31,7 @@ struct AtRule { FlyString name; Vector prelude; Vector child_rules_and_lists_of_declarations; + bool is_block_rule { false }; void for_each(AtRuleVisitor&& visit_at_rule, QualifiedRuleVisitor&& visit_qualified_rule, DeclarationVisitor&& visit_declaration) const; void for_each_as_declaration_list(DeclarationVisitor&& visit) const; diff --git a/Tests/LibWeb/Text/expected/css/CSSRule-type.txt b/Tests/LibWeb/Text/expected/css/CSSRule-type.txt index 66077a22f8b..77143fdc295 100644 --- a/Tests/LibWeb/Text/expected/css/CSSRule-type.txt +++ b/Tests/LibWeb/Text/expected/css/CSSRule-type.txt @@ -6,5 +6,5 @@ CSSFontFaceRule type = 5 CSSKeyframesRule type = 7 CSSSupportsRule type = 12 CSSLayerStatementRule type = 0 -CSSLayerStatementRule type = 0 +CSSLayerBlockRule type = 0 CSSPropertyRule type = 0 diff --git a/Tests/LibWeb/Text/expected/wpt-import/css/css-cascade/parsing/layer.txt b/Tests/LibWeb/Text/expected/wpt-import/css/css-cascade/parsing/layer.txt new file mode 100644 index 00000000000..74ac939986d --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/css/css-cascade/parsing/layer.txt @@ -0,0 +1,21 @@ +Harness status: OK + +Found 11 tests + +11 Pass +Pass @layer A; should be a valid rule +Pass @layer A, B, C; should be a valid rule +Pass @layer A.A; should be a valid rule +Pass @layer A, B.C.D, C; should be a valid rule +Pass @layer; should be an invalid rule +Pass @layer A . A; should be an invalid rule +Pass @layer { +} should be a valid rule +Pass @layer A { +} should be a valid rule +Pass @layer A.B { +} should be a valid rule +Pass @layer A . B { +} should be an invalid rule +Pass @layer A, B, C { +} should be an invalid rule \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/wpt-import/css/css-cascade/parsing/layer.html b/Tests/LibWeb/Text/input/wpt-import/css/css-cascade/parsing/layer.html new file mode 100644 index 00000000000..0367725145a --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/css/css-cascade/parsing/layer.html @@ -0,0 +1,25 @@ + + +@layer rule parsing / serialization + + + + + + +