LibWeb: Disallow trailing tokens in @supports(<declaration>)

This commit is contained in:
Callum Law 2025-06-21 00:46:06 +12:00 committed by Tim Ledbetter
commit d7036daa89
Notes: github-actions[bot] 2025-06-21 10:50:48 +00:00
5 changed files with 113 additions and 1 deletions

View file

@ -291,7 +291,7 @@ OwnPtr<BooleanExpression> Parser::parse_supports_feature(TokenStream<ComponentVa
if (first_token.is_block() && first_token.block().is_paren()) {
TokenStream block_tokens { first_token.block().value };
// FIXME: Parsing and then converting back to a string is weird.
if (auto declaration = consume_a_declaration(block_tokens); declaration.has_value()) {
if (auto declaration = consume_a_declaration(block_tokens); declaration.has_value() && !block_tokens.has_next_token()) {
transaction.commit();
auto supports_declaration = Supports::Declaration::create(
declaration->to_string(),

View file

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<style>
div {
width: 100px;
height: 100px;
background-color: green;
}
</style>
<p>
Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.
</p>
<div></div>
</html>

View file

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<style>
div {
width: 100px;
height: 100px;
background-color: green;
}
</style>
<p>
Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.
</p>
<div></div>
</html>

View file

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Test (Conditional Rules): a supports condition declaration can not end with a semi-colon</title>
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
<link rel="help" href="http://www.w3.org/TR/css3-conditional/#at-supports" title="6. Feature queries: the '@supports' rule">
<link rel="match" href="../../../../expected/wpt-import/css/css-conditional/at-supports-001-ref.html">
<meta name="flags" content="invalid">
<meta name="assert" content="Each individual single supports condition declaration can not end up with a semi-colon ';'. A semi-colon is a punctuation separator of multiple CSS declarations and thus is not part of an individual CSS declaration per se.">
<!--
supports_condition_in_parens
: ( '(' S* supports_condition ')' S* ) | supports_declaration_condition |
general_enclosed
;
-->
<style>
div
{
background-color: red;
height: 100px;
width: 100px;
}
@supports (margin: 0;) { div {background-color: red !important;} }
@supports (margin: 0) { div {background-color: green;} }
</style>
</head>
<body>
<p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
<div></div>
</body>
</html>

View file

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Test (Conditional Rules): a supports condition declaration can not end with a semi-colon</title>
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
<link rel="help" href="http://www.w3.org/TR/css3-conditional/#at-supports" title="6. Feature queries: the '@supports' rule">
<link rel="match" href="../../../../expected/wpt-import/css/css-conditional/at-supports-001-ref.html">
<meta name="flags" content="invalid">
<meta name="assert" content="Each individual single supports condition declaration can not end up with a semi-colon ';'. A semi-colon is a punctuation separator of multiple CSS declarations and thus is not part of an individual CSS declaration per se.">
<!--
supports_condition_in_parens
: ( '(' S* supports_condition ')' S* ) | supports_declaration_condition |
general_enclosed
;
-->
<style>
div
{
background-color: red;
height: 100px;
width: 100px;
}
@supports (margin: 0) { div {background-color: green;} }
@supports (margin: 0;) { div {background-color: red;} }
</style>
</head>
<body>
<p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
<div></div>
</body>
</html>