summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ui/compositor/layer_animation_element.cc2
-rw-r--r--ui/compositor/layer_animation_element_unittest.cc53
2 files changed, 52 insertions, 3 deletions
diff --git a/ui/compositor/layer_animation_element.cc b/ui/compositor/layer_animation_element.cc
index 1234a04..f70c108 100644
--- a/ui/compositor/layer_animation_element.cc
+++ b/ui/compositor/layer_animation_element.cc
@@ -517,7 +517,7 @@ class ThreadedTransformTransition : public ThreadedLayerAnimationElement {
}
virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {
- if (delegate && animation_id()) {
+ if (delegate && Started()) {
ThreadedLayerAnimationElement::OnAbort(delegate);
delegate->SetTransformFromAnimation(Tween::ValueBetween(
Tween::CalculateValue(tween_type(), last_progressed_fraction()),
diff --git a/ui/compositor/layer_animation_element_unittest.cc b/ui/compositor/layer_animation_element_unittest.cc
index a674270..2701200 100644
--- a/ui/compositor/layer_animation_element_unittest.cc
+++ b/ui/compositor/layer_animation_element_unittest.cc
@@ -290,7 +290,8 @@ TEST(LayerAnimationElementTest, PauseElement) {
copy.GetGrayscaleForAnimation());
}
-// Check that a threaded element updates the delegate as expected when aborted.
+// Check that a threaded opacity element updates the delegate as expected when
+// aborted.
TEST(LayerAnimationElementTest, AbortOpacityElement) {
TestLayerAnimationDelegate delegate;
float start = 0.0;
@@ -305,9 +306,14 @@ TEST(LayerAnimationElementTest, AbortOpacityElement) {
Tween::Type tween_type = Tween::EASE_IN;
element->set_tween_type(tween_type);
+ delegate.SetOpacityFromAnimation(start);
+
+ // Aborting the element before it has started should not update the delegate.
+ element->Abort(&delegate);
+ EXPECT_FLOAT_EQ(start, delegate.GetOpacityForAnimation());
+
start_time += delta;
element->set_requested_start_time(start_time);
- delegate.SetOpacityFromAnimation(start);
element->Start(&delegate, 1);
element->Progress(start_time, &delegate);
effective_start_time = start_time + delta;
@@ -315,11 +321,54 @@ TEST(LayerAnimationElementTest, AbortOpacityElement) {
element->Progress(effective_start_time, &delegate);
element->Progress(effective_start_time + delta/2, &delegate);
+ // Since the element has started, it should update the delegate when
+ // aborted.
element->Abort(&delegate);
EXPECT_FLOAT_EQ(Tween::CalculateValue(tween_type, 0.5),
delegate.GetOpacityForAnimation());
}
+// Check that a threaded transform element updates the delegate as expected when
+// aborted.
+TEST(LayerAnimationElementTest, AbortTransformElement) {
+ TestLayerAnimationDelegate delegate;
+ gfx::Transform start_transform, target_transform;
+ start_transform.Rotate(-30.0);
+ target_transform.Rotate(30.0);
+ base::TimeTicks start_time;
+ base::TimeTicks effective_start_time;
+ base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
+ scoped_ptr<LayerAnimationElement> element(
+ LayerAnimationElement::CreateTransformElement(target_transform, delta));
+
+ // Choose a non-linear Tween type.
+ Tween::Type tween_type = Tween::EASE_IN;
+ element->set_tween_type(tween_type);
+
+ delegate.SetTransformFromAnimation(start_transform);
+
+ // Aborting the element before it has started should not update the delegate.
+ element->Abort(&delegate);
+ CheckApproximatelyEqual(start_transform, delegate.GetTransformForAnimation());
+
+ start_time += delta;
+ element->set_requested_start_time(start_time);
+ element->Start(&delegate, 1);
+ element->Progress(start_time, &delegate);
+ effective_start_time = start_time + delta;
+ element->set_effective_start_time(effective_start_time);
+ element->Progress(effective_start_time, &delegate);
+ element->Progress(effective_start_time + delta/2, &delegate);
+
+ // Since the element has started, it should update the delegate when
+ // aborted.
+ element->Abort(&delegate);
+ target_transform.Blend(start_transform,
+ Tween::CalculateValue(tween_type, 0.5));
+ CheckApproximatelyEqual(target_transform,
+ delegate.GetTransformForAnimation());
+}
+
} // namespace
} // namespace ui