OLD | NEW |
---|---|
(Empty) | |
1 <!doctype html> | |
2 <head> | |
3 <script src="../resources/testharness.js"></script> | |
4 <script src="../resources/testharnessreport.js"></script> | |
5 <script src="./resources/resizeTestHelper.js"></script> | |
6 <style> | |
7 div { | |
8 border: 1px dotted gray | |
9 } | |
10 .transform { | |
11 transform: scale(2,2) rotate(90deg) | |
12 } | |
13 </style> | |
14 </head> | |
15 <p>ResizeObserver tests</p> | |
16 <div id="target1" style="width:100px;height:100px;">t1 | |
17 <div id="target2" style="width:100px;height:100px;">t2 | |
18 <div id="target3" style="width:100px;height:100px;">t3 | |
19 <span id="inline">inline</span> | |
20 </div> | |
21 </div> | |
22 </div> | |
23 <div id="absolute" style="width:100.5px;height:100.5px;position:absolute;top:10. 3px;left:10.3px"> | |
24 <script> | |
25 'use strict'; | |
26 | |
27 var helper = new ResizeTestHelper(); | |
28 | |
29 let t1 = document.querySelector('#target1'); | |
30 let t2 = document.querySelector('#target2'); | |
31 let t3 = document.querySelector('#target3'); | |
32 let abs = document.querySelector('#absolute'); | |
33 let inline = document.querySelector('#inline'); | |
34 | |
35 setup({allow_uncaught_exception: true}); | |
36 | |
37 function test0() { | |
38 helper.createTest( | |
39 "test0: notification ordering", | |
40 setup => { | |
41 helper.observer.disconnect(); | |
42 helper.observer.observe(t3); | |
43 helper.observer.observe(t2); | |
44 helper.observer.observe(t1); | |
45 t1.style.width = "5px"; | |
46 t3.style.width = "5px"; | |
47 t2.style.width = "5px"; | |
48 | |
49 }, | |
50 entries => { | |
51 assert_equals(entries.length, 3, "3 resizes"); | |
52 assert_equals(entries[0].target, t3, "ordering"); | |
53 assert_equals(entries[1].target, t2, "ordering"); | |
54 assert_equals(entries[2].target, t1, "ordering"); | |
55 t1.style.width = "100px"; | |
56 t2.style.width = "100px"; | |
57 t3.style.width = "100px"; | |
58 test1(); | |
59 } | |
60 ); | |
61 } | |
62 | |
63 function test1() { | |
64 helper.createTest( | |
65 "test1: display:none triggers notification", | |
66 setup => { | |
67 helper.observer.disconnect(); | |
68 helper.observer.observe(t1); | |
69 }, | |
70 entries => { | |
71 // initial observation happens here | |
72 } | |
73 ); | |
74 helper.createTest( | |
75 "display:none triggers notification, part 2", | |
76 setup => { | |
77 t1.style.display = "none"; | |
78 }, | |
79 entries => { | |
80 // initial observation happens here | |
81 t1.style.display = ""; | |
82 test2(); | |
83 } | |
84 ); | |
85 } | |
86 | |
87 | |
88 function test2() { | |
89 helper.createTest( | |
90 "test2: remove/reinsert", | |
91 setup => { | |
92 helper.observer.disconnect(); | |
93 helper.observer.observe(t1); | |
94 }, | |
95 entries => { | |
96 // initial observation | |
97 } | |
98 ); | |
99 helper.createTest( | |
100 "removeChild triggers notification", | |
101 setup => { | |
102 t1.parentNode.removeChild(t1); | |
103 }, | |
104 entries => { | |
105 assert_equals(entries[0].target, t1); | |
106 } | |
107 ); | |
108 helper.createTest( | |
109 "appendChild triggers notification", | |
110 setup => { | |
111 document.body.appendChild(t1); | |
112 }, | |
113 entries => { | |
114 assert_equals(entries[0].target, t1); | |
115 test3(); | |
116 } | |
117 ); | |
118 } | |
119 | |
120 | |
121 function test3() { | |
122 helper.createTest( | |
123 "test3: dimensions match", | |
124 setup => { | |
125 helper.observer.disconnect(); | |
126 helper.observer.observe(t1); | |
127 t1.style.width = "200.5px"; | |
128 t1.style.height = "100px"; | |
129 t1.style.paddingLeft = "20px"; | |
130 t1.style.paddingTop = "10px"; | |
eae
2016/07/13 23:39:47
It would be nice to have a test with borders and m
atotic1
2016/07/15 01:43:17
Done.
| |
131 }, | |
132 entries => { | |
133 assert_equals(entries[0].contentRect.left,20); | |
134 assert_equals(entries[0].contentRect.top,10); | |
135 assert_between_inclusive(entries[0].contentRect.width, 200.4, 200.6, "widt h is not rounded"); | |
136 assert_equals(entries[0].contentRect.height, 100); | |
137 test4(); | |
138 } | |
139 ); | |
140 } | |
141 | |
142 function test4() { | |
143 helper.createTest( | |
144 "test4: transform do not cause notifications", | |
145 setup => { | |
146 helper.observer.disconnect(); | |
147 helper.observer.observe(t2); | |
148 }, | |
149 entries => { | |
150 // initial notification | |
151 } | |
152 ); | |
153 helper.createTest( | |
154 "transform do not cause notification, part 2", | |
155 setup => { | |
156 t2.classList.add("transform"); | |
157 }, | |
158 entries => { | |
159 assert_unreached("transform must not trigger notifications"); | |
160 }, | |
161 timeout => { | |
162 t2.classList.remove("transform"); | |
163 test5(); | |
164 } | |
165 ); | |
166 } | |
167 | |
168 | |
169 function test5() { | |
170 helper.createTest( | |
171 "test5: moving an element does not trigger notifications", | |
172 setup => { | |
173 helper.observer.disconnect(); | |
174 helper.observer.observe(abs); | |
175 }, | |
176 entries => { | |
177 // initial observation | |
178 } | |
179 ); | |
180 helper.createTest( | |
181 "moving an element does not trigger notifications, part 2", | |
182 setup => { | |
183 abs.style.top = "20.33px"; | |
184 abs.style.left = "20.33px"; | |
185 }, | |
186 entries => { | |
187 assert_unreached("movement should not cause resize notifications"); | |
188 }, | |
189 timeout => { | |
190 test6(); | |
191 } | |
192 ); | |
193 } | |
194 | |
195 function test6() { | |
196 helper.createTest( | |
197 "test6: inline element does not notify", | |
198 setup => { | |
199 helper.observer.disconnect(); | |
200 helper.observer.observe(inline); | |
201 helper.observer.observe(t1); | |
202 t1.style.width = "66px"; | |
203 inline.style.width = "66px"; | |
204 }, | |
205 entries => { | |
206 assert_equals(entries.length, 1, "inline elements must not trigger notific ations"); | |
207 assert_equals(entries[0].target, t1, "inline elements must not trigger no tifications"); | |
208 } | |
209 ); | |
210 helper.createTest( | |
211 "inline element that becomes block should notify", | |
212 setup => { | |
213 inline.style.display = "block"; | |
214 }, | |
215 entries => { | |
216 assert_equals(entries[0].target, inline); | |
217 test7(); | |
218 } | |
219 ); | |
220 } | |
221 | |
222 function test7() { | |
223 let test = async_test("test7: unobserve inside notify callback"); | |
224 | |
225 let notifyStep = 0; | |
226 let notify = entries => { | |
227 switch(notifyStep) { | |
228 case 0: | |
229 // initial setup | |
230 t1.style.width = "777px"; | |
231 t2.style.width = "777px"; | |
232 ro.unobserve(t1); | |
233 break; | |
234 case 1: | |
235 test.step(_ => { | |
236 assert_equals(entries.length, 1, "only t2 is observed"); | |
237 assert_equals(entries[0].target, t2, "only t2 is observed"); | |
238 test8(); | |
239 helper.startTests(); | |
240 test.done(); | |
241 ro.disconnect(); | |
242 }); | |
243 break; | |
244 } | |
245 notifyStep++; | |
246 } | |
247 | |
248 let ro = new ResizeObserver(notify); | |
249 ro.observe(t1); | |
250 ro.observe(t2); | |
251 } | |
252 | |
253 function test8() { | |
254 let test = async_test("test8: observe inside notify callback"); | |
255 | |
256 let notifyStep = 0; | |
257 let notify = entries => { | |
258 switch(notifyStep) { | |
259 case 0: | |
260 // intial setup | |
261 ro.observe(t2); | |
262 t2.style.width = "888px"; | |
263 break; | |
264 case 1: | |
265 test.step( _ => { | |
266 assert_equals(entries.length, 1, "only t2 is observed"); | |
267 assert_equals(entries[0].target, t2, "only t2 is observed"); | |
268 test9(); | |
269 test.done(); | |
270 ro.disconnect(); | |
271 }); | |
272 break; | |
273 } | |
274 notifyStep++; | |
275 } | |
276 | |
277 let ro = new ResizeObserver(notify); | |
278 ro.observe(t1); | |
279 } | |
280 | |
281 function test9() { | |
282 let test = async_test("test9: disconnect inside notify callback"); | |
283 | |
284 let notifyStep = 0; | |
285 let timeoutId = 0; | |
286 let notify = entries => { | |
287 switch(notifyStep) { | |
288 case 0: | |
289 // intial setup | |
290 t1.style.width = "888px"; | |
291 ro.disconnect(); | |
292 timeoutId = test.step_timeout(_ => { | |
293 test10(); | |
294 test.done(); | |
295 }, ResizeTestHelper.TIMEOUT); | |
296 break; | |
297 case 1: | |
298 window.clearTimeout(timeoutId); | |
299 test.step( _ => { | |
300 assert_unreached("there should be no notifications after disconnect"); | |
301 }); | |
302 break; | |
303 } | |
304 notifyStep++; | |
305 } | |
306 | |
307 let ro = new ResizeObserver(notify); | |
308 ro.observe(t1); | |
309 } | |
310 | |
311 var onErrorCalled = false; | |
312 | |
313 window.onerror = err => { | |
314 onErrorCalled = true; | |
315 } | |
316 | |
317 function test10() { | |
318 helper.createTest( | |
319 "test10: multiple notifications inside same event loop, with limit exceeded" , | |
320 setup => { | |
321 onErrorCalled = false; | |
322 helper.observer.disconnect(); | |
323 helper.observer.observe(t1); | |
324 }, | |
325 entries => { | |
326 // initial notification | |
327 } | |
328 ); | |
329 let rAF = 0; | |
330 | |
331 // Following tests should all complete within | |
332 // a same event loop. Use rAF to detect loop end. | |
333 for (let i=0; i<20; i++) { | |
334 helper.createTest( | |
335 "notify with error" + i, | |
336 setup => { | |
337 if (i == 0) | |
338 window.requestAnimationFrame(_ => { rAF++; }); | |
339 t1.style.width = i * 10 + "px"; | |
340 }, | |
341 entries => { | |
342 if (i < 15) { | |
343 assert_equals(rAF, 0, "must stay in same notify loop for 16 loops"); | |
344 } | |
345 else if (i >= 15) { | |
346 assert_true(onErrorCalled, "window.onerror should be called if limit e xceeded"); | |
347 assert_equals(rAF, 1, "raf was called after limit was exceeded"); | |
348 } | |
349 } | |
350 ); | |
351 } | |
352 helper.startTests(); | |
353 }; | |
354 | |
355 test0(); | |
356 helper.startTests(); | |
357 | |
358 </script> | |
359 <!-- file:///usr/local/google/home/atotic/chromium/src/third_party/WebKit/Layout Tests/resize-observer/notify.html --> | |
OLD | NEW |