| 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 |