
[1]
[[WinIE 6]] は、[[選択子]]に構文的に未対応なものが含まれていると、[[選択子]] (の[[群]]) 全体、つまり [CODE(CSS)@en[[[selectorText]]]] を
[CODE(CSS)@en[[[UNKNOWN]]]] に置き換え (て [[CSSOM]] の一部に含め) ます。
([[名無しさん]])

[2]
[[WinIE 6]] は、未対応の[[擬似クラス]]を [CODE(CSS)@en[:[[unknown]]]] に置き換え (て [[CSSOM]] の一部に含め) ます。

[PRE(CSS bad example code)[
a:xxxx, b { color: red }
]PRE]

では、 [[CSS 2.1]] 的には[[宣言ブロック]]全体が無視されるべきですが、
[[WinIE 6]] では [CODE(HTMLe)@en[[[b]]]] が[[赤]]くなります。
([[名無しさん]])

[3]
[[WinIE 6]] は、未対応の[[擬似クラス]]を [CODE(CSS)@en[:[[unknown]]]] に置き換え (て [[CSSOM]] の一部に含め) ます。

[PRE(CSS bad example code)[
a:xxxx, b { color: red }
]PRE]

では、 [[CSS 2.1]] 的には[[宣言ブロック]]全体が無視されるべきですが、
[[WinIE 6]] では [CODE(HTMLe)@en[[[b]]]] が[[赤]]くなります。
([[名無しさん]])

[4]
[[WinIE 6]] の [CODE(DOMa)@en[[[selectorText]]]] 決定[[算法]]:
= [[字句化]]し、[[正規化]]する。例えば [[escape]] を[[復号]]する。
[CODE(charname)@en[[[NULL]]]] は除去する ([[CSSの字句化]]を参照)。
== ここで、 [CODE(CSS)@en[\:]] は [[escape]] されたままとする。
なお、 [CODE(CSS)@en[\00003a]] は [CODE(CSS)@en[:]]
に[[復号]]するし、 [CODE(CSS)@en[\\\00003a]] と前者は同じではない。
= 前項で得られた[[字句]]列が、[[選択子群]]全体として ([[WinIE 6]] が理解できる) 構文に適合するかを調べる。適合しなければ、 [CODE(CSS)@en[[[UNKNOWN]]]] を返す。
== 前項で残した [CODE(CSS)@en[\:]] は、
[[型選択子]]中の先頭以外の場所に高々1回だけ出現できる。
それ以外に出現するなら不適合。
= 各[[単純選択子列]]について、
== [[普遍選択子]]があれば、除去する。
=== [[普遍選択子]]が[[選択子群]]に含まれる唯一の構成要素なら、[[空文字列]]になる。
== [[型選択子]]が既知の [[HTML]] [[要素型名]]なら、[[大文字]]に変換する。
=== ただし、 (少なくても) [CODE(HTMLe)@en[[[xml]]]] は[[大文字]]に変換しない。
=== [CODE(HTMLe)@en[[[abbr]]]] は未知。 [CODE(HTMLe)@en[[[q]]]]
は未知。[CODE(HTMLe)@en[[[isindex]]]], [CODE(HTMLe)@en[[[rt]]]], [CODE(HTMLe)@en[[[comment]]]] は既知、
[CODE(HTMLe)@en[[[rb]]]] は未知。[CODE(HTMLe)@en[[[image]]]] は
[CODE(CSS)@en[[[IMG]]]] に変換される。
== [[クラス選択子]]が複数あれば、最後に指定されたもののみを残して除去する。
== [[識別子選択子]]が複数あれば、最後に指定されたもののみを残して除去する。
== 既知の[[擬似クラス]]が複数あれば、最後に指定されたもののみを残して除去する。
== 未知の[[擬似クラス]]や[[擬似クラス]] ([CODE(CSS)@en[[[:]]]] とその後に続く [CODE(CSS)@en[[[IDENT]]]] または [CODE(CSS)@en[[[:]]]] のみ) は未知なら[CODE(CSS)@en[:[[unknown]]]] に置き換える。
=== 例えば [CODE(CSS)@en[::[[first-letter]]]] は
[CODE(CSS)@en[:]] と [CODE(CSS)@en[:[[first-letter]]]]
の連続とみなされ、前者は [CODE(CSS)@en[:[[unknown]]]] と解釈され、
それが後者により上書きされ、結局 [CODE(CSS)@en[:[[first-letter]]]]
になる。
=== ただし、 [CODE(CSS)@en[:]] が[[単純選択子列]]の末尾に来るのはこの[[算法]]全体の2項目の場合に該当し、[[選択子群]]全体が [CODE(CSS)@en[[[UNKNOWN]]]] となる。
=== [[擬似要素]]は[[単純選択子列]]や[[選択子]]の末尾でなくても構わない。
== 以上で残ったものを、[[型選択子]]、[[クラス選択子]]、[[識別子選択子]]、既知の[[擬似クラス]]、未知の[[擬似クラス]]・[[擬似要素]]の順に並べる。
== 前項の結果を返す。

([[名無しさん]])

[5]
[[Firefox]] 1.5, 2 は [CODE(CSS)@en[@[[namespace]]]] が使われていて
[CODE(DOMa)@en[[[selectorText]]]] の[[型選択子]]に[[名前空間接頭辞]]を付ける場合、
なぜか [CODE(CSS)@en[:[[not]]()]] [[擬似クラス]]にも[[名前空間接頭辞]]を付けます。
他の[[擬似クラス]]の場合にはつけないようですし、
[[括弧]]の中身にも関係無しに付けるようです
([[括弧]]の中に[[型選択子]]があれば、それにもちゃんと[[名前空間接頭辞]]をつけます)。
([[名無しさん]])

[6]
[[Opera]] 9 は[[普遍選択子]]が明示的または暗示的に用いられている場合 (明示的に用いられていても、それが唯一の{[[単純選択子]]|[[擬似要素]]}である場合以外、 [CODE(DOMa)@en[[[selectorText]]]] には現れません。) で、
[CODE(CSS)@en[@[[namespace]]]] が使われていて[[型選択子]]等に[[名前空間接頭辞]]を付ける場合、省略されている[[普遍選択子]]には
[CODE(CSS)[|]] だけをつけます。例えば、
[PRE(CSS example code)[
@namespace 'http://www.example.com/';
.a {}
]PRE]

だと
[PRE(CSS example code illegal)[
|.a {  }
]PRE]

になります。

([[名無しさん]])

[7]
>>6 [[Firefox]] 2 も同じで、こちらは[[普遍選択子]]を省略しないので、
[PRE(CSS illegal example code)[
*|.a {  }
]PRE]

になります。
([[名無しさん]])

[8]
[[WinIE 6]] は、未対応の[[擬似クラス]]を [CODE(CSS)@en[:[[unknown]]]] に置き換え (て [[CSSOM]] の一部に含め) ます。

[PRE(CSS bad example code)[
a:xxxx, b { color: red }
]PRE]

では、 [[CSS 2.1]] 的には[[宣言ブロック]]全体が無視されるべきですが、
[[WinIE 6]] では [CODE(HTMLe)@en[[[b]]]] が[[赤]]くなります。
([[名無しさん]])

[9]
[[Firefox]] 2 の [CODE(DOMa)@en[[[selectorText]]]]:
- <http://suika.fam.cx/gate/2007/cssom/viewer?c=%5C%3A%20%7B%0A%20%20color%3A%20red%3B%0A%7D;h=%3Cp%3EAAAA%3C%2Fa%3E;p=n;x=style-element> → [CODE(CSS)@en[*::]]
- <http://suika.fam.cx/gate/2007/cssom/viewer?c=a%5C%3A%20%7B%0A%20%20color%3A%20red%3B%0A%7D;h=%3Cp%3EAAAA%3C%2Fa%3E;p=n;x=style-element>
→ [CODE(CSS)@en[a:]]
- <http://suika.fam.cx/gate/2007/cssom/viewer?c=%5C%3Ab%20%7B%0A%20%20color%3A%20red%3B%0A%7D;h=%3Cp%3EAAAA%3C%2Fa%3E;p=n;x=style-element>
→ [CODE(CSS)@en[*::b]]

[CODE(charname)@en[[[COLON]]]] の扱いが謎。
([[名無しさん]])

[10]
<http://suika.fam.cx/gate/2007/cssom/viewer?c=a%20%5C%3A%20%7B%0A%20%20color%3A%20red%3B%0A%7D;h=%3Cp%3EAAAA%3C%2Fa%3E;p=n;x=style-element>
→ [CODE(CSS)@en[a::]]

([[名無しさん]])

[11]
>>4 は不完全のようです。 >>9 を [[WinIE 6]]
に与えると [CODE(CSS)@en[[[UNKNOWN]]]] になりますが、
>>10 を [[WinIE 6]] に与えると
[CODE(CSS)@en[a\:]] になります。
([[名無しさん]])

[12]
>>11
<http://suika.fam.cx/gate/2007/cssom/viewer.en.html?c=a%20%5C%3A%20b%20%7B%0D%0A%20%20color%3A%20red%3B%0D%0A%7D;h=%3Cp%3EAAAA%3C%2Fa%3E;p=n;x=style-element>
は [CODE(CSS)@en[a\:b]] になります。
<http://suika.fam.cx/gate/2007/cssom/viewer.en.html?c=a%20%5C%3A%20b%20%5C%3A%20e%20%7B%0D%0A%20%20color%3A%20red%3B%0D%0A%7D;h=%3Cp%3EAAAA%3C%2Fa%3E;p=n;x=style-element>
や <http://suika.fam.cx/gate/2007/cssom/viewer.en.html?c=a%20%5C%3A%20b%20%5C%3A%20e%20%7B%0D%0A%20%20color%3A%20red%3B%0D%0A%7D;h=%3Cp%3EAAAA%3C%2Fa%3E;p=n;x=style-element>
だと [CODE(CSS)@en[[[UNKNOWN]]]] になります。どうも、
[[WinIE 6]] は [CODE(CSS)@en[\:]] を1つの[[字句]]とみなしている
(そして前後の[[空白]]を無視する) ようですね。
([[名無しさん]])

[13]
<http://suika.fam.cx/gate/2007/cssom/viewer.en.html?c=a%5C%3A%2F**%2Fb%20%7B%0D%0A%20%20color%3A%20red%3B%0D%0A%7D;h=%3Cp%3EAAAA%3C%2Fa%3E;p=n;x=style-element>
のように [CODE(CSS)@en[\:]] の後に[[注釈]]が入ると、[[子孫]][[結合子]]があるものとして扱うようです。
<http://suika.fam.cx/gate/2007/cssom/viewer.en.html?c=a%2F**%2F%5C%3Ab%20%7B%0D%0A%20%20color%3A%20red%3B%0D%0A%7D;h=%3Cp%3EAAAA%3C%2Fa%3E;p=n;x=style-element>
のように [CODE(CSS)@en[\:]] の前に[[注釈]]が入った時は[[注釈]]を無視するようです。
<http://suika.fam.cx/gate/2007/cssom/viewer.en.html?c=a%2F**%2F%20%5C%3Ab%20%7B%0D%0A%20%20color%3A%20red%3B%0D%0A%7D;h=%3Cp%3EAAAA%3C%2Fa%3E;p=n;x=style-element>
のように[[注釈]]の後に[[空白]]が入っても無視されますが、
<http://suika.fam.cx/gate/2007/cssom/viewer.en.html?c=a%20%2F**%2F%5C%3Ab%20%7B%0D%0A%20%20color%3A%20red%3B%0D%0A%7D;h=%3Cp%3EAAAA%3C%2Fa%3E;p=n;x=style-element>
のように[[注釈]]の前に[[空白]]が入ると[[子孫]][[結合子]]とみなされるらしく、
[CODE(CSS)@en[[[UNKNOWN]]]] になります。
([[名無しさん]])

[14]
>>5 の例 ([CODE(CSS example)@en[a:[[not]](a)]]):
[CODE(CSS example invalid)@en[*|a*|:[[not]](*|a)]]

([[名無しさん]])

[15]
[[HTML]] における[[大文字]]・[[小文字]]
- [[WinIE 6]]: [[ASCII]] [[小文字]]を含む既知の [[HTML]]
[[要素型名]]は[[大文字]]に[[正規化]]、[[擬似クラス]]名、
[[擬似要素]]名は[[小文字]]に[[正規化]] ([[ASCII]])、
[[識別子名]]や[[クラス名]]は変換なし
- [[Opera]] 9: [[ASCII]] [[大文字]]を含む既知の [[HTML]]
[[要素型名]]は[[小文字]]に[[正規化]]、既知の [[HTML]]
[[属性名]]は[[小文字]]に[[正規化]] (こっちは [[Unicode]])、
[[擬似クラス]]は[[小文字]]に[[正規化]] (これも [[Unicode]])、
[[擬似要素]]も[[小文字]]に[[正規化]] (これは [[ASCII]])、
[[属性値]]や[[識別子名]]や[[クラス名]]は変換なし
- [[Firefox]] 2: [[要素型名]]、[[属性名]]、[[擬似クラス]]名、
[[擬似要素]]名を[[小文字]]に[[正規化]] ([[Unicode]])、
[[クラス名]]や[[識別子名]]や[[属性値]]は変換なし

([[名無しさん]])

[16]
[[Opera]] 9 は [CODE(CSS)@en[:[[lang]]()]] の[[引数]]部を括弧もろとも
[CODE(DOMa)@en[[[selectorText]]]] には出しません。
[[Firefox]] 2 は[[大文字]]・[[小文字]]変換なし

([[名無しさん]])

[17]
>>15 [[属性名]]の[[正規化]]では、[[要素型名]]との対応はチェックしていないようです。

[[XML]] [[文書]]内の[[スタイル・シート]]では、
[[Firefox]] 2 も [[Opera]] 9 も[[要素型名]]と[[属性名]]の[[大文字]]・[[小文字]]を保存するようです。
([[名無しさん]])

[18]
[[Opera]] 9 は[[単純選択子]]の順序を保存します。

[[Firefox]] 2 は
= [[型選択子]]・[[普遍選択子]]
= [[識別子選択子]]
= [[クラス選択子]]
= [[属性選択子]]
= [[擬似クラス]]
= [[擬似要素]]

の順に並べ替えます。同じ種類の[[単純選択子]]同士の順序は保存するようです。

([[名無しさん]])

[19]
[[Firefox]] 2, [[Opera]] 9 とも、
[[擬似要素]]の前が [CODE(CSS)[[[::]]]] となっていた場合、
[CODE(CSS)[[[:]]]] に[[正規化]]します。
[[注釈]]、[[空白]]、[[escape]] はすべて除去します。
[[属性値]]はすべて [CODE(CSS)[[["]]]] [[区切り]]に[[正規化]]します。
([[名無しさん]])

[20]
[[Firefox]] 2, [[Opera]] 9 とも、[[選択子]]の区切りは
[CODE(charname)@en[[[COMMA]]]] [CODE(charname)@en[[[SPACE]]]]
に[[正規化]]します。
([[名無しさん]])

[21]
[[Firefox]] 2 は[[型選択子]]なき場合必ず[[普遍選択子]]をつけますが、
[[Opera]] 9 はそれ以外に[[単純選択子]]や[[擬似要素]]がまったくない場合を除き、
[[普遍選択子]]を除去します。
([[名無しさん]])

[22]
[[Opera]] 9 で [[HTML]] [[文書]]だと、なぜか15文字を超える[[属性名]]は[[空文字列]]に変換されてしまいます
([[XML]] [[文書]]ではそうならないので、[[小文字]][[正規化]]の部分がおかしい?)。
([[名無しさん]])

[23]
[[Opera]] 9 で [[HTML]] [[文書]]だと、なぜか15文字を超える[[属性名]]は[[空文字列]]に変換されてしまいます
([[XML]] [[文書]]ではそうならないので、[[小文字]][[正規化]]の部分がおかしい?)。
([[名無しさん]])

[24]
[[Opera]] 9 で [[HTML]] [[文書]]だと、なぜか15文字を超える[[属性名]]は[[空文字列]]に変換されてしまいます
([[XML]] [[文書]]ではそうならないので、[[小文字]][[正規化]]の部分がおかしい?)。
([[名無しさん]])

[25]
[[Firefox]] 2、[[Opera]] 9 共に、
[CODE(CSS)@en[@[[namespace]]]] がない場合、
[[名前空間接頭辞]]である
[CODE(CSS)[|]] ([[空文字列]]) はそのまま保存され、
[CODE(CSS)[[[*]]|]] は除去されます。

[[要素型名]]はともかく、[[属性名]]で
[CODE(CSS)[[[*]]|]] を除去すると意味が変わってしまうのですが、
どちらのブラウザも内部的には区別を保持したままのようです。

;; <http://suika.fam.cx/gate/2007/cssom/viewer?c=%5B*%7Cblank%5D%20%7B%0A%20%20color%3A%20green%3B%0A%7D%0A%5B%7Cblank%5D%20%7B%0A%20%20color%3A%20red%3B%0A%7D%0A;h=%3Cp%20onclick%3D%22setAttributeNS%20('about%3A'%2C%20'about%3Ablank'%2C%20'test')%22%3Eclick%20here%20to%20set%20%3Ccode%3Eabout%3Ablank%3C%2Fcode%3E%20attribute%20to%20this%20element.%3C%2Fp%3E;p=n;x=style-element>

([[名無しさん]])

[26]
>>25 訂正。どちらのブラウザでも、[[属性名]]の
[CODE(CSS)[[[|]]]] ([[空文字列]]の[[名前空間接頭辞]])
は除去されます。

([[名無しさん]])

[27]
[[名前空間接頭辞]]の[[正規化]]については [CODE(CSS)@en[@[[namespace]]]] の項にも調べた結果があります。
([[名無しさん]])

[28]

[PRE(CSS example code)[
a[b] {} |a[|b] {} *|a[*|b] {} a|a[a|b] {}
]PRE]

に対応する [CODE(DOMa)@en[[[selectorText]]]] がどうなるか?

[CODE(CSS)@en[@[[namespace]]]] なし:
- [[Opera]] 9: a[b], |a[b], a[b], ([[無視]])
-- 3つ目の[[属性]]の方は正しくない
- [[Firefox]] 2: a[b], |a[b], a[b], ([[無視]])
-- 3つ目の[[属性]]の方は正しくない

[[既定名前空間]]のみあり:
- [[Opera]] 9: |a[b], |a[b], a[b], ([[無視]])
-- 1つ目の[[要素型]]、3つ目は正しくない
- [[Firefox]] 2: a[b], |a[b], *|a[b], ([[無視]])
-- 3つ目の[[属性]]の方は正しくない

[[名前空間接頭辞]] [VAR[a]] のみあり:
- [[Opera]] 9: a[b], |a[b], a[b], a|a[a|b]
-- 3つ目は正しくない
- [[Firefox]] 2: *|a[b], |a[b], *|a[b], a|a[a|b]
-- 3つ目の[[属性]]の方は正しくない

[[既定名前空間]]も[[名前空間接頭辞]] [VAR[a]] もあり:
- [[Opera]] 9: |a[b], |a[b], a[b], a|a[a|b]
-- 1つ目の[[要素型]]、3つ目は正しくない
- [[Firefox]] 2: a[b], |a[b], *|a[b], a|a[a|b]
-- 3つ目の[[属性]]の方は正しくない

([[名無しさん]])

[29]
[[Firefox]] 2 も [[Opera]] 9 も[[子孫結合子]]は
[CODE(charname)@en[[[SPACE]]]] 1つに[[正規化]]します。また、その他の[[結合子]]は前後に
[CODE(charname)@en[[[SPACE]]]] 1つずつに[[正規化]]します。
([[名無しさん]])

[30]
[[Firefox]] 2 も [[Opera]] 9 も[[子孫結合子]]は
[CODE(charname)@en[[[SPACE]]]] 1つに[[正規化]]します。また、その他の[[結合子]]は前後に
[CODE(charname)@en[[[SPACE]]]] 1つずつに[[正規化]]します。
([[名無しさん]])

[31]
[[Firefox]] 2 も [[Opera]] 9 も[[子孫結合子]]は
[CODE(charname)@en[[[SPACE]]]] 1つに[[正規化]]します。また、その他の[[結合子]]は前後に
[CODE(charname)@en[[[SPACE]]]] 1つずつに[[正規化]]します。
([[名無しさん]])

[32]
[[Firefox]] 2 も [[Opera]] 9 も[[子孫結合子]]は
[CODE(charname)@en[[[SPACE]]]] 1つに[[正規化]]します。また、その他の[[結合子]]は前後に
[CODE(charname)@en[[[SPACE]]]] 1つずつに[[正規化]]します。
([[名無しさん]])

[33]
>>21 の [[Opera]] 9 の動作は[[名前空間接頭辞]]の存在と独立なので、
[CODE(CSS example code)[@namespace 'x'; [a] ]] の [a] にも |
だけがついて |[a] になってしまいます。
([[名無しさん]])

[34]
[[Firefox]] 2、 [[HTML]] [[文書]]では、
[CODE(CSS)@en[@[[namespace]]]] の有無と[[大文字]]・[[小文字]]の[[正規化]]は関係していないようです。
[[XML]] [[文書]]では全部保存されます。

[[Opera]] 9 では、
- [[HTML]] [[文書]]で、[[名前空間]]が指定されていない 
([CODE(CSS)[*|]] と[[等価]]な) [[要素型名]]
- [[HTML]] [[文書]]で、[[名前空間URI]] が
[CODE(URI)@en[[[http://www.w3.org/1999/xhtml]]]] な[[要素型名]]
- [[HTML]] [[文書]]で、[[名前空間URI]] が
[CODE(URI)@en[[[http://www.w3.org/TR/REC-html40]]]] な[[要素型名]]
- [[属性名]]

であれば[[大文字]]・[[小文字]]を無視し、その他の場合には[[大文字]]・[[小文字]]を保存するようです。

([[名無しさん]])


[35]
>>28 の変化については、[[無視]]される[[非妥当]]な
[CODE(CSS)@en[@[[namespace]]]] [[規則]]は考慮されないようです。
([[名無しさん]])

