OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library ElementTest; | 5 library ElementTest; |
| 6 |
6 import 'package:unittest/unittest.dart'; | 7 import 'package:unittest/unittest.dart'; |
7 import 'package:unittest/html_individual_config.dart'; | 8 import 'package:unittest/html_individual_config.dart'; |
8 import 'dart:async'; | 9 import 'dart:async'; |
9 import 'dart:html'; | 10 import 'dart:html'; |
10 import 'dart:svg' as svg; | 11 import 'dart:svg' as svg; |
11 import 'utils.dart'; | 12 import 'utils.dart'; |
12 | 13 |
13 expectLargeRect(Rectangle rect) { | 14 expectLargeRect(Rectangle rect) { |
14 expect(rect.top, 0); | 15 expect(rect.top, 0); |
15 expect(rect.left, 0); | 16 expect(rect.left, 0); |
(...skipping 24 matching lines...) Expand all Loading... |
40 var isElementList = | 41 var isElementList = |
41 predicate((x) => x is List<Element>, 'is a List<Element>'); | 42 predicate((x) => x is List<Element>, 'is a List<Element>'); |
42 var isElementIterable = | 43 var isElementIterable = |
43 predicate((x) => x is Iterable<Element>, 'is an Iterable<Element>'); | 44 predicate((x) => x is Iterable<Element>, 'is an Iterable<Element>'); |
44 var isHeadingElement = | 45 var isHeadingElement = |
45 predicate((x) => x is HeadingElement, 'is a HeadingElement'); | 46 predicate((x) => x is HeadingElement, 'is a HeadingElement'); |
46 | 47 |
47 Element makeElement() => new Element.tag('div'); | 48 Element makeElement() => new Element.tag('div'); |
48 | 49 |
49 Element makeElementWithChildren() => | 50 Element makeElementWithChildren() => |
50 new Element.html("<div><br/><img/><input/></div>"); | 51 new Element.html("<div><br/><img/><input/></div>"); |
51 | 52 |
52 group('position', () { | 53 group('position', () { |
53 test('computedStyle', () { | 54 test('computedStyle', () { |
54 final element = document.body; | 55 final element = document.body; |
55 var style = element.getComputedStyle(); | 56 var style = element.getComputedStyle(); |
56 expect(style.getPropertyValue('left'), 'auto'); | 57 expect(style.getPropertyValue('left'), 'auto'); |
57 }); | 58 }); |
58 | 59 |
59 test('client position synchronous', () { | 60 test('client position synchronous', () { |
60 final container = new Element.tag("div"); | 61 final container = new Element.tag("div"); |
(...skipping 19 matching lines...) Expand all Loading... |
80 expect(element.documentOffset.y, 8); | 81 expect(element.documentOffset.y, 8); |
81 container.remove(); | 82 container.remove(); |
82 }); | 83 }); |
83 }); | 84 }); |
84 | 85 |
85 group('constructors', () { | 86 group('constructors', () { |
86 test('error', () { | 87 test('error', () { |
87 expect(() => new Element.html('<br/><br/>'), throwsStateError); | 88 expect(() => new Element.html('<br/><br/>'), throwsStateError); |
88 }); | 89 }); |
89 | 90 |
90 test('.html has no parent', () => | 91 test('.html has no parent', |
91 expect(new Element.html('<br/>').parent, isNull)); | 92 () => expect(new Element.html('<br/>').parent, isNull)); |
92 | 93 |
93 test('.html table', () { | 94 test('.html table', () { |
94 // http://developers.whatwg.org/tabular-data.html#tabular-data | 95 // http://developers.whatwg.org/tabular-data.html#tabular-data |
95 var node = new Element.html(''' | 96 var node = new Element.html(''' |
96 <table> | 97 <table> |
97 <caption>Characteristics with positive and negative sides</caption> | 98 <caption>Characteristics with positive and negative sides</caption> |
98 <thead> | 99 <thead> |
99 <tr> | 100 <tr> |
100 <th id="n"> Negative | 101 <th id="n"> Negative |
101 <th> Characteristic | 102 <th> Characteristic |
(...skipping 17 matching lines...) Expand all Loading... |
119 expect(node.tHead.rows[0].cells.length, 3); | 120 expect(node.tHead.rows[0].cells.length, 3); |
120 expect(node.tBodies.length, 1); | 121 expect(node.tBodies.length, 1); |
121 expect(node.tBodies[0].rows.length, 2); | 122 expect(node.tBodies[0].rows.length, 2); |
122 expect(node.tBodies[0].rows[1].cells.map((c) => c.innerHtml), | 123 expect(node.tBodies[0].rows[1].cells.map((c) => c.innerHtml), |
123 [' Failing\n ', ' Grade\n ', ' Passing\n']); | 124 [' Failing\n ', ' Grade\n ', ' Passing\n']); |
124 }); | 125 }); |
125 | 126 |
126 test('.html caption', () { | 127 test('.html caption', () { |
127 var table = new TableElement(); | 128 var table = new TableElement(); |
128 var node = table.createFragment('<caption><p>Table 1.').nodes.single; | 129 var node = table.createFragment('<caption><p>Table 1.').nodes.single; |
129 expect(node, predicate((x) => x is TableCaptionElement, | 130 expect( |
130 'is a TableCaptionElement')); | 131 node, |
| 132 predicate( |
| 133 (x) => x is TableCaptionElement, 'is a TableCaptionElement')); |
131 expect(node.tagName, 'CAPTION'); | 134 expect(node.tagName, 'CAPTION'); |
132 expect(node.parent, isNull); | 135 expect(node.parent, isNull); |
133 expect(node.innerHtml, '<p>Table 1.</p>'); | 136 expect(node.innerHtml, '<p>Table 1.</p>'); |
134 }); | 137 }); |
135 | 138 |
136 test('.html colgroup', () { | 139 test('.html colgroup', () { |
137 var table = new TableElement(); | 140 var table = new TableElement(); |
138 var node = | 141 var node = |
139 table.createFragment('<colgroup> <col> <col> <col>').nodes.single; | 142 table.createFragment('<colgroup> <col> <col> <col>').nodes.single; |
140 expect(node, predicate((x) => x is TableColElement, | 143 expect( |
141 'is a TableColElement')); | 144 node, predicate((x) => x is TableColElement, 'is a TableColElement')); |
142 expect(node.tagName, 'COLGROUP'); | 145 expect(node.tagName, 'COLGROUP'); |
143 expect(node.parent, isNull); | 146 expect(node.parent, isNull); |
144 expect(node.innerHtml, ' <col> <col> <col>'); | 147 expect(node.innerHtml, ' <col> <col> <col>'); |
145 }); | 148 }); |
146 | 149 |
147 test('.html tbody', () { | 150 test('.html tbody', () { |
148 var innerHtml = '<tr><td headers="n r1">Sad</td><td>Happy</td></tr>'; | 151 var innerHtml = '<tr><td headers="n r1">Sad</td><td>Happy</td></tr>'; |
149 var table = new TableElement(); | 152 var table = new TableElement(); |
150 var node = table.createFragment('<tbody>$innerHtml').nodes.single; | 153 var node = table.createFragment('<tbody>$innerHtml').nodes.single; |
151 expect(node, predicate((x) => x is TableSectionElement, | 154 expect( |
152 'is a TableSectionElement')); | 155 node, |
| 156 predicate( |
| 157 (x) => x is TableSectionElement, 'is a TableSectionElement')); |
153 expect(node.tagName, 'TBODY'); | 158 expect(node.tagName, 'TBODY'); |
154 expect(node.parent, isNull); | 159 expect(node.parent, isNull); |
155 expect(node.rows.length, 1); | 160 expect(node.rows.length, 1); |
156 expect(node.rows[0].cells.length, 2); | 161 expect(node.rows[0].cells.length, 2); |
157 expect(node.innerHtml, innerHtml); | 162 expect(node.innerHtml, innerHtml); |
158 }); | 163 }); |
159 | 164 |
160 test('.html thead', () { | 165 test('.html thead', () { |
161 var innerHtml = '<tr><th id="n">Negative</th><th>Positive</th></tr>'; | 166 var innerHtml = '<tr><th id="n">Negative</th><th>Positive</th></tr>'; |
162 var table = new TableElement(); | 167 var table = new TableElement(); |
163 var node = table.createFragment('<thead>$innerHtml').nodes.single; | 168 var node = table.createFragment('<thead>$innerHtml').nodes.single; |
164 expect(node, predicate((x) => x is TableSectionElement, | 169 expect( |
165 'is a TableSectionElement')); | 170 node, |
| 171 predicate( |
| 172 (x) => x is TableSectionElement, 'is a TableSectionElement')); |
166 expect(node.tagName, 'THEAD'); | 173 expect(node.tagName, 'THEAD'); |
167 expect(node.parent, isNull); | 174 expect(node.parent, isNull); |
168 expect(node.rows.length, 1); | 175 expect(node.rows.length, 1); |
169 expect(node.rows[0].cells.length, 2); | 176 expect(node.rows[0].cells.length, 2); |
170 expect(node.innerHtml, innerHtml); | 177 expect(node.innerHtml, innerHtml); |
171 }); | 178 }); |
172 | 179 |
173 test('.html tfoot', () { | 180 test('.html tfoot', () { |
174 var innerHtml = '<tr><th>percentage</th><td>34.3%</td></tr>'; | 181 var innerHtml = '<tr><th>percentage</th><td>34.3%</td></tr>'; |
175 var table = new TableElement(); | 182 var table = new TableElement(); |
176 var node = table.createFragment('<tfoot>$innerHtml').nodes.single; | 183 var node = table.createFragment('<tfoot>$innerHtml').nodes.single; |
177 expect(node, predicate((x) => x is TableSectionElement, | 184 expect( |
178 'is a TableSectionElement')); | 185 node, |
| 186 predicate( |
| 187 (x) => x is TableSectionElement, 'is a TableSectionElement')); |
179 expect(node.tagName, 'TFOOT'); | 188 expect(node.tagName, 'TFOOT'); |
180 expect(node.parent, isNull); | 189 expect(node.parent, isNull); |
181 expect(node.rows.length, 1); | 190 expect(node.rows.length, 1); |
182 expect(node.rows[0].cells.length, 2); | 191 expect(node.rows[0].cells.length, 2); |
183 expect(node.innerHtml, innerHtml); | 192 expect(node.innerHtml, innerHtml); |
184 }); | 193 }); |
185 | 194 |
186 test('.html tr', () { | 195 test('.html tr', () { |
187 var table = new TableElement(); | 196 var table = new TableElement(); |
188 document.body.append(table); | 197 document.body.append(table); |
189 var tBody = table.createTBody(); | 198 var tBody = table.createTBody(); |
190 var node = tBody.createFragment('<tr><td>foo<td>bar').nodes.single; | 199 var node = tBody.createFragment('<tr><td>foo<td>bar').nodes.single; |
191 expect(node, predicate((x) => x is TableRowElement, | 200 expect( |
192 'is a TableRowElement')); | 201 node, predicate((x) => x is TableRowElement, 'is a TableRowElement')); |
193 expect(node.tagName, 'TR'); | 202 expect(node.tagName, 'TR'); |
194 expect(node.parent, isNull); | 203 expect(node.parent, isNull); |
195 expect(node.cells.map((c) => c.innerHtml), ['foo', 'bar']); | 204 expect(node.cells.map((c) => c.innerHtml), ['foo', 'bar']); |
196 }); | 205 }); |
197 | 206 |
198 test('.html td', () { | 207 test('.html td', () { |
199 var table = new TableElement(); | 208 var table = new TableElement(); |
200 document.body.append(table); | 209 document.body.append(table); |
201 var tBody = table.createTBody(); | 210 var tBody = table.createTBody(); |
202 var tRow = tBody.addRow(); | 211 var tRow = tBody.addRow(); |
203 var node = tRow.createFragment('<td>foobar').nodes.single; | 212 var node = tRow.createFragment('<td>foobar').nodes.single; |
204 expect(node, predicate((x) => x is TableCellElement, | 213 expect(node, |
205 'is a TableCellElement')); | 214 predicate((x) => x is TableCellElement, 'is a TableCellElement')); |
206 expect(node.tagName, 'TD'); | 215 expect(node.tagName, 'TD'); |
207 expect(node.parent, isNull); | 216 expect(node.parent, isNull); |
208 expect(node.innerHtml, 'foobar'); | 217 expect(node.innerHtml, 'foobar'); |
209 }); | 218 }); |
210 | 219 |
211 test('.html th', () { | 220 test('.html th', () { |
212 var table = new TableElement(); | 221 var table = new TableElement(); |
213 document.body.append(table); | 222 document.body.append(table); |
214 var tBody = table.createTBody(); | 223 var tBody = table.createTBody(); |
215 var tRow = tBody.addRow(); | 224 var tRow = tBody.addRow(); |
216 var node = tRow.createFragment('<th>foobar').nodes.single; | 225 var node = tRow.createFragment('<th>foobar').nodes.single; |
217 expect(node, predicate((x) => x is TableCellElement, | 226 expect(node, |
218 'is a TableCellElement')); | 227 predicate((x) => x is TableCellElement, 'is a TableCellElement')); |
219 expect(node.tagName, 'TH'); | 228 expect(node.tagName, 'TH'); |
220 expect(node.parent, isNull); | 229 expect(node.parent, isNull); |
221 expect(node.innerHtml, 'foobar'); | 230 expect(node.innerHtml, 'foobar'); |
222 }); | 231 }); |
223 | 232 |
224 test('.html can fire events', () { | 233 test('.html can fire events', () { |
225 var e = new Element.html('<button>aha</button>'); | 234 var e = new Element.html('<button>aha</button>'); |
226 var gotEvent = false; | 235 var gotEvent = false; |
227 e.onClick.listen((_) { | 236 e.onClick.listen((_) { |
228 gotEvent = true; | 237 gotEvent = true; |
229 }); | 238 }); |
230 e.click(); | 239 e.click(); |
231 expect(gotEvent, isTrue, reason: 'click should have raised click event'); | 240 expect(gotEvent, isTrue, reason: 'click should have raised click event'); |
232 }); | 241 }); |
233 }); | 242 }); |
234 | 243 |
235 group('eventListening', () { | 244 group('eventListening', () { |
236 test('streams', () { | 245 test('streams', () { |
237 final target = new Element.tag('div'); | 246 final target = new TextAreaElement(); |
238 | 247 |
239 void testEvent(Stream stream, String type) { | 248 void testEvent(Stream stream, String type, [createEvent(String type)]) { |
240 var firedOnEvent = false; | 249 var firedOnEvent = false; |
241 stream.listen((e) { | 250 stream.listen((e) { |
242 firedOnEvent = true; | 251 firedOnEvent = true; |
243 }); | 252 }); |
244 expect(firedOnEvent, isFalse); | 253 expect(firedOnEvent, isFalse); |
245 var event = new Event(type); | 254 var event = createEvent != null ? createEvent(type) : new Event(type); |
246 target.dispatchEvent(event); | 255 target.dispatchEvent(event); |
247 | 256 |
248 expect(firedOnEvent, isTrue); | 257 expect(firedOnEvent, isTrue); |
249 } | 258 } |
250 | 259 |
251 testEvent(target.onAbort, 'abort'); | 260 testEvent(target.onAbort, 'abort'); |
252 testEvent(target.onBeforeCopy, 'beforecopy'); | 261 testEvent(target.onBeforeCopy, 'beforecopy'); |
253 testEvent(target.onBeforeCut, 'beforecut'); | 262 testEvent(target.onBeforeCut, 'beforecut'); |
254 testEvent(target.onBeforePaste, 'beforepaste'); | 263 testEvent(target.onBeforePaste, 'beforepaste'); |
255 testEvent(target.onBlur, 'blur'); | 264 testEvent(target.onBlur, 'blur'); |
256 testEvent(target.onChange, 'change'); | 265 testEvent(target.onChange, 'change'); |
257 testEvent(target.onContextMenu, 'contextmenu'); | 266 testEvent( |
| 267 target.onContextMenu, 'contextmenu', (type) => new MouseEvent(type)); |
| 268 // We cannot test dispatching a true ClipboardEvent as the DOM does not |
| 269 // provide a way to create a fake ClipboardEvent. |
258 testEvent(target.onCopy, 'copy'); | 270 testEvent(target.onCopy, 'copy'); |
259 testEvent(target.onCut, 'cut'); | 271 testEvent(target.onCut, 'cut'); |
260 testEvent(target.onDoubleClick, 'dblclick'); | 272 testEvent(target.onPaste, 'paste'); |
261 testEvent(target.onDrag, 'drag'); | 273 |
262 testEvent(target.onDragEnd, 'dragend'); | 274 testEvent( |
263 testEvent(target.onDragEnter, 'dragenter'); | 275 target.onDoubleClick, 'dblclick', (type) => new MouseEvent(type)); |
264 testEvent(target.onDragLeave, 'dragleave'); | 276 testEvent(target.onDrag, 'drag', (type) => new MouseEvent(type)); |
265 testEvent(target.onDragOver, 'dragover'); | 277 testEvent(target.onDragEnd, 'dragend', (type) => new MouseEvent(type)); |
266 testEvent(target.onDragStart, 'dragstart'); | 278 testEvent( |
267 testEvent(target.onDrop, 'drop'); | 279 target.onDragEnter, 'dragenter', (type) => new MouseEvent(type)); |
| 280 testEvent( |
| 281 target.onDragLeave, 'dragleave', (type) => new MouseEvent(type)); |
| 282 testEvent(target.onDragOver, 'dragover', (type) => new MouseEvent(type)); |
| 283 testEvent( |
| 284 target.onDragStart, 'dragstart', (type) => new MouseEvent(type)); |
| 285 testEvent(target.onDrop, 'drop', (type) => new MouseEvent(type)); |
268 testEvent(target.onError, 'error'); | 286 testEvent(target.onError, 'error'); |
269 testEvent(target.onFocus, 'focus'); | 287 testEvent(target.onFocus, 'focus'); |
270 testEvent(target.onFullscreenChange, 'webkitfullscreenchange'); | 288 testEvent(target.onFullscreenChange, 'webkitfullscreenchange'); |
271 testEvent(target.onInput, 'input'); | 289 testEvent(target.onInput, 'input'); |
272 testEvent(target.onInvalid, 'invalid'); | 290 testEvent(target.onInvalid, 'invalid'); |
273 testEvent(target.onKeyDown, 'keydown'); | 291 testEvent(target.onKeyDown, 'keydown', (type) => new KeyboardEvent(type)); |
274 testEvent(target.onKeyPress, 'keypress'); | 292 testEvent( |
275 testEvent(target.onKeyUp, 'keyup'); | 293 target.onKeyPress, 'keypress', (type) => new KeyboardEvent(type)); |
| 294 testEvent(target.onKeyUp, 'keyup', (type) => new KeyboardEvent(type)); |
276 testEvent(target.onLoad, 'load'); | 295 testEvent(target.onLoad, 'load'); |
277 testEvent(target.onMouseDown, 'mousedown'); | 296 testEvent( |
278 testEvent(target.onMouseMove, 'mousemove'); | 297 target.onMouseDown, 'mousedown', (type) => new MouseEvent(type)); |
279 testEvent(target.onMouseOut, 'mouseout'); | 298 testEvent( |
280 testEvent(target.onMouseOver, 'mouseover'); | 299 target.onMouseMove, 'mousemove', (type) => new MouseEvent(type)); |
281 testEvent(target.onMouseUp, 'mouseup'); | 300 testEvent(target.onMouseOut, 'mouseout', (type) => new MouseEvent(type)); |
282 testEvent(target.onPaste, 'paste'); | 301 testEvent( |
| 302 target.onMouseOver, 'mouseover', (type) => new MouseEvent(type)); |
| 303 testEvent(target.onMouseUp, 'mouseup', (type) => new MouseEvent(type)); |
283 testEvent(target.onReset, 'reset'); | 304 testEvent(target.onReset, 'reset'); |
284 testEvent(target.onScroll, 'scroll'); | 305 testEvent(target.onScroll, 'scroll'); |
285 testEvent(target.onSearch, 'search'); | 306 testEvent(target.onSearch, 'search'); |
286 testEvent(target.onSelect, 'select'); | 307 testEvent(target.onSelect, 'select'); |
287 testEvent(target.onSelectStart, 'selectstart'); | 308 testEvent(target.onSelectStart, 'selectstart'); |
288 testEvent(target.onSubmit, 'submit'); | 309 testEvent(target.onSubmit, 'submit'); |
| 310 // We would prefer to create new touch events for this test via |
| 311 // new TouchEvent(null, null, null, type) |
| 312 // but that fails on desktop browsers as touch is not enabled. |
289 testEvent(target.onTouchCancel, 'touchcancel'); | 313 testEvent(target.onTouchCancel, 'touchcancel'); |
290 testEvent(target.onTouchEnd, 'touchend'); | 314 testEvent(target.onTouchEnd, 'touchend'); |
291 testEvent(target.onTouchLeave, 'touchleave'); | 315 testEvent(target.onTouchLeave, 'touchleave'); |
292 testEvent(target.onTouchMove, 'touchmove'); | 316 testEvent(target.onTouchMove, 'touchmove'); |
293 testEvent(target.onTouchStart, 'touchstart'); | 317 testEvent(target.onTouchStart, 'touchstart'); |
294 }); | 318 }); |
295 }); | 319 }); |
296 | 320 |
297 group('click', () { | 321 group('click', () { |
298 test('clickEvent', () { | 322 test('clickEvent', () { |
(...skipping 13 matching lines...) Expand all Loading... |
312 }); | 336 }); |
313 e2.click(); | 337 e2.click(); |
314 expect(firedEvent2, false); | 338 expect(firedEvent2, false); |
315 e2.classes.add('foo'); | 339 e2.classes.add('foo'); |
316 e2.click(); | 340 e2.click(); |
317 expect(firedEvent2, true); | 341 expect(firedEvent2, true); |
318 }); | 342 }); |
319 }); | 343 }); |
320 | 344 |
321 group('attributes', () { | 345 group('attributes', () { |
322 test('manipulation', () { | 346 test('manipulation', () { |
323 final element = new Element.html( | 347 final element = new Element.html( |
324 '''<div class="foo" style="overflow: hidden" data-foo="bar" | 348 '''<div class="foo" style="overflow: hidden" data-foo="bar" |
325 data-foo2="bar2" dir="rtl"> | 349 data-foo2="bar2" dir="rtl"> |
326 </div>''', treeSanitizer: new NullTreeSanitizer()); | 350 </div>''', |
327 final attributes = element.attributes; | 351 treeSanitizer: new NullTreeSanitizer()); |
328 expect(attributes['class'], 'foo'); | 352 final attributes = element.attributes; |
329 expect(attributes['style'], startsWith('overflow: hidden')); | 353 expect(attributes['class'], 'foo'); |
330 expect(attributes['data-foo'], 'bar'); | 354 expect(attributes['style'], startsWith('overflow: hidden')); |
331 expect(attributes['data-foo2'], 'bar2'); | 355 expect(attributes['data-foo'], 'bar'); |
332 expect(attributes.length, 5); | 356 expect(attributes['data-foo2'], 'bar2'); |
333 expect(element.dataset.length, 2); | 357 expect(attributes.length, 5); |
334 element.dataset['foo'] = 'baz'; | 358 expect(element.dataset.length, 2); |
335 expect(element.dataset['foo'], 'baz'); | 359 element.dataset['foo'] = 'baz'; |
336 expect(attributes['data-foo'], 'baz'); | 360 expect(element.dataset['foo'], 'baz'); |
337 attributes['data-foo2'] = 'baz2'; | 361 expect(attributes['data-foo'], 'baz'); |
338 expect(attributes['data-foo2'], 'baz2'); | 362 attributes['data-foo2'] = 'baz2'; |
339 expect(element.dataset['foo2'], 'baz2'); | 363 expect(attributes['data-foo2'], 'baz2'); |
340 expect(attributes['dir'], 'rtl'); | 364 expect(element.dataset['foo2'], 'baz2'); |
| 365 expect(attributes['dir'], 'rtl'); |
341 | 366 |
342 final dataset = element.dataset; | 367 final dataset = element.dataset; |
343 dataset.remove('foo2'); | 368 dataset.remove('foo2'); |
344 expect(attributes.length, 4); | 369 expect(attributes.length, 4); |
345 expect(dataset.length, 1); | 370 expect(dataset.length, 1); |
346 attributes.remove('style'); | 371 attributes.remove('style'); |
347 expect(attributes.length, 3); | 372 expect(attributes.length, 3); |
348 dataset['foo3'] = 'baz3'; | 373 dataset['foo3'] = 'baz3'; |
349 expect(dataset.length, 2); | 374 expect(dataset.length, 2); |
350 expect(attributes.length, 4); | 375 expect(attributes.length, 4); |
351 attributes['style'] = 'width: 300px;'; | 376 attributes['style'] = 'width: 300px;'; |
352 expect(attributes.length, 5); | 377 expect(attributes.length, 5); |
353 }); | 378 }); |
354 | 379 |
355 test('namespaces', () { | 380 test('namespaces', () { |
356 var element = new svg.SvgElement.svg( | 381 var element = |
357 '''<svg xmlns="http://www.w3.org/2000/svg" | 382 new svg.SvgElement.svg('''<svg xmlns="http://www.w3.org/2000/svg" |
358 xmlns:xlink="http://www.w3.org/1999/xlink"> | 383 xmlns:xlink="http://www.w3.org/1999/xlink"> |
359 <image xlink:href="foo" data-foo="bar"/> | 384 <image xlink:href="foo" data-foo="bar"/> |
360 </svg>''').children[0]; | 385 </svg>''').children[0]; |
361 | 386 |
362 var attributes = element.attributes; | 387 var attributes = element.attributes; |
363 expect(attributes.length, 1); | 388 expect(attributes.length, 1); |
364 expect(attributes['data-foo'], 'bar'); | 389 expect(attributes['data-foo'], 'bar'); |
365 | 390 |
366 var xlinkAttrs = | 391 var xlinkAttrs = |
367 element.getNamespacedAttributes('http://www.w3.org/1999/xlink'); | 392 element.getNamespacedAttributes('http://www.w3.org/1999/xlink'); |
368 expect(xlinkAttrs.length, 1); | 393 expect(xlinkAttrs.length, 1); |
369 expect(xlinkAttrs['href'], 'foo'); | 394 expect(xlinkAttrs['href'], 'foo'); |
370 | 395 |
371 xlinkAttrs.remove('href'); | 396 xlinkAttrs.remove('href'); |
372 expect(xlinkAttrs.length, 0); | 397 expect(xlinkAttrs.length, 0); |
373 | 398 |
374 xlinkAttrs['href'] = 'bar'; | 399 xlinkAttrs['href'] = 'bar'; |
375 expect(xlinkAttrs['href'], 'bar'); | 400 expect(xlinkAttrs['href'], 'bar'); |
376 | 401 |
377 var randomAttrs = element.getNamespacedAttributes('http://example.com'); | 402 var randomAttrs = element.getNamespacedAttributes('http://example.com'); |
378 expect(randomAttrs.length, 0); | 403 expect(randomAttrs.length, 0); |
379 randomAttrs['href'] = 'bar'; | 404 randomAttrs['href'] = 'bar'; |
380 expect(randomAttrs.length, 1); | 405 expect(randomAttrs.length, 1); |
381 }); | 406 }); |
382 }); | 407 }); |
383 | 408 |
384 group('children', () { | 409 group('children', () { |
385 test('is a subset of nodes', () { | 410 test('is a subset of nodes', () { |
386 var el = new Element.html("<div>Foo<br/><img/></div>"); | 411 var el = new Element.html("<div>Foo<br/><img/></div>"); |
387 expect(el.nodes.length, 3); | 412 expect(el.nodes.length, 3); |
388 expect(el.children.length, 2); | 413 expect(el.children.length, 2); |
389 expect(el.nodes[1], el.children[0]); | 414 expect(el.nodes[1], el.children[0]); |
390 expect(el.nodes[2], el.children[1]); | 415 expect(el.nodes[2], el.children[1]); |
391 }); | 416 }); |
(...skipping 22 matching lines...) Expand all Loading... |
414 test('forEach', () { | 439 test('forEach', () { |
415 var els = []; | 440 var els = []; |
416 var el = makeElementWithChildren(); | 441 var el = makeElementWithChildren(); |
417 el.children.forEach((n) => els.add(n)); | 442 el.children.forEach((n) => els.add(n)); |
418 expect(els[0], isBRElement); | 443 expect(els[0], isBRElement); |
419 expect(els[1], isImageElement); | 444 expect(els[1], isImageElement); |
420 expect(els[2], isInputElement); | 445 expect(els[2], isInputElement); |
421 }); | 446 }); |
422 | 447 |
423 test('where', () { | 448 test('where', () { |
424 var filtered = makeElementWithChildren().children. | 449 var filtered = |
425 where((n) => n is ImageElement); | 450 makeElementWithChildren().children.where((n) => n is ImageElement); |
426 expect(1, filtered.length); | 451 expect(1, filtered.length); |
427 expect(filtered.first, isImageElement); | 452 expect(filtered.first, isImageElement); |
428 expect(filtered, isElementIterable); | 453 expect(filtered, isElementIterable); |
429 }); | 454 }); |
430 | 455 |
431 test('every', () { | 456 test('every', () { |
432 var el = makeElementWithChildren(); | 457 var el = makeElementWithChildren(); |
433 expect(el.children.every((n) => n is Element), isTrue); | 458 expect(el.children.every((n) => n is Element), isTrue); |
434 expect(el.children.every((n) => n is InputElement), isFalse); | 459 expect(el.children.every((n) => n is InputElement), isFalse); |
435 }); | 460 }); |
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
757 expect(range, isElementList); | 782 expect(range, isElementList); |
758 expect(range[0], isImageElement); | 783 expect(range[0], isImageElement); |
759 expect(range[1], isInputElement); | 784 expect(range[1], isInputElement); |
760 }); | 785 }); |
761 }); | 786 }); |
762 | 787 |
763 group('eventDelegation', () { | 788 group('eventDelegation', () { |
764 test('matches', () { | 789 test('matches', () { |
765 Element clickOne = new Element.a(); | 790 Element clickOne = new Element.a(); |
766 Element selectorOne = new Element.div() | 791 Element selectorOne = new Element.div() |
767 ..classes.add('selector') | 792 ..classes.add('selector') |
768 ..children.add(clickOne); | 793 ..children.add(clickOne); |
769 | 794 |
770 Element clickTwo = new Element.a(); | 795 Element clickTwo = new Element.a(); |
771 Element selectorTwo = new Element.div() | 796 Element selectorTwo = new Element.div() |
772 ..classes.add('selector') | 797 ..classes.add('selector') |
773 ..children.add(clickTwo); | 798 ..children.add(clickTwo); |
774 document.body.append(selectorOne); | 799 document.body.append(selectorOne); |
775 document.body.append(selectorTwo); | 800 document.body.append(selectorTwo); |
776 | 801 |
777 document.body.onClick.matches('.selector').listen(expectAsync( | 802 document.body.onClick |
778 (Event event) { | 803 .matches('.selector') |
| 804 .listen(expectAsync((Event event) { |
779 expect(event.currentTarget, document.body); | 805 expect(event.currentTarget, document.body); |
780 expect(event.target, clickOne); | 806 expect(event.target, clickOne); |
781 expect(event.matchingTarget, selectorOne); | 807 expect(event.matchingTarget, selectorOne); |
782 })); | 808 })); |
783 | 809 |
784 selectorOne.onClick.matches('.selector').listen(expectAsync( | 810 selectorOne.onClick |
785 (Event event) { | 811 .matches('.selector') |
| 812 .listen(expectAsync((Event event) { |
786 expect(event.currentTarget, selectorOne); | 813 expect(event.currentTarget, selectorOne); |
787 expect(event.target, clickOne); | 814 expect(event.target, clickOne); |
788 expect(event.matchingTarget, selectorOne); | 815 expect(event.matchingTarget, selectorOne); |
789 })); | 816 })); |
790 clickOne.click(); | 817 clickOne.click(); |
791 | 818 |
792 Element elem = new Element.div()..classes.addAll(['a', 'b']); | 819 Element elem = new Element.div()..classes.addAll(['a', 'b']); |
793 Element img = new Element.img() | 820 Element img = new Element.img() |
794 ..classes.addAll(['b', 'a', 'd']) | 821 ..classes.addAll(['b', 'a', 'd']) |
795 ..id = 'cookie'; | 822 ..id = 'cookie'; |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 }); | 916 }); |
890 | 917 |
891 b.on['custom_event'].capture((_) { | 918 b.on['custom_event'].capture((_) { |
892 eventOrder.add('b capture'); | 919 eventOrder.add('b capture'); |
893 }); | 920 }); |
894 | 921 |
895 document.body.append(a); | 922 document.body.append(a); |
896 | 923 |
897 var event = new Event('custom_event', canBubble: true); | 924 var event = new Event('custom_event', canBubble: true); |
898 c.dispatchEvent(event); | 925 c.dispatchEvent(event); |
899 expect(eventOrder, [ | 926 expect(eventOrder, |
900 'a capture', | 927 ['a capture', 'b capture', 'b no-capture', 'a no-capture']); |
901 'b capture', | |
902 'b no-capture', | |
903 'a no-capture' | |
904 ]); | |
905 }); | 928 }); |
906 }); | 929 }); |
907 | 930 |
908 group('ElementList', () { | 931 group('ElementList', () { |
909 // Tests for methods on the DOM class 'NodeList'. | 932 // Tests for methods on the DOM class 'NodeList'. |
910 // | 933 // |
911 // There are two interesting things that are checked here from the viewpoint | 934 // There are two interesting things that are checked here from the viewpoint |
912 // of the dart2js implementation of a 'native' class: | 935 // of the dart2js implementation of a 'native' class: |
913 // | 936 // |
914 // 1. Some methods are implementated from by 'Object' or 'Interceptor'; | 937 // 1. Some methods are implementated from by 'Object' or 'Interceptor'; |
915 // some of these tests simply check that a method can be called. | 938 // some of these tests simply check that a method can be called. |
916 // 2. Some methods are implemented by mixins. | 939 // 2. Some methods are implemented by mixins. |
917 | 940 |
918 ElementList<Element> makeElementList() => | 941 ElementList<Element> makeElementList() => |
919 (new Element.html("<div>Foo<br/><!--baz--><br/><br/></div>")) | 942 (new Element.html("<div>Foo<br/><!--baz--><br/><br/></div>")) |
920 .queryAll('br'); | 943 .queryAll('br'); |
921 | 944 |
922 test('hashCode', () { | 945 test('hashCode', () { |
923 var nodes = makeElementList(); | 946 var nodes = makeElementList(); |
924 var hash = nodes.hashCode; | 947 var hash = nodes.hashCode; |
925 final int N = 1000; | 948 final int N = 1000; |
926 int matchCount = 0; | 949 int matchCount = 0; |
927 for (int i = 0; i < N; i++) { | 950 for (int i = 0; i < N; i++) { |
928 if (makeElementList().hashCode == hash) matchCount++; | 951 if (makeElementList().hashCode == hash) matchCount++; |
929 } | 952 } |
930 expect(matchCount, lessThan(N)); | 953 expect(matchCount, lessThan(N)); |
931 }); | 954 }); |
932 | 955 |
933 test('operator==', () { | 956 test('operator==', () { |
934 var a = [makeElementList(), makeElementList(), null]; | 957 var a = [makeElementList(), makeElementList(), null]; |
935 for (int i = 0; i < a.length; i++) { | 958 for (int i = 0; i < a.length; i++) { |
936 for (int j = 0; j < a.length; j++) { | 959 for (int j = 0; j < a.length; j++) { |
937 expect(i == j, a[i] == a[j]); | 960 expect(i == j, a[i] == a[j]); |
938 } | 961 } |
939 } | 962 } |
940 }); | 963 }); |
941 | 964 |
942 test('runtimeType', () { | 965 test('runtimeType', () { |
943 var nodes1 = makeElementList(); | 966 var nodes1 = makeElementList(); |
944 var nodes2 = makeElementList(); | 967 var nodes2 = makeElementList(); |
945 var type1 = nodes1.runtimeType; | 968 var type1 = nodes1.runtimeType; |
946 var type2 = nodes2.runtimeType; | 969 var type2 = nodes2.runtimeType; |
947 expect(type1 == type2, true); | 970 expect(type1 == type2, true); |
(...skipping 18 matching lines...) Expand all Loading... |
966 expect(filtered.length, 3); | 989 expect(filtered.length, 3); |
967 expect(filtered[0], isBRElement); | 990 expect(filtered[0], isBRElement); |
968 }); | 991 }); |
969 | 992 |
970 test('sublist', () { | 993 test('sublist', () { |
971 var range = makeElementList().sublist(1, 3); | 994 var range = makeElementList().sublist(1, 3); |
972 expect(range.length, 2); | 995 expect(range.length, 2); |
973 expect(range[0], isBRElement); | 996 expect(range[0], isBRElement); |
974 expect(range[1], isBRElement); | 997 expect(range[1], isBRElement); |
975 }); | 998 }); |
976 | |
977 }); | 999 }); |
978 } | 1000 } |
OLD | NEW |