- From: Simon Sapin <simon.sapin@kozea.fr>
- Date: Mon, 28 Jan 2013 17:56:10 +0100
- To: "Tab Atkins Jr." <jackalmage@gmail.com>
- CC: www-style list <www-style@w3.org>
Le 28/01/2013 17:18, Tab Atkins Jr. a écrit :
> On Mon, Jan 28, 2013 at 4:20 AM, Simon Sapin <simon.sapin@kozea.fr> wrote:
>> data:text/html,<p style="color:red;};color:green">test
>>
>> Green in Firefox and IE, red in Chrome and Opera.
>>
>> [...]
>
> Right. WebKit parses it by just wrapping it in, iirc, "@-webkit-rule
> {}" and parsing it as a stylesheet, then extracting the resulting
> declarations. That's why we stop on the } - it looks like it's
> closing the at-rule.
>
> I know we just got two impls agreeing on this, which let us advance
> the Style Attr spec, but still. :/ It's not a hard change to the
> parser, it just's the only thing I know of so far that varies based on
> entry point. (But see below, I guess.)
I don’t think stopping or not stopping at } in a style attr is compat
problem either way. Not stopping makes more sense IMO (there is no
matching { token) but I would not object to stopping.
>>>> Similarly, for a single declaration, a ; token does not end the
>>>> declaration.
>>>
>>> What do you mean by "does not end the declaration"? It looks like
>>> top-level ; tokens aren't allowed in @supports conditions, and I don't
>>> see how they'd be allowed anywhere else that wants to take a single
>>> decl in the future. I'd prefer to just say that it's a syntax error
>>> if the decl is appended or unset before the token stream is fully
>>> consumed.
>>
>> Ok, that would work too. But it’s still different from "append the
>> declaration to the current rule and switch …" etc, so the state machine
>> still has to be adapted.
>
> Yeah, you're right, it would need a parser change to work well. Darn,
> that's two instances, which makes it worthwhile to add the change.
Or, as I said in another branch of the thread, just redefine "a single
declaration that can not be made important" separately. It’s pretty simple:
ws* ident ws* ':' (any primitive except delim(!))*
Or maybe:
ws* ident ws* ':' (any primitive except delim(!))+
Grammar mismatch means invalid declaration, no error recovery needed.
(It could be written as a state machine if you prefer that to a grammar.)
>> Hopefully, the syntax in selectors4 will be defined in terms of such
>> primitives rather than have its own tokenizer.
>
> It already is. No spec has ever tried to redo tokenization.
http://www.w3.org/TR/css3-selectors/#lex defines a tokenizer that is not
quite the same as CSS 2.1. It has no delim or unicode-range tokens but
has PREFIXMATCH, COMMA, and a few others.
>> Error handling in selectors is easy: the whole selector list is invalid. I’m
>> not sure about media queries…
>>
>> data:text/html,<style>@media ], all{body{background:green
>>
>> (Green in Firefox, Opera and IE, not in Chrome.)
>
> Chrome's wrong here - a syntax error in a MQ list just falsifies the
> MQ, but leaves the rest of the list alone.
>
> I suppose I can do another parsing function, in addition to the "list
> of primitives" one you outline above, which is more similar to
> function parsing: break the list by top-level commas, and the value of
> each entry is either a list of primitives or a syntax error.
I don’t really like it, but another option is to make bad-string and
bad-url preserved tokens so that ( { [ and function are the only
non-preserved tokens, and "consume a primitive" never fails.
It’s up to selectors, MQs, etc. to define their error handling for
tokens such as bad-string, ] or cdo.
Maybe it’s not such a bad idea after all.
--
Simon Sapin
Received on Monday, 28 January 2013 16:56:43 UTC