| Index: ui/compositor/layer_animator.cc
|
| diff --git a/ui/compositor/layer_animator.cc b/ui/compositor/layer_animator.cc
|
| index 5dc323053cdbd2f09a4ea7adcb116d24c94cd5df..2cf25dc5339e01742db010fe6149ff72e718917c 100644
|
| --- a/ui/compositor/layer_animator.cc
|
| +++ b/ui/compositor/layer_animator.cc
|
| @@ -38,32 +38,6 @@ ui::AnimationContainer* GetAnimationContainer() {
|
|
|
| } // namespace
|
|
|
| -class LayerAnimator::DestroyedTracker
|
| - : public base::RefCounted<LayerAnimator::DestroyedTracker> {
|
| - public:
|
| - DestroyedTracker() : is_alive_(true) {}
|
| -
|
| - // Returns true if the animator is still alive.
|
| - bool is_alive() const { return is_alive_; }
|
| -
|
| - // Invoked when the animator is destroyed.
|
| - void AnimatorDeleted() {
|
| - DCHECK(is_alive_);
|
| - is_alive_ = false;
|
| - }
|
| -
|
| - private:
|
| - friend class base::RefCounted<DestroyedTracker>;
|
| -
|
| - ~DestroyedTracker() {
|
| - DCHECK(!is_alive_);
|
| - }
|
| -
|
| - bool is_alive_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DestroyedTracker);
|
| -};
|
| -
|
| // static
|
| bool LayerAnimator::disable_animations_for_test_ = false;
|
| // static
|
| @@ -79,15 +53,14 @@ LayerAnimator::LayerAnimator(base::TimeDelta transition_duration)
|
| transition_duration_(transition_duration),
|
| tween_type_(Tween::LINEAR),
|
| is_started_(false),
|
| - disable_timer_for_test_(false),
|
| - destroyed_tracker_(new DestroyedTracker) {
|
| + disable_timer_for_test_(false) {
|
| }
|
|
|
| LayerAnimator::~LayerAnimator() {
|
| for (size_t i = 0; i < running_animations_.size(); ++i)
|
| running_animations_[i].sequence->OnAnimatorDestroyed();
|
| - ClearAnimations();
|
| - destroyed_tracker_->AnimatorDeleted();
|
| + ClearAnimationsInternal();
|
| + delegate_ = NULL;
|
| }
|
|
|
| // static
|
| @@ -186,11 +159,11 @@ float LayerAnimator::GetTargetGrayscale() const {
|
| }
|
|
|
| void LayerAnimator::SetDelegate(LayerAnimationDelegate* delegate) {
|
| - DCHECK(delegate);
|
| delegate_ = delegate;
|
| }
|
|
|
| void LayerAnimator::StartAnimation(LayerAnimationSequence* animation) {
|
| + scoped_refptr<LayerAnimator> retain(this);
|
| OnScheduled(animation);
|
| if (!StartSequenceImmediately(animation)) {
|
| // Attempt to preempt a running animation.
|
| @@ -219,6 +192,7 @@ void LayerAnimator::StartAnimation(LayerAnimationSequence* animation) {
|
| }
|
|
|
| void LayerAnimator::ScheduleAnimation(LayerAnimationSequence* animation) {
|
| + scoped_refptr<LayerAnimator> retain(this);
|
| OnScheduled(animation);
|
| if (is_animating()) {
|
| animation_queue_.push_back(make_linked_ptr(animation));
|
| @@ -231,6 +205,8 @@ void LayerAnimator::ScheduleAnimation(LayerAnimationSequence* animation) {
|
|
|
| void LayerAnimator::ScheduleTogether(
|
| const std::vector<LayerAnimationSequence*>& animations) {
|
| + scoped_refptr<LayerAnimator> retain(this);
|
| +
|
| // Collect all the affected properties.
|
| LayerAnimationElement::AnimatableProperties animated_properties;
|
| std::vector<LayerAnimationSequence*>::const_iterator iter;
|
| @@ -286,20 +262,19 @@ bool LayerAnimator::IsAnimatingProperty(
|
|
|
| void LayerAnimator::StopAnimatingProperty(
|
| LayerAnimationElement::AnimatableProperty property) {
|
| + scoped_refptr<LayerAnimator> retain(this);
|
| while (true) {
|
| RunningAnimation* running = GetRunningAnimation(property);
|
| if (!running)
|
| break;
|
| - if (FinishAnimation(running->sequence) == DESTROYED)
|
| - return;
|
| + FinishAnimation(running->sequence);
|
| }
|
| }
|
|
|
| void LayerAnimator::StopAnimating() {
|
| - while (is_animating()) {
|
| - if (FinishAnimation(running_animations_[0].sequence) == DESTROYED)
|
| - return;
|
| - }
|
| + scoped_refptr<LayerAnimator> retain(this);
|
| + while (is_animating())
|
| + FinishAnimation(running_animations_[0].sequence);
|
| }
|
|
|
| void LayerAnimator::AddObserver(LayerAnimationObserver* observer) {
|
| @@ -318,9 +293,12 @@ void LayerAnimator::RemoveObserver(LayerAnimationObserver* observer) {
|
|
|
| // LayerAnimator protected -----------------------------------------------------
|
|
|
| -bool LayerAnimator::ProgressAnimation(LayerAnimationSequence* sequence,
|
| +void LayerAnimator::ProgressAnimation(LayerAnimationSequence* sequence,
|
| base::TimeDelta delta) {
|
| - return sequence->Progress(delta, delegate());
|
| + if (!delegate())
|
| + return;
|
| +
|
| + sequence->Progress(delta, delegate());
|
| }
|
|
|
|
|
| @@ -337,6 +315,7 @@ bool LayerAnimator::HasAnimation(LayerAnimationSequence* sequence) const {
|
|
|
| void LayerAnimator::Step(base::TimeTicks now) {
|
| TRACE_EVENT0("ui", "LayerAnimator::Step");
|
| + scoped_refptr<LayerAnimator> retain(this);
|
|
|
| last_step_time_ = now;
|
|
|
| @@ -344,7 +323,6 @@ void LayerAnimator::Step(base::TimeTicks now) {
|
| // and finishing them may indirectly affect the collection of running
|
| // animations.
|
| RunningAnimations running_animations_copy = running_animations_;
|
| - bool needs_redraw = false;
|
| for (size_t i = 0; i < running_animations_copy.size(); ++i) {
|
| if (!HasAnimation(running_animations_copy[i].sequence))
|
| continue;
|
| @@ -352,22 +330,10 @@ void LayerAnimator::Step(base::TimeTicks now) {
|
| base::TimeDelta delta = now - running_animations_copy[i].start_time;
|
| if (delta >= running_animations_copy[i].sequence->duration() &&
|
| !running_animations_copy[i].sequence->is_cyclic()) {
|
| - if (FinishAnimation(running_animations_copy[i].sequence) == DESTROYED)
|
| - return;
|
| - needs_redraw = true;
|
| - } else {
|
| - scoped_refptr<DestroyedTracker> tracker(destroyed_tracker_);
|
| - const bool progress_result =
|
| - ProgressAnimation(running_animations_copy[i].sequence, delta);
|
| - if (!tracker->is_alive())
|
| - return;
|
| - if (progress_result)
|
| - needs_redraw = true;
|
| - }
|
| + FinishAnimation(running_animations_copy[i].sequence);
|
| + } else
|
| + ProgressAnimation(running_animations_copy[i].sequence, delta);
|
| }
|
| -
|
| - if (needs_redraw && delegate())
|
| - delegate()->ScheduleDrawForAnimation();
|
| }
|
|
|
| void LayerAnimator::SetStartTime(base::TimeTicks start_time) {
|
| @@ -417,21 +383,17 @@ LayerAnimationSequence* LayerAnimator::RemoveAnimation(
|
| return to_return.release();
|
| }
|
|
|
| -LayerAnimator::DestroyedType LayerAnimator::FinishAnimation(
|
| - LayerAnimationSequence* sequence) {
|
| +void LayerAnimator::FinishAnimation(LayerAnimationSequence* sequence) {
|
| + scoped_refptr<LayerAnimator> retain(this);
|
| scoped_ptr<LayerAnimationSequence> removed(RemoveAnimation(sequence));
|
| - {
|
| - scoped_refptr<DestroyedTracker> tracker(destroyed_tracker_);
|
| + if (delegate())
|
| sequence->Progress(sequence->duration(), delegate());
|
| - if (!tracker->is_alive())
|
| - return DESTROYED;
|
| - }
|
| ProcessQueue();
|
| UpdateAnimationState();
|
| - return NOT_DESTROYED;
|
| }
|
|
|
| void LayerAnimator::FinishAnyAnimationWithZeroDuration() {
|
| + scoped_refptr<LayerAnimator> retain(this);
|
| // Special case: if we've started a 0 duration animation, just finish it now
|
| // and get rid of it. We need to make a copy because Progress may indirectly
|
| // cause new animations to start running.
|
| @@ -441,8 +403,8 @@ void LayerAnimator::FinishAnyAnimationWithZeroDuration() {
|
| continue;
|
|
|
| if (running_animations_copy[i].sequence->duration() == base::TimeDelta()) {
|
| - running_animations_copy[i].sequence->Progress(
|
| - running_animations_copy[i].sequence->duration(), delegate());
|
| + ProgressAnimation(running_animations_copy[i].sequence,
|
| + running_animations_copy[i].sequence->duration());
|
| scoped_ptr<LayerAnimationSequence> removed(
|
| RemoveAnimation(running_animations_copy[i].sequence));
|
| }
|
| @@ -452,23 +414,8 @@ void LayerAnimator::FinishAnyAnimationWithZeroDuration() {
|
| }
|
|
|
| void LayerAnimator::ClearAnimations() {
|
| - // Abort should never affect the set of running animations, but just in case
|
| - // clients are badly behaved, we will use a copy of the running animations.
|
| - RunningAnimations running_animations_copy = running_animations_;
|
| - for (size_t i = 0; i < running_animations_copy.size(); ++i) {
|
| - if (!HasAnimation(running_animations_copy[i].sequence))
|
| - continue;
|
| -
|
| - scoped_ptr<LayerAnimationSequence> removed(
|
| - RemoveAnimation(running_animations_copy[i].sequence));
|
| - if (removed.get())
|
| - removed->Abort();
|
| - }
|
| - // This *should* have cleared the list of running animations.
|
| - DCHECK(running_animations_.empty());
|
| - running_animations_.clear();
|
| - animation_queue_.clear();
|
| - UpdateAnimationState();
|
| + scoped_refptr<LayerAnimator> retain(this);
|
| + ClearAnimationsInternal();
|
| }
|
|
|
| LayerAnimator::RunningAnimation* LayerAnimator::GetRunningAnimation(
|
| @@ -515,8 +462,8 @@ void LayerAnimator::RemoveAllAnimationsWithACommonProperty(
|
| if (abort)
|
| running_animations_copy[i].sequence->Abort();
|
| else
|
| - running_animations_copy[i].sequence->Progress(
|
| - running_animations_copy[i].sequence->duration(), delegate());
|
| + ProgressAnimation(running_animations_copy[i].sequence,
|
| + running_animations_copy[i].sequence->duration());
|
| }
|
| }
|
|
|
| @@ -537,7 +484,7 @@ void LayerAnimator::RemoveAllAnimationsWithACommonProperty(
|
| if (abort)
|
| sequences[i]->Abort();
|
| else
|
| - sequences[i]->Progress(sequences[i]->duration(), delegate());
|
| + ProgressAnimation(sequences[i], sequences[i]->duration());
|
| }
|
| }
|
| }
|
| @@ -549,7 +496,7 @@ void LayerAnimator::ImmediatelySetNewTarget(LayerAnimationSequence* sequence) {
|
| RemoveAllAnimationsWithACommonProperty(sequence, abort);
|
| LayerAnimationSequence* removed = RemoveAnimation(sequence);
|
| DCHECK(removed == NULL || removed == sequence);
|
| - sequence->Progress(sequence->duration(), delegate());
|
| + ProgressAnimation(sequence, sequence->duration());
|
| }
|
|
|
| void LayerAnimator::ImmediatelyAnimateToNewTarget(
|
| @@ -692,4 +639,24 @@ base::TimeDelta LayerAnimator::GetTransitionDuration() const {
|
| return transition_duration_;
|
| }
|
|
|
| +void LayerAnimator::ClearAnimationsInternal() {
|
| + // Abort should never affect the set of running animations, but just in case
|
| + // clients are badly behaved, we will use a copy of the running animations.
|
| + RunningAnimations running_animations_copy = running_animations_;
|
| + for (size_t i = 0; i < running_animations_copy.size(); ++i) {
|
| + if (!HasAnimation(running_animations_copy[i].sequence))
|
| + continue;
|
| +
|
| + scoped_ptr<LayerAnimationSequence> removed(
|
| + RemoveAnimation(running_animations_copy[i].sequence));
|
| + if (removed.get())
|
| + removed->Abort();
|
| + }
|
| + // This *should* have cleared the list of running animations.
|
| + DCHECK(running_animations_.empty());
|
| + running_animations_.clear();
|
| + animation_queue_.clear();
|
| + UpdateAnimationState();
|
| +}
|
| +
|
| } // namespace ui
|
|
|