| Index: ui/compositor/layer_animator.cc
|
| diff --git a/ui/compositor/layer_animator.cc b/ui/compositor/layer_animator.cc
|
| index 96a184c52ab244b88e06dbec98932109635173d0..69454eaaf2e270eb66f45a00304a6654b6ba5d39 100644
|
| --- a/ui/compositor/layer_animator.cc
|
| +++ b/ui/compositor/layer_animator.cc
|
| @@ -13,6 +13,7 @@
|
| #include "ui/compositor/layer_animation_delegate.h"
|
| #include "ui/compositor/layer_animation_observer.h"
|
| #include "ui/compositor/layer_animation_sequence.h"
|
| +#include "ui/compositor/layer_animation_timer.h"
|
|
|
| #define SAFE_INVOKE_VOID(function, running_anim, ...) \
|
| if (running_anim.is_sequence_alive()) \
|
| @@ -38,14 +39,42 @@ static const base::TimeDelta kDefaultTransitionDuration =
|
| static const base::TimeDelta kTimerInterval =
|
| base::TimeDelta::FromMilliseconds(10);
|
|
|
| -// Returns the AnimationContainer we're added to.
|
| -ui::AnimationContainer* GetAnimationContainer() {
|
| - static ui::AnimationContainer* container = NULL;
|
| - if (!container) {
|
| - container = new AnimationContainer();
|
| - container->AddRef();
|
| +// The default timer is simply a thin wrapper around an AnimationContainer.
|
| +class DefaultLayerAnimationTimer : public LayerAnimationTimer {
|
| + public:
|
| + DefaultLayerAnimationTimer() : container_(new AnimationContainer()) {
|
| }
|
| - return container;
|
| +
|
| + private:
|
| + // LayerAnimationTimer implementation.
|
| + virtual void Start(AnimationContainerElement* element) {
|
| + container_->Start(element);
|
| + }
|
| +
|
| + virtual void Stop(AnimationContainerElement* element) {
|
| + container_->Stop(element);
|
| + }
|
| +
|
| + virtual base::TimeTicks last_tick_time() const {
|
| + return container_->last_tick_time();
|
| + }
|
| +
|
| + virtual bool is_running() const {
|
| + return container_->is_running();
|
| + }
|
| +
|
| + scoped_refptr<AnimationContainer> container_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(DefaultLayerAnimationTimer);
|
| +};
|
| +
|
| +static LayerAnimationTimer* s_timer = NULL;
|
| +
|
| +// Returns the LayerAnimationTimer we're added to.
|
| +static LayerAnimationTimer* GetAnimationTimer() {
|
| + if (!s_timer)
|
| + s_timer = new DefaultLayerAnimationTimer();
|
| + return s_timer;
|
| }
|
|
|
| } // namespace
|
| @@ -181,8 +210,8 @@ void LayerAnimator::StartTogether(
|
|
|
| adding_animations_ = true;
|
| if (!is_animating()) {
|
| - if (GetAnimationContainer()->is_running())
|
| - last_step_time_ = GetAnimationContainer()->last_tick_time();
|
| + if (GetAnimationTimer()->is_running())
|
| + last_step_time_ = GetAnimationTimer()->last_tick_time();
|
| else
|
| last_step_time_ = base::TimeTicks::Now();
|
| }
|
| @@ -323,6 +352,13 @@ void LayerAnimator::RemoveObserver(LayerAnimationObserver* observer) {
|
| }
|
| }
|
|
|
| +// static
|
| +void LayerAnimator::SetAnimationTimer(LayerAnimationTimer* timer) {
|
| + if (s_timer && s_timer != timer)
|
| + delete s_timer;
|
| + s_timer = timer;
|
| +}
|
| +
|
| // LayerAnimator protected -----------------------------------------------------
|
|
|
| void LayerAnimator::ProgressAnimation(LayerAnimationSequence* sequence,
|
| @@ -388,9 +424,9 @@ void LayerAnimator::UpdateAnimationState() {
|
|
|
| const bool should_start = is_animating();
|
| if (should_start && !is_started_)
|
| - GetAnimationContainer()->Start(this);
|
| + GetAnimationTimer()->Start(this);
|
| else if (!should_start && is_started_)
|
| - GetAnimationContainer()->Stop(this);
|
| + GetAnimationTimer()->Stop(this);
|
|
|
| is_started_ = should_start;
|
| }
|
| @@ -676,8 +712,8 @@ bool LayerAnimator::StartSequenceImmediately(LayerAnimationSequence* sequence) {
|
| base::TimeTicks start_time;
|
| if (is_animating() || adding_animations_)
|
| start_time = last_step_time_;
|
| - else if (GetAnimationContainer()->is_running())
|
| - start_time = GetAnimationContainer()->last_tick_time();
|
| + else if (GetAnimationTimer()->is_running())
|
| + start_time = GetAnimationTimer()->last_tick_time();
|
| else
|
| start_time = base::TimeTicks::Now();
|
|
|
|
|