- From: Maciej Stachowiak <mjs@apple.com>
- Date: Fri, 2 May 2008 15:30:25 -0700
- To: John Resig <jresig@mozilla.com>
- Cc: Boris Zbarsky <bzbarsky@MIT.EDU>, public-webapi@w3.org
On May 2, 2008, at 2:15 PM, John Resig wrote:
>
>
> There's a solution to the above that is both simple and intuitive:
> The first character of the selector that the UA doesn't know what to
> do with. For example, in the above, it would be:
>
> :not(a:link)
> ^
> :not|test|
> ^
> :note
> ^
Your proposed "first character of the selector that the UA doesn't
know what to do with" carries a lot of assumptions. For example, it's
not obvious to me why in the second case, | isn't "the first character
the UA doesn't know what to do with". It's also not clear why the
error pointer is not at "a" in the second example, since the whole
subexpression inside :not is what is in error (since it is not a
simple selector).
I think it would be fairly complicated to define a way of reporting a
specific "error character" in the face of varying browser support for
different aspects of selectors. What exactly is the goal? Are you
trying to distinguish real syntax errors from selectors that the UA
doesn't know, but the library does? Or are you trying to find a
reliable way to feature-test for different aspects of selectors up
front?
In the former case, why not just have the library always try to parse
the selector, and if it fails, you know that neither the UA nor the
library could handle it. In the latter case, you could do it like this:
querySelector("a") --> exception means simple element selectors are
not supported, unlikely, but probably means this impl is unusable
querySelector("a > b") --> exception means direct descendant
combinator is not supported
querySelector(":not(a)") --> exception means :not descendant
combinator is not supported
querySelector(":not(a > b)") --> exception means non-simple selectors
inside :not are not supported
I am not entirely sure how this preflighting helps, but perhaps in
some cases, you could arrange to have querySelector do most of the
work for a selector it can't handle, with additional filtering by the
JS library. I think specific capability testing would be more useful
for this than an indicator of the error location.
> You just have to ask yourself "am I use this expression?" if not,
> then it's an error and that's where you mark it. It's
> inconsequential that the useragent supports :not in the :not|test|
> example since not enough information is provided to actually use it.
I'm not sure I understand the distinction. What about this invalid
selector: ":not(a". The error is lack of a close paren. Is the failure
past the a (where you saw the end of the string instead of a close
paren or some other character that would be allowed), or at the a
(since that is the start if the subexpression that did not complete
":not(") or at the colon, since you don't have a full valid :not
expression? I am not sure how to tell. To a Selectors parser this case
is actually no different than your :not(a:link) case, since you push a
":not(" token and then an "a" token and then hit a parse error. But it
is not really the same kind of mistake.
So, in summary, it is pretty complex to define interoperable "first
bad character" error info. And this doesn't even match the way CSS
parsers tend to work. If you build an LALR(1) parser, as with the
reference grammar, the failure is often that it can't combine a
sequence of tokens that are individually valid and the parser doesn't
generally know enough to identify which token was bad. Compare this to
a C compiler. They have basically the same idea of what programs are
valid, but gcc and MSVC will not give you identical column numbers for
errors, even though the C grammar is well-defined. It would take
additional spec language to guarantee that.
We may still be able to help the use case you want handled, but I'd
still like to understand more what you want to do with the error info.
Is it for total library fallback, partial library fallback, or some
other reason?
By the way, I appreciate that you and other JS library authors are
looking at this API and providing feedback. I am inclined to add :-
webkit-scoped support in WebKit's implementation as this would allow a
very easy way to achieve the usual JS library semantics.
Regards,
Maciej
Received on Friday, 2 May 2008 22:31:14 UTC