Re: [selectors] Case-sensitivity of type and attribute selectors

On 11/28/12 7:58 PM, Tab Atkins Jr. wrote:
> In particular, it appears that FF's behavior is to do a
> case-insensitive comparison if the element is in the HTML namespace,
> and case-sensitive otherwise.

I'm not sure how you tested this, exactly, but that's not correct.

The exact behavior of Firefox for type selectors is as follows:

1)  Store both the original casing of the type and the ASCII-lowercased
     version when parsing the CSS selector.
2)  When matching, if the element is an HTML element in an HTML
     document (so the namespace is http://www.w3.org/1999/xhtml and the
     document is text/html, to a first approximation) the element's
     localName is compared to the ASCII-lowercased type selector.
     Otherwise it's compared to the original-case type selector.

This allows us to do the right thing with SVG, and with the common case 
of HTML elements, because they end up with all-lowercase localNames from 
the parser, while not having to deal with the slowness that is actual 
case-folding at matching time.  The one drawback is that elements in the 
HTML namespace in an HTML document that don't have all-lowercase 
localNames become impossible to match.  But it was judged that this edge 
case was acceptable.

Note that this behavior matches the behavior of getElementsByTagName, as 
specified at 
<http://www.w3.org/TR/domcore/#concept-getelementsbytagname>.  Indeed, 
that's where the initial discussion about this happened.  See thread 
leading to http://lists.w3.org/Archives/Public/public-html/2009Apr/0080.html

You can detect the difference between this behavior and what you 
described (and what seems to be specified at 
<http://www.whatwg.org/specs/web-apps/current-work/multipage/selectors.html#selectors>) 
by doing something like this:

<style>div { color: green; }</style>
<body>
   <script>
   var div =
      document.createElementNS("http://www.w3.org/1999/xhtml", "DIV");
   div.textContent = "Am I green?";
   document.body.appendChild(div);
   </script>
</body>

 > Opera is always case-insensitive.

The testcase above shows that this is not true... at least not in the 
Opera I have here.

> WK's behavior is broken in the case of SVG elements, since some of
> them have canonical names with uppercase in them.

Indeed.  See thread linked to above.

> What should the correct behavior be?

See above.  ;)

-Boris

Received on Thursday, 29 November 2012 04:32:21 UTC