-
Notifications
You must be signed in to change notification settings - Fork 757
Description
This is a follow-up of #7040, which reports an issue when parsing a whitespace against <media-query-list>.
If I am not mistaken, in @media {}, the input would be the <whitespace-token> between @media and {}.
To parse a
<media-query-list>production, parse a comma-separated list of component values, then parse each entry in the returned list as a<media-query>. Its value is the list of<media-query>s so produced.
https://drafts.csswg.org/mediaqueries-5/#typedef-media-query-list
- Normalize
input, and set input to the result.- Let
groupsbe an empty list.- While
inputis not empty: [...]- Consume a list of component values from
input, with<comma-token>as the stop token, and append the result togroups.- Discard a token from input.
- Return
groups.
https://drafts.csswg.org/css-syntax-3/#parse-a-comma-separated-list-of-component-values
If I am not mistaken, groups contains <whitespace-token> as its unique item, which is parsed against <media-query>, which returns an invalid result.
A media query that does not match the grammar in the previous section must be replaced by not all during parsing.
https://drafts.csswg.org/mediaqueries-5/#error-handling
If I am not mistaken, the invalid result in groups is replaced by not all.
In Chrome/FF:
<style>
@media {} /* Evaluates to true */
</style>
<script>
document.styleSheets[0].cssRules[0].cssText// @media {\n}
</script>Indeed, their behavior conforms to the spec:
Note: This definition of
<media-query-list>parsing intentionally accepts an empty list.
An empty media query list evaluates to true.
Before this resolution to preserve invalid media queries, I would have suggested to parse <media-query-list> with parse a comma-separated list according to a CSS grammar, which handle whitespaces by returning an empty list. But it also replaces comma-separated values by the result from their parse against the given grammar (<media-query>): invalid media queries are lost at this step.
I also feel like whitespaces between an at-rule name and its prelude should be consumed in consume an at-rule (like whitespaces between a declaration name and value), and that the prelude of @media should be defined with <media-query-list>?.