- From: Kang-Hao (Kenny) Lu <kennyluck@csail.mit.edu>
- Date: Wed, 23 May 2012 04:47:31 +0800
- To: WWW Style <www-style@w3.org>
My reading of the current grammar
# media_query
# : [ONLY | NOT]? S* media_type S* [ AND S* expression ]*
# | expression [ AND S* expression ]*
# ;
# media_type
# : IDENT
# ;
suggests that "not", "only" and "and" can be used as media_type and
therefore the following are all valid: "not and (width)", "not not",
"not and and (width)". However, no browser implements this. Here are
some options:
A. Change the spec: "not" and "only" as media_type cannot be valid
unless it's preceded by "not" or "only".
== valid ==
and [ and (expr) ]*
[ not | only ] [ not | only | and ] [ and (expr) ]*
== invalid ==
[ not | only ] [ and (expr) ]*
Firefox12 and IE9 implement this. I probably support this. If we had
started writing this section using a state machine-based instead of a
rule-based approach, we would have been closer to this, I think.
I think I support this. The concrete proposal is to change
# media_query
# : [ONLY | NOT]? S* media_type S* [ AND S* expression ]*
# | expression [ AND S* expression ]*
# ;
# media_type
# : IDENT
# ;
to
| media_query
| : [ONLY | NOT] S* media_type S* [ AND S* expression ]*
| | media_type_no_keywords S* [ AND S* expression ]*
| | expression [ AND S* expression ]*
| ;
| media_type
| : IDENT
| ;
| /*
| * There is a constraint on it that it must not be {O}{N}{L}{Y} or
| * {N}{O}{T}
| */
| media_type_no_keywords
| : IDENT
| ;
B. Don't change the spec (besides perhaps add some test cases to the
test suite)
== valid ==
and [ and (expr) ]*
[ not | only ] [ not | only | and ] [ and (expr) ]*
[ not | only ] [ and (expr) ]*
== invalid ==
This is actually implementable (I have a patch for Gecko[1], though the
code is admittedly quite crappy.).
C. Change the spec: "not", "only" and "and" cannot be media_type.
== valid ==
== invalid ==
and [ and (expr) ]*
[ not | only ] [ not | only | and ] [ and (expr) ]*
[ not | only ] [ and (expr) ]*
Chromium nightly and Opera12alpha implement this. I am slightly opposed
to this because, for the majority of normal cases, an extra check to see
if it's "and" is required.
I should note that while some of these are only observable via CSSOM,
the ones starting with "not" can be observed without scripts, say:
data:text/html,<style>@media not not {:root{background: green;}}</style>
data:text/html,<style>@media not and and (width) {:root{background:
green;}}</style>
[1] https://bugzilla.mozilla.org/show_bug.cgi?id=757554#c3
Cheers,
Kenny
Received on Tuesday, 22 May 2012 20:48:15 UTC