Reviewed by darin.
[WebKit-https.git] / LayoutTests / fast / css / resources / html-attr-case-sensitivity.js
1 description("This tests that [attr=value] CSS selectors are case sensitive depending on attr");
2
3 // List of all HTML4 attrs
4 // true = case sensitive
5 var htmlAttrs = {
6     "abbr" : true,
7     "accept-charset" : false,
8     "accept" : false,
9     "accesskey" : true,
10     "action" : true,
11     "align" : false,
12     "alink" : false,
13     "alt" : true,
14     "archive" : true,
15     "axis" : false,
16     "background" : true,
17     "bgcolor" : false,
18     "border" : true,
19     "cellpadding" : true,
20     "cellspacing" : true,
21     "char" : true,
22     "charoff" : true,
23     "charset" : false,
24     "checked" : false,
25     "cite" : true,
26     "class" : true,
27     "classid" : true,
28     "clear" : false,
29     "code" : true,
30     "codebase" : true,
31     "codetype" : false,
32     "color" : false,
33     "cols" : true,
34     "colspan" : true,
35     "compact" : false,
36     "content" : true,
37     "coords" : true,
38     "data" : true,
39     "datetime" : true,
40     "declare" : false,
41     "defer" : false,
42     "dir" : false,
43     "disabled" : false,
44     "enctype" : false,
45     "face" : false,
46     "for" : true,
47     "frame" : false,
48     "frameborder" : true,
49     "headers" : true,
50     "height" : true,
51     "href" : true,
52     "hreflang" : false,
53     "hspace" : true,
54     "http-equiv" : false,
55     "id" : true,
56     "ismap" : true,
57     "label" : true,
58     "lang" : false,
59     "language" : false,
60     "link" : false,
61     "longdesc" : true,
62     "marginheight" : true,
63     "marginwidth" : true,
64     "maxlength" : true,
65     "media" : false,
66     "method" : false,
67     "multiple" : false,
68     "name" : true,
69     "nohref" : false,
70     "noresize" : false,
71     "noshade" : false,
72     "nowrap" : false,
73     "object" : true,
74     "onblur" : true,
75     "onchange" : true,
76     "onclick" : true,
77     "ondblclick" : true,
78     "onfocus" : true,
79     "onkeydown" : true,
80     "onkeypress" : true,
81     "onkeyup" : true,
82     "onload" : true,
83     "onmousedown" : true,
84     "onmousemove" : true,
85     "onmouseout" : true,
86     "onmouseover" : true,
87     "onmouseup" : true,
88     "onreset" : true,
89     "onselect" : true,
90     "onsubmit" : true,
91     "onunload" : true,
92     "profile" : true,
93     "prompt" : true,
94     "readonly" : false,
95     "rel" : false,
96     "rev" : false,
97     "rows" : true,
98     "rowspan" : true,
99     "rules" : false,
100     "scheme" : true,
101     "scope" : false,
102     "scrolling" : false,
103     "selected" : false,
104     "shape" : false,
105     "size" : true,
106     "span" : true,
107     "src" : true,
108     "standby" : true,
109     "start" : true,
110     "style" : true,
111     "summary" : true,
112     "tabindex" : true,
113     "target" : false,
114     "text" : false,
115     "title" : true,
116     "type" : false,
117     "usemap" : true,
118     "valign" : false,
119     "value" : true,
120     "valuetype" : false,
121     "version" : true,
122     "vlink" : false,
123     "vspace" : true,
124     "width" : true
125 };
126
127 function isCaseSensitive(attrName) {
128     var style = document.createElement('style');
129     style.appendChild(document.createTextNode("br { color: red; float: right; border-color: red; }\n"));
130     style.appendChild(document.createTextNode("br[" + attrName + "=foo] { color: blue; }\n"));
131     style.appendChild(document.createTextNode("br[" + attrName + "~=foo] { float: left; }\n"));
132     style.appendChild(document.createTextNode("br[" + attrName + "|=foo] { border-left-color: green; }\n"));
133     style.appendChild(document.createTextNode("br[" + attrName + "^=foo] { border-right-color: pink; }\n"));
134     style.appendChild(document.createTextNode("br[" + attrName + "$=foo] { border-top-color: orange; }\n"));
135     style.appendChild(document.createTextNode("br[" + attrName + "*=foo] { border-bottom-color: black; }\n"));
136     
137     document.documentElement.firstChild.appendChild(style);
138     
139     var testElement = document.createElement("br");
140     testElement.setAttribute(attrName, "FOO");
141     document.body.appendChild(testElement);
142     
143     var computedStyle = window.getComputedStyle(testElement, '');
144     
145     var isCaseInsensitive = (computedStyle.getPropertyValue("color") == "rgb(0, 0, 255)");
146     
147     if ((computedStyle.getPropertyValue("float") == "left") != isCaseInsensitive)
148         testFailed("~=foo and =foo for " + attrName + " did not match with same case sensitivity");
149     
150     if ((computedStyle.getPropertyValue("border-left-color") == "rgb(0, 128, 0)") != isCaseInsensitive)
151         testFailed("|=foo and =foo for " + attrName + " did not match with same case sensitivity");
152
153     if ((computedStyle.getPropertyValue("border-right-color") == "rgb(255, 192, 203)") != isCaseInsensitive)
154         testFailed("^=foo and =foo for " + attrName + " did not match with same case sensitivity");
155
156     if ((computedStyle.getPropertyValue("border-top-color") == "rgb(255, 165, 0)") != isCaseInsensitive)
157         testFailed("$=foo and =foo for " + attrName + " did not match with same case sensitivity");
158
159     if ((computedStyle.getPropertyValue("border-bottom-color") == "rgb(0, 0, 0)") != isCaseInsensitive)
160         testFailed("*=foo and =foo for " + attrName + " did not match with same case sensitivity");
161     
162     // clean up
163     testElement.parentNode.removeChild(testElement);
164     style.parentNode.removeChild(style);
165     
166     return !isCaseInsensitive;
167 }
168
169 for (var attr in htmlAttrs) {
170     shouldBe('isCaseSensitive("' + attr + '")', "" + htmlAttrs[attr]);
171 }
172
173 // test a nonexistent attr
174 shouldBe('isCaseSensitive("foobar")', "true");
175
176 var successfullyParsed = true;