OLD | NEW |
| (Empty) |
1 <!-- | |
2 Copyright 2013 Google Inc. All Rights Reserved. | |
3 | |
4 Licensed under the Apache License, Version 2.0 (the "License"); | |
5 you may not use this file except in compliance with the License. | |
6 You may obtain a copy of the License at | |
7 | |
8 http://www.apache.org/licenses/LICENSE-2.0 | |
9 | |
10 Unless required by applicable law or agreed to in writing, software | |
11 distributed under the License is distributed on an "AS IS" BASIS, | |
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 See the License for the specific language governing permissions and | |
14 limitations under the License. | |
15 | |
16 Written by Steph McArthur | |
17 --> | |
18 | |
19 <!DOCTYPE html><meta charset="UTF-8"> | |
20 <div id="anim"></div> | |
21 | |
22 <script src="../bootstrap.js"></script> | |
23 <script> | |
24 var animation = new Animation(anim, {left: "100px"}, 100); | |
25 var dt = document.timeline; | |
26 | |
27 // Test AnimationPlayer.timeline. | |
28 var player1 = dt.play(animation); | |
29 test(function() {assert_equals(player1.timeline, document.timeline)}, | |
30 "AnimationPlayer.timeline is document timeline"); | |
31 | |
32 // Test that TimedItem.player and AnimationPlayer.source are consistent. | |
33 test(function() {assert_equals(player1.source, animation)}, | |
34 "AnimationPlayer.source should be the Animation"); | |
35 test(function() {assert_equals(animation.player, player1)}, | |
36 "TimedItem.player should be the AnimationPlayer"); | |
37 | |
38 // Test that play() always returns a new AnimationPlayer. | |
39 var player2 = dt.play(animation); | |
40 test(function() {assert_not_equals(player2, player1)}, | |
41 "Repeated calls to play() should create a new AnimationPlayer"); | |
42 test(function() {assert_equals(animation.player, player2)}, | |
43 "Repeated play(): TimedItem.player should be the AnimationPlayer"); | |
44 test(function() {assert_equals(player2.source, animation)}, | |
45 "Repeated play(): AnimationPlayer.source should be the Animation"); | |
46 test(function() {assert_equals(player2.startTime, player1.startTime)}, | |
47 "Repeated play(): Players should have same start time"); | |
48 | |
49 // Test explicit setting of AnimationPlayer.source. | |
50 player1.source = animation; | |
51 test(function() {assert_equals(player2.source, null)}, | |
52 "Set AnimationPlayer.source: Old source should be null"); | |
53 test(function() {assert_equals(player1.source, animation)}, | |
54 "Set AnimationPlayer.source: New source should be the Animation"); | |
55 test(function() {assert_equals(animation.player, player1)}, | |
56 "Set AnimationPlayer.source: TimedItem.player should be the AnimationPlayer
"); | |
57 | |
58 // Test that TimedItem.player gives null on a detached tree. | |
59 var animation2 = | |
60 new Animation(document.getElementById("anim"), {left: "100px"}); | |
61 var animationGroup = new AnimationGroup([animation2]); | |
62 test(function() {assert_equals(animationGroup.player, null)}, | |
63 "TimedItem.player should be null for root"); | |
64 test(function() {assert_equals(animation2.player, null)}, | |
65 "TimedItem.player should be null for leaf"); | |
66 | |
67 // Test that TimedItem.player remotes to the root of the tree. | |
68 var player3 = dt.play(animationGroup); | |
69 test(function() {assert_equals(animation2.player, player3)}, | |
70 "TimedItem.player should remote"); | |
71 | |
72 // Test that calling play() on a TimedItem with a parent results in | |
73 // reparenting. | |
74 var player4 = dt.play(animation2); | |
75 test(function() {assert_equals(animation2.parent, null)}, | |
76 "Animation should be reparented"); | |
77 test(function() {assert_equals(animationGroup.children.length, 0)}, | |
78 "Animation parent should be updated, leaving animationGroup.children.length
= 0"); | |
79 test(function() {assert_equals(player4.source, animation2)}, | |
80 "AnimationPlayer should use reparented animation"); | |
81 | |
82 // Test that setting a parent on a TimedItem with an AnimationPlayer causes the | |
83 // player to be disconnected. | |
84 animationGroup.append(animation2); | |
85 test(function() {assert_equals(animationGroup.player, player3)}, | |
86 "TimedItem.player should be updated for root"); | |
87 test(function() {assert_equals(animation2.player, player3)}, | |
88 "TimedItem.player should be updated for leaf"); | |
89 test(function() {assert_equals(player4.source, null)}, | |
90 "AnimationPlayer.source should be updated"); | |
91 test(function() {assert_equals(animation2.parent, animationGroup)}, | |
92 "Animation.parent should be updated"); | |
93 test(function() {assert_equals(animationGroup.children.length, 1)}, | |
94 "Animation parent should be updated, leaving animationGroup.children.lengt
h = 1"); | |
95 test(function() {assert_equals(animationGroup.children[0], animation2)}, | |
96 "Animation parent should be updated"); | |
97 | |
98 // Test that currentTime is zero before timeline starts. | |
99 test(function() {assert_equals(document.timeline.play(animation).currentTime, 0
)}, | |
100 "currentTime should be zero before Timeline starts"); | |
101 | |
102 // Test that startTime is zero before timeline starts. | |
103 test(function() {assert_equals(document.timeline.play(animation).startTime, 0)}
, | |
104 "startTime should be zero before Timeline starts"); | |
105 | |
106 // Test that setting currentTime has an effect before the timeline starts. | |
107 var player5 = dt.play(animation); | |
108 player5.currentTime = 42; | |
109 test(function() {assert_equals(player5.currentTime, 42)}, | |
110 "player5 can be seeked before timeline starts"); | |
111 timing_test(function() { | |
112 at(0.1, function() { | |
113 assert_equals(player5.currentTime, 42.1); | |
114 }); | |
115 }, "player5's updates to currentTime should persist after Timeline starts"); | |
116 | |
117 // Test that setting startTime has an effect before the timeline starts. | |
118 var player6 = dt.play(animation.clone()); | |
119 player6.startTime = 42; | |
120 test(function() {assert_equals(player6.currentTime, -42)}, | |
121 "player6's currentTime should always be zero before Timeline starts"); | |
122 | |
123 // Test that an AnimationPlayer's TimedItem gets a null inherited time until the | |
124 // timeline starts. | |
125 var animation1 = new Animation(document.getElementById("anim"), {left: "100px"})
; | |
126 dt.play(animation1); | |
127 test(function() {assert_equals(animation1.localTime, null)}, | |
128 "TimedItem's inherited time, and thus " + | |
129 "localTime should be null before Timeline starts"); | |
130 timing_test(function() { | |
131 at(0.0, function() {assert_not_equals(animation1.localTime, null)}); | |
132 }, "TimedItem's inherited time " + | |
133 "and thus localTime should not be null after Timeline starts"); | |
134 | |
135 // Test that TimedItem is updated immediately on calling Timeline.play() after | |
136 // the timeline starts. | |
137 var animation4 = new Animation( | |
138 document.getElementById("anim"), {left: "100px"}); | |
139 test(function() {assert_equals(animation4.localTime, null)}, | |
140 "localTime should be null before playing"); | |
141 timing_test(function() { | |
142 at(0.0, function() { | |
143 document.timeline.play(animation4); | |
144 assert_equals(animation4.localTime, 0) | |
145 }); | |
146 }, "localTime should be set by playing"); | |
147 | |
148 // Test that updates to currentTime take immediate effect. | |
149 timing_test(function() { | |
150 at(0.0, function() { | |
151 var animation5 = new Animation( | |
152 document.getElementById("anim"), {left: "100px"}, 100); | |
153 document.timeline.play(animation5).currentTime = 42; | |
154 assert_equals(animation5.localTime, 42); | |
155 }); | |
156 }, "Updates to AnimationPlayer.currentTime should take immediate effect"); | |
157 | |
158 // Test that updates to source take immediate effect. | |
159 timing_test(function() { | |
160 at(0.0, function() { | |
161 var player = document.timeline.play(new Animation( | |
162 document.getElementById("anim"), {left: "100px"})); | |
163 var animation7 = new Animation( | |
164 document.getElementById("anim"), {left: "100px"}); | |
165 player.source = animation7; | |
166 assert_equals(animation7.localTime, 0); | |
167 }); | |
168 }, "Updates to AnimationPlayer.source should take immediate effect"); | |
169 | |
170 function createPlayer(duration) { | |
171 return document.timeline.play(new Animation(null, null, duration)); | |
172 } | |
173 | |
174 // Tests the initial values of the AnimationPlayer API. | |
175 timing_test(function() { | |
176 at(0, function() { | |
177 var anim = new Animation(null, null, 3); | |
178 assert_equals(anim.player, null, "player should be null initially"); | |
179 | |
180 // Check state after playing | |
181 document.timeline.play(anim); | |
182 assert_not_equals(anim.player, null, "player should be not be null when pl
aying"); | |
183 assert_equals(anim.player.source, anim, "Initial source content"); | |
184 assert_equals(anim.player.timeline, document.timeline, "Initial document t
imeline"); | |
185 assert_equals(anim.player.startTime, document.timeline.currentTime, "Initi
al start time"); | |
186 assert_equals(anim.player.currentTime, 0, "Initial current time"); | |
187 assert_equals(anim.player.timeLag, 0, "Initial time lag"); | |
188 assert_equals(anim.player.playbackRate, 1, "Initial playback rate"); | |
189 assert_false(anim.player.paused, "Initial paused state"); | |
190 assert_false(anim.player.finished, "Initial finished state"); | |
191 }); | |
192 }, "Initial state"); | |
193 | |
194 // Test paused states after pausing. | |
195 test(function() { | |
196 var player = createPlayer(3); | |
197 | |
198 // Pause | |
199 player.pause(); | |
200 assert_true(player.paused, "Paused state after pausing"); | |
201 assert_false(player.finished, "Finished state after pausing"); | |
202 | |
203 // Unpause | |
204 player.play(); | |
205 assert_false(player.paused, "Paused state after unpausing"); | |
206 assert_false(player.finished, "Finished state after unpausing"); | |
207 }, "Pause"); | |
208 | |
209 // Test seeking behind startTime for a forwards player. | |
210 timing_test(function() { | |
211 var player = createPlayer(3); | |
212 | |
213 // Seek before start | |
214 player.currentTime = -0.1; | |
215 assert_equals(player.currentTime, -0.1, "Current time after seeking before s
tart"); | |
216 assert_false(player.paused, "Paused state after seeking before start"); | |
217 assert_false(player.finished, "Finished state after seeking before start"); | |
218 | |
219 // Check player does progress | |
220 at(0.2, function() { | |
221 assert_equals(player.currentTime, 0.1, "Current time should progress"); | |
222 }); | |
223 }, "Seek behind content (forwards)"); | |
224 | |
225 // Test players do not get bounded after updating startTime such that they are b
efore the start time. | |
226 timing_test(function() { | |
227 var player = createPlayer(3); | |
228 | |
229 // Set start time in the future | |
230 player.startTime = 0.1; | |
231 | |
232 // Check state of player | |
233 assert_equals(player.currentTime, -0.1, "Current time while waiting to start
"); | |
234 assert_false(player.paused, "Paused state while waiting to start"); | |
235 assert_false(player.finished, "Finished state while waiting to start"); | |
236 | |
237 // Check player starts automatically | |
238 at(0.2, function() { | |
239 assert_equals(player.currentTime, 0.1, "Current time should progress"); | |
240 assert_false(player.paused, "Paused state after starting"); | |
241 assert_false(player.finished, "Finished state after starting"); | |
242 }); | |
243 }, "No bounding at start"); | |
244 | |
245 // Test players get bounded when they finish their source content. | |
246 timing_test(function() { | |
247 var player = createPlayer(3); | |
248 | |
249 // Seek to just before end | |
250 player.currentTime = 2.9; | |
251 | |
252 // Check state of player | |
253 assert_equals(player.currentTime, 2.9, "Current time just before end"); | |
254 assert_false(player.paused, "Paused state just before end"); | |
255 assert_false(player.finished, "Finished state just before end"); | |
256 | |
257 // Check player after finishing | |
258 at(0.2, function() { | |
259 assert_equals(player.currentTime, 3.0, "Current time when bounded progress
"); | |
260 assert_false(player.paused, "Paused state after ending"); | |
261 assert_true(player.finished, "Finished state after ending"); | |
262 }); | |
263 }, "Limiting at end (seek with current time)"); | |
264 | |
265 // Test players get bounded when they finish their source content after altering
start time. | |
266 timing_test(function() { | |
267 var player = createPlayer(3); | |
268 | |
269 // Seek to just before end using the start time | |
270 player.startTime -= 2.9; | |
271 | |
272 // Check state of player | |
273 assert_equals(player.currentTime, 2.9, "Current time just before end"); | |
274 assert_false(player.paused, "Paused state just before end"); | |
275 assert_false(player.finished, "Finished state just before end"); | |
276 | |
277 // Check player after finishing | |
278 at(0.2, function() { | |
279 assert_equals(player.currentTime, 3.0, "Current time when bounded progress
"); | |
280 assert_false(player.paused, "Paused state after ending"); | |
281 assert_true(player.finished, "Finished state after ending"); | |
282 }); | |
283 }, "Limiting at end (seek with start time)"); | |
284 | |
285 // Test reversing a player prior to starting doesn't snap the current time to th
e beginning. | |
286 timing_test(function() { | |
287 var player = createPlayer(3); | |
288 | |
289 // Seek before start | |
290 player.currentTime = -0.1; | |
291 | |
292 // Check state | |
293 assert_equals(player.currentTime, -0.1, "Current time before reversing"); | |
294 assert_false(player.finished, "Finished state before reversing"); | |
295 | |
296 // Reverse | |
297 player.reverse(); | |
298 assert_equals(player.currentTime, -0.1, "Current time after reversing"); | |
299 assert_true(player.finished, "Finished state after reversing"); | |
300 assert_equals(player.playbackRate, -1, "Playback rate after reversing"); | |
301 | |
302 // Check player after some time | |
303 at(0.2, function() { | |
304 assert_equals(player.currentTime, -0.1, "Current time later"); | |
305 assert_true(player.finished, "Finished state later"); | |
306 }); | |
307 }, "reverse() before start"); | |
308 | |
309 // Test reversing a player at the start causes the player to become bounded. | |
310 timing_test(function() { | |
311 var player = createPlayer(3); | |
312 | |
313 // Reverse | |
314 player.reverse(); | |
315 assert_equals(player.currentTime, 0, "Current time after reversing"); | |
316 assert_true(player.finished, "Finished state after reversing"); | |
317 assert_equals(player.playbackRate, -1, "Playback rate after reversing"); | |
318 | |
319 // Check player after some time | |
320 at(0.2, function() { | |
321 assert_equals(player.currentTime, 0, "Current time later"); | |
322 assert_true(player.finished, "Finished state later"); | |
323 }); | |
324 }, "reverse() at start"); | |
325 | |
326 // Test reversing a player halfway through an animation. | |
327 timing_test(function() { | |
328 var player = createPlayer(3); | |
329 | |
330 // Seek midway | |
331 player.currentTime = 1.5; | |
332 | |
333 // Reverse | |
334 player.reverse(); | |
335 assert_equals(player.currentTime, 1.5, "Current time after reversing"); | |
336 assert_false(player.finished, "Finished state after reversing"); | |
337 assert_equals(player.playbackRate, -1, "Playback rate after reversing"); | |
338 | |
339 // Check player after some time | |
340 at(0.2, function() { | |
341 assert_equals(player.currentTime, 1.3, "Current time when reversing"); | |
342 assert_false(player.finished, "Finished state later"); | |
343 }); | |
344 }, "reverse() while playing"); | |
345 | |
346 // Test reversing a player that has ended starts playing backwards. | |
347 timing_test(function() { | |
348 var player = createPlayer(3); | |
349 | |
350 // Seek to just before the end | |
351 player.currentTime = 2.9; | |
352 | |
353 // Wait to finish | |
354 at(0.2, function() { | |
355 assert_equals(player.currentTime, 3.0, "Current time when finished"); | |
356 assert_true(player.finished, "Finished state after finished"); | |
357 | |
358 // Reverse | |
359 player.reverse(); | |
360 assert_equals(player.currentTime, 3.0, "Current time after reversing"); | |
361 assert_false(player.finished, "Finished state after reversing"); | |
362 assert_equals(player.playbackRate, -1, "Playback rate after reversing"); | |
363 | |
364 // Check we actually reverse | |
365 at(0.2, function() { | |
366 assert_equals(player.currentTime, 2.8, "Current time after beginning rev
erse"); | |
367 assert_false(player.finished, "Finished state after reversing"); | |
368 }); | |
369 }); | |
370 }, "reverse() when finished"); | |
371 | |
372 // Test reversing a player seeked past the end will snap back to the end. | |
373 timing_test(function() { | |
374 var player = createPlayer(3); | |
375 | |
376 // Seek to past the end | |
377 player.currentTime = 4.0 | |
378 | |
379 player.reverse(); | |
380 assert_equals(player.currentTime, 3.0, "Current time after reversing"); | |
381 assert_false(player.finished, "Finished state after reversing"); | |
382 assert_equals(player.playbackRate, -1, "Playback rate after reversing"); | |
383 | |
384 // Check we actually reverse | |
385 at(0.2, function() { | |
386 assert_equals(player.currentTime, 2.8, "Current time after beginning rever
se"); | |
387 assert_false(player.finished, "Finished state after reversing"); | |
388 }); | |
389 }, "reverse() when seeked past end"); | |
390 | |
391 // Test player current time after adjusting start time. | |
392 test(function() { | |
393 var player = createPlayer(3); | |
394 | |
395 player.startTime = 1; | |
396 | |
397 assert_equals(player.currentTime, -1, "currentTime while waiting to start"); | |
398 assert_false(player.finished, "Finished state while waiting to start"); | |
399 | |
400 // Then put it in range | |
401 player.startTime -= 2; | |
402 assert_equals(player.currentTime, 1, "currentTime after updating start time"
); | |
403 assert_false(player.finished, "Finished state while after updating start tim
e"); | |
404 }, "Adjust start time (1)"); | |
405 | |
406 // Test player current time after adjusting start time and playing. | |
407 timing_test(function() { | |
408 var player = createPlayer(3); | |
409 | |
410 player.startTime = 1; | |
411 | |
412 assert_equals(player.currentTime, -1, "currentTime while waiting to start"); | |
413 assert_false(player.finished, "Finished state while waiting to start"); | |
414 | |
415 // Then adjust start time | |
416 player.startTime -= 0.75; | |
417 | |
418 // Check player is still waiting | |
419 assert_equals(player.currentTime, -0.25, "currentTime while waiting to start
"); | |
420 assert_false(player.finished, "Finished state while still waiting to start")
; | |
421 | |
422 // Verify the time *did* update though | |
423 at(0.5, function() { | |
424 assert_equals(player.currentTime, 0.25, "currentTime after starting to pla
y"); | |
425 assert_false(player.finished, "Finished state after starting to play"); | |
426 }); | |
427 }, "Adjust start time (2)"); | |
428 | |
429 // Test player bounding by changing start time. | |
430 test(function() { | |
431 var player = createPlayer(3); | |
432 | |
433 // Put it past the end | |
434 player.startTime = -4; | |
435 assert_equals(player.currentTime, 3, "currentTime after end"); | |
436 assert_true(player.finished, "Finished state after end"); | |
437 }, "Adjust start time (3)"); | |
438 | |
439 // Test bounding and unbounding a player by modifying start time. | |
440 test(function() { | |
441 var player = createPlayer(3); | |
442 | |
443 // Put player in limited stage | |
444 player.startTime = -4; | |
445 | |
446 assert_equals(player.currentTime, 3, "currentTime state while limited"); | |
447 assert_true(player.finished, "Finished state while limited"); | |
448 | |
449 // Then put it in range | |
450 player.startTime += 2; | |
451 assert_equals(player.currentTime, 2, "currentTime after updating start time"
); | |
452 assert_false(player.finished, "Finished state while after updating start tim
e"); | |
453 }, "Adjust start time (4)"); | |
454 | |
455 // Test seeking past end of player. | |
456 timing_test(function() { | |
457 var player = createPlayer(3); | |
458 player.currentTime = 4; | |
459 assert_equals(player.currentTime, 4, "currentTime before waiting"); | |
460 at(0.2, function() { | |
461 assert_equals(player.currentTime, 4, "currentTime after waiting"); | |
462 }); | |
463 }, "Seeking past player content end and waiting"); | |
464 | |
465 // Test seeking before start of reversed player. | |
466 timing_test(function() { | |
467 var player = createPlayer(3); | |
468 player.playbackRate = -1; | |
469 player.currentTime = -1; | |
470 assert_equals(player.currentTime, -1, "currentTime before waiting"); | |
471 at(0.2, function() { | |
472 assert_equals(player.currentTime, -1, "currentTime after waiting"); | |
473 }); | |
474 }, "Seeking before reversed player content start and waiting"); | |
475 | |
476 // Test reversing the playback rate of a bounded player. | |
477 timing_test(function() { | |
478 var player = createPlayer(3); | |
479 | |
480 // Set up player to start in 0.1s | |
481 player.startTime = 0.1; | |
482 | |
483 // Check state | |
484 assert_equals(player.currentTime, -0.1, "currentTime after while waiting to
start"); | |
485 assert_false(player.finished, "Finished state while waiting to start"); | |
486 | |
487 // Reverse playbackRate | |
488 player.playbackRate = -1; | |
489 | |
490 // We should maintain the same current time | |
491 assert_equals(player.currentTime, -0.1, "currentTime after updating playback
Rate"); | |
492 assert_true(player.finished, "Finished state after updating playbackRate"); | |
493 | |
494 // If we wait a while we should be stuck at the end | |
495 at(0.2, function() { | |
496 assert_equals(player.currentTime, -0.1, "currentTime after waiting"); | |
497 assert_true(player.finished, "Finished state after waiting"); | |
498 | |
499 // Call play and we should start from the end | |
500 player.play(); | |
501 assert_equals(player.currentTime, 3, "currentTime after play()"); | |
502 assert_false(player.finished, "Finished state after play()"); | |
503 }); | |
504 }, "Reversing playbackRate before start"); | |
505 | |
506 // Test normal current time progression of a player after being bounded and unbo
unded. | |
507 timing_test(function() { | |
508 // Set up player | |
509 var player = createPlayer(3); | |
510 | |
511 // Seek to bounded time | |
512 player.currentTime = 4; | |
513 | |
514 // Check state | |
515 assert_equals(player.currentTime, 4, "currentTime while bounded"); | |
516 assert_true(player.finished, "Finished state while bounded"); | |
517 | |
518 // Seek to unbounded time | |
519 player.currentTime = 2; | |
520 assert_equals(player.currentTime, 2, "currentTime while unbounded"); | |
521 assert_false(player.finished, "Finished state while unbounded"); | |
522 | |
523 // Check it actually is playing | |
524 at(0.2, function() { | |
525 assert_equals(player.currentTime, 2.2, "Current time after playing unbound
ed"); | |
526 }); | |
527 }, "Seeking from end to playing"); | |
528 | |
529 // Test finishing and replaying a player in reverse. | |
530 timing_test(function() { | |
531 // Set up player | |
532 var player = createPlayer(3); | |
533 | |
534 // Seek to middle of interval and reverse | |
535 player.currentTime = 2; | |
536 player.reverse(); | |
537 | |
538 // Check state | |
539 assert_equals(player.currentTime, 2, "currentTime after reversing"); | |
540 assert_false(player.finished, "Finished state after reversing"); | |
541 assert_equals(player.playbackRate, -1, "Playback rate after reversing"); | |
542 player.finish(); | |
543 assert_equals(player.currentTime, 0, "currentTime after finishing"); | |
544 assert_true(player.finished, "Finished state after finishing"); | |
545 | |
546 // Then play again | |
547 player.play(); | |
548 assert_equals(player.currentTime, 3, "currentTime after playing again"); | |
549 assert_false(player.finished, "Finished state after playing again"); | |
550 | |
551 // Check if actually progresses | |
552 at(0.2, function() { | |
553 assert_equals(player.currentTime, 2.8, "Current time after playing for a w
hile"); | |
554 }); | |
555 }, "play() on a finished reversed player"); | |
556 | |
557 // Test player.play() seeking to start when behind the source content. | |
558 timing_test(function() { | |
559 // Set up player to start in 2s | |
560 var player = createPlayer(3); | |
561 player.startTime = 2; | |
562 | |
563 // Check it is waiting to start | |
564 assert_equals(player.currentTime, -2, "currentTime while waiting"); | |
565 assert_false(player.finished, "Finished state while waiting"); | |
566 | |
567 // Call play() | |
568 player.play(); | |
569 assert_equals(player.currentTime, 0, "currentTime after calling play()"); | |
570 assert_false(player.finished, "Finished state after calling play()"); | |
571 | |
572 // Check it really is playing | |
573 at(0.5, function() { | |
574 assert_equals(player.currentTime, 0.5, "Current time after playing for a w
hile"); | |
575 }); | |
576 }, "play() on player waiting to start kick-starts it"); | |
577 | |
578 // Test seeking a player to the start of its animation. | |
579 timing_test(function() { | |
580 // Set up player to start in 2s | |
581 var player = createPlayer(3); | |
582 player.startTime = 2; | |
583 | |
584 // Check it is waiting to start | |
585 assert_equals(player.currentTime, -2, "currentTime while waiting"); | |
586 assert_false(player.finished, "Finished state while waiting"); | |
587 | |
588 // Set currentTime = 0 | |
589 player.currentTime = 0; | |
590 assert_equals(player.currentTime, 0, "currentTime after setting currentTime
= 0"); | |
591 assert_false(player.finished, "Finished state after setting currentTime = 0"
); | |
592 | |
593 // Check it is playing | |
594 at(0.5, function() { | |
595 assert_equals(player.currentTime, 0.5, "currentTime after waiting a while"
); | |
596 assert_false(player.finished, "Finished state after waiting a while"); | |
597 }); | |
598 }, "currentTime = 0 on player waiting to start is ok"); | |
599 | |
600 // Test player becoming unbounded after source content is extended. | |
601 timing_test(function() { | |
602 var player = createPlayer(3); | |
603 | |
604 player.currentTime = 4; | |
605 assert_equals(player.currentTime, 4, "currentTime after setting currentTime
= 4"); | |
606 assert_true(player.finished, "Finished state after setting currentTime = 4")
; | |
607 | |
608 // Check it is NOT playing | |
609 at(0.2, function() { | |
610 assert_equals(player.currentTime, 4, "currentTime after waiting a while"); | |
611 | |
612 // Extend source | |
613 player.source.timing.duration = 5; | |
614 assert_equals(player.currentTime, 4, "currentTime after extending source")
; | |
615 assert_false(player.finished, "Finished state after extending source"); | |
616 | |
617 // Check it IS playing | |
618 at(0.2, function() { | |
619 assert_equals(player.currentTime, 4.2, "currentTime after waiting a whil
e again"); | |
620 }); | |
621 }); | |
622 }, "Extending source unblocks player (seek past end)"); | |
623 | |
624 // Test player ending normally and becoming unbounded after source content is ex
tended. | |
625 timing_test(function() { | |
626 var player = createPlayer(3); | |
627 | |
628 // Set currentTime to just before the end | |
629 player.currentTime = 2.9; | |
630 assert_false(player.finished, "Finished state just before ending"); | |
631 | |
632 // Play to end | |
633 at(0.2, function() { | |
634 assert_equals(player.currentTime, 3, "currentTime after ending normally"); | |
635 assert_true(player.finished, "Finished state after ending normally"); | |
636 | |
637 // Extend source | |
638 player.source.timing.duration = 5; | |
639 assert_equals(player.currentTime, 3.0, "currentTime after extending source
"); | |
640 assert_false(player.finished, "Finished state after extending source"); | |
641 | |
642 // Check it is playing | |
643 at(0.2, function() { | |
644 assert_equals(player.currentTime, 3.2, "currentTime after waiting a whil
e again"); | |
645 }); | |
646 }); | |
647 }, "Extending source unblocks player (end normally)"); | |
648 | |
649 // Test player becomes bounded after source content is shortened. | |
650 timing_test(function() { | |
651 var player = createPlayer(3); | |
652 | |
653 // Set currentTime to just before the end | |
654 player.currentTime = 2; | |
655 assert_equals(player.currentTime, 2.0, "currentTime before shortening"); | |
656 assert_false(player.finished, "Finished state before shortening"); | |
657 | |
658 // Shorten source | |
659 player.source.timing.duration = 1; | |
660 assert_equals(player.currentTime, 2.0, "currentTime after shortening"); | |
661 assert_true(player.finished, "Finished state after shortening"); | |
662 | |
663 // Check it is not playing | |
664 at(0.2, function() { | |
665 assert_equals(player.currentTime, 2.0, "currentTime after shortening"); | |
666 }); | |
667 }, "Shortening source blocks player"); | |
668 | |
669 // Test playing player becomes bounded after source content is shortened. | |
670 timing_test(function() { | |
671 var player = createPlayer(3); | |
672 | |
673 // Set currentTime to midway | |
674 player.currentTime = 1.5; | |
675 assert_equals(player.currentTime, 1.5, "currentTime before shortening"); | |
676 assert_false(player.finished, "Finished state after seeking"); | |
677 | |
678 // Let it play for a while | |
679 at(0.2, function() { | |
680 assert_equals(player.currentTime, 1.7, "currentTime before shortening"); | |
681 assert_false(player.finished, "Finished state before shortening"); | |
682 | |
683 // Shorten source | |
684 player.source.timing.duration = 1; | |
685 assert_equals(player.currentTime, 1.7, "currentTime after shortening"); | |
686 assert_true(player.finished, "Finished state after shortening"); | |
687 }); | |
688 }, "Shortening source blocks player when playing"); | |
689 | |
690 // Test reversed player does not become bounded after its source content is shor
tened. | |
691 timing_test(function() { | |
692 var player = createPlayer(3); | |
693 | |
694 // Set currentTime to just before the end | |
695 player.currentTime = 2; | |
696 player.reverse(); | |
697 assert_equals(player.currentTime, 2.0, "currentTime before shortening"); | |
698 assert_false(player.finished, "Finished state before shortening"); | |
699 | |
700 // Shorten source | |
701 player.source.timing.duration = 1; | |
702 assert_equals(player.currentTime, 2.0, "currentTime after shortening"); | |
703 assert_false(player.finished, "Finished state after shortening"); | |
704 | |
705 // Check it is playing | |
706 at(0.2, function() { | |
707 assert_equals(player.currentTime, 1.8, "currentTime after shortening"); | |
708 }); | |
709 }, "Shortening source does not block in reverse"); | |
710 | |
711 // Test player becoming unbounded after duration 0 source content is extended. | |
712 timing_test(function() { | |
713 // Add empty animation | |
714 var player = createPlayer(0); | |
715 | |
716 // Check we don't progress | |
717 assert_equals(player.currentTime, 0, "currentTime before adding content"); | |
718 assert_true(player.finished, "Finished state before adding content"); | |
719 | |
720 // Wait and check we don't progress | |
721 at(0.2, function() { | |
722 assert_equals(player.currentTime, 0, "currentTime after waiting"); | |
723 assert_true(player.finished, "Finished state after waiting"); | |
724 | |
725 // "Add" content | |
726 player.source.timing.duration = 3; | |
727 | |
728 // We should pick up from 0, not jump 0.2s in | |
729 assert_equals(player.currentTime, 0, "currentTime after extending"); | |
730 assert_false(player.finished, "Finished state after extending"); | |
731 | |
732 // Wait and check | |
733 at(0.2, function() { | |
734 assert_equals(player.currentTime, 0.2, "currentTime after extending and
waiting"); | |
735 }); | |
736 }); | |
737 }, "Async add content"); | |
738 | |
739 // Test negative player playback rate with negative current time. | |
740 timing_test(function() { | |
741 var player = createPlayer(3); | |
742 | |
743 // Set a negative time and let it play for a while | |
744 player.currentTime = -1; | |
745 at(0.2, function() { | |
746 assert_equals(player.currentTime, -0.8, "currentTime after waiting"); | |
747 assert_false(player.finished, "Finished state after waiting"); | |
748 | |
749 // Reverse | |
750 player.playbackRate = -1; | |
751 assert_equals(player.currentTime, -0.8, "currentTime after reversing"); | |
752 assert_true(player.finished, "Finished state after reversing"); | |
753 }); | |
754 }, "Setting negative playback rate in negative space"); | |
755 | |
756 // Test reversed player becoming bounded when start of animation is reached. | |
757 timing_test(function() { | |
758 var player = createPlayer(3); | |
759 | |
760 // Seek to just before end | |
761 player.reverse(); | |
762 player.currentTime = 0.1; | |
763 | |
764 // Check state of player | |
765 assert_equals(player.currentTime, 0.1, "Current time just before end"); | |
766 assert_false(player.paused, "Paused state just before end"); | |
767 assert_false(player.finished, "Finished state just before end"); | |
768 | |
769 // Check player after finishing | |
770 at(0.2, function() { | |
771 assert_equals(player.currentTime, 0, "Current time when limited"); | |
772 assert_false(player.paused, "Paused state after ending"); | |
773 assert_true(player.finished, "Finished state after ending"); | |
774 }); | |
775 }, "Limiting at start"); | |
776 | |
777 // Test the floating point accuracy of seeking a player. | |
778 test(function() { | |
779 var player = createPlayer(3); | |
780 // Setting a high playbackRate has caused the reported currentTime to differ | |
781 // from what was set in previous implementations of AnimationPlayer. | |
782 player.playbackRate = 123456; | |
783 player.currentTime = 1.618; | |
784 assert_equals(player.currentTime, 1.618, "currentTime after seeking to fract
ional time"); | |
785 }, "currentTime preserves floating point accuracy after seeking"); | |
786 </script> | |
OLD | NEW |