diff --git a/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp b/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp index 56586fcaf07..c5e20554b95 100644 --- a/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp @@ -561,6 +561,15 @@ Optional Parser::parse_media_feature_value(MediaFeatureID med GC::Ptr Parser::convert_to_media_rule(AtRule const& rule, Nested nested) { + // https://drafts.csswg.org/css-conditional-3/#at-media + // @media { + // + // } + if (!rule.is_block_rule) { + dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @media rule: Expected a block."); + return nullptr; + } + auto media_query_tokens = TokenStream { rule.prelude }; auto media_query_list = parse_a_media_query_list(media_query_tokens); auto media_list = MediaList::create(realm(), move(media_query_list)); diff --git a/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp b/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp index 5f0a84da3d9..7dcc220d08c 100644 --- a/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp @@ -190,14 +190,13 @@ GC::Ptr Parser::convert_to_import_rule(AtRule const& rule) // // = [ supports( [ | ] ) ]? // ? - - if (rule.prelude.is_empty()) { - dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @import rule: Empty prelude."); + if (rule.is_block_rule) { + dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @import rule: Block is not allowed."); return {}; } - if (rule.is_block_rule) { - dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @import rule: Block is not allowed."); + if (rule.prelude.is_empty()) { + dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @import rule: Empty prelude."); return {}; } @@ -365,14 +364,16 @@ GC::Ptr Parser::convert_to_keyframes_rule(AtRule const& rule) // = | // = # { } // = from | to | + if (!rule.is_block_rule) { + dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @keyframes rule: Expected a block."); + return nullptr; + } if (rule.prelude.is_empty()) { dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @keyframes rule: Empty prelude."); return {}; } - // FIXME: Is there some way of detecting if there is a block or not? - auto prelude_stream = TokenStream { rule.prelude }; prelude_stream.discard_whitespace(); auto& token = prelude_stream.consume_a_token(); @@ -464,14 +465,13 @@ GC::Ptr Parser::convert_to_namespace_rule(AtRule const& rule) // https://drafts.csswg.org/css-namespaces/#syntax // @namespace ? [ | ] ; // = - - if (rule.prelude.is_empty()) { - dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @namespace rule: Empty prelude."); + if (rule.is_block_rule) { + dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @namespace rule: Block is not allowed."); return {}; } - if (rule.is_block_rule) { - dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @namespace rule: Block is not allowed."); + if (rule.prelude.is_empty()) { + dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @namespace rule: Empty prelude."); return {}; } @@ -515,6 +515,10 @@ GC::Ptr Parser::convert_to_supports_rule(AtRule const& rule, Ne // @supports { // // } + if (!rule.is_block_rule) { + dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @supports rule: Expected a block."); + return {}; + } if (rule.prelude.is_empty()) { dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @supports rule: Empty prelude."); @@ -553,6 +557,10 @@ GC::Ptr Parser::convert_to_property_rule(AtRule const& rule) // @property { // // } + if (!rule.is_block_rule) { + dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @property rule: Expected a block."); + return {}; + } if (rule.prelude.is_empty()) { dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @property rule: Empty prelude."); @@ -629,6 +637,11 @@ GC::Ptr Parser::convert_to_property_rule(AtRule const& rule) GC::Ptr Parser::convert_to_font_face_rule(AtRule const& rule) { // https://drafts.csswg.org/css-fonts/#font-face-rule + if (!rule.is_block_rule) { + dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @font-face rule: Expected a block."); + return nullptr; + } + DescriptorList descriptors { AtRuleID::FontFace }; rule.for_each_as_declaration_list([&](auto& declaration) { if (auto descriptor = convert_to_descriptor(AtRuleID::FontFace, declaration); descriptor.has_value()) { @@ -643,6 +656,11 @@ GC::Ptr Parser::convert_to_page_rule(AtRule const& page_rule) { // https://drafts.csswg.org/css-page-3/#syntax-page-selector // @page = @page ? { } + if (!page_rule.is_block_rule) { + dbgln_if(CSS_PARSER_DEBUG, "Failed to parse @property rule: Expected a block."); + return nullptr; + } + TokenStream tokens { page_rule.prelude }; auto page_selectors = parse_a_page_selector_list(tokens); if (page_selectors.is_error()) @@ -672,6 +690,11 @@ GC::Ptr Parser::convert_to_page_rule(AtRule const& page_rule) GC::Ptr Parser::convert_to_margin_rule(AtRule const& rule) { + if (!rule.is_block_rule) { + dbgln_if(CSS_PARSER_DEBUG, "Failed to parse margin rule @{}: Expected a block.", rule.name); + return nullptr; + } + // https://drafts.csswg.org/css-page-3/#syntax-page-selector // There are lots of these, but they're all in the format: // @foo = @foo { }; diff --git a/Tests/LibWeb/Ref/expected/wpt-import/css/CSS2/reference/ref-this-text-should-be-green.xht b/Tests/LibWeb/Ref/expected/wpt-import/css/CSS2/reference/ref-this-text-should-be-green.xht new file mode 100644 index 00000000000..29fe1d8e47c --- /dev/null +++ b/Tests/LibWeb/Ref/expected/wpt-import/css/CSS2/reference/ref-this-text-should-be-green.xht @@ -0,0 +1,22 @@ + + + + + + + CSS Reftest Reference + + + + + + + + + +

This text should be green.

+ + + \ No newline at end of file diff --git a/Tests/LibWeb/Ref/input/wpt-import/css/CSS2/cascade/at-import-009.xht b/Tests/LibWeb/Ref/input/wpt-import/css/CSS2/cascade/at-import-009.xht new file mode 100644 index 00000000000..e8ec6fab3b5 --- /dev/null +++ b/Tests/LibWeb/Ref/input/wpt-import/css/CSS2/cascade/at-import-009.xht @@ -0,0 +1,20 @@ + + + + CSS Test: @import following a known but invalid @rule + + + + + + + + +

This text should be green.

+ + diff --git a/Tests/LibWeb/Ref/input/wpt-import/css/CSS2/cascade/support/import-green.css b/Tests/LibWeb/Ref/input/wpt-import/css/CSS2/cascade/support/import-green.css new file mode 100644 index 00000000000..537104e6633 --- /dev/null +++ b/Tests/LibWeb/Ref/input/wpt-import/css/CSS2/cascade/support/import-green.css @@ -0,0 +1 @@ +.import { color: green; } diff --git a/Tests/LibWeb/Text/expected/wpt-import/css/css-conditional/js/conditional-CSSGroupingRule.txt b/Tests/LibWeb/Text/expected/wpt-import/css/css-conditional/js/conditional-CSSGroupingRule.txt index 482273bec5c..1e3b1c18d61 100644 --- a/Tests/LibWeb/Text/expected/wpt-import/css/css-conditional/js/conditional-CSSGroupingRule.txt +++ b/Tests/LibWeb/Text/expected/wpt-import/css/css-conditional/js/conditional-CSSGroupingRule.txt @@ -2,8 +2,7 @@ Harness status: OK Found 34 tests -32 Pass -2 Fail +34 Pass Pass @media is CSSGroupingRule Pass @media rule type Pass Empty @media rule length @@ -12,7 +11,7 @@ Pass insertRule into empty @media at bad index Pass insertRule into @media updates length Pass insertRule of valid @media into @media Pass insertRule of valid style rule into @media -Fail insertRule of invalid @media into @media +Pass insertRule of invalid @media into @media Pass insertRule of empty string into @media Pass insertRule of valid @media rule followed by garbage into @media Pass insertRule of valid style rule followed by garbage into @media @@ -29,7 +28,7 @@ Pass insertRule into empty @supports at bad index Pass insertRule into @supports updates length Pass insertRule of valid @media into @supports Pass insertRule of valid style rule into @supports -Fail insertRule of invalid @media into @supports +Pass insertRule of invalid @media into @supports Pass insertRule of empty string into @supports Pass insertRule of valid @media rule followed by garbage into @supports Pass insertRule of valid style rule followed by garbage into @supports