Index: ui/compositor/layer_animator_unittest.cc |
diff --git a/ui/compositor/layer_animator_unittest.cc b/ui/compositor/layer_animator_unittest.cc |
index ed739656e56be3bee3d82a7a38f072e330678f91..03800fdc2745ad074052c1321b04fa8b097545c2 100644 |
--- a/ui/compositor/layer_animator_unittest.cc |
+++ b/ui/compositor/layer_animator_unittest.cc |
@@ -120,12 +120,41 @@ class DeletingLayerAnimationObserver : public LayerAnimationObserver { |
DISALLOW_COPY_AND_ASSIGN(DeletingLayerAnimationObserver); |
}; |
+class LayerAnimatorDestructionObserver { |
+ public: |
+ LayerAnimatorDestructionObserver() : animator_deleted_(false) {} |
+ virtual ~LayerAnimatorDestructionObserver() {} |
+ |
+ void NotifyAnimatorDeleted() { |
+ animator_deleted_ = true; |
+ } |
+ |
+ bool IsAnimatorDeleted() { |
+ return animator_deleted_; |
+ } |
+ |
+ private: |
+ bool animator_deleted_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(LayerAnimatorDestructionObserver); |
+}; |
+ |
class TestLayerAnimator : public LayerAnimator { |
public: |
- TestLayerAnimator() : LayerAnimator(base::TimeDelta::FromSeconds(0)) {} |
+ TestLayerAnimator() : LayerAnimator(base::TimeDelta::FromSeconds(0)), |
+ destruction_observer_(NULL) {} |
+ |
+ void SetDestructionObserver( |
+ LayerAnimatorDestructionObserver* observer) { |
+ destruction_observer_ = observer; |
+ } |
protected: |
- virtual ~TestLayerAnimator() {} |
+ virtual ~TestLayerAnimator() { |
+ if (destruction_observer_) { |
+ destruction_observer_->NotifyAnimatorDeleted(); |
+ } |
+ } |
virtual void ProgressAnimation(LayerAnimationSequence* sequence, |
base::TimeTicks now) OVERRIDE { |
@@ -134,6 +163,8 @@ class TestLayerAnimator : public LayerAnimator { |
} |
private: |
+ LayerAnimatorDestructionObserver* destruction_observer_; |
+ |
DISALLOW_COPY_AND_ASSIGN(TestLayerAnimator); |
}; |
@@ -1642,6 +1673,30 @@ TEST(LayerAnimatorTest, InterruptedImplicitAnimationObservers) { |
EXPECT_FLOAT_EQ(1.0f, delegate.GetBrightnessForAnimation()); |
} |
+// Tests that LayerAnimator is not deleted after the animation completes as long |
+// as there is a live ScopedLayerAnimationSettings object wrapped around it. |
+TEST(LayerAnimatorTest, AnimatorKeptAliveBySettings) { |
+ // Note we are using a raw pointer unlike in other tests. |
+ TestLayerAnimator* animator = new TestLayerAnimator(); |
+ LayerAnimatorDestructionObserver destruction_observer; |
+ animator->SetDestructionObserver(&destruction_observer); |
+ AnimationContainerElement* element = animator; |
+ animator->set_disable_timer_for_test(true); |
+ TestLayerAnimationDelegate delegate; |
+ animator->SetDelegate(&delegate); |
+ { |
+ // ScopedLayerAnimationSettings should keep the Animator alive as long as |
+ // it is alive, even beyond the end of the animation. |
+ ScopedLayerAnimationSettings settings(animator); |
+ base::TimeTicks now = gfx::FrameTime::Now(); |
+ animator->SetBrightness(0.5); |
+ element->Step(now + base::TimeDelta::FromSeconds(1)); |
+ EXPECT_FALSE(destruction_observer.IsAnimatorDeleted()); |
+ } |
+ // ScopedLayerAnimationSettings was destroyed, so Animator should be deleted. |
+ EXPECT_TRUE(destruction_observer.IsAnimatorDeleted()); |
+} |
+ |
// Tests that an observer added to a scoped settings object is not notified |
// when the animator is destroyed unless explicitly requested. |
TEST(LayerAnimatorTest, ImplicitObserversAtAnimatorDestruction) { |