| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 { | 45 { |
| 46 static unsigned next = 0; | 46 static unsigned next = 0; |
| 47 return ++next; | 47 return ++next; |
| 48 } | 48 } |
| 49 | 49 |
| 50 } | 50 } |
| 51 | 51 |
| 52 PassRefPtrWillBeRawPtr<AnimationPlayer> AnimationPlayer::create(ExecutionContext
* executionContext, AnimationTimeline& timeline, AnimationNode* content) | 52 PassRefPtrWillBeRawPtr<AnimationPlayer> AnimationPlayer::create(ExecutionContext
* executionContext, AnimationTimeline& timeline, AnimationNode* content) |
| 53 { | 53 { |
| 54 RefPtrWillBeRawPtr<AnimationPlayer> player = adoptRefWillBeNoop(new Animatio
nPlayer(executionContext, timeline, content)); | 54 RefPtrWillBeRawPtr<AnimationPlayer> player = adoptRefWillBeNoop(new Animatio
nPlayer(executionContext, timeline, content)); |
| 55 player->uncancel(); |
| 55 timeline.document()->compositorPendingAnimations().add(player.get()); | 56 timeline.document()->compositorPendingAnimations().add(player.get()); |
| 56 player->suspendIfNeeded(); | 57 player->suspendIfNeeded(); |
| 57 return player.release(); | 58 return player.release(); |
| 58 } | 59 } |
| 59 | 60 |
| 60 AnimationPlayer::AnimationPlayer(ExecutionContext* executionContext, AnimationTi
meline& timeline, AnimationNode* content) | 61 AnimationPlayer::AnimationPlayer(ExecutionContext* executionContext, AnimationTi
meline& timeline, AnimationNode* content) |
| 61 : ActiveDOMObject(executionContext) | 62 : ActiveDOMObject(executionContext) |
| 62 , m_playbackRate(1) | 63 , m_playbackRate(1) |
| 63 , m_startTime(nullValue()) | 64 , m_startTime(nullValue()) |
| 64 , m_holdTime(0) | 65 , m_holdTime(0) |
| 65 , m_sequenceNumber(nextSequenceNumber()) | 66 , m_sequenceNumber(nextSequenceNumber()) |
| 66 , m_content(content) | 67 , m_content(content) |
| 67 , m_timeline(&timeline) | 68 , m_timeline(&timeline) |
| 68 , m_paused(false) | 69 , m_paused(false) |
| 69 , m_held(true) | 70 , m_held(true) |
| 70 , m_isPausedForTesting(false) | 71 , m_isPausedForTesting(false) |
| 71 , m_outdated(true) | 72 , m_outdated(true) |
| 72 , m_finished(false) | 73 , m_finished(true) |
| 73 , m_compositorState(nullptr) | 74 , m_compositorState(nullptr) |
| 74 , m_compositorPending(true) | 75 , m_compositorPending(true) |
| 75 , m_currentTimePending(false) | 76 , m_currentTimePending(false) |
| 77 , m_idle(true) |
| 76 { | 78 { |
| 77 ScriptWrappable::init(this); | 79 ScriptWrappable::init(this); |
| 78 if (m_content) { | 80 if (m_content) { |
| 79 if (m_content->player()) | 81 if (m_content->player()) { |
| 80 m_content->player()->cancel(); | 82 m_content->player()->cancel(); |
| 83 m_content->player()->setSource(0); |
| 84 } |
| 81 m_content->attach(this); | 85 m_content->attach(this); |
| 82 } | 86 } |
| 83 } | 87 } |
| 84 | 88 |
| 85 AnimationPlayer::~AnimationPlayer() | 89 AnimationPlayer::~AnimationPlayer() |
| 86 { | 90 { |
| 87 #if !ENABLE(OILPAN) | 91 #if !ENABLE(OILPAN) |
| 88 if (m_content) | 92 if (m_content) |
| 89 m_content->detach(); | 93 m_content->detach(); |
| 90 if (m_timeline) | 94 if (m_timeline) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 m_holdTime = m_playbackRate < 0 ? 0 : sourceEnd(); | 148 m_holdTime = m_playbackRate < 0 ? 0 : sourceEnd(); |
| 145 } | 149 } |
| 146 | 150 |
| 147 double AnimationPlayer::startTime() const | 151 double AnimationPlayer::startTime() const |
| 148 { | 152 { |
| 149 return m_startTime * 1000; | 153 return m_startTime * 1000; |
| 150 } | 154 } |
| 151 | 155 |
| 152 double AnimationPlayer::currentTime() | 156 double AnimationPlayer::currentTime() |
| 153 { | 157 { |
| 154 if (m_currentTimePending) | 158 if (m_currentTimePending || m_idle) |
| 155 return std::numeric_limits<double>::quiet_NaN(); | 159 return std::numeric_limits<double>::quiet_NaN(); |
| 156 return currentTimeInternal() * 1000; | 160 return currentTimeInternal() * 1000; |
| 157 } | 161 } |
| 158 | 162 |
| 159 double AnimationPlayer::currentTimeInternal() | 163 double AnimationPlayer::currentTimeInternal() |
| 160 { | 164 { |
| 161 updateCurrentTimingState(TimingUpdateOnDemand); | 165 updateCurrentTimingState(TimingUpdateOnDemand); |
| 162 if (m_held) | 166 if (m_held) |
| 163 return m_holdTime; | 167 return m_holdTime; |
| 164 return calculateCurrentTime(); | 168 return calculateCurrentTime(); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 return; | 355 return; |
| 352 | 356 |
| 353 setCompositorPending(true); | 357 setCompositorPending(true); |
| 354 | 358 |
| 355 double storedCurrentTime = currentTimeInternal(); | 359 double storedCurrentTime = currentTimeInternal(); |
| 356 if (m_content) | 360 if (m_content) |
| 357 m_content->detach(); | 361 m_content->detach(); |
| 358 m_content = newSource; | 362 m_content = newSource; |
| 359 if (newSource) { | 363 if (newSource) { |
| 360 // FIXME: This logic needs to be updated once groups are implemented | 364 // FIXME: This logic needs to be updated once groups are implemented |
| 361 if (newSource->player()) | 365 if (newSource->player()) { |
| 362 newSource->player()->cancel(); | 366 newSource->player()->cancel(); |
| 367 newSource->player()->setSource(0); |
| 368 } |
| 363 newSource->attach(this); | 369 newSource->attach(this); |
| 364 setOutdated(); | 370 setOutdated(); |
| 365 } | 371 } |
| 366 setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand); | 372 setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand); |
| 367 } | 373 } |
| 368 | 374 |
| 369 String AnimationPlayer::playState() | 375 String AnimationPlayer::playState() |
| 370 { | 376 { |
| 371 switch (playStateInternal()) { | 377 switch (playStateInternal()) { |
| 372 case Idle: | 378 case Idle: |
| 373 return "idle"; | 379 return "idle"; |
| 374 case Pending: | 380 case Pending: |
| 375 return "pending"; | 381 return "pending"; |
| 376 case Running: | 382 case Running: |
| 377 return "running"; | 383 return "running"; |
| 378 case Paused: | 384 case Paused: |
| 379 return "paused"; | 385 return "paused"; |
| 380 case Finished: | 386 case Finished: |
| 381 return "finished"; | 387 return "finished"; |
| 382 default: | 388 default: |
| 383 ASSERT_NOT_REACHED(); | 389 ASSERT_NOT_REACHED(); |
| 384 return ""; | 390 return ""; |
| 385 } | 391 } |
| 386 } | 392 } |
| 387 | 393 |
| 388 AnimationPlayer::AnimationPlayState AnimationPlayer::playStateInternal() | 394 AnimationPlayer::AnimationPlayState AnimationPlayer::playStateInternal() |
| 389 { | 395 { |
| 390 // FIXME(shanestephens): Add clause for in-idle-state here. | 396 if (m_idle) |
| 397 return Idle; |
| 391 if (m_currentTimePending || (isNull(m_startTime) && !m_paused && m_playbackR
ate != 0)) | 398 if (m_currentTimePending || (isNull(m_startTime) && !m_paused && m_playbackR
ate != 0)) |
| 392 return Pending; | 399 return Pending; |
| 393 // FIXME(shanestephens): Add idle handling here. | |
| 394 if (m_paused) | 400 if (m_paused) |
| 395 return Paused; | 401 return Paused; |
| 396 if (finished()) | 402 if (finished()) |
| 397 return Finished; | 403 return Finished; |
| 398 return Running; | 404 return Running; |
| 399 } | 405 } |
| 400 | 406 |
| 401 void AnimationPlayer::pause() | 407 void AnimationPlayer::pause() |
| 402 { | 408 { |
| 403 if (m_paused) | 409 if (m_paused) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 426 m_paused = false; | 432 m_paused = false; |
| 427 setCurrentTimeInternal(currentTimeInternal(), TimingUpdateOnDemand); | 433 setCurrentTimeInternal(currentTimeInternal(), TimingUpdateOnDemand); |
| 428 } | 434 } |
| 429 | 435 |
| 430 void AnimationPlayer::play() | 436 void AnimationPlayer::play() |
| 431 { | 437 { |
| 432 if (!playing()) | 438 if (!playing()) |
| 433 m_startTime = nullValue(); | 439 m_startTime = nullValue(); |
| 434 | 440 |
| 435 setCompositorPending(); | 441 setCompositorPending(); |
| 442 uncancel(); |
| 436 unpauseInternal(); | 443 unpauseInternal(); |
| 437 if (!m_content) | 444 if (!m_content) |
| 438 return; | 445 return; |
| 439 double currentTime = this->currentTimeInternal(); | 446 double currentTime = this->currentTimeInternal(); |
| 440 if (m_playbackRate > 0 && (currentTime < 0 || currentTime >= sourceEnd())) | 447 if (m_playbackRate > 0 && (currentTime < 0 || currentTime >= sourceEnd())) |
| 441 setCurrentTimeInternal(0, TimingUpdateOnDemand); | 448 setCurrentTimeInternal(0, TimingUpdateOnDemand); |
| 442 else if (m_playbackRate < 0 && (currentTime <= 0 || currentTime > sourceEnd(
))) | 449 else if (m_playbackRate < 0 && (currentTime <= 0 || currentTime > sourceEnd(
))) |
| 443 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand); | 450 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand); |
| 444 m_finished = false; | 451 m_finished = false; |
| 445 } | 452 } |
| 446 | 453 |
| 447 void AnimationPlayer::reverse() | 454 void AnimationPlayer::reverse() |
| 448 { | 455 { |
| 449 if (!m_playbackRate) { | 456 if (!m_playbackRate) { |
| 450 return; | 457 return; |
| 451 } | 458 } |
| 459 |
| 460 uncancel(); |
| 461 |
| 452 if (m_content) { | 462 if (m_content) { |
| 453 if (m_playbackRate > 0 && currentTimeInternal() > sourceEnd()) { | 463 if (m_playbackRate > 0 && currentTimeInternal() > sourceEnd()) { |
| 454 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand); | 464 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand); |
| 455 ASSERT(finished()); | 465 ASSERT(finished()); |
| 456 } else if (m_playbackRate < 0 && currentTimeInternal() < 0) { | 466 } else if (m_playbackRate < 0 && currentTimeInternal() < 0) { |
| 457 setCurrentTimeInternal(0, TimingUpdateOnDemand); | 467 setCurrentTimeInternal(0, TimingUpdateOnDemand); |
| 458 ASSERT(finished()); | 468 ASSERT(finished()); |
| 459 } | 469 } |
| 460 } | 470 } |
| 461 setPlaybackRate(-m_playbackRate); | 471 setPlaybackRate(-m_playbackRate); |
| 462 unpauseInternal(); | 472 unpauseInternal(); |
| 463 } | 473 } |
| 464 | 474 |
| 465 void AnimationPlayer::finish(ExceptionState& exceptionState) | 475 void AnimationPlayer::finish(ExceptionState& exceptionState) |
| 466 { | 476 { |
| 467 if (!m_playbackRate) { | 477 if (!m_playbackRate) { |
| 468 return; | 478 return; |
| 469 } | 479 } |
| 470 if (m_playbackRate > 0 && sourceEnd() == std::numeric_limits<double>::infini
ty()) { | 480 if (m_playbackRate > 0 && sourceEnd() == std::numeric_limits<double>::infini
ty()) { |
| 471 exceptionState.throwDOMException(InvalidStateError, "AnimationPlayer has
source content whose end time is infinity."); | 481 exceptionState.throwDOMException(InvalidStateError, "AnimationPlayer has
source content whose end time is infinity."); |
| 472 return; | 482 return; |
| 473 } | 483 } |
| 474 if (playing()) { | 484 if (playing()) { |
| 475 setCompositorPending(); | 485 setCompositorPending(); |
| 476 } | 486 } |
| 487 |
| 488 uncancel(); |
| 489 m_startTime = 0; |
| 490 |
| 477 if (m_playbackRate < 0) { | 491 if (m_playbackRate < 0) { |
| 478 setCurrentTimeInternal(0, TimingUpdateOnDemand); | 492 setCurrentTimeInternal(0, TimingUpdateOnDemand); |
| 479 } else { | 493 } else { |
| 480 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand); | 494 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand); |
| 481 } | 495 } |
| 482 ASSERT(finished()); | 496 ASSERT(finished()); |
| 483 } | 497 } |
| 484 | 498 |
| 485 const AtomicString& AnimationPlayer::interfaceName() const | 499 const AtomicString& AnimationPlayer::interfaceName() const |
| 486 { | 500 { |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 588 } | 602 } |
| 589 | 603 |
| 590 bool AnimationPlayer::update(TimingUpdateReason reason) | 604 bool AnimationPlayer::update(TimingUpdateReason reason) |
| 591 { | 605 { |
| 592 if (!m_timeline) | 606 if (!m_timeline) |
| 593 return false; | 607 return false; |
| 594 | 608 |
| 595 updateCurrentTimingState(reason); | 609 updateCurrentTimingState(reason); |
| 596 m_outdated = false; | 610 m_outdated = false; |
| 597 | 611 |
| 598 if (m_content) { | 612 if (m_content && !m_idle) { |
| 599 double inheritedTime = isNull(m_timeline->currentTimeInternal()) ? nullV
alue() : currentTimeInternal(); | 613 double inheritedTime = isNull(m_timeline->currentTimeInternal()) ? nullV
alue() : currentTimeInternal(); |
| 600 m_content->updateInheritedTime(inheritedTime, reason); | 614 m_content->updateInheritedTime(inheritedTime, reason); |
| 601 } | 615 } |
| 602 | 616 |
| 603 if (finished() && !m_finished) { | 617 if ((m_idle || finished()) && !m_finished) { |
| 604 if (reason == TimingUpdateForAnimationFrame && hasStartTime()) { | 618 if (reason == TimingUpdateForAnimationFrame && (m_idle || hasStartTime()
)) { |
| 605 const AtomicString& eventType = EventTypeNames::finish; | 619 const AtomicString& eventType = EventTypeNames::finish; |
| 606 if (executionContext() && hasEventListeners(eventType)) { | 620 if (executionContext() && hasEventListeners(eventType)) { |
| 607 m_pendingFinishedEvent = AnimationPlayerEvent::create(eventType,
currentTime(), timeline()->currentTime()); | 621 m_pendingFinishedEvent = AnimationPlayerEvent::create(eventType,
currentTime(), timeline()->currentTime()); |
| 608 m_pendingFinishedEvent->setTarget(this); | 622 m_pendingFinishedEvent->setTarget(this); |
| 609 m_pendingFinishedEvent->setCurrentTarget(this); | 623 m_pendingFinishedEvent->setCurrentTarget(this); |
| 610 m_timeline->document()->enqueueAnimationFrameEvent(m_pendingFini
shedEvent); | 624 m_timeline->document()->enqueueAnimationFrameEvent(m_pendingFini
shedEvent); |
| 611 } | 625 } |
| 612 m_finished = true; | 626 m_finished = true; |
| 613 } | 627 } |
| 614 } | 628 } |
| 615 ASSERT(!m_outdated); | 629 ASSERT(!m_outdated); |
| 616 return !m_finished || !finished(); | 630 return !m_finished; |
| 617 } | 631 } |
| 618 | 632 |
| 619 double AnimationPlayer::timeToEffectChange() | 633 double AnimationPlayer::timeToEffectChange() |
| 620 { | 634 { |
| 621 ASSERT(!m_outdated); | 635 ASSERT(!m_outdated); |
| 622 if (m_held || !hasStartTime()) | 636 if (m_held || !hasStartTime()) |
| 623 return std::numeric_limits<double>::infinity(); | 637 return std::numeric_limits<double>::infinity(); |
| 624 if (!m_content) | 638 if (!m_content) |
| 625 return -currentTimeInternal() / m_playbackRate; | 639 return -currentTimeInternal() / m_playbackRate; |
| 626 if (m_playbackRate > 0) | 640 if (m_playbackRate > 0) |
| 627 return m_content->timeToForwardsEffectChange() / m_playbackRate; | 641 return m_content->timeToForwardsEffectChange() / m_playbackRate; |
| 628 return m_content->timeToReverseEffectChange() / -m_playbackRate; | 642 return m_content->timeToReverseEffectChange() / -m_playbackRate; |
| 629 } | 643 } |
| 630 | 644 |
| 631 void AnimationPlayer::cancel() | 645 void AnimationPlayer::cancel() |
| 632 { | 646 { |
| 633 setSource(0); | 647 m_idle = true; |
| 648 m_startTime = nullValue(); |
| 649 setCompositorPending(); |
| 634 } | 650 } |
| 635 | 651 |
| 636 #if !ENABLE(OILPAN) | 652 #if !ENABLE(OILPAN) |
| 637 bool AnimationPlayer::canFree() const | 653 bool AnimationPlayer::canFree() const |
| 638 { | 654 { |
| 639 ASSERT(m_content); | 655 ASSERT(m_content); |
| 640 return hasOneRef() && m_content->isAnimation() && m_content->hasOneRef(); | 656 return hasOneRef() && m_content->isAnimation() && m_content->hasOneRef(); |
| 641 } | 657 } |
| 642 #endif | 658 #endif |
| 643 | 659 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 660 | 676 |
| 661 void AnimationPlayer::trace(Visitor* visitor) | 677 void AnimationPlayer::trace(Visitor* visitor) |
| 662 { | 678 { |
| 663 visitor->trace(m_content); | 679 visitor->trace(m_content); |
| 664 visitor->trace(m_timeline); | 680 visitor->trace(m_timeline); |
| 665 visitor->trace(m_pendingFinishedEvent); | 681 visitor->trace(m_pendingFinishedEvent); |
| 666 EventTargetWithInlineData::trace(visitor); | 682 EventTargetWithInlineData::trace(visitor); |
| 667 } | 683 } |
| 668 | 684 |
| 669 } // namespace | 685 } // namespace |
| OLD | NEW |