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 Player.timeline. |
| 28 var player1 = dt.play(animation); |
| 29 test(function() {assert_equals(player1.timeline, document.timeline)}, |
| 30 "Player.timeline is document timeline"); |
| 31 |
| 32 // Test that TimedItem.player and Player.source are consistent. |
| 33 test(function() {assert_equals(player1.source, animation)}, |
| 34 "Player.source should be the Animation"); |
| 35 test(function() {assert_equals(animation.player, player1)}, |
| 36 "TimedItem.player should be the Player"); |
| 37 |
| 38 // Test that play() always returns a new Player. |
| 39 var player2 = dt.play(animation); |
| 40 test(function() {assert_not_equals(player2, player1)}, |
| 41 "Repeated calls to play() should create a new Player"); |
| 42 test(function() {assert_equals(animation.player, player2)}, |
| 43 "Repeated play(): TimedItem.player should be the Player"); |
| 44 test(function() {assert_equals(player2.source, animation)}, |
| 45 "Repeated play(): Player.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 Player.source. |
| 50 player1.source = animation; |
| 51 test(function() {assert_equals(player2.source, null)}, |
| 52 "Set Player.source: Old Player.source should be null"); |
| 53 test(function() {assert_equals(player1.source, animation)}, |
| 54 "Set Player.source: New Player.source should be the Animation"); |
| 55 test(function() {assert_equals(animation.player, player1)}, |
| 56 "Set Player.source: TimedItem.player should be the Player"); |
| 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 parGroup = new ParGroup([animation2]); |
| 62 test(function() {assert_equals(parGroup.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(parGroup); |
| 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(parGroup.children.length, 0)}, |
| 78 "Animation parent should be updated, leaving parGroup.children.length = 0")
; |
| 79 test(function() {assert_equals(player4.source, animation2)}, |
| 80 "Player should use reparented animation"); |
| 81 |
| 82 // Test that setting a parent on a TimedItem with a Player causes the player to. |
| 83 // be disconnected. |
| 84 parGroup.append(animation2); |
| 85 test(function() {assert_equals(parGroup.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 "Player.source should be updated"); |
| 91 test(function() {assert_equals(animation2.parent, parGroup)}, |
| 92 "Animation.parent should be updated"); |
| 93 test(function() {assert_equals(parGroup.children.length, 1)}, |
| 94 "Animation parent should be updated, leaving parGroup.children.length = 1"
); |
| 95 test(function() {assert_equals(parGroup.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 a Player'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 Player.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 Player.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 Player 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.specified.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.specified.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.specified.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.specified.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.specified.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.specified.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 Player. |
| 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 |