Re: [css3-mediaqueries][cssom] Empty media queries in stylesheets and the DOM

On Thursday 2010-04-15 00:49 +0000, Sylvain Galineau wrote:
> It is unclear whether the second statement means a) that this:
> 
>    @media { ... }
> 
> ...is equivalent to:
> 
>    @media all { ... } 
> 
> ...or b) whether it only means that:
> 
>    @media (orientation:portrait) { ... }
> 
> ...is equivalent to:
> 
>    @media all and (orientation:portrait) { ... }
> 
> ...but that @media { ... } is otherwise invalid.

As I mentioned in
http://lists.w3.org/Archives/Public/www-style/2010Apr/0512.html , we
resolved in
http://lists.w3.org/Archives/Public/www-style/2009Aug/0128.html that
an empty media query list is equivalent to 'all', but that some
users of media queries can forbid empty lists, and @media is one of
those users.

(The minutes weren't all that clear, but I implemented the change
that day based on what we discussed, perhaps even during the
telecon, and then forgot to get the change landed... it's now
https://bugzilla.mozilla.org/show_bug.cgi?id=561580 .)

As Daniel pointed out in today's telecon, we also need to specify
whether that restriction for @media is syntactic (something enforced
only at parse time) or dynamic (something that's also enforced after
mutation of the media list is mutated via the object model).  I
believe Daniel said that it should be syntactic (a parse time check
only), which happens to be what I implemented.  I also agree that
this is the right thing (presuming we want this restriction on
@media at all); I would not want to have to implement dynamic
enforcement of this restriction, while enforcing it syntactically is
a one line code change (see the patch in the above bug).  However,
it would mean that an @media rule all of whose media had been
removed dynamically would have to be serialized as @media all, a
slight quirk.

I'd also be happy just allowing @media {} (and throwing away the
patch in that bug).

> On my Win7 laptop, Firefox 3.6.3 and Opera 10.51 treat @media {...}  like 
> @media all { ... }. Safari 4.0.3 and Chrome 4.1 ignore the @media rule.
> 
> As it is currently specified, however, Safari and Chrome comply
> with the media query syntax defined in CSS2.1[2] and CSS3 Media
> Queries[3], where both the media_list (2.1) and media_query_list
> (CSS3) productions require at least one media type/medium IDENT.
> 
> Things get more confusing at the DOM level. 
> 
> If one specifies an @media all {...} rule and then removes the
> 'all' medium using MediaList.deleteMedium()[4], Firefox then
> returns 'not all' for MediaList.mediaText. 
> 
> Consistent with this media query value, the content of the @media
> rule no longer applies and the relevant elements' style is updated
> accordingly. 

This is related to our handling of the combination of these two
statements in section 3.1 of media queries
http://www.w3.org/TR/2009/CR-css3-mediaqueries-20090915/#error-handling :

Statement 1:
  # * Unknown media features. User agents are to ignore a media
  #   query when one of the specified media features is unknown.
  # [...]
  # * Unknown media feature values. As with unknown media features,
  #   user agents are to ignore a media query when one of the
  #   specified media feature values is unknown.

Statement 2:
  # When all media queries in a media query list are ignored it is
  # the same as if "not all" was specified.

I implemented this by recording in a media query list whether it had
any queries in it (ignored or not), which leads to the bad side
effect that you mention: once a media query is non-empty, it becomes
impossible to empty it back to being equivalent to 'all'.


I think the object model handling here would be much more sensible
if statement 2 were changed to say that *each* media query in a
media query list that is ignored is treated as 'not all', and
replaced in the object model by 'not all'.

Then the emptiness check for media query lists can be made using
only information that is represented in the object model rather than
requiring hidden information (whether any media queries were
ignored) that is not in the object model.


> In this same case, Opera returns an empty string for the mediaText
> property, and, consistent with its handling of @media {...}, still
> applies the styles defined in the rule.
> 
> Safari and Chrome return the empty string but do not refresh the
> styles originally applied by the @media all {...} rule (although I
> haven't verified whether that is true for all properties).

What do you mean by "do not refresh"?  How is this different from
what Opera does?

-David

-- 
L. David Baron                                 http://dbaron.org/
Mozilla Corporation                       http://www.mozilla.com/

Received on Wednesday, 28 April 2010 17:51:23 UTC