1 /* 2 * Copyright (c) 2013, Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "core/animation/AnimationPlayer.h" 33 34 #include "core/animation/ActiveAnimations.h" 35 #include "core/animation/Animation.h" 36 #include "core/animation/AnimationClock.h" 37 #include "core/animation/AnimationTimeline.h" 38 #include "core/dom/Document.h" 39 #include "core/dom/QualifiedName.h" 40 #include "platform/weborigin/KURL.h" 41 #include <gtest/gtest.h> 42 43 using namespace blink; 44 45 namespace { 46 47 class AnimationAnimationPlayerTest : public ::testing::Test { 48 protected: 49 virtual void SetUp() 50 { 51 setUpWithoutStartingTimeline(); 52 startTimeline(); 53 } 54 55 void setUpWithoutStartingTimeline() 56 { 57 document = Document::create(); 58 document->animationClock().resetTimeForTesting(); 59 timeline = AnimationTimeline::create(document.get()); 60 player = timeline->createAnimationPlayer(0); 61 player->setStartTime(0); 62 player->setSource(makeAnimation().get()); 63 } 64 65 void startTimeline() 66 { 67 simulateFrame(0); 68 } 69 70 PassRefPtrWillBeRawPtr<Animation> makeAnimation(double duration = 30, double playbackRate = 1) 71 { 72 Timing timing; 73 timing.iterationDuration = duration; 74 timing.playbackRate = playbackRate; 75 return Animation::create(0, nullptr, timing); 76 } 77 78 bool simulateFrame(double time) 79 { 80 document->animationClock().updateTime(time); 81 document->compositorPendingAnimations().update(false); 82 // The timeline does not know about our player, so we have to explicitly call update(). 83 return player->update(TimingUpdateForAnimationFrame); 84 } 85 86 RefPtrWillBePersistent<Document> document; 87 RefPtrWillBePersistent<AnimationTimeline> timeline; 88 RefPtrWillBePersistent<AnimationPlayer> player; 89 TrackExceptionState exceptionState; 90 }; 91 92 TEST_F(AnimationAnimationPlayerTest, InitialState) 93 { 94 setUpWithoutStartingTimeline(); 95 player = timeline->createAnimationPlayer(0); 96 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 97 EXPECT_EQ(0, player->currentTimeInternal()); 98 EXPECT_FALSE(player->paused()); 99 EXPECT_EQ(1, player->playbackRate()); 100 EXPECT_FALSE(player->hasStartTime()); 101 EXPECT_TRUE(isNull(player->startTimeInternal())); 102 103 startTimeline(); 104 EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal()); 105 EXPECT_EQ(0, timeline->currentTimeInternal()); 106 EXPECT_EQ(0, player->currentTimeInternal()); 107 EXPECT_FALSE(player->paused()); 108 EXPECT_EQ(1, player->playbackRate()); 109 EXPECT_EQ(0, player->startTimeInternal()); 110 EXPECT_TRUE(player->hasStartTime()); 111 } 112 113 114 TEST_F(AnimationAnimationPlayerTest, CurrentTimeDoesNotSetOutdated) 115 { 116 EXPECT_FALSE(player->outdated()); 117 EXPECT_EQ(0, player->currentTimeInternal()); 118 EXPECT_FALSE(player->outdated()); 119 // FIXME: We should split simulateFrame into a version that doesn't update 120 // the player and one that does, as most of the tests don't require update() 121 // to be called. 122 document->animationClock().updateTime(10); 123 EXPECT_EQ(10, player->currentTimeInternal()); 124 EXPECT_FALSE(player->outdated()); 125 } 126 127 TEST_F(AnimationAnimationPlayerTest, SetCurrentTime) 128 { 129 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 130 player->setCurrentTimeInternal(10); 131 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 132 EXPECT_EQ(10, player->currentTimeInternal()); 133 simulateFrame(10); 134 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 135 EXPECT_EQ(20, player->currentTimeInternal()); 136 } 137 138 TEST_F(AnimationAnimationPlayerTest, SetCurrentTimeNegative) 139 { 140 player->setCurrentTimeInternal(-10); 141 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 142 EXPECT_EQ(-10, player->currentTimeInternal()); 143 simulateFrame(20); 144 EXPECT_EQ(10, player->currentTimeInternal()); 145 146 player->setPlaybackRate(-2); 147 player->setCurrentTimeInternal(-10); 148 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 149 EXPECT_EQ(-10, player->currentTimeInternal()); 150 simulateFrame(40); 151 EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal()); 152 EXPECT_EQ(-10, player->currentTimeInternal()); 153 } 154 155 TEST_F(AnimationAnimationPlayerTest, SetCurrentTimeNegativeWithoutSimultaneousPlaybackRateChange) 156 { 157 simulateFrame(20); 158 EXPECT_EQ(20, player->currentTimeInternal()); 159 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 160 player->setPlaybackRate(-1); 161 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 162 simulateFrame(30); 163 EXPECT_EQ(20, player->currentTimeInternal()); 164 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 165 player->setCurrentTimeInternal(-10); 166 EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal()); 167 } 168 169 TEST_F(AnimationAnimationPlayerTest, SetCurrentTimePastContentEnd) 170 { 171 player->setCurrentTimeInternal(50); 172 EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal()); 173 EXPECT_EQ(50, player->currentTimeInternal()); 174 simulateFrame(20); 175 EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal()); 176 EXPECT_EQ(50, player->currentTimeInternal()); 177 178 player->setPlaybackRate(-2); 179 player->setCurrentTimeInternal(50); 180 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 181 EXPECT_EQ(50, player->currentTimeInternal()); 182 simulateFrame(20); 183 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 184 simulateFrame(40); 185 EXPECT_EQ(10, player->currentTimeInternal()); 186 } 187 188 TEST_F(AnimationAnimationPlayerTest, SetCurrentTimeBeforeTimelineStarted) 189 { 190 setUpWithoutStartingTimeline(); 191 player->setCurrentTimeInternal(5); 192 EXPECT_EQ(5, player->currentTimeInternal()); 193 startTimeline(); 194 simulateFrame(10); 195 EXPECT_EQ(15, player->currentTimeInternal()); 196 } 197 198 TEST_F(AnimationAnimationPlayerTest, SetCurrentTimePastContentEndBeforeTimelineStarted) 199 { 200 setUpWithoutStartingTimeline(); 201 player->setCurrentTimeInternal(250); 202 EXPECT_EQ(250, player->currentTimeInternal()); 203 startTimeline(); 204 simulateFrame(10); 205 EXPECT_EQ(250, player->currentTimeInternal()); 206 } 207 208 TEST_F(AnimationAnimationPlayerTest, SetCurrentTimeMax) 209 { 210 player->setCurrentTimeInternal(std::numeric_limits<double>::max()); 211 EXPECT_EQ(std::numeric_limits<double>::max(), player->currentTimeInternal()); 212 simulateFrame(100); 213 EXPECT_EQ(std::numeric_limits<double>::max(), player->currentTimeInternal()); 214 } 215 216 TEST_F(AnimationAnimationPlayerTest, SetCurrentTimeUnrestrictedDouble) 217 { 218 simulateFrame(10); 219 player->setCurrentTime(nullValue()); 220 EXPECT_EQ(10, player->currentTimeInternal()); 221 player->setCurrentTime(std::numeric_limits<double>::infinity()); 222 EXPECT_EQ(10, player->currentTimeInternal()); 223 player->setCurrentTime(-std::numeric_limits<double>::infinity()); 224 EXPECT_EQ(10, player->currentTimeInternal()); 225 } 226 227 228 TEST_F(AnimationAnimationPlayerTest, SetCurrentTimeSetsStartTime) 229 { 230 EXPECT_EQ(0, player->startTime()); 231 player->setCurrentTime(1000); 232 EXPECT_EQ(-1000, player->startTime()); 233 simulateFrame(1); 234 EXPECT_EQ(-1000, player->startTime()); 235 EXPECT_EQ(2000, player->currentTime()); 236 } 237 238 TEST_F(AnimationAnimationPlayerTest, SetStartTime) 239 { 240 simulateFrame(20); 241 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 242 EXPECT_EQ(0, player->startTimeInternal()); 243 EXPECT_EQ(20, player->currentTimeInternal()); 244 player->setStartTime(10 * 1000); 245 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 246 EXPECT_EQ(10, player->startTimeInternal()); 247 EXPECT_EQ(10, player->currentTimeInternal()); 248 simulateFrame(30); 249 EXPECT_EQ(10, player->startTimeInternal()); 250 EXPECT_EQ(20, player->currentTimeInternal()); 251 player->setStartTime(-20 * 1000); 252 EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal()); 253 } 254 255 TEST_F(AnimationAnimationPlayerTest, SetStartTimeLimitsAnimationPlayer) 256 { 257 player->setStartTime(-50 * 1000); 258 EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal()); 259 EXPECT_EQ(30, player->currentTimeInternal()); 260 player->setPlaybackRate(-1); 261 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 262 player->setStartTime(-100 * 1000); 263 EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal()); 264 EXPECT_EQ(0, player->currentTimeInternal()); 265 EXPECT_TRUE(player->finished()); 266 } 267 268 TEST_F(AnimationAnimationPlayerTest, SetStartTimeOnLimitedAnimationPlayer) 269 { 270 simulateFrame(30); 271 player->setStartTime(-10 * 1000); 272 EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal()); 273 EXPECT_EQ(30, player->currentTimeInternal()); 274 player->setCurrentTimeInternal(50); 275 player->setStartTime(-40 * 1000); 276 EXPECT_EQ(30, player->currentTimeInternal()); 277 EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal()); 278 EXPECT_TRUE(player->finished()); 279 } 280 281 TEST_F(AnimationAnimationPlayerTest, StartTimePauseFinish) 282 { 283 player->pause(); 284 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 285 EXPECT_TRUE(std::isnan(player->startTime())); 286 player->finish(exceptionState); 287 EXPECT_EQ(AnimationPlayer::Paused, player->playStateInternal()); 288 EXPECT_TRUE(std::isnan(player->startTime())); 289 } 290 291 TEST_F(AnimationAnimationPlayerTest, PauseBeatsFinish) 292 { 293 player->pause(); 294 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 295 simulateFrame(10); 296 EXPECT_EQ(AnimationPlayer::Paused, player->playStateInternal()); 297 player->finish(exceptionState); 298 EXPECT_EQ(AnimationPlayer::Paused, player->playStateInternal()); 299 } 300 301 TEST_F(AnimationAnimationPlayerTest, StartTimeFinishPause) 302 { 303 player->finish(exceptionState); 304 EXPECT_EQ(-30 * 1000, player->startTime()); 305 player->pause(); 306 EXPECT_TRUE(std::isnan(player->startTime())); 307 } 308 309 TEST_F(AnimationAnimationPlayerTest, StartTimeWithZeroPlaybackRate) 310 { 311 player->setPlaybackRate(0); 312 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 313 EXPECT_TRUE(std::isnan(player->startTime())); 314 simulateFrame(10); 315 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 316 } 317 318 TEST_F(AnimationAnimationPlayerTest, PausePlay) 319 { 320 simulateFrame(10); 321 player->pause(); 322 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 323 EXPECT_TRUE(player->paused()); 324 EXPECT_EQ(10, player->currentTimeInternal()); 325 simulateFrame(20); 326 EXPECT_EQ(AnimationPlayer::Paused, player->playStateInternal()); 327 player->play(); 328 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 329 simulateFrame(20); 330 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 331 EXPECT_FALSE(player->paused()); 332 EXPECT_EQ(10, player->currentTimeInternal()); 333 simulateFrame(30); 334 EXPECT_EQ(20, player->currentTimeInternal()); 335 } 336 337 TEST_F(AnimationAnimationPlayerTest, PauseBeforeTimelineStarted) 338 { 339 setUpWithoutStartingTimeline(); 340 player->pause(); 341 EXPECT_TRUE(player->paused()); 342 player->play(); 343 EXPECT_FALSE(player->paused()); 344 345 player->pause(); 346 startTimeline(); 347 simulateFrame(100); 348 EXPECT_TRUE(player->paused()); 349 EXPECT_EQ(0, player->currentTimeInternal()); 350 } 351 352 TEST_F(AnimationAnimationPlayerTest, PlayRewindsToStart) 353 { 354 player->setCurrentTimeInternal(30); 355 player->play(); 356 EXPECT_EQ(0, player->currentTimeInternal()); 357 358 player->setCurrentTimeInternal(40); 359 player->play(); 360 EXPECT_EQ(0, player->currentTimeInternal()); 361 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 362 simulateFrame(10); 363 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 364 365 player->setCurrentTimeInternal(-10); 366 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 367 player->play(); 368 EXPECT_EQ(0, player->currentTimeInternal()); 369 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 370 } 371 372 TEST_F(AnimationAnimationPlayerTest, PlayRewindsToEnd) 373 { 374 player->setPlaybackRate(-1); 375 player->play(); 376 EXPECT_EQ(30, player->currentTimeInternal()); 377 378 player->setCurrentTimeInternal(40); 379 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 380 player->play(); 381 EXPECT_EQ(30, player->currentTimeInternal()); 382 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 383 simulateFrame(10); 384 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 385 386 player->setCurrentTimeInternal(-10); 387 player->play(); 388 EXPECT_EQ(30, player->currentTimeInternal()); 389 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 390 simulateFrame(20); 391 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 392 } 393 394 TEST_F(AnimationAnimationPlayerTest, PlayWithPlaybackRateZeroDoesNotSeek) 395 { 396 player->setPlaybackRate(0); 397 player->play(); 398 EXPECT_EQ(0, player->currentTimeInternal()); 399 400 player->setCurrentTimeInternal(40); 401 player->play(); 402 EXPECT_EQ(40, player->currentTimeInternal()); 403 404 player->setCurrentTimeInternal(-10); 405 player->play(); 406 EXPECT_EQ(-10, player->currentTimeInternal()); 407 } 408 409 TEST_F(AnimationAnimationPlayerTest, PlayAfterPauseWithPlaybackRateZeroUpdatesPlayState) 410 { 411 player->pause(); 412 player->setPlaybackRate(0); 413 simulateFrame(1); 414 EXPECT_EQ(AnimationPlayer::Paused, player->playStateInternal()); 415 player->play(); 416 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 417 } 418 419 TEST_F(AnimationAnimationPlayerTest, Reverse) 420 { 421 player->setCurrentTimeInternal(10); 422 player->pause(); 423 player->reverse(); 424 EXPECT_FALSE(player->paused()); 425 EXPECT_EQ(-1, player->playbackRate()); 426 EXPECT_EQ(10, player->currentTimeInternal()); 427 } 428 429 TEST_F(AnimationAnimationPlayerTest, ReverseDoesNothingWithPlaybackRateZero) 430 { 431 player->setCurrentTimeInternal(10); 432 player->setPlaybackRate(0); 433 player->pause(); 434 player->reverse(); 435 EXPECT_TRUE(player->paused()); 436 EXPECT_EQ(0, player->playbackRate()); 437 EXPECT_EQ(10, player->currentTimeInternal()); 438 } 439 440 TEST_F(AnimationAnimationPlayerTest, ReverseDoesNotSeekWithNoSource) 441 { 442 player->setSource(0); 443 player->setCurrentTimeInternal(10); 444 player->reverse(); 445 EXPECT_EQ(10, player->currentTimeInternal()); 446 } 447 448 TEST_F(AnimationAnimationPlayerTest, ReverseSeeksToStart) 449 { 450 player->setCurrentTimeInternal(-10); 451 player->setPlaybackRate(-1); 452 player->reverse(); 453 EXPECT_EQ(0, player->currentTimeInternal()); 454 } 455 456 TEST_F(AnimationAnimationPlayerTest, ReverseSeeksToEnd) 457 { 458 player->setCurrentTimeInternal(40); 459 player->reverse(); 460 EXPECT_EQ(30, player->currentTimeInternal()); 461 } 462 463 TEST_F(AnimationAnimationPlayerTest, ReverseBeyondLimit) 464 { 465 player->setCurrentTimeInternal(40); 466 player->setPlaybackRate(-1); 467 player->reverse(); 468 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 469 EXPECT_EQ(0, player->currentTimeInternal()); 470 471 player->setCurrentTimeInternal(-10); 472 player->reverse(); 473 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 474 EXPECT_EQ(30, player->currentTimeInternal()); 475 } 476 477 478 TEST_F(AnimationAnimationPlayerTest, Finish) 479 { 480 player->finish(exceptionState); 481 EXPECT_EQ(30, player->currentTimeInternal()); 482 EXPECT_TRUE(player->finished()); 483 484 player->setPlaybackRate(-1); 485 player->finish(exceptionState); 486 EXPECT_EQ(0, player->currentTimeInternal()); 487 EXPECT_TRUE(player->finished()); 488 489 EXPECT_FALSE(exceptionState.hadException()); 490 } 491 492 TEST_F(AnimationAnimationPlayerTest, FinishAfterSourceEnd) 493 { 494 player->setCurrentTimeInternal(40); 495 player->finish(exceptionState); 496 EXPECT_EQ(30, player->currentTimeInternal()); 497 } 498 499 TEST_F(AnimationAnimationPlayerTest, FinishBeforeStart) 500 { 501 player->setCurrentTimeInternal(-10); 502 player->setPlaybackRate(-1); 503 player->finish(exceptionState); 504 EXPECT_EQ(0, player->currentTimeInternal()); 505 } 506 507 TEST_F(AnimationAnimationPlayerTest, FinishDoesNothingWithPlaybackRateZero) 508 { 509 player->setCurrentTimeInternal(10); 510 player->setPlaybackRate(0); 511 player->finish(exceptionState); 512 EXPECT_EQ(10, player->currentTimeInternal()); 513 } 514 515 TEST_F(AnimationAnimationPlayerTest, FinishRaisesException) 516 { 517 Timing timing; 518 timing.iterationDuration = 1; 519 timing.iterationCount = std::numeric_limits<double>::infinity(); 520 player->setSource(Animation::create(0, nullptr, timing).get()); 521 player->setCurrentTimeInternal(10); 522 523 player->finish(exceptionState); 524 EXPECT_EQ(10, player->currentTimeInternal()); 525 EXPECT_TRUE(exceptionState.hadException()); 526 EXPECT_EQ(InvalidStateError, exceptionState.code()); 527 } 528 529 530 TEST_F(AnimationAnimationPlayerTest, LimitingAtSourceEnd) 531 { 532 simulateFrame(30); 533 EXPECT_EQ(30, player->currentTimeInternal()); 534 EXPECT_TRUE(player->finished()); 535 simulateFrame(40); 536 EXPECT_EQ(30, player->currentTimeInternal()); 537 EXPECT_FALSE(player->paused()); 538 } 539 540 TEST_F(AnimationAnimationPlayerTest, LimitingAtStart) 541 { 542 simulateFrame(30); 543 player->setPlaybackRate(-2); 544 simulateFrame(30); 545 simulateFrame(45); 546 EXPECT_EQ(0, player->currentTimeInternal()); 547 EXPECT_TRUE(player->finished()); 548 simulateFrame(60); 549 EXPECT_EQ(0, player->currentTimeInternal()); 550 EXPECT_FALSE(player->paused()); 551 } 552 553 TEST_F(AnimationAnimationPlayerTest, LimitingWithNoSource) 554 { 555 player->setSource(0); 556 EXPECT_TRUE(player->finished()); 557 simulateFrame(30); 558 EXPECT_EQ(0, player->currentTimeInternal()); 559 } 560 561 562 TEST_F(AnimationAnimationPlayerTest, SetPlaybackRate) 563 { 564 player->setPlaybackRate(2); 565 simulateFrame(0); 566 EXPECT_EQ(2, player->playbackRate()); 567 EXPECT_EQ(0, player->currentTimeInternal()); 568 simulateFrame(10); 569 EXPECT_EQ(20, player->currentTimeInternal()); 570 } 571 572 TEST_F(AnimationAnimationPlayerTest, SetPlaybackRateBeforeTimelineStarted) 573 { 574 setUpWithoutStartingTimeline(); 575 player->setPlaybackRate(2); 576 EXPECT_EQ(2, player->playbackRate()); 577 EXPECT_EQ(0, player->currentTimeInternal()); 578 startTimeline(); 579 simulateFrame(10); 580 EXPECT_EQ(20, player->currentTimeInternal()); 581 } 582 583 TEST_F(AnimationAnimationPlayerTest, SetPlaybackRateWhilePaused) 584 { 585 simulateFrame(10); 586 player->pause(); 587 player->setPlaybackRate(2); 588 simulateFrame(20); 589 player->play(); 590 EXPECT_EQ(10, player->currentTimeInternal()); 591 simulateFrame(20); 592 simulateFrame(25); 593 EXPECT_EQ(20, player->currentTimeInternal()); 594 } 595 596 TEST_F(AnimationAnimationPlayerTest, SetPlaybackRateWhileLimited) 597 { 598 simulateFrame(40); 599 EXPECT_EQ(30, player->currentTimeInternal()); 600 player->setPlaybackRate(2); 601 simulateFrame(50); 602 EXPECT_EQ(30, player->currentTimeInternal()); 603 player->setPlaybackRate(-2); 604 simulateFrame(50); 605 simulateFrame(60); 606 EXPECT_FALSE(player->finished()); 607 EXPECT_EQ(10, player->currentTimeInternal()); 608 } 609 610 TEST_F(AnimationAnimationPlayerTest, SetPlaybackRateZero) 611 { 612 simulateFrame(0); 613 simulateFrame(10); 614 player->setPlaybackRate(0); 615 simulateFrame(10); 616 EXPECT_EQ(10, player->currentTimeInternal()); 617 simulateFrame(20); 618 EXPECT_EQ(10, player->currentTimeInternal()); 619 player->setCurrentTimeInternal(20); 620 EXPECT_EQ(20, player->currentTimeInternal()); 621 } 622 623 TEST_F(AnimationAnimationPlayerTest, SetPlaybackRateMax) 624 { 625 player->setPlaybackRate(std::numeric_limits<double>::max()); 626 simulateFrame(0); 627 EXPECT_EQ(std::numeric_limits<double>::max(), player->playbackRate()); 628 EXPECT_EQ(0, player->currentTimeInternal()); 629 simulateFrame(1); 630 EXPECT_EQ(30, player->currentTimeInternal()); 631 } 632 633 634 TEST_F(AnimationAnimationPlayerTest, SetSource) 635 { 636 player = timeline->createAnimationPlayer(0); 637 player->setStartTime(0); 638 RefPtrWillBeRawPtr<AnimationNode> source1 = makeAnimation(); 639 RefPtrWillBeRawPtr<AnimationNode> source2 = makeAnimation(); 640 player->setSource(source1.get()); 641 EXPECT_EQ(source1, player->source()); 642 EXPECT_EQ(0, player->currentTimeInternal()); 643 player->setCurrentTimeInternal(15); 644 player->setSource(source2.get()); 645 EXPECT_EQ(15, player->currentTimeInternal()); 646 EXPECT_EQ(0, source1->player()); 647 EXPECT_EQ(player.get(), source2->player()); 648 EXPECT_EQ(source2, player->source()); 649 } 650 651 TEST_F(AnimationAnimationPlayerTest, SetSourceLimitsAnimationPlayer) 652 { 653 player->setCurrentTimeInternal(20); 654 player->setSource(makeAnimation(10).get()); 655 EXPECT_EQ(20, player->currentTimeInternal()); 656 EXPECT_TRUE(player->finished()); 657 simulateFrame(10); 658 EXPECT_EQ(20, player->currentTimeInternal()); 659 } 660 661 TEST_F(AnimationAnimationPlayerTest, SetSourceUnlimitsAnimationPlayer) 662 { 663 player->setCurrentTimeInternal(40); 664 player->setSource(makeAnimation(60).get()); 665 EXPECT_FALSE(player->finished()); 666 EXPECT_EQ(40, player->currentTimeInternal()); 667 simulateFrame(10); 668 EXPECT_EQ(50, player->currentTimeInternal()); 669 } 670 671 672 TEST_F(AnimationAnimationPlayerTest, EmptyAnimationPlayersDontUpdateEffects) 673 { 674 player = timeline->createAnimationPlayer(0); 675 player->update(TimingUpdateOnDemand); 676 EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange()); 677 678 simulateFrame(1234); 679 EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange()); 680 } 681 682 TEST_F(AnimationAnimationPlayerTest, AnimationPlayersDisassociateFromSource) 683 { 684 AnimationNode* animationNode = player->source(); 685 AnimationPlayer* player2 = timeline->createAnimationPlayer(animationNode); 686 EXPECT_EQ(0, player->source()); 687 player->setSource(animationNode); 688 EXPECT_EQ(0, player2->source()); 689 } 690 691 TEST_F(AnimationAnimationPlayerTest, AnimationPlayersReturnTimeToNextEffect) 692 { 693 Timing timing; 694 timing.startDelay = 1; 695 timing.iterationDuration = 1; 696 timing.endDelay = 1; 697 RefPtrWillBeRawPtr<Animation> animation = Animation::create(0, nullptr, timing); 698 player = timeline->createAnimationPlayer(animation.get()); 699 player->setStartTime(0); 700 701 simulateFrame(0); 702 EXPECT_EQ(1, player->timeToEffectChange()); 703 704 simulateFrame(0.5); 705 EXPECT_EQ(0.5, player->timeToEffectChange()); 706 707 simulateFrame(1); 708 EXPECT_EQ(0, player->timeToEffectChange()); 709 710 simulateFrame(1.5); 711 EXPECT_EQ(0, player->timeToEffectChange()); 712 713 simulateFrame(2); 714 EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange()); 715 716 simulateFrame(3); 717 EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange()); 718 719 player->setCurrentTimeInternal(0); 720 simulateFrame(3); 721 EXPECT_EQ(1, player->timeToEffectChange()); 722 723 player->setPlaybackRate(2); 724 simulateFrame(3); 725 EXPECT_EQ(0.5, player->timeToEffectChange()); 726 727 player->setPlaybackRate(0); 728 player->update(TimingUpdateOnDemand); 729 EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange()); 730 731 player->setCurrentTimeInternal(3); 732 player->setPlaybackRate(-1); 733 player->update(TimingUpdateOnDemand); 734 simulateFrame(3); 735 EXPECT_EQ(1, player->timeToEffectChange()); 736 737 player->setPlaybackRate(-2); 738 player->update(TimingUpdateOnDemand); 739 simulateFrame(3); 740 EXPECT_EQ(0.5, player->timeToEffectChange()); 741 } 742 743 TEST_F(AnimationAnimationPlayerTest, TimeToNextEffectWhenPaused) 744 { 745 EXPECT_EQ(0, player->timeToEffectChange()); 746 player->pause(); 747 player->update(TimingUpdateOnDemand); 748 EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange()); 749 } 750 751 TEST_F(AnimationAnimationPlayerTest, TimeToNextEffectWhenCancelledBeforeStart) 752 { 753 EXPECT_EQ(0, player->timeToEffectChange()); 754 player->setCurrentTimeInternal(-8); 755 player->setPlaybackRate(2); 756 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 757 player->cancel(); 758 EXPECT_EQ(AnimationPlayer::Idle, player->playStateInternal()); 759 player->update(TimingUpdateOnDemand); 760 // This frame will fire the finish event event though no start time has been 761 // received from the compositor yet, as cancel() nukes start times. 762 simulateFrame(0); 763 EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange()); 764 } 765 766 TEST_F(AnimationAnimationPlayerTest, TimeToNextEffectWhenCancelledBeforeStartReverse) 767 { 768 EXPECT_EQ(0, player->timeToEffectChange()); 769 player->setCurrentTimeInternal(9); 770 player->setPlaybackRate(-3); 771 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 772 player->cancel(); 773 EXPECT_EQ(AnimationPlayer::Idle, player->playStateInternal()); 774 player->update(TimingUpdateOnDemand); 775 // This frame will fire the finish event event though no start time has been 776 // received from the compositor yet, as cancel() nukes start times. 777 simulateFrame(0); 778 EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange()); 779 } 780 781 TEST_F(AnimationAnimationPlayerTest, TimeToNextEffectSimpleCancelledBeforeStart) 782 { 783 EXPECT_EQ(0, player->timeToEffectChange()); 784 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 785 player->cancel(); 786 player->update(TimingUpdateOnDemand); 787 // This frame will fire the finish event event though no start time has been 788 // received from the compositor yet, as cancel() nukes start times. 789 simulateFrame(0); 790 EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange()); 791 } 792 793 TEST_F(AnimationAnimationPlayerTest, AttachedAnimationPlayers) 794 { 795 RefPtrWillBePersistent<Element> element = document->createElement("foo", ASSERT_NO_EXCEPTION); 796 797 Timing timing; 798 RefPtrWillBeRawPtr<Animation> animation = Animation::create(element.get(), nullptr, timing); 799 RefPtrWillBeRawPtr<AnimationPlayer> player = timeline->createAnimationPlayer(animation.get()); 800 simulateFrame(0); 801 timeline->serviceAnimations(TimingUpdateForAnimationFrame); 802 EXPECT_EQ(1U, element->activeAnimations()->players().find(player.get())->value); 803 804 player.release(); 805 Heap::collectAllGarbage(); 806 EXPECT_TRUE(element->activeAnimations()->players().isEmpty()); 807 } 808 809 TEST_F(AnimationAnimationPlayerTest, HasLowerPriority) 810 { 811 RefPtrWillBeRawPtr<AnimationPlayer> player1 = timeline->createAnimationPlayer(0); 812 RefPtrWillBeRawPtr<AnimationPlayer> player2 = timeline->createAnimationPlayer(0); 813 EXPECT_TRUE(AnimationPlayer::hasLowerPriority(player1.get(), player2.get())); 814 } 815 816 TEST_F(AnimationAnimationPlayerTest, PlayAfterCancel) 817 { 818 player->cancel(); 819 EXPECT_EQ(AnimationPlayer::Idle, player->playStateInternal()); 820 EXPECT_TRUE(std::isnan(player->currentTime())); 821 EXPECT_TRUE(std::isnan(player->startTime())); 822 player->play(); 823 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 824 EXPECT_EQ(0, player->currentTime()); 825 EXPECT_TRUE(std::isnan(player->startTime())); 826 simulateFrame(10); 827 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 828 EXPECT_EQ(0, player->currentTime()); 829 EXPECT_EQ(10 * 1000, player->startTime()); 830 } 831 832 TEST_F(AnimationAnimationPlayerTest, PlayBackwardsAfterCancel) 833 { 834 player->setPlaybackRate(-1); 835 player->setCurrentTime(15 * 1000); 836 simulateFrame(0); 837 player->cancel(); 838 EXPECT_EQ(AnimationPlayer::Idle, player->playStateInternal()); 839 EXPECT_TRUE(std::isnan(player->currentTime())); 840 EXPECT_TRUE(std::isnan(player->startTime())); 841 player->play(); 842 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 843 EXPECT_EQ(30 * 1000, player->currentTime()); 844 EXPECT_TRUE(std::isnan(player->startTime())); 845 simulateFrame(10); 846 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 847 EXPECT_EQ(30 * 1000, player->currentTime()); 848 EXPECT_EQ(40 * 1000, player->startTime()); 849 } 850 851 TEST_F(AnimationAnimationPlayerTest, ReverseAfterCancel) 852 { 853 player->cancel(); 854 EXPECT_EQ(AnimationPlayer::Idle, player->playStateInternal()); 855 EXPECT_TRUE(std::isnan(player->currentTime())); 856 EXPECT_TRUE(std::isnan(player->startTime())); 857 player->reverse(); 858 EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); 859 EXPECT_EQ(30 * 1000, player->currentTime()); 860 EXPECT_TRUE(std::isnan(player->startTime())); 861 simulateFrame(10); 862 EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal()); 863 EXPECT_EQ(30 * 1000, player->currentTime()); 864 EXPECT_EQ(40 * 1000, player->startTime()); 865 } 866 867 TEST_F(AnimationAnimationPlayerTest, FinishAfterCancel) 868 { 869 player->cancel(); 870 EXPECT_EQ(AnimationPlayer::Idle, player->playStateInternal()); 871 EXPECT_TRUE(std::isnan(player->currentTime())); 872 EXPECT_TRUE(std::isnan(player->startTime())); 873 player->finish(exceptionState); 874 EXPECT_TRUE(std::isnan(player->currentTime())); 875 EXPECT_TRUE(std::isnan(player->startTime())); 876 EXPECT_EQ(AnimationPlayer::Idle, player->playStateInternal()); 877 } 878 879 TEST_F(AnimationAnimationPlayerTest, PauseAfterCancel) 880 { 881 player->cancel(); 882 EXPECT_EQ(AnimationPlayer::Idle, player->playStateInternal()); 883 EXPECT_TRUE(std::isnan(player->currentTime())); 884 EXPECT_TRUE(std::isnan(player->startTime())); 885 player->pause(); 886 EXPECT_EQ(AnimationPlayer::Idle, player->playStateInternal()); 887 EXPECT_TRUE(std::isnan(player->currentTime())); 888 EXPECT_TRUE(std::isnan(player->startTime())); 889 } 890 891 } 892