Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Unified Diff: ui/compositor/layer_animator.cc

Issue 10869066: Attempt 2 at Fixes crash introduced @ 153047 (you can hit crash by maximizing a (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: The fix Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« ash/wm/window_animations_unittest.cc ('K') | « ui/compositor/layer_animator.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/compositor/layer_animator.cc
diff --git a/ui/compositor/layer_animator.cc b/ui/compositor/layer_animator.cc
index 5fc289b42c79868d2d8f2a161b1db0595eb381be..9213995d417bdf06da2cbb88c07c97d7cd251468 100644
--- a/ui/compositor/layer_animator.cc
+++ b/ui/compositor/layer_animator.cc
@@ -43,13 +43,16 @@ LayerAnimator::LayerAnimator(base::TimeDelta transition_duration)
transition_duration_(transition_duration),
tween_type_(Tween::LINEAR),
is_started_(false),
- disable_timer_for_test_(false) {
+ disable_timer_for_test_(false),
+ destroyed_(NULL) {
}
LayerAnimator::~LayerAnimator() {
for (size_t i = 0; i < running_animations_.size(); ++i)
running_animations_[i].sequence->OnAnimatorDestroyed();
ClearAnimations();
+ if (destroyed_)
+ *destroyed_ = true;
}
// static
@@ -235,13 +238,16 @@ void LayerAnimator::StopAnimatingProperty(
RunningAnimation* running = GetRunningAnimation(property);
if (!running)
break;
- FinishAnimation(running->sequence);
+ if (FinishAnimation(running->sequence) == DESTROYED)
+ return;
}
}
void LayerAnimator::StopAnimating() {
- while (is_animating())
- FinishAnimation(running_animations_[0].sequence);
+ while (is_animating()) {
+ if (FinishAnimation(running_animations_[0].sequence) == DESTROYED)
+ return;
+ }
}
void LayerAnimator::AddObserver(LayerAnimationObserver* observer) {
@@ -293,10 +299,12 @@ 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()) {
- FinishAnimation(running_animations_copy[i].sequence);
+ if (FinishAnimation(running_animations_copy[i].sequence) == DESTROYED)
+ return;
needs_redraw = true;
- } else if (ProgressAnimation(running_animations_copy[i].sequence, delta))
+ } else if (ProgressAnimation(running_animations_copy[i].sequence, delta)) {
needs_redraw = true;
+ }
}
if (needs_redraw && delegate())
@@ -356,11 +364,20 @@ LayerAnimationSequence* LayerAnimator::RemoveAnimation(
return to_return.release();
}
-void LayerAnimator::FinishAnimation(LayerAnimationSequence* sequence) {
+LayerAnimator::DestroyedType LayerAnimator::FinishAnimation(
+ LayerAnimationSequence* sequence) {
scoped_ptr<LayerAnimationSequence> removed(RemoveAnimation(sequence));
- sequence->Progress(sequence->duration(), delegate());
+ {
+ bool destroyed = false;
+ destroyed_ = &destroyed;
+ sequence->Progress(sequence->duration(), delegate());
+ if (destroyed)
+ return DESTROYED;
+ destroyed_ = NULL;
+ }
ProcessQueue();
UpdateAnimationState();
+ return NOT_DESTROYED;
}
void LayerAnimator::FinishAnyAnimationWithZeroDuration() {
« ash/wm/window_animations_unittest.cc ('K') | « ui/compositor/layer_animator.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698