OLD | NEW |
| (Empty) |
1 // This test mostly comes from fast/dom/HTMLElement/script-tests/class-list.js | |
2 description('Tests the htmlFor attribute and its properties.'); | |
3 | |
4 var container = document.createElement('div'); | |
5 document.body.appendChild(container); | |
6 | |
7 var element; | |
8 | |
9 function createElement(tokenList) | |
10 { | |
11 container.innerHTML = '<output for="' + tokenList + '"></output>'; | |
12 element = container.lastChild; | |
13 } | |
14 | |
15 debug('- Tests from http://simon.html5.org/test/html/dom/reflecting/DOMTokenList
/'); | |
16 | |
17 // HTMLOutputElement::htmlFor setter is forwarding assignment to DOMSettableToke
nList.value attribute. | |
18 createElement('x'); | |
19 shouldBeEqualToString('element.htmlFor.value', 'x'); | |
20 shouldBeEqualToString('String(element.htmlFor)', 'x'); | |
21 element.htmlFor = 'y'; | |
22 shouldBeEqualToString('element.htmlFor.value', 'y'); | |
23 shouldBeEqualToString('String(element.htmlFor)', 'y'); | |
24 | |
25 // http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/001.htm | |
26 createElement(''); | |
27 shouldEvaluateTo('element.htmlFor.length', 0); | |
28 | |
29 // http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/002.htm | |
30 createElement('x'); | |
31 shouldEvaluateTo('element.htmlFor.length', 1); | |
32 | |
33 // http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/003.htm | |
34 createElement('x x'); | |
35 shouldEvaluateTo('element.htmlFor.length', 2); | |
36 | |
37 // http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/004.htm | |
38 createElement('x y'); | |
39 shouldEvaluateTo('element.htmlFor.length', 2); | |
40 | |
41 // http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/005.htm | |
42 createElement(''); | |
43 element.htmlFor.add('x'); | |
44 shouldBeEqualToString('element.htmlFor.toString()', 'x'); | |
45 | |
46 // http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/006.htm | |
47 createElement('x'); | |
48 element.htmlFor.add('x'); | |
49 shouldBeEqualToString('element.htmlFor.toString()', 'x'); | |
50 | |
51 // http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/007.htm | |
52 createElement('x x'); | |
53 element.htmlFor.add('x'); | |
54 shouldBeEqualToString('element.htmlFor.toString()', 'x x'); | |
55 | |
56 // http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/008.htm | |
57 createElement('y'); | |
58 element.htmlFor.add('x'); | |
59 shouldBeEqualToString('element.htmlFor.toString()', 'y x'); | |
60 | |
61 // http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/009.htm | |
62 createElement(''); | |
63 element.htmlFor.remove('x'); | |
64 shouldBeEqualToString('element.htmlFor.toString()', ''); | |
65 | |
66 // http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/010.htm | |
67 createElement('x'); | |
68 element.htmlFor.remove('x'); | |
69 shouldBeEqualToString('element.htmlFor.toString()', ''); | |
70 | |
71 // http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/011.htm | |
72 createElement(' y x y '); | |
73 element.htmlFor.remove('x'); | |
74 shouldBeEqualToString('element.htmlFor.toString()', 'y y'); | |
75 | |
76 // http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/012.htm | |
77 createElement(' x y x '); | |
78 element.htmlFor.remove('x'); | |
79 shouldBeEqualToString('element.htmlFor.toString()', 'y'); | |
80 | |
81 | |
82 debug('- Ensure that we can handle empty form attribute correctly'); | |
83 element = document.createElement('output'); | |
84 var list = element.htmlFor; | |
85 list.toggle('x'); | |
86 shouldBeEqualToString('list.value', 'x'); | |
87 | |
88 list.toggle('x'); | |
89 shouldBeEqualToString('list.value', ''); | |
90 | |
91 element = document.createElement('output'); | |
92 shouldBeFalse('element.htmlFor.contains(\'x\')'); | |
93 shouldBeUndefined('element.htmlFor[1]'); | |
94 element.htmlFor.remove('x'); | |
95 element.htmlFor.add('x') | |
96 shouldBeTrue('element.htmlFor.contains(\'x\')'); | |
97 shouldBeUndefined('element.htmlFor[1]'); | |
98 | |
99 debug('- Testing add in presence of trailing white spaces.'); | |
100 | |
101 createElement('x '); | |
102 element.htmlFor.add('y'); | |
103 shouldBeEqualToString('element.htmlFor.toString()', 'x y'); | |
104 | |
105 createElement('x\t'); | |
106 element.htmlFor.add('y'); | |
107 shouldBeEqualToString('element.htmlFor.toString()', 'x\ty'); | |
108 | |
109 createElement(' '); | |
110 element.htmlFor.add('y'); | |
111 shouldBeEqualToString('element.htmlFor.toString()', ' y'); | |
112 | |
113 | |
114 debug('- Test invalid tokens'); | |
115 | |
116 // Testing exception due to invalid token | |
117 | |
118 // shouldThrow from js-test.js is not sufficient. | |
119 function shouldThrowDOMException(f, ec) | |
120 { | |
121 try { | |
122 f(); | |
123 testFailed('Expected an exception'); | |
124 } catch (ex) { | |
125 if (!(ex instanceof DOMException)) { | |
126 testFailed('Exception is not an instance of DOMException, found: ' + | |
127 Object.toString.call(ex)); | |
128 return; | |
129 } | |
130 if (ec !== ex.code) { | |
131 testFailed('Wrong exception code: ' + ex.code); | |
132 return; | |
133 } | |
134 } | |
135 var formattedFunction = String(f).replace(/^function.+\{\s*/m, ''). | |
136 replace(/;?\s+\}/m, ''); | |
137 testPassed(formattedFunction + ' threw expected DOMException with code ' + e
c); | |
138 } | |
139 | |
140 createElement('x'); | |
141 shouldThrowDOMException(function() { | |
142 element.htmlFor.contains(''); | |
143 }, DOMException.SYNTAX_ERR); | |
144 | |
145 createElement('x y'); | |
146 shouldThrowDOMException(function() { | |
147 element.htmlFor.contains('x y'); | |
148 }, DOMException.INVALID_CHARACTER_ERR); | |
149 | |
150 createElement(''); | |
151 shouldThrowDOMException(function() { | |
152 element.htmlFor.add(''); | |
153 }, DOMException.SYNTAX_ERR); | |
154 | |
155 createElement(''); | |
156 shouldThrowDOMException(function() { | |
157 element.htmlFor.add('x y'); | |
158 }, DOMException.INVALID_CHARACTER_ERR); | |
159 | |
160 createElement(''); | |
161 shouldThrowDOMException(function() { | |
162 element.htmlFor.remove(''); | |
163 }, DOMException.SYNTAX_ERR); | |
164 | |
165 createElement(''); | |
166 shouldThrowDOMException(function() { | |
167 element.htmlFor.remove('x y'); | |
168 }, DOMException.INVALID_CHARACTER_ERR); | |
169 | |
170 createElement(''); | |
171 shouldThrowDOMException(function() { | |
172 element.htmlFor.toggle(''); | |
173 }, DOMException.SYNTAX_ERR); | |
174 | |
175 createElement('x y'); | |
176 shouldThrowDOMException(function() { | |
177 element.htmlFor.toggle('x y'); | |
178 }, DOMException.INVALID_CHARACTER_ERR); | |
179 | |
180 | |
181 debug('- Indexing'); | |
182 | |
183 createElement('x'); | |
184 shouldBeEqualToString('element.htmlFor[0]', 'x'); | |
185 shouldBeEqualToString('element.htmlFor.item(0)', 'x'); | |
186 | |
187 createElement('x x'); | |
188 shouldBeEqualToString('element.htmlFor[1]', 'x'); | |
189 shouldBeEqualToString('element.htmlFor.item(1)', 'x'); | |
190 | |
191 createElement('x y'); | |
192 shouldBeEqualToString('element.htmlFor[1]', 'y'); | |
193 shouldBeEqualToString('element.htmlFor.item(1)', 'y'); | |
194 | |
195 createElement(''); | |
196 shouldBeUndefined('element.htmlFor[0]'); | |
197 shouldBeNull('element.htmlFor.item(0)'); | |
198 | |
199 createElement('x y z'); | |
200 shouldBeUndefined('element.htmlFor[4]'); | |
201 shouldBeNull('element.htmlFor.item(4)'); | |
202 shouldBeUndefined('element.htmlFor[-1]'); // Not a valid index so should not tr
igger item(). | |
203 shouldBeNull('element.htmlFor.item(-1)'); | |
204 | |
205 debug('- Test case since DOMTokenList is case sensitive'); | |
206 | |
207 createElement('x'); | |
208 shouldBeTrue('element.htmlFor.contains(\'x\')'); | |
209 shouldBeFalse('element.htmlFor.contains(\'X\')'); | |
210 shouldBeEqualToString('element.htmlFor[0]', 'x'); | |
211 | |
212 createElement('X'); | |
213 shouldBeTrue('element.htmlFor.contains(\'X\')'); | |
214 shouldBeFalse('element.htmlFor.contains(\'x\')'); | |
215 shouldBeEqualToString('element.htmlFor[0]', 'X'); | |
216 | |
217 | |
218 debug('- Testing whitespace'); | |
219 // U+0020 SPACE, U+0009 CHARACTER TABULATION (tab), U+000A LINE FEED (LF), | |
220 // U+000C FORM FEED (FF), and U+000D CARRIAGE RETURN (CR) | |
221 | |
222 createElement('x\u0020y'); | |
223 shouldEvaluateTo('element.htmlFor.length', 2); | |
224 | |
225 createElement('x\u0009y'); | |
226 shouldEvaluateTo('element.htmlFor.length', 2); | |
227 | |
228 createElement('x\u000Ay'); | |
229 shouldEvaluateTo('element.htmlFor.length', 2); | |
230 | |
231 createElement('x\u000Cy'); | |
232 shouldEvaluateTo('element.htmlFor.length', 2); | |
233 | |
234 createElement('x\u000Dy'); | |
235 shouldEvaluateTo('element.htmlFor.length', 2); | |
236 | |
237 | |
238 debug('- DOMSettableTokenList presence and type'); | |
239 | |
240 | |
241 // Safari returns object | |
242 // Firefox returns object | |
243 // IE8 returns object | |
244 // Chrome returns function | |
245 // assertEquals('object', typeof DOMSettableTokenList); | |
246 shouldBeTrue('\'undefined\' != typeof DOMSettableTokenList'); | |
247 | |
248 shouldBeEqualToString('typeof DOMSettableTokenList.prototype', 'object'); | |
249 | |
250 createElement('x'); | |
251 shouldBeEqualToString('typeof element.htmlFor', 'object'); | |
252 | |
253 shouldEvaluateTo('element.htmlFor.constructor', 'DOMSettableTokenList'); | |
254 | |
255 shouldBeTrue('element.htmlFor === element.htmlFor'); | |
OLD | NEW |