• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "ui/compositor/layer_animator.h"
6 
7 #include "base/basictypes.h"
8 #include "base/compiler_specific.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/strings/stringprintf.h"
11 #include "base/time/time.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 #include "ui/compositor/layer.h"
14 #include "ui/compositor/layer_animation_delegate.h"
15 #include "ui/compositor/layer_animation_element.h"
16 #include "ui/compositor/layer_animation_sequence.h"
17 #include "ui/compositor/layer_animator_collection.h"
18 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
19 #include "ui/compositor/scoped_layer_animation_settings.h"
20 #include "ui/compositor/test/context_factories_for_test.h"
21 #include "ui/compositor/test/layer_animator_test_controller.h"
22 #include "ui/compositor/test/test_compositor_host.h"
23 #include "ui/compositor/test/test_layer_animation_delegate.h"
24 #include "ui/compositor/test/test_layer_animation_observer.h"
25 #include "ui/compositor/test/test_utils.h"
26 #include "ui/gfx/frame_time.h"
27 #include "ui/gfx/rect.h"
28 #include "ui/gfx/transform.h"
29 
30 namespace ui {
31 
32 namespace {
33 
34 // Converts |color| to a string. Each component of the color is separated by a
35 // space and the order if A R G B.
ColorToString(SkColor color)36 std::string ColorToString(SkColor color) {
37   return base::StringPrintf("%d %d %d %d", SkColorGetA(color),
38                             SkColorGetR(color), SkColorGetG(color),
39                             SkColorGetB(color));
40 }
41 
42 // Creates vector with two LayerAnimationSequences, based on |first| and
43 // |second| layer animation elements.
CreateMultiSequence(LayerAnimationElement * first,LayerAnimationElement * second)44 std::vector<LayerAnimationSequence*> CreateMultiSequence(
45     LayerAnimationElement* first,
46     LayerAnimationElement* second) {
47   LayerAnimationSequence* first_sequence = new LayerAnimationSequence();
48   first_sequence->AddElement(first);
49   LayerAnimationSequence* second_sequence = new LayerAnimationSequence();
50   second_sequence->AddElement(second);
51 
52   std::vector<ui::LayerAnimationSequence*> animations;
53   animations.push_back(first_sequence);
54   animations.push_back(second_sequence);
55   return animations;
56 }
57 
58 class TestImplicitAnimationObserver : public ImplicitAnimationObserver {
59  public:
TestImplicitAnimationObserver(bool notify_when_animator_destructed)60   explicit TestImplicitAnimationObserver(bool notify_when_animator_destructed)
61     : animations_completed_(false),
62       notify_when_animator_destructed_(notify_when_animator_destructed) {
63   }
64 
animations_completed() const65   bool animations_completed() const { return animations_completed_; }
set_animations_completed(bool completed)66   void set_animations_completed(bool completed) {
67     animations_completed_ = completed;
68   }
69 
WasAnimationAbortedForProperty(LayerAnimationElement::AnimatableProperty property) const70   bool WasAnimationAbortedForProperty(
71       LayerAnimationElement::AnimatableProperty property) const {
72     return ImplicitAnimationObserver::WasAnimationAbortedForProperty(property);
73   }
74 
WasAnimationCompletedForProperty(LayerAnimationElement::AnimatableProperty property) const75   bool WasAnimationCompletedForProperty(
76       LayerAnimationElement::AnimatableProperty property) const {
77     return ImplicitAnimationObserver::WasAnimationCompletedForProperty(
78         property);
79   }
80 
81  private:
82   // ImplicitAnimationObserver implementation
OnImplicitAnimationsCompleted()83   virtual void OnImplicitAnimationsCompleted() OVERRIDE {
84     animations_completed_ = true;
85   }
86 
RequiresNotificationWhenAnimatorDestroyed() const87   virtual bool RequiresNotificationWhenAnimatorDestroyed() const OVERRIDE {
88     return notify_when_animator_destructed_;
89   }
90 
91   bool animations_completed_;
92   bool notify_when_animator_destructed_;
93 
94   DISALLOW_COPY_AND_ASSIGN(TestImplicitAnimationObserver);
95 };
96 
97 // When notified that an animation has ended, stops all other animations.
98 class DeletingLayerAnimationObserver : public LayerAnimationObserver {
99  public:
DeletingLayerAnimationObserver(LayerAnimator * animator)100   DeletingLayerAnimationObserver(LayerAnimator* animator)
101     : animator_(animator) {
102   }
103 
OnLayerAnimationEnded(LayerAnimationSequence * sequence)104   virtual void OnLayerAnimationEnded(
105       LayerAnimationSequence* sequence) OVERRIDE {
106     animator_->StopAnimating();
107   }
108 
OnLayerAnimationAborted(LayerAnimationSequence * sequence)109   virtual void OnLayerAnimationAborted(
110       LayerAnimationSequence* sequence) OVERRIDE {
111     animator_->StopAnimating();
112   }
113 
OnLayerAnimationScheduled(LayerAnimationSequence * sequence)114   virtual void OnLayerAnimationScheduled(
115       LayerAnimationSequence* sequence) OVERRIDE {
116   }
117 
118  private:
119   LayerAnimator* animator_;
120 
121   DISALLOW_COPY_AND_ASSIGN(DeletingLayerAnimationObserver);
122 };
123 
124 class LayerAnimatorDestructionObserver {
125  public:
LayerAnimatorDestructionObserver()126   LayerAnimatorDestructionObserver() : animator_deleted_(false) {}
~LayerAnimatorDestructionObserver()127   virtual ~LayerAnimatorDestructionObserver() {}
128 
NotifyAnimatorDeleted()129   void NotifyAnimatorDeleted() {
130     animator_deleted_ = true;
131   }
132 
IsAnimatorDeleted()133   bool IsAnimatorDeleted() {
134     return animator_deleted_;
135   }
136 
137  private:
138   bool animator_deleted_;
139 
140   DISALLOW_COPY_AND_ASSIGN(LayerAnimatorDestructionObserver);
141 };
142 
143 class TestLayerAnimator : public LayerAnimator {
144  public:
TestLayerAnimator()145   TestLayerAnimator() : LayerAnimator(base::TimeDelta::FromSeconds(0)),
146       destruction_observer_(NULL) {}
147 
SetDestructionObserver(LayerAnimatorDestructionObserver * observer)148   void SetDestructionObserver(
149       LayerAnimatorDestructionObserver* observer) {
150     destruction_observer_ = observer;
151   }
152 
153  protected:
~TestLayerAnimator()154   virtual ~TestLayerAnimator() {
155     if (destruction_observer_) {
156       destruction_observer_->NotifyAnimatorDeleted();
157     }
158   }
159 
ProgressAnimation(LayerAnimationSequence * sequence,base::TimeTicks now)160   virtual void ProgressAnimation(LayerAnimationSequence* sequence,
161                                  base::TimeTicks now) OVERRIDE {
162     EXPECT_TRUE(HasAnimation(sequence));
163     LayerAnimator::ProgressAnimation(sequence, now);
164   }
165 
166  private:
167   LayerAnimatorDestructionObserver* destruction_observer_;
168 
169   DISALLOW_COPY_AND_ASSIGN(TestLayerAnimator);
170 };
171 
172 // The test layer animation sequence updates a live instances count when it is
173 // created and destroyed.
174 class TestLayerAnimationSequence : public LayerAnimationSequence {
175  public:
TestLayerAnimationSequence(LayerAnimationElement * element,int * num_live_instances)176   TestLayerAnimationSequence(LayerAnimationElement* element,
177                              int* num_live_instances)
178       : LayerAnimationSequence(element),
179         num_live_instances_(num_live_instances) {
180     (*num_live_instances_)++;
181   }
182 
~TestLayerAnimationSequence()183   virtual ~TestLayerAnimationSequence() {
184     (*num_live_instances_)--;
185   }
186 
187  private:
188   int* num_live_instances_;
189 
190   DISALLOW_COPY_AND_ASSIGN(TestLayerAnimationSequence);
191 };
192 
193 } // namespace
194 
195 // Checks that setting a property on an implicit animator causes an animation to
196 // happen.
TEST(LayerAnimatorTest,ImplicitAnimation)197 TEST(LayerAnimatorTest, ImplicitAnimation) {
198   scoped_refptr<LayerAnimator> animator(
199       LayerAnimator::CreateImplicitAnimator());
200   animator->set_disable_timer_for_test(true);
201   TestLayerAnimationDelegate delegate;
202   animator->SetDelegate(&delegate);
203   base::TimeTicks now = gfx::FrameTime::Now();
204   animator->SetBrightness(0.5);
205   EXPECT_TRUE(animator->is_animating());
206   animator->Step(now + base::TimeDelta::FromSeconds(1));
207   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), 0.5);
208 }
209 
210 // Checks that if the animator is a default animator, that implicit animations
211 // are not started.
TEST(LayerAnimatorTest,NoImplicitAnimation)212 TEST(LayerAnimatorTest, NoImplicitAnimation) {
213   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
214   animator->set_disable_timer_for_test(true);
215   TestLayerAnimationDelegate delegate;
216   animator->SetDelegate(&delegate);
217   animator->SetBrightness(0.5);
218   EXPECT_FALSE(animator->is_animating());
219   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), 0.5);
220 }
221 
222 // Checks that StopAnimatingProperty stops animation for that property, and also
223 // skips the stopped animation to the end.
TEST(LayerAnimatorTest,StopAnimatingProperty)224 TEST(LayerAnimatorTest, StopAnimatingProperty) {
225   scoped_refptr<LayerAnimator> animator(
226       LayerAnimator::CreateImplicitAnimator());
227   animator->set_disable_timer_for_test(true);
228   TestLayerAnimationDelegate delegate;
229   animator->SetDelegate(&delegate);
230   double target_opacity(0.5);
231   gfx::Rect target_bounds(0, 0, 50, 50);
232   animator->SetOpacity(target_opacity);
233   animator->SetBounds(target_bounds);
234   animator->StopAnimatingProperty(LayerAnimationElement::OPACITY);
235   EXPECT_TRUE(animator->is_animating());
236   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), 0.5);
237   animator->StopAnimatingProperty(LayerAnimationElement::BOUNDS);
238   EXPECT_FALSE(animator->is_animating());
239   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
240 }
241 
242 // Checks that multiple running animation for separate properties can be stopped
243 // simultaneously and that all animations are advanced to their target values.
TEST(LayerAnimatorTest,StopAnimating)244 TEST(LayerAnimatorTest, StopAnimating) {
245   scoped_refptr<LayerAnimator> animator(
246       LayerAnimator::CreateImplicitAnimator());
247   animator->set_disable_timer_for_test(true);
248   TestLayerAnimationDelegate delegate;
249   animator->SetDelegate(&delegate);
250   double target_opacity(0.5);
251   gfx::Rect target_bounds(0, 0, 50, 50);
252   animator->SetOpacity(target_opacity);
253   animator->SetBounds(target_bounds);
254   EXPECT_TRUE(animator->is_animating());
255   animator->StopAnimating();
256   EXPECT_FALSE(animator->is_animating());
257   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), 0.5);
258   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
259 }
260 
261 // Checks that multiple running animation for separate properties can be stopped
262 // simultaneously and that all animations are advanced to their target values.
TEST(LayerAnimatorTest,AbortAllAnimations)263 TEST(LayerAnimatorTest, AbortAllAnimations) {
264   scoped_refptr<LayerAnimator> animator(
265       LayerAnimator::CreateImplicitAnimator());
266   animator->set_disable_timer_for_test(true);
267   TestLayerAnimationDelegate delegate;
268   double initial_opacity(1.0);
269   gfx::Rect initial_bounds(0, 0, 10, 10);
270   delegate.SetOpacityFromAnimation(initial_opacity);
271   delegate.SetBoundsFromAnimation(initial_bounds);
272   animator->SetDelegate(&delegate);
273   double target_opacity(0.5);
274   gfx::Rect target_bounds(0, 0, 50, 50);
275   animator->SetOpacity(target_opacity);
276   animator->SetBounds(target_bounds);
277   EXPECT_TRUE(animator->is_animating());
278   animator->AbortAllAnimations();
279   EXPECT_FALSE(animator->is_animating());
280   EXPECT_FLOAT_EQ(initial_opacity, delegate.GetOpacityForAnimation());
281   CheckApproximatelyEqual(initial_bounds, delegate.GetBoundsForAnimation());
282 }
283 
284 // Schedule a non-threaded animation that can run immediately. This is the
285 // trivial case and should result in the animation being started immediately.
TEST(LayerAnimatorTest,ScheduleAnimationThatCanRunImmediately)286 TEST(LayerAnimatorTest, ScheduleAnimationThatCanRunImmediately) {
287   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
288   animator->set_disable_timer_for_test(true);
289   TestLayerAnimationDelegate delegate;
290   animator->SetDelegate(&delegate);
291 
292   double start_brightness(0.0);
293   double middle_brightness(0.5);
294   double target_brightness(1.0);
295 
296   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
297 
298   delegate.SetBrightnessFromAnimation(start_brightness);
299 
300   animator->ScheduleAnimation(
301       new LayerAnimationSequence(
302           LayerAnimationElement::CreateBrightnessElement(target_brightness,
303                                                          delta)));
304 
305   EXPECT_TRUE(animator->is_animating());
306   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
307 
308   base::TimeTicks start_time = animator->last_step_time();
309 
310   animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
311 
312   EXPECT_TRUE(animator->is_animating());
313   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
314 
315   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
316 
317   EXPECT_FALSE(animator->is_animating());
318   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
319 }
320 
321 // Schedule a threaded animation that can run immediately.
TEST(LayerAnimatorTest,ScheduleThreadedAnimationThatCanRunImmediately)322 TEST(LayerAnimatorTest, ScheduleThreadedAnimationThatCanRunImmediately) {
323   double epsilon = 0.00001;
324   LayerAnimatorTestController test_controller(
325       LayerAnimator::CreateDefaultAnimator());
326   LayerAnimator* animator = test_controller.animator();
327   test_controller.animator()->set_disable_timer_for_test(true);
328   TestLayerAnimationDelegate delegate;
329   test_controller.animator()->SetDelegate(&delegate);
330 
331   double start_opacity(0.0);
332   double target_opacity(1.0);
333 
334   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
335 
336   delegate.SetOpacityFromAnimation(start_opacity);
337 
338   test_controller.animator()->ScheduleAnimation(
339       new LayerAnimationSequence(
340           LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
341 
342   EXPECT_TRUE(test_controller.animator()->is_animating());
343   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
344 
345   base::TimeTicks start_time = test_controller.animator()->last_step_time();
346   base::TimeTicks effective_start = start_time + delta;
347 
348   test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
349       cc::AnimationEvent::Started,
350       0,
351       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
352           ->animation_group_id(),
353       cc::Animation::Opacity,
354       effective_start));
355 
356   animator->Step(effective_start + delta / 2);
357 
358   EXPECT_TRUE(test_controller.animator()->is_animating());
359   EXPECT_NEAR(
360       0.5,
361       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)->
362           last_progressed_fraction(),
363       epsilon);
364 
365   animator->Step(effective_start + delta);
366 
367   EXPECT_FALSE(test_controller.animator()->is_animating());
368   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
369 }
370 
371 // Schedule two non-threaded animations on separate properties. Both animations
372 // should start immediately and should progress in lock step.
TEST(LayerAnimatorTest,ScheduleTwoAnimationsThatCanRunImmediately)373 TEST(LayerAnimatorTest, ScheduleTwoAnimationsThatCanRunImmediately) {
374   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
375   animator->set_disable_timer_for_test(true);
376   TestLayerAnimationDelegate delegate;
377   animator->SetDelegate(&delegate);
378 
379   double start_brightness(0.0);
380   double middle_brightness(0.5);
381   double target_brightness(1.0);
382 
383   gfx::Rect start_bounds, target_bounds, middle_bounds;
384   start_bounds = target_bounds = middle_bounds = gfx::Rect(0, 0, 50, 50);
385   start_bounds.set_x(-90);
386   target_bounds.set_x(90);
387 
388   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
389 
390   delegate.SetBrightnessFromAnimation(start_brightness);
391   delegate.SetBoundsFromAnimation(start_bounds);
392 
393   animator->ScheduleAnimation(
394       new LayerAnimationSequence(
395           LayerAnimationElement::CreateBrightnessElement(target_brightness,
396                                                          delta)));
397 
398   animator->ScheduleAnimation(
399       new LayerAnimationSequence(
400           LayerAnimationElement::CreateBoundsElement(target_bounds, delta)));
401 
402   EXPECT_TRUE(animator->is_animating());
403   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
404   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
405 
406   base::TimeTicks start_time = animator->last_step_time();
407 
408   animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
409 
410   EXPECT_TRUE(animator->is_animating());
411   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
412   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), middle_bounds);
413 
414   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
415 
416   EXPECT_FALSE(animator->is_animating());
417   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
418   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
419 }
420 
421 // Schedule a threaded and a non-threaded animation on separate properties. Both
422 // animations should progress in lock step.
TEST(LayerAnimatorTest,ScheduleThreadedAndNonThreadedAnimations)423 TEST(LayerAnimatorTest, ScheduleThreadedAndNonThreadedAnimations) {
424   double epsilon = 0.00001;
425   LayerAnimatorTestController test_controller(
426       LayerAnimator::CreateDefaultAnimator());
427   LayerAnimator* animator = test_controller.animator();
428   test_controller.animator()->set_disable_timer_for_test(true);
429   TestLayerAnimationDelegate delegate;
430   test_controller.animator()->SetDelegate(&delegate);
431 
432   double start_opacity(0.0);
433   double target_opacity(1.0);
434 
435   gfx::Rect start_bounds, target_bounds, middle_bounds;
436   start_bounds = target_bounds = middle_bounds = gfx::Rect(0, 0, 50, 50);
437   start_bounds.set_x(-90);
438   target_bounds.set_x(90);
439 
440   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
441 
442   delegate.SetOpacityFromAnimation(start_opacity);
443   delegate.SetBoundsFromAnimation(start_bounds);
444 
445   std::vector<LayerAnimationSequence*> animations;
446   animations.push_back(
447       new LayerAnimationSequence(
448           LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
449 
450   animations.push_back(
451       new LayerAnimationSequence(
452           LayerAnimationElement::CreateBoundsElement(target_bounds, delta)));
453 
454   test_controller.animator()->ScheduleTogether(animations);
455 
456   EXPECT_TRUE(test_controller.animator()->is_animating());
457   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
458   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
459 
460   base::TimeTicks start_time = test_controller.animator()->last_step_time();
461   base::TimeTicks effective_start = start_time + delta;
462 
463   test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
464       cc::AnimationEvent::Started,
465       0,
466       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
467           ->animation_group_id(),
468       cc::Animation::Opacity,
469       effective_start));
470 
471   animator->Step(effective_start + delta / 2);
472 
473   EXPECT_TRUE(test_controller.animator()->is_animating());
474   EXPECT_NEAR(
475       0.5,
476       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)->
477           last_progressed_fraction(),
478       epsilon);
479   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), middle_bounds);
480 
481   animator->Step(effective_start + delta);
482 
483   EXPECT_FALSE(test_controller.animator()->is_animating());
484   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
485   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
486 }
487 
488 // Schedule two animations on the same property. In this case, the two
489 // animations should run one after another.
TEST(LayerAnimatorTest,ScheduleTwoAnimationsOnSameProperty)490 TEST(LayerAnimatorTest, ScheduleTwoAnimationsOnSameProperty) {
491   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
492   animator->set_disable_timer_for_test(true);
493   TestLayerAnimationDelegate delegate;
494   animator->SetDelegate(&delegate);
495 
496   double start_brightness(0.0);
497   double middle_brightness(0.5);
498   double target_brightness(1.0);
499 
500   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
501 
502   delegate.SetBrightnessFromAnimation(start_brightness);
503 
504   animator->ScheduleAnimation(
505       new LayerAnimationSequence(
506           LayerAnimationElement::CreateBrightnessElement(target_brightness,
507                                                          delta)));
508 
509   animator->ScheduleAnimation(
510       new LayerAnimationSequence(
511           LayerAnimationElement::CreateBrightnessElement(start_brightness,
512                                                          delta)));
513 
514   EXPECT_TRUE(animator->is_animating());
515   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
516 
517   base::TimeTicks start_time = animator->last_step_time();
518 
519   animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
520 
521   EXPECT_TRUE(animator->is_animating());
522   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
523 
524   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
525 
526   EXPECT_TRUE(animator->is_animating());
527   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
528 
529   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
530 
531   EXPECT_TRUE(animator->is_animating());
532   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
533 
534   animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
535 
536   EXPECT_FALSE(animator->is_animating());
537   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
538 }
539 
540 // Schedule [{g}, {g,b}, {b}] and ensure that {b} doesn't run right away. That
541 // is, ensure that all animations targetting a particular property are run in
542 // order.
TEST(LayerAnimatorTest,ScheduleBlockedAnimation)543 TEST(LayerAnimatorTest, ScheduleBlockedAnimation) {
544   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
545   animator->set_disable_timer_for_test(true);
546   TestLayerAnimationDelegate delegate;
547   animator->SetDelegate(&delegate);
548 
549   double start_grayscale(0.0);
550   double middle_grayscale(0.5);
551   double target_grayscale(1.0);
552 
553   gfx::Rect start_bounds, target_bounds, middle_bounds;
554   start_bounds = target_bounds = middle_bounds = gfx::Rect(0, 0, 50, 50);
555   start_bounds.set_x(-90);
556   target_bounds.set_x(90);
557 
558   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
559 
560   delegate.SetGrayscaleFromAnimation(start_grayscale);
561   delegate.SetBoundsFromAnimation(start_bounds);
562 
563   animator->ScheduleAnimation(
564       new LayerAnimationSequence(
565           LayerAnimationElement::CreateGrayscaleElement(target_grayscale,
566                                                         delta)));
567 
568   scoped_ptr<LayerAnimationSequence> bounds_and_grayscale(
569       new LayerAnimationSequence(
570           LayerAnimationElement::CreateGrayscaleElement(start_grayscale,
571                                                         delta)));
572 
573   bounds_and_grayscale->AddElement(
574       LayerAnimationElement::CreateBoundsElement(target_bounds, delta));
575 
576   animator->ScheduleAnimation(bounds_and_grayscale.release());
577 
578   animator->ScheduleAnimation(
579       new LayerAnimationSequence(
580           LayerAnimationElement::CreateBoundsElement(start_bounds, delta)));
581 
582   EXPECT_TRUE(animator->is_animating());
583   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
584   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
585 
586   base::TimeTicks start_time = animator->last_step_time();
587 
588   animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
589 
590   EXPECT_TRUE(animator->is_animating());
591   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), middle_grayscale);
592   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
593 
594   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
595 
596   EXPECT_TRUE(animator->is_animating());
597   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), target_grayscale);
598   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
599 
600   animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
601 
602   EXPECT_TRUE(animator->is_animating());
603   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
604   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
605 
606   animator->Step(start_time + base::TimeDelta::FromMilliseconds(3000));
607 
608   EXPECT_TRUE(animator->is_animating());
609   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
610   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
611 
612   animator->Step(start_time + base::TimeDelta::FromMilliseconds(4000));
613 
614   EXPECT_FALSE(animator->is_animating());
615   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
616   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
617 }
618 
619 // Schedule {g} and then schedule {g} and {b} together. In this case, since
620 // ScheduleTogether is being used, the bounds animation should not start until
621 // the second grayscale animation starts.
TEST(LayerAnimatorTest,ScheduleTogether)622 TEST(LayerAnimatorTest, ScheduleTogether) {
623   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
624   animator->set_disable_timer_for_test(true);
625   TestLayerAnimationDelegate delegate;
626   animator->SetDelegate(&delegate);
627 
628   double start_grayscale(0.0);
629   double target_grayscale(1.0);
630 
631   gfx::Rect start_bounds, target_bounds, middle_bounds;
632   start_bounds = target_bounds = gfx::Rect(0, 0, 50, 50);
633   start_bounds.set_x(-90);
634   target_bounds.set_x(90);
635 
636   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
637 
638   delegate.SetGrayscaleFromAnimation(start_grayscale);
639   delegate.SetBoundsFromAnimation(start_bounds);
640 
641   animator->ScheduleAnimation(
642       new LayerAnimationSequence(
643           LayerAnimationElement::CreateGrayscaleElement(target_grayscale,
644                                                         delta)));
645 
646   std::vector<LayerAnimationSequence*> sequences;
647   sequences.push_back(new LayerAnimationSequence(
648       LayerAnimationElement::CreateGrayscaleElement(start_grayscale, delta)));
649   sequences.push_back(new LayerAnimationSequence(
650       LayerAnimationElement::CreateBoundsElement(target_bounds, delta)));
651 
652   animator->ScheduleTogether(sequences);
653 
654   EXPECT_TRUE(animator->is_animating());
655   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
656   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
657 
658   base::TimeTicks start_time = animator->last_step_time();
659 
660   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
661 
662   EXPECT_TRUE(animator->is_animating());
663   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), target_grayscale);
664   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
665 
666   animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
667 
668   EXPECT_FALSE(animator->is_animating());
669   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
670   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
671 }
672 
673 // Start non-threaded animation (that can run immediately). This is the trivial
674 // case (see the trival case for ScheduleAnimation).
TEST(LayerAnimatorTest,StartAnimationThatCanRunImmediately)675 TEST(LayerAnimatorTest, StartAnimationThatCanRunImmediately) {
676   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
677   animator->set_disable_timer_for_test(true);
678   TestLayerAnimationDelegate delegate;
679   animator->SetDelegate(&delegate);
680 
681   double start_brightness(0.0);
682   double middle_brightness(0.5);
683   double target_brightness(1.0);
684 
685   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
686 
687   delegate.SetBrightnessFromAnimation(start_brightness);
688 
689   animator->StartAnimation(
690       new LayerAnimationSequence(
691           LayerAnimationElement::CreateBrightnessElement(target_brightness,
692                                                          delta)));
693 
694   EXPECT_TRUE(animator->is_animating());
695   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
696 
697   base::TimeTicks start_time = animator->last_step_time();
698 
699   animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
700 
701   EXPECT_TRUE(animator->is_animating());
702   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
703 
704   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
705 
706   EXPECT_FALSE(animator->is_animating());
707   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
708 }
709 
710 // Start threaded animation (that can run immediately).
TEST(LayerAnimatorTest,StartThreadedAnimationThatCanRunImmediately)711 TEST(LayerAnimatorTest, StartThreadedAnimationThatCanRunImmediately) {
712   double epsilon = 0.00001;
713   LayerAnimatorTestController test_controller(
714       LayerAnimator::CreateDefaultAnimator());
715   LayerAnimator* animator = test_controller.animator();
716   test_controller.animator()->set_disable_timer_for_test(true);
717   TestLayerAnimationDelegate delegate;
718   test_controller.animator()->SetDelegate(&delegate);
719 
720   double start_opacity(0.0);
721   double target_opacity(1.0);
722 
723   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
724 
725   delegate.SetOpacityFromAnimation(start_opacity);
726 
727   test_controller.animator()->StartAnimation(
728       new LayerAnimationSequence(
729           LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
730 
731   EXPECT_TRUE(test_controller.animator()->is_animating());
732   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
733 
734   base::TimeTicks start_time = test_controller.animator()->last_step_time();
735   base::TimeTicks effective_start = start_time + delta;
736 
737   test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
738       cc::AnimationEvent::Started,
739       0,
740       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
741           ->animation_group_id(),
742       cc::Animation::Opacity,
743       effective_start));
744 
745   animator->Step(effective_start + delta / 2);
746 
747   EXPECT_TRUE(test_controller.animator()->is_animating());
748   EXPECT_NEAR(
749       0.5,
750       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)->
751           last_progressed_fraction(),
752       epsilon);
753 
754   animator->Step(effective_start + delta);
755   EXPECT_FALSE(test_controller.animator()->is_animating());
756   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
757 }
758 
759 // Preempt by immediately setting new target.
TEST(LayerAnimatorTest,PreemptBySettingNewTarget)760 TEST(LayerAnimatorTest, PreemptBySettingNewTarget) {
761   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
762   animator->set_disable_timer_for_test(true);
763   TestLayerAnimationDelegate delegate;
764   animator->SetDelegate(&delegate);
765 
766   double start_opacity(0.0);
767   double target_opacity(1.0);
768 
769   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
770 
771   delegate.SetOpacityFromAnimation(start_opacity);
772 
773   animator->set_preemption_strategy(LayerAnimator::IMMEDIATELY_SET_NEW_TARGET);
774 
775   animator->StartAnimation(
776       new LayerAnimationSequence(
777           LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
778 
779   animator->StartAnimation(
780       new LayerAnimationSequence(
781           LayerAnimationElement::CreateOpacityElement(start_opacity, delta)));
782 
783   EXPECT_FALSE(animator->is_animating());
784   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
785 }
786 
787 // Preempt by animating to new target, with a non-threaded animation.
TEST(LayerAnimatorTest,PreemptByImmediatelyAnimatingToNewTarget)788 TEST(LayerAnimatorTest, PreemptByImmediatelyAnimatingToNewTarget) {
789   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
790   animator->set_disable_timer_for_test(true);
791   TestLayerAnimationDelegate delegate;
792   animator->SetDelegate(&delegate);
793 
794   double start_brightness(0.0);
795   double middle_brightness(0.5);
796   double target_brightness(1.0);
797 
798   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
799 
800   delegate.SetBrightnessFromAnimation(start_brightness);
801 
802   animator->set_preemption_strategy(
803       LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
804 
805   animator->StartAnimation(
806       new LayerAnimationSequence(
807           LayerAnimationElement::CreateBrightnessElement(target_brightness,
808                                                          delta)));
809 
810   base::TimeTicks start_time = animator->last_step_time();
811 
812   animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
813 
814   animator->StartAnimation(
815       new LayerAnimationSequence(
816           LayerAnimationElement::CreateBrightnessElement(start_brightness,
817                                                          delta)));
818 
819   EXPECT_TRUE(animator->is_animating());
820   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
821 
822   animator->StartAnimation(
823       new LayerAnimationSequence(
824           LayerAnimationElement::CreateBrightnessElement(start_brightness,
825                                                          delta)));
826 
827   EXPECT_TRUE(animator->is_animating());
828 
829   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
830 
831   EXPECT_TRUE(animator->is_animating());
832   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(),
833                   0.5 * (start_brightness + middle_brightness));
834 
835   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
836 
837   EXPECT_FALSE(animator->is_animating());
838   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
839 }
840 
841 // Preempt by animating to new target, with a threaded animation.
TEST(LayerAnimatorTest,PreemptThreadedByImmediatelyAnimatingToNewTarget)842 TEST(LayerAnimatorTest, PreemptThreadedByImmediatelyAnimatingToNewTarget) {
843   double epsilon = 0.00001;
844   LayerAnimatorTestController test_controller(
845       LayerAnimator::CreateDefaultAnimator());
846   LayerAnimator* animator = test_controller.animator();
847   test_controller.animator()->set_disable_timer_for_test(true);
848   TestLayerAnimationDelegate delegate;
849   test_controller.animator()->SetDelegate(&delegate);
850 
851   double start_opacity(0.0);
852   double middle_opacity(0.5);
853   double target_opacity(1.0);
854 
855   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
856 
857   delegate.SetOpacityFromAnimation(start_opacity);
858 
859   test_controller.animator()->set_preemption_strategy(
860       LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
861 
862   test_controller.animator()->StartAnimation(
863       new LayerAnimationSequence(
864           LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
865 
866   base::TimeTicks start_time = test_controller.animator()->last_step_time();
867   base::TimeTicks effective_start = start_time + delta;
868 
869   test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
870       cc::AnimationEvent::Started,
871       0,
872       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
873           ->animation_group_id(),
874       cc::Animation::Opacity,
875       effective_start));
876 
877   animator->Step(effective_start + delta / 2);
878 
879   test_controller.animator()->StartAnimation(
880       new LayerAnimationSequence(
881           LayerAnimationElement::CreateOpacityElement(start_opacity, delta)));
882 
883   EXPECT_TRUE(test_controller.animator()->is_animating());
884   EXPECT_NEAR(delegate.GetOpacityForAnimation(), middle_opacity, epsilon);
885 
886   test_controller.animator()->StartAnimation(
887       new LayerAnimationSequence(
888           LayerAnimationElement::CreateOpacityElement(start_opacity, delta)));
889 
890   EXPECT_TRUE(test_controller.animator()->is_animating());
891 
892   base::TimeTicks second_effective_start = effective_start + delta;
893 
894   test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
895       cc::AnimationEvent::Started,
896       0,
897       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
898           ->animation_group_id(),
899       cc::Animation::Opacity,
900       second_effective_start));
901 
902   animator->Step(second_effective_start + delta / 2);
903 
904   EXPECT_TRUE(test_controller.animator()->is_animating());
905   EXPECT_NEAR(
906       0.5,
907       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)->
908           last_progressed_fraction(),
909       epsilon);
910 
911   animator->Step(second_effective_start + delta);
912 
913   EXPECT_FALSE(test_controller.animator()->is_animating());
914   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
915 }
916 
917 // Preempt by enqueuing the new animation.
TEST(LayerAnimatorTest,PreemptEnqueueNewAnimation)918 TEST(LayerAnimatorTest, PreemptEnqueueNewAnimation) {
919   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
920   animator->set_disable_timer_for_test(true);
921   TestLayerAnimationDelegate delegate;
922   animator->SetDelegate(&delegate);
923 
924   double start_brightness(0.0);
925   double middle_brightness(0.5);
926   double target_brightness(1.0);
927 
928   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
929 
930   delegate.SetBrightnessFromAnimation(start_brightness);
931 
932   animator->set_preemption_strategy(LayerAnimator::ENQUEUE_NEW_ANIMATION);
933 
934   animator->StartAnimation(
935       new LayerAnimationSequence(
936           LayerAnimationElement::CreateBrightnessElement(target_brightness,
937                                                           delta)));
938 
939   base::TimeTicks start_time = animator->last_step_time();
940 
941   animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
942 
943   animator->StartAnimation(
944       new LayerAnimationSequence(
945           LayerAnimationElement::CreateBrightnessElement(start_brightness,
946                                                          delta)));
947 
948   EXPECT_TRUE(animator->is_animating());
949   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
950 
951   EXPECT_TRUE(animator->is_animating());
952 
953   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
954 
955   EXPECT_TRUE(animator->is_animating());
956   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
957 
958   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
959 
960   EXPECT_TRUE(animator->is_animating());
961   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
962 
963   animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
964 
965   EXPECT_FALSE(animator->is_animating());
966   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
967 }
968 
969 // Start an animation when there are sequences waiting in the queue. In this
970 // case, all pending and running animations should be finished, and the new
971 // animation started.
TEST(LayerAnimatorTest,PreemptyByReplacingQueuedAnimations)972 TEST(LayerAnimatorTest, PreemptyByReplacingQueuedAnimations) {
973   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
974   animator->set_disable_timer_for_test(true);
975   TestLayerAnimationDelegate delegate;
976   animator->SetDelegate(&delegate);
977 
978   double start_brightness(0.0);
979   double middle_brightness(0.5);
980   double target_brightness(1.0);
981 
982   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
983 
984   delegate.SetBrightnessFromAnimation(start_brightness);
985 
986   animator->set_preemption_strategy(LayerAnimator::REPLACE_QUEUED_ANIMATIONS);
987 
988   animator->StartAnimation(
989       new LayerAnimationSequence(
990           LayerAnimationElement::CreateBrightnessElement(target_brightness,
991                                                          delta)));
992 
993   base::TimeTicks start_time = animator->last_step_time();
994 
995   animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
996 
997   animator->StartAnimation(
998       new LayerAnimationSequence(
999           LayerAnimationElement::CreateBrightnessElement(middle_brightness,
1000                                                          delta)));
1001 
1002   // Queue should now have two animations. Starting a third should replace the
1003   // second.
1004   animator->StartAnimation(
1005       new LayerAnimationSequence(
1006           LayerAnimationElement::CreateBrightnessElement(start_brightness,
1007                                                          delta)));
1008 
1009   EXPECT_TRUE(animator->is_animating());
1010   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
1011 
1012   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
1013 
1014   EXPECT_TRUE(animator->is_animating());
1015   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
1016 
1017   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
1018 
1019   EXPECT_TRUE(animator->is_animating());
1020   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
1021 
1022   animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
1023 
1024   EXPECT_FALSE(animator->is_animating());
1025   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
1026 }
1027 
TEST(LayerAnimatorTest,StartTogetherSetsLastStepTime)1028 TEST(LayerAnimatorTest, StartTogetherSetsLastStepTime) {
1029   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1030   animator->set_disable_timer_for_test(true);
1031   TestLayerAnimationDelegate delegate;
1032   animator->SetDelegate(&delegate);
1033 
1034   double start_grayscale(0.0);
1035   double target_grayscale(1.0);
1036   double start_brightness(0.1);
1037   double target_brightness(0.9);
1038 
1039   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1040 
1041   delegate.SetGrayscaleFromAnimation(start_grayscale);
1042   delegate.SetBrightnessFromAnimation(start_brightness);
1043 
1044   animator->set_preemption_strategy(
1045       LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
1046 
1047   animator->set_last_step_time(base::TimeTicks());
1048 
1049   animator->StartTogether(
1050       CreateMultiSequence(
1051           LayerAnimationElement::CreateGrayscaleElement(target_grayscale,
1052                                                         delta),
1053           LayerAnimationElement::CreateBrightnessElement(target_brightness,
1054                                                          delta)
1055       ));
1056 
1057   // If last step time was not set correctly, the resulting delta should be
1058   // miniscule (fractions of a millisecond). If set correctly, then the delta
1059   // should be enormous. Arbitrarily choosing 1 minute as the threshold,
1060   // though a much smaller value would probably have sufficed.
1061   delta = gfx::FrameTime::Now() - animator->last_step_time();
1062   EXPECT_GT(60.0, delta.InSecondsF());
1063 }
1064 
1065 //-------------------------------------------------------
1066 // Preempt by immediately setting new target.
TEST(LayerAnimatorTest,MultiPreemptBySettingNewTarget)1067 TEST(LayerAnimatorTest, MultiPreemptBySettingNewTarget) {
1068   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1069   animator->set_disable_timer_for_test(true);
1070   TestLayerAnimationDelegate delegate;
1071   animator->SetDelegate(&delegate);
1072 
1073   double start_opacity(0.0);
1074   double target_opacity(1.0);
1075   double start_brightness(0.1);
1076   double target_brightness(0.9);
1077 
1078   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1079 
1080   delegate.SetOpacityFromAnimation(start_opacity);
1081   delegate.SetBrightnessFromAnimation(start_brightness);
1082 
1083   animator->set_preemption_strategy(LayerAnimator::IMMEDIATELY_SET_NEW_TARGET);
1084 
1085   animator->StartTogether(
1086       CreateMultiSequence(
1087           LayerAnimationElement::CreateOpacityElement(target_opacity, delta),
1088           LayerAnimationElement::CreateBrightnessElement(target_brightness,
1089                                                          delta)
1090       ));
1091 
1092   animator->StartTogether(
1093       CreateMultiSequence(
1094           LayerAnimationElement::CreateOpacityElement(start_opacity, delta),
1095           LayerAnimationElement::CreateBrightnessElement(start_brightness,
1096                                                          delta)
1097       ));
1098 
1099   EXPECT_FALSE(animator->is_animating());
1100   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
1101   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
1102 }
1103 
1104 // Preempt by animating to new target.
TEST(LayerAnimatorTest,MultiPreemptByImmediatelyAnimatingToNewTarget)1105 TEST(LayerAnimatorTest, MultiPreemptByImmediatelyAnimatingToNewTarget) {
1106   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1107   animator->set_disable_timer_for_test(true);
1108   TestLayerAnimationDelegate delegate;
1109   animator->SetDelegate(&delegate);
1110 
1111   double start_grayscale(0.0);
1112   double middle_grayscale(0.5);
1113   double target_grayscale(1.0);
1114 
1115   double start_brightness(0.1);
1116   double middle_brightness(0.2);
1117   double target_brightness(0.3);
1118 
1119   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1120 
1121   delegate.SetGrayscaleFromAnimation(start_grayscale);
1122   delegate.SetBrightnessFromAnimation(start_brightness);
1123 
1124   animator->set_preemption_strategy(
1125       LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
1126 
1127   animator->StartTogether(
1128       CreateMultiSequence(
1129           LayerAnimationElement::CreateGrayscaleElement(target_grayscale,
1130                                                         delta),
1131           LayerAnimationElement::CreateBrightnessElement(target_brightness,
1132                                                          delta)
1133       ));
1134 
1135   base::TimeTicks start_time = animator->last_step_time();
1136 
1137   animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
1138 
1139   animator->StartTogether(
1140       CreateMultiSequence(
1141           LayerAnimationElement::CreateGrayscaleElement(start_grayscale, delta),
1142           LayerAnimationElement::CreateBrightnessElement(start_brightness,
1143                                                          delta)));
1144 
1145   EXPECT_TRUE(animator->is_animating());
1146   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), middle_grayscale);
1147   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
1148 
1149   animator->StartTogether(
1150       CreateMultiSequence(
1151           LayerAnimationElement::CreateGrayscaleElement(start_grayscale, delta),
1152           LayerAnimationElement::CreateBrightnessElement(start_brightness,
1153                                                          delta)));
1154 
1155   EXPECT_TRUE(animator->is_animating());
1156 
1157   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
1158 
1159   EXPECT_TRUE(animator->is_animating());
1160   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(),
1161                   0.5 * (start_grayscale + middle_grayscale));
1162   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(),
1163                   0.5 * (start_brightness + middle_brightness));
1164 
1165   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
1166 
1167   EXPECT_FALSE(animator->is_animating());
1168   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
1169   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
1170 }
1171 
1172 // Preempt a threaded animation by animating to new target.
TEST(LayerAnimatorTest,MultiPreemptThreadedByImmediatelyAnimatingToNewTarget)1173 TEST(LayerAnimatorTest, MultiPreemptThreadedByImmediatelyAnimatingToNewTarget) {
1174   double epsilon = 0.00001;
1175   LayerAnimatorTestController test_controller(
1176       LayerAnimator::CreateDefaultAnimator());
1177   LayerAnimator* animator = test_controller.animator();
1178   test_controller.animator()->set_disable_timer_for_test(true);
1179   TestLayerAnimationDelegate delegate;
1180   test_controller.animator()->SetDelegate(&delegate);
1181 
1182   double start_opacity(0.0);
1183   double middle_opacity(0.5);
1184   double target_opacity(1.0);
1185 
1186   double start_brightness(0.1);
1187   double middle_brightness(0.2);
1188   double target_brightness(0.3);
1189 
1190   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1191 
1192   delegate.SetOpacityFromAnimation(start_opacity);
1193   delegate.SetBrightnessFromAnimation(start_brightness);
1194 
1195   test_controller.animator()->set_preemption_strategy(
1196       LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
1197 
1198   test_controller.animator()->StartTogether(
1199       CreateMultiSequence(
1200           LayerAnimationElement::CreateOpacityElement(target_opacity, delta),
1201           LayerAnimationElement::CreateBrightnessElement(target_brightness,
1202                                                          delta)
1203       ));
1204 
1205   base::TimeTicks start_time = test_controller.animator()->last_step_time();
1206   base::TimeTicks effective_start = start_time + delta;
1207 
1208   test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
1209       cc::AnimationEvent::Started,
1210       0,
1211       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
1212           ->animation_group_id(),
1213       cc::Animation::Opacity,
1214       effective_start));
1215 
1216   animator->Step(effective_start + delta / 2);
1217 
1218   test_controller.animator()->StartTogether(
1219       CreateMultiSequence(
1220           LayerAnimationElement::CreateOpacityElement(start_opacity, delta),
1221           LayerAnimationElement::CreateBrightnessElement(start_brightness,
1222                                                          delta)));
1223 
1224   EXPECT_TRUE(test_controller.animator()->is_animating());
1225   EXPECT_NEAR(delegate.GetOpacityForAnimation(), middle_opacity, epsilon);
1226   EXPECT_NEAR(delegate.GetBrightnessForAnimation(), middle_brightness, epsilon);
1227 
1228   test_controller.animator()->StartTogether(
1229       CreateMultiSequence(
1230           LayerAnimationElement::CreateOpacityElement(start_opacity, delta),
1231           LayerAnimationElement::CreateBrightnessElement(start_brightness,
1232                                                          delta)));
1233 
1234   EXPECT_TRUE(test_controller.animator()->is_animating());
1235 
1236   base::TimeTicks second_effective_start = effective_start + delta;
1237 
1238   test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
1239       cc::AnimationEvent::Started,
1240       0,
1241       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
1242           ->animation_group_id(),
1243       cc::Animation::Opacity,
1244       second_effective_start));
1245 
1246   animator->Step(second_effective_start + delta / 2);
1247 
1248   EXPECT_TRUE(test_controller.animator()->is_animating());
1249   EXPECT_NEAR(
1250       0.5,
1251       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)->
1252           last_progressed_fraction(),
1253       epsilon);
1254   EXPECT_NEAR(delegate.GetBrightnessForAnimation(),
1255               0.5 * (start_brightness + middle_brightness),
1256               epsilon);
1257 
1258   animator->Step(second_effective_start + delta);
1259 
1260   EXPECT_FALSE(test_controller.animator()->is_animating());
1261   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
1262   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
1263 }
1264 
1265 // Preempt by enqueuing the new animation.
TEST(LayerAnimatorTest,MultiPreemptEnqueueNewAnimation)1266 TEST(LayerAnimatorTest, MultiPreemptEnqueueNewAnimation) {
1267   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1268   animator->set_disable_timer_for_test(true);
1269   TestLayerAnimationDelegate delegate;
1270   animator->SetDelegate(&delegate);
1271 
1272   double start_grayscale(0.0);
1273   double middle_grayscale(0.5);
1274   double target_grayscale(1.0);
1275 
1276   double start_brightness(0.1);
1277   double middle_brightness(0.2);
1278   double target_brightness(0.3);
1279 
1280   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1281 
1282   delegate.SetGrayscaleFromAnimation(start_grayscale);
1283   delegate.SetBrightnessFromAnimation(start_brightness);
1284 
1285   animator->set_preemption_strategy(LayerAnimator::ENQUEUE_NEW_ANIMATION);
1286 
1287   animator->StartTogether(
1288       CreateMultiSequence(
1289           LayerAnimationElement::CreateGrayscaleElement(target_grayscale,
1290                                                         delta),
1291           LayerAnimationElement::CreateBrightnessElement(target_brightness,
1292                                                          delta)));
1293 
1294   base::TimeTicks start_time = animator->last_step_time();
1295 
1296   animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
1297 
1298   animator->StartTogether(
1299       CreateMultiSequence(
1300           LayerAnimationElement::CreateGrayscaleElement(start_grayscale, delta),
1301           LayerAnimationElement::CreateBrightnessElement(start_brightness,
1302                                                          delta)));
1303 
1304   EXPECT_TRUE(animator->is_animating());
1305   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), middle_grayscale);
1306   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
1307 
1308   EXPECT_TRUE(animator->is_animating());
1309 
1310   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
1311 
1312   EXPECT_TRUE(animator->is_animating());
1313   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), target_grayscale);
1314   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
1315 
1316   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
1317 
1318   EXPECT_TRUE(animator->is_animating());
1319   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), middle_grayscale);
1320   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
1321 
1322   animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
1323 
1324   EXPECT_FALSE(animator->is_animating());
1325   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
1326   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
1327 }
1328 
1329 // Start an animation when there are sequences waiting in the queue. In this
1330 // case, all pending and running animations should be finished, and the new
1331 // animation started.
TEST(LayerAnimatorTest,MultiPreemptByReplacingQueuedAnimations)1332 TEST(LayerAnimatorTest, MultiPreemptByReplacingQueuedAnimations) {
1333   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1334   animator->set_disable_timer_for_test(true);
1335   TestLayerAnimationDelegate delegate;
1336   animator->SetDelegate(&delegate);
1337 
1338   double start_grayscale(0.0);
1339   double middle_grayscale(0.5);
1340   double target_grayscale(1.0);
1341 
1342   double start_brightness(0.1);
1343   double middle_brightness(0.2);
1344   double target_brightness(0.3);
1345 
1346   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1347 
1348   delegate.SetGrayscaleFromAnimation(start_grayscale);
1349   delegate.SetBrightnessFromAnimation(start_brightness);
1350 
1351   animator->set_preemption_strategy(LayerAnimator::REPLACE_QUEUED_ANIMATIONS);
1352 
1353   animator->StartTogether(
1354       CreateMultiSequence(
1355           LayerAnimationElement::CreateGrayscaleElement(target_grayscale,
1356                                                         delta),
1357           LayerAnimationElement::CreateBrightnessElement(target_brightness,
1358                                                          delta)));
1359 
1360   base::TimeTicks start_time = animator->last_step_time();
1361 
1362   animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
1363 
1364   animator->StartTogether(
1365       CreateMultiSequence(
1366           LayerAnimationElement::CreateGrayscaleElement(middle_grayscale,
1367                                                         delta),
1368           LayerAnimationElement::CreateBrightnessElement(middle_brightness,
1369                                                          delta)));
1370 
1371   // Queue should now have two animations. Starting a third should replace the
1372   // second.
1373   animator->StartTogether(
1374       CreateMultiSequence(
1375           LayerAnimationElement::CreateGrayscaleElement(start_grayscale, delta),
1376           LayerAnimationElement::CreateBrightnessElement(start_brightness,
1377                                                          delta)));
1378 
1379   EXPECT_TRUE(animator->is_animating());
1380   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), middle_grayscale);
1381   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
1382 
1383   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
1384 
1385   EXPECT_TRUE(animator->is_animating());
1386   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), target_grayscale);
1387   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
1388 
1389   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
1390 
1391   EXPECT_TRUE(animator->is_animating());
1392   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), middle_grayscale);
1393   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
1394 
1395   animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
1396 
1397   EXPECT_FALSE(animator->is_animating());
1398   EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
1399   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
1400 }
1401 //-------------------------------------------------------
1402 // Test that non-threaded cyclic sequences continue to animate.
TEST(LayerAnimatorTest,CyclicSequences)1403 TEST(LayerAnimatorTest, CyclicSequences) {
1404   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1405   animator->set_disable_timer_for_test(true);
1406   TestLayerAnimationDelegate delegate;
1407   animator->SetDelegate(&delegate);
1408 
1409   double start_brightness(0.0);
1410   double target_brightness(1.0);
1411 
1412   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1413 
1414   delegate.SetBrightnessFromAnimation(start_brightness);
1415 
1416   scoped_ptr<LayerAnimationSequence> sequence(
1417       new LayerAnimationSequence(
1418           LayerAnimationElement::CreateBrightnessElement(target_brightness,
1419                                                          delta)));
1420 
1421   sequence->AddElement(
1422       LayerAnimationElement::CreateBrightnessElement(start_brightness, delta));
1423 
1424   sequence->set_is_cyclic(true);
1425 
1426   animator->StartAnimation(sequence.release());
1427 
1428   base::TimeTicks start_time = animator->last_step_time();
1429 
1430   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
1431 
1432   EXPECT_TRUE(animator->is_animating());
1433   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
1434 
1435   animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
1436 
1437   EXPECT_TRUE(animator->is_animating());
1438   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
1439 
1440   animator->Step(start_time + base::TimeDelta::FromMilliseconds(3000));
1441 
1442   EXPECT_TRUE(animator->is_animating());
1443   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
1444 
1445   // Skip ahead by a lot.
1446   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000000000));
1447 
1448   EXPECT_TRUE(animator->is_animating());
1449   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
1450 
1451   // Skip ahead by a lot.
1452   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000001000));
1453 
1454   EXPECT_TRUE(animator->is_animating());
1455   EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
1456 
1457   animator->StopAnimatingProperty(LayerAnimationElement::BRIGHTNESS);
1458 
1459   EXPECT_FALSE(animator->is_animating());
1460 }
1461 
1462 // Test that threaded cyclic sequences continue to animate.
TEST(LayerAnimatorTest,ThreadedCyclicSequences)1463 TEST(LayerAnimatorTest, ThreadedCyclicSequences) {
1464   LayerAnimatorTestController test_controller(
1465       LayerAnimator::CreateDefaultAnimator());
1466   LayerAnimator* animator = test_controller.animator();
1467   test_controller.animator()->set_disable_timer_for_test(true);
1468   TestLayerAnimationDelegate delegate;
1469   test_controller.animator()->SetDelegate(&delegate);
1470 
1471   double start_opacity(0.0);
1472   double target_opacity(1.0);
1473 
1474   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1475 
1476   delegate.SetOpacityFromAnimation(start_opacity);
1477 
1478   scoped_ptr<LayerAnimationSequence> sequence(
1479       new LayerAnimationSequence(
1480           LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
1481 
1482   sequence->AddElement(
1483       LayerAnimationElement::CreateOpacityElement(start_opacity, delta));
1484 
1485   sequence->set_is_cyclic(true);
1486 
1487   test_controller.animator()->StartAnimation(sequence.release());
1488 
1489   base::TimeTicks start_time = test_controller.animator()->last_step_time();
1490   base::TimeTicks effective_start = start_time + delta;
1491 
1492   test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
1493       cc::AnimationEvent::Started,
1494       0,
1495       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
1496           ->animation_group_id(),
1497       cc::Animation::Opacity,
1498       effective_start));
1499 
1500   animator->Step(effective_start + delta);
1501   EXPECT_TRUE(test_controller.animator()->is_animating());
1502   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
1503 
1504   base::TimeTicks second_effective_start = effective_start + 2 * delta;
1505   test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
1506       cc::AnimationEvent::Started,
1507       0,
1508       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
1509           ->animation_group_id(),
1510       cc::Animation::Opacity,
1511       second_effective_start));
1512 
1513   animator->Step(second_effective_start + delta);
1514 
1515   EXPECT_TRUE(test_controller.animator()->is_animating());
1516   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
1517 
1518   base::TimeTicks third_effective_start = second_effective_start + 2 * delta;
1519   test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
1520       cc::AnimationEvent::Started,
1521       0,
1522       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
1523           ->animation_group_id(),
1524       cc::Animation::Opacity,
1525       third_effective_start));
1526 
1527   animator->Step(third_effective_start + delta);
1528   EXPECT_TRUE(test_controller.animator()->is_animating());
1529   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
1530 
1531   base::TimeTicks fourth_effective_start = third_effective_start + 2 * delta;
1532   test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
1533       cc::AnimationEvent::Started,
1534       0,
1535       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
1536           ->animation_group_id(),
1537       cc::Animation::Opacity,
1538       fourth_effective_start));
1539 
1540   // Skip ahead by a lot.
1541   animator->Step(fourth_effective_start + 1000 * delta);
1542 
1543   EXPECT_TRUE(test_controller.animator()->is_animating());
1544   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
1545 
1546   base::TimeTicks fifth_effective_start = fourth_effective_start + 1001 * delta;
1547   test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
1548       cc::AnimationEvent::Started,
1549       0,
1550       test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
1551           ->animation_group_id(),
1552       cc::Animation::Opacity,
1553       fifth_effective_start));
1554 
1555   // Skip ahead by a lot.
1556   animator->Step(fifth_effective_start + 999 * delta);
1557 
1558   EXPECT_TRUE(test_controller.animator()->is_animating());
1559   EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
1560 
1561   test_controller.animator()->StopAnimatingProperty(
1562       LayerAnimationElement::OPACITY);
1563 
1564   EXPECT_FALSE(test_controller.animator()->is_animating());
1565 }
1566 
TEST(LayerAnimatorTest,AddObserverExplicit)1567 TEST(LayerAnimatorTest, AddObserverExplicit) {
1568   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1569   animator->set_disable_timer_for_test(true);
1570   TestLayerAnimationObserver observer;
1571   TestLayerAnimationDelegate delegate;
1572   animator->SetDelegate(&delegate);
1573   animator->AddObserver(&observer);
1574   observer.set_requires_notification_when_animator_destroyed(true);
1575 
1576   EXPECT_TRUE(!observer.last_ended_sequence());
1577 
1578   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1579 
1580   delegate.SetBrightnessFromAnimation(0.0f);
1581 
1582   LayerAnimationSequence* sequence = new LayerAnimationSequence(
1583       LayerAnimationElement::CreateBrightnessElement(1.0f, delta));
1584 
1585   animator->StartAnimation(sequence);
1586 
1587   EXPECT_EQ(observer.last_scheduled_sequence(), sequence);
1588 
1589   base::TimeTicks start_time = animator->last_step_time();
1590 
1591   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
1592 
1593   EXPECT_EQ(observer.last_ended_sequence(), sequence);
1594 
1595   // |sequence| has been destroyed. Recreate it to test abort.
1596   sequence = new LayerAnimationSequence(
1597       LayerAnimationElement::CreateBrightnessElement(1.0f, delta));
1598 
1599   animator->StartAnimation(sequence);
1600 
1601   animator = NULL;
1602 
1603   EXPECT_EQ(observer.last_aborted_sequence(), sequence);
1604 }
1605 
1606 // Tests that an observer added to a scoped settings object is still notified
1607 // when the object goes out of scope.
TEST(LayerAnimatorTest,ImplicitAnimationObservers)1608 TEST(LayerAnimatorTest, ImplicitAnimationObservers) {
1609   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1610   animator->set_disable_timer_for_test(true);
1611   TestImplicitAnimationObserver observer(false);
1612   TestLayerAnimationDelegate delegate;
1613   animator->SetDelegate(&delegate);
1614 
1615   EXPECT_FALSE(observer.animations_completed());
1616   animator->SetBrightness(1.0f);
1617 
1618   {
1619     ScopedLayerAnimationSettings settings(animator.get());
1620     settings.AddObserver(&observer);
1621     animator->SetBrightness(0.0f);
1622   }
1623 
1624   EXPECT_FALSE(observer.animations_completed());
1625   base::TimeTicks start_time = animator->last_step_time();
1626   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
1627   EXPECT_TRUE(observer.animations_completed());
1628   EXPECT_TRUE(observer.WasAnimationCompletedForProperty(
1629       LayerAnimationElement::BRIGHTNESS));
1630   EXPECT_FLOAT_EQ(0.0f, delegate.GetBrightnessForAnimation());
1631 }
1632 
1633 // Tests that an observer added to a scoped settings object is still notified
1634 // when the object goes out of scope due to the animation being interrupted.
TEST(LayerAnimatorTest,InterruptedImplicitAnimationObservers)1635 TEST(LayerAnimatorTest, InterruptedImplicitAnimationObservers) {
1636   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1637   animator->set_disable_timer_for_test(true);
1638   TestImplicitAnimationObserver observer(false);
1639   TestLayerAnimationDelegate delegate;
1640   animator->SetDelegate(&delegate);
1641 
1642   EXPECT_FALSE(observer.animations_completed());
1643   animator->SetBrightness(1.0f);
1644 
1645   {
1646     ScopedLayerAnimationSettings settings(animator.get());
1647     settings.AddObserver(&observer);
1648     animator->SetBrightness(0.0f);
1649   }
1650 
1651   EXPECT_FALSE(observer.animations_completed());
1652   // This should interrupt the implicit animation causing the observer to be
1653   // notified immediately.
1654   animator->SetBrightness(1.0f);
1655   EXPECT_TRUE(observer.animations_completed());
1656   EXPECT_TRUE(observer.WasAnimationCompletedForProperty(
1657       LayerAnimationElement::BRIGHTNESS));
1658   EXPECT_FLOAT_EQ(1.0f, delegate.GetBrightnessForAnimation());
1659 }
1660 
1661 // Tests that LayerAnimator is not deleted after the animation completes as long
1662 // as there is a live ScopedLayerAnimationSettings object wrapped around it.
TEST(LayerAnimatorTest,AnimatorKeptAliveBySettings)1663 TEST(LayerAnimatorTest, AnimatorKeptAliveBySettings) {
1664   // Note we are using a raw pointer unlike in other tests.
1665   TestLayerAnimator* animator = new TestLayerAnimator();
1666   LayerAnimatorDestructionObserver destruction_observer;
1667   animator->SetDestructionObserver(&destruction_observer);
1668   animator->set_disable_timer_for_test(true);
1669   TestLayerAnimationDelegate delegate;
1670   animator->SetDelegate(&delegate);
1671   {
1672     // ScopedLayerAnimationSettings should keep the Animator alive as long as
1673     // it is alive, even beyond the end of the animation.
1674     ScopedLayerAnimationSettings settings(animator);
1675     base::TimeTicks now = gfx::FrameTime::Now();
1676     animator->SetBrightness(0.5);
1677     animator->Step(now + base::TimeDelta::FromSeconds(1));
1678     EXPECT_FALSE(destruction_observer.IsAnimatorDeleted());
1679   }
1680   // ScopedLayerAnimationSettings was destroyed, so Animator should be deleted.
1681   EXPECT_TRUE(destruction_observer.IsAnimatorDeleted());
1682 }
1683 
1684 // Tests that an observer added to a scoped settings object is not notified
1685 // when the animator is destroyed unless explicitly requested.
TEST(LayerAnimatorTest,ImplicitObserversAtAnimatorDestruction)1686 TEST(LayerAnimatorTest, ImplicitObserversAtAnimatorDestruction) {
1687   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1688   animator->set_disable_timer_for_test(true);
1689   TestImplicitAnimationObserver observer_notify(true);
1690   TestImplicitAnimationObserver observer_do_not_notify(false);
1691   TestLayerAnimationDelegate delegate;
1692   animator->SetDelegate(&delegate);
1693 
1694   EXPECT_FALSE(observer_notify.animations_completed());
1695   EXPECT_FALSE(observer_do_not_notify.animations_completed());
1696 
1697   animator->SetBrightness(1.0f);
1698 
1699   {
1700     ScopedLayerAnimationSettings settings(animator.get());
1701     settings.AddObserver(&observer_notify);
1702     settings.AddObserver(&observer_do_not_notify);
1703     animator->SetBrightness(0.0f);
1704   }
1705 
1706   EXPECT_FALSE(observer_notify.animations_completed());
1707   EXPECT_FALSE(observer_do_not_notify.animations_completed());
1708   animator = NULL;
1709   EXPECT_TRUE(observer_notify.animations_completed());
1710   EXPECT_TRUE(observer_notify.WasAnimationAbortedForProperty(
1711       LayerAnimationElement::BRIGHTNESS));
1712   EXPECT_FALSE(observer_do_not_notify.animations_completed());
1713 }
1714 
TEST(LayerAnimatorTest,AbortedAnimationStatusInImplicitObservers)1715 TEST(LayerAnimatorTest, AbortedAnimationStatusInImplicitObservers) {
1716   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1717   animator->set_disable_timer_for_test(true);
1718   TestImplicitAnimationObserver observer(false);
1719   TestLayerAnimationDelegate delegate;
1720   animator->SetDelegate(&delegate);
1721 
1722   EXPECT_FALSE(observer.animations_completed());
1723   animator->SetBrightness(1.0f);
1724 
1725   {
1726     ScopedLayerAnimationSettings settings(animator.get());
1727     settings.AddObserver(&observer);
1728     animator->SetBrightness(0.0f);
1729   }
1730   EXPECT_FALSE(observer.animations_completed());
1731 
1732   animator->AbortAllAnimations();
1733   EXPECT_TRUE(observer.animations_completed());
1734   EXPECT_TRUE(observer.WasAnimationAbortedForProperty(
1735       LayerAnimationElement::BRIGHTNESS));
1736   EXPECT_FALSE(observer.WasAnimationAbortedForProperty(
1737       LayerAnimationElement::OPACITY));
1738 
1739   observer.set_animations_completed(false);
1740   {
1741     ScopedLayerAnimationSettings settings(animator.get());
1742     settings.AddObserver(&observer);
1743     animator->SetOpacity(0.0f);
1744   }
1745   EXPECT_FALSE(observer.animations_completed());
1746 
1747   animator->AbortAllAnimations();
1748   EXPECT_TRUE(observer.animations_completed());
1749   EXPECT_TRUE(observer.WasAnimationAbortedForProperty(
1750       LayerAnimationElement::BRIGHTNESS));
1751   EXPECT_TRUE(observer.WasAnimationAbortedForProperty(
1752       LayerAnimationElement::OPACITY));
1753 }
1754 
TEST(LayerAnimatorTest,RemoveObserverShouldRemoveFromSequences)1755 TEST(LayerAnimatorTest, RemoveObserverShouldRemoveFromSequences) {
1756   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1757   animator->set_disable_timer_for_test(true);
1758   TestLayerAnimationObserver observer;
1759   TestLayerAnimationObserver removed_observer;
1760   TestLayerAnimationDelegate delegate;
1761   animator->SetDelegate(&delegate);
1762 
1763   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1764 
1765   LayerAnimationSequence* sequence = new LayerAnimationSequence(
1766       LayerAnimationElement::CreateBrightnessElement(1.0f, delta));
1767 
1768   sequence->AddObserver(&observer);
1769   sequence->AddObserver(&removed_observer);
1770 
1771   animator->StartAnimation(sequence);
1772 
1773   EXPECT_EQ(observer.last_scheduled_sequence(), sequence);
1774   EXPECT_TRUE(!observer.last_ended_sequence());
1775   EXPECT_EQ(removed_observer.last_scheduled_sequence(), sequence);
1776   EXPECT_TRUE(!removed_observer.last_ended_sequence());
1777 
1778   // This should stop the observer from observing sequence.
1779   animator->RemoveObserver(&removed_observer);
1780 
1781   base::TimeTicks start_time = animator->last_step_time();
1782 
1783   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
1784 
1785   EXPECT_EQ(observer.last_ended_sequence(), sequence);
1786   EXPECT_TRUE(!removed_observer.last_ended_sequence());
1787 }
1788 
TEST(LayerAnimatorTest,ObserverReleasedBeforeAnimationSequenceEnds)1789 TEST(LayerAnimatorTest, ObserverReleasedBeforeAnimationSequenceEnds) {
1790   TestLayerAnimationDelegate delegate;
1791   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1792   animator->set_disable_timer_for_test(true);
1793 
1794   scoped_ptr<TestLayerAnimationObserver> observer(
1795       new TestLayerAnimationObserver);
1796   animator->SetDelegate(&delegate);
1797   animator->AddObserver(observer.get());
1798 
1799   delegate.SetOpacityFromAnimation(0.0f);
1800 
1801   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1802   LayerAnimationSequence* sequence = new LayerAnimationSequence(
1803       LayerAnimationElement::CreateOpacityElement(1.0f, delta));
1804 
1805   animator->StartAnimation(sequence);
1806 
1807   // |observer| should be attached to |sequence|.
1808   EXPECT_TRUE(sequence->observers_.might_have_observers());
1809 
1810   // Now, release |observer|
1811   observer.reset();
1812 
1813   // And |sequence| should no longer be attached to |observer|.
1814   EXPECT_FALSE(sequence->observers_.might_have_observers());
1815 }
1816 
TEST(LayerAnimatorTest,ObserverAttachedAfterAnimationStarted)1817 TEST(LayerAnimatorTest, ObserverAttachedAfterAnimationStarted) {
1818   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1819   animator->set_disable_timer_for_test(true);
1820 
1821   TestImplicitAnimationObserver observer(false);
1822   TestLayerAnimationDelegate delegate;
1823   animator->SetDelegate(&delegate);
1824 
1825   delegate.SetBrightnessFromAnimation(0.0f);
1826 
1827   {
1828     ScopedLayerAnimationSettings setter(animator.get());
1829 
1830     base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1831     LayerAnimationSequence* sequence = new LayerAnimationSequence(
1832         LayerAnimationElement::CreateBrightnessElement(1.0f, delta));
1833 
1834     animator->StartAnimation(sequence);
1835     base::TimeTicks start_time = animator->last_step_time();
1836     animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
1837 
1838     setter.AddObserver(&observer);
1839 
1840     // Start observing an in-flight animation.
1841     sequence->AddObserver(&observer);
1842 
1843     animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
1844   }
1845 
1846   EXPECT_TRUE(observer.animations_completed());
1847   EXPECT_TRUE(observer.WasAnimationCompletedForProperty(
1848                   LayerAnimationElement::BRIGHTNESS));
1849 }
1850 
TEST(LayerAnimatorTest,ObserverDetachedBeforeAnimationFinished)1851 TEST(LayerAnimatorTest, ObserverDetachedBeforeAnimationFinished) {
1852   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1853   animator->set_disable_timer_for_test(true);
1854 
1855   TestImplicitAnimationObserver observer(false);
1856   TestLayerAnimationDelegate delegate;
1857   animator->SetDelegate(&delegate);
1858 
1859   delegate.SetBrightnessFromAnimation(0.0f);
1860   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1861   LayerAnimationSequence* sequence = new LayerAnimationSequence(
1862       LayerAnimationElement::CreateBrightnessElement(1.0f, delta));
1863 
1864   {
1865     ScopedLayerAnimationSettings setter(animator.get());
1866     setter.AddObserver(&observer);
1867 
1868     animator->StartAnimation(sequence);
1869     base::TimeTicks start_time = animator->last_step_time();
1870     animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
1871   }
1872 
1873   EXPECT_FALSE(observer.animations_completed());
1874 
1875   // Stop observing an in-flight animation.
1876   sequence->RemoveObserver(&observer);
1877 
1878   EXPECT_TRUE(observer.animations_completed());
1879 
1880   // The animation didn't complete, and neither was it aborted.
1881   EXPECT_FALSE(observer.WasAnimationCompletedForProperty(
1882                   LayerAnimationElement::BRIGHTNESS));
1883   EXPECT_FALSE(observer.WasAnimationAbortedForProperty(
1884                   LayerAnimationElement::BRIGHTNESS));
1885 }
1886 
1887 // This checks that if an animation is deleted due to a callback, that the
1888 // animator does not try to use the deleted animation. For example, if we have
1889 // two running animations, and the first finishes and the resulting callback
1890 // causes the second to be deleted, we should not attempt to animate the second
1891 // animation.
TEST(LayerAnimatorTest,ObserverDeletesAnimationsOnEnd)1892 TEST(LayerAnimatorTest, ObserverDeletesAnimationsOnEnd) {
1893   ScopedAnimationDurationScaleMode normal_duration_mode(
1894       ScopedAnimationDurationScaleMode::NORMAL_DURATION);
1895   scoped_refptr<LayerAnimator> animator(new TestLayerAnimator());
1896   animator->set_disable_timer_for_test(true);
1897   TestLayerAnimationDelegate delegate;
1898   animator->SetDelegate(&delegate);
1899 
1900   double start_brightness(0.0);
1901   double target_brightness(1.0);
1902 
1903   gfx::Rect start_bounds(0, 0, 50, 50);
1904   gfx::Rect target_bounds(5, 5, 5, 5);
1905 
1906   delegate.SetBrightnessFromAnimation(start_brightness);
1907   delegate.SetBoundsFromAnimation(start_bounds);
1908 
1909   base::TimeDelta brightness_delta = base::TimeDelta::FromSeconds(1);
1910   base::TimeDelta halfway_delta = base::TimeDelta::FromSeconds(2);
1911   base::TimeDelta bounds_delta = base::TimeDelta::FromSeconds(3);
1912 
1913   scoped_ptr<DeletingLayerAnimationObserver> observer(
1914       new DeletingLayerAnimationObserver(animator.get()));
1915 
1916   animator->AddObserver(observer.get());
1917 
1918   animator->StartAnimation(
1919       new LayerAnimationSequence(
1920           LayerAnimationElement::CreateBrightnessElement(
1921               target_brightness, brightness_delta)));
1922 
1923   animator->StartAnimation(new LayerAnimationSequence(
1924       LayerAnimationElement::CreateBoundsElement(
1925           target_bounds, bounds_delta)));
1926   ASSERT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
1927 
1928   base::TimeTicks start_time = animator->last_step_time();
1929   animator->Step(start_time + halfway_delta);
1930 
1931   // Completing the brightness animation should have stopped the bounds
1932   // animation.
1933   ASSERT_FALSE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
1934 
1935   animator->RemoveObserver(observer.get());
1936 }
1937 
1938 // Ensure that stopping animation in a bounds change does not crash and that
1939 // animation gets stopped correctly.
1940 // This scenario is possible when animation is restarted from inside a
1941 // callback triggered by the animation progress.
TEST(LayerAnimatorTest,CallbackDeletesAnimationInProgress)1942 TEST(LayerAnimatorTest, CallbackDeletesAnimationInProgress) {
1943 
1944   class TestLayerAnimationDeletingDelegate : public TestLayerAnimationDelegate {
1945    public:
1946     TestLayerAnimationDeletingDelegate(LayerAnimator* animator, int max_width)
1947       : animator_(animator),
1948         max_width_(max_width) {
1949     }
1950 
1951     virtual void SetBoundsFromAnimation(const gfx::Rect& bounds) OVERRIDE {
1952       TestLayerAnimationDelegate::SetBoundsFromAnimation(bounds);
1953       if (bounds.width() > max_width_)
1954         animator_->StopAnimating();
1955     }
1956    private:
1957     LayerAnimator* animator_;
1958     int max_width_;
1959     // Allow copy and assign.
1960   };
1961 
1962   ScopedAnimationDurationScaleMode normal_duration_mode(
1963       ScopedAnimationDurationScaleMode::NORMAL_DURATION);
1964   scoped_refptr<LayerAnimator> animator(new TestLayerAnimator());
1965   animator->set_disable_timer_for_test(true);
1966   TestLayerAnimationDeletingDelegate delegate(animator.get(), 30);
1967   animator->SetDelegate(&delegate);
1968 
1969   gfx::Rect start_bounds(0, 0, 0, 0);
1970   gfx::Rect target_bounds(5, 5, 50, 50);
1971 
1972   delegate.SetBoundsFromAnimation(start_bounds);
1973 
1974   base::TimeDelta bounds_delta1 = base::TimeDelta::FromMilliseconds(333);
1975   base::TimeDelta bounds_delta2 = base::TimeDelta::FromMilliseconds(666);
1976   base::TimeDelta bounds_delta = base::TimeDelta::FromMilliseconds(1000);
1977   base::TimeDelta final_delta = base::TimeDelta::FromMilliseconds(1500);
1978 
1979   animator->StartAnimation(new LayerAnimationSequence(
1980       LayerAnimationElement::CreateBoundsElement(
1981           target_bounds, bounds_delta)));
1982   ASSERT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
1983 
1984   base::TimeTicks start_time = animator->last_step_time();
1985   ASSERT_NO_FATAL_FAILURE(animator->Step(start_time + bounds_delta1));
1986   ASSERT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
1987 
1988   // The next step should change the animated bounds past the threshold and
1989   // cause the animaton to stop.
1990   ASSERT_NO_FATAL_FAILURE(animator->Step(start_time + bounds_delta2));
1991   ASSERT_FALSE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
1992   ASSERT_NO_FATAL_FAILURE(animator->Step(start_time + final_delta));
1993 
1994   // Completing the animation should have stopped the bounds
1995   // animation.
1996   ASSERT_FALSE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
1997 }
1998 
1999 // Similar to the ObserverDeletesAnimationsOnEnd test above except that it
2000 // tests the behavior when the OnLayerAnimationAborted() callback causes
2001 // all of the animator's other animations to be deleted.
TEST(LayerAnimatorTest,ObserverDeletesAnimationsOnAbort)2002 TEST(LayerAnimatorTest, ObserverDeletesAnimationsOnAbort) {
2003   ScopedAnimationDurationScaleMode normal_duration_mode(
2004       ScopedAnimationDurationScaleMode::NORMAL_DURATION);
2005   scoped_refptr<LayerAnimator> animator(new TestLayerAnimator());
2006   animator->set_disable_timer_for_test(true);
2007   TestLayerAnimationDelegate delegate;
2008   animator->SetDelegate(&delegate);
2009 
2010   double start_brightness(0.0);
2011   double target_brightness(1.0);
2012   gfx::Rect start_bounds(0, 0, 50, 50);
2013   gfx::Rect target_bounds(5, 5, 5, 5);
2014   base::TimeDelta brightness_delta = base::TimeDelta::FromSeconds(1);
2015   base::TimeDelta bounds_delta = base::TimeDelta::FromSeconds(2);
2016 
2017   delegate.SetBrightnessFromAnimation(start_brightness);
2018   delegate.SetBoundsFromAnimation(start_bounds);
2019 
2020   scoped_ptr<DeletingLayerAnimationObserver> observer(
2021       new DeletingLayerAnimationObserver(animator.get()));
2022   animator->AddObserver(observer.get());
2023 
2024   animator->StartAnimation(
2025       new LayerAnimationSequence(
2026           LayerAnimationElement::CreateBrightnessElement(
2027               target_brightness, brightness_delta)));
2028   animator->StartAnimation(new LayerAnimationSequence(
2029       LayerAnimationElement::CreateBoundsElement(
2030           target_bounds, bounds_delta)));
2031   ASSERT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
2032 
2033   animator->set_preemption_strategy(
2034       LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
2035   animator->StartAnimation(
2036       new LayerAnimationSequence(
2037           LayerAnimationElement::CreateBrightnessElement(
2038               target_brightness, brightness_delta)));
2039 
2040   // Starting the second brightness animation should have aborted the initial
2041   // brightness animation. |observer| should have stopped the bounds animation
2042   // as a result.
2043   ASSERT_FALSE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
2044 
2045   animator->RemoveObserver(observer.get());
2046 }
2047 
2048 // Check that setting a property during an animation with a default animator
2049 // cancels the original animation.
TEST(LayerAnimatorTest,SettingPropertyDuringAnAnimation)2050 TEST(LayerAnimatorTest, SettingPropertyDuringAnAnimation) {
2051   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
2052   animator->set_disable_timer_for_test(true);
2053   TestLayerAnimationDelegate delegate;
2054   animator->SetDelegate(&delegate);
2055 
2056   double start_opacity(0.0);
2057   double target_opacity(1.0);
2058 
2059   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
2060 
2061   delegate.SetOpacityFromAnimation(start_opacity);
2062 
2063   scoped_ptr<LayerAnimationSequence> sequence(
2064       new LayerAnimationSequence(
2065           LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
2066 
2067   animator->StartAnimation(sequence.release());
2068 
2069   animator->SetOpacity(0.5);
2070 
2071   EXPECT_FALSE(animator->is_animating());
2072   EXPECT_EQ(0.5, animator->GetTargetOpacity());
2073 }
2074 
2075 // Tests that the preemption mode IMMEDIATELY_SET_NEW_TARGET, doesn't cause the
2076 // second sequence to be leaked.
TEST(LayerAnimatorTest,ImmediatelySettingNewTargetDoesNotLeak)2077 TEST(LayerAnimatorTest, ImmediatelySettingNewTargetDoesNotLeak) {
2078   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
2079   animator->set_preemption_strategy(LayerAnimator::IMMEDIATELY_SET_NEW_TARGET);
2080   animator->set_disable_timer_for_test(true);
2081   TestLayerAnimationDelegate delegate;
2082   animator->SetDelegate(&delegate);
2083 
2084   gfx::Rect start_bounds(0, 0, 50, 50);
2085   gfx::Rect middle_bounds(10, 10, 100, 100);
2086   gfx::Rect target_bounds(5, 5, 5, 5);
2087 
2088   delegate.SetBoundsFromAnimation(start_bounds);
2089 
2090   {
2091     // start an implicit bounds animation.
2092     ScopedLayerAnimationSettings settings(animator.get());
2093     animator->SetBounds(middle_bounds);
2094   }
2095 
2096   EXPECT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
2097 
2098   int num_live_instances = 0;
2099   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
2100   scoped_ptr<TestLayerAnimationSequence> sequence(
2101       new TestLayerAnimationSequence(
2102           LayerAnimationElement::CreateBoundsElement(target_bounds, delta),
2103           &num_live_instances));
2104 
2105   EXPECT_EQ(1, num_live_instances);
2106 
2107   // This should interrupt the running sequence causing us to immediately set
2108   // the target value. The sequence should alse be destructed.
2109   animator->StartAnimation(sequence.release());
2110 
2111   EXPECT_FALSE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
2112   EXPECT_EQ(0, num_live_instances);
2113   CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
2114 }
2115 
2116 // Verifies GetTargetOpacity() works when multiple sequences are scheduled.
TEST(LayerAnimatorTest,GetTargetOpacity)2117 TEST(LayerAnimatorTest, GetTargetOpacity) {
2118   TestLayerAnimationDelegate delegate;
2119   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
2120   animator->set_preemption_strategy(LayerAnimator::ENQUEUE_NEW_ANIMATION);
2121   animator->set_disable_timer_for_test(true);
2122   animator->SetDelegate(&delegate);
2123 
2124   delegate.SetOpacityFromAnimation(0.0);
2125 
2126   {
2127     ScopedLayerAnimationSettings settings(animator.get());
2128     animator->SetOpacity(0.5);
2129     EXPECT_EQ(0.5, animator->GetTargetOpacity());
2130 
2131     // Because the strategy is ENQUEUE_NEW_ANIMATION the target should now be 1.
2132     animator->SetOpacity(1.0);
2133     EXPECT_EQ(1.0, animator->GetTargetOpacity());
2134   }
2135 }
2136 
2137 // Verifies GetTargetBrightness() works when multiple sequences are scheduled.
TEST(LayerAnimatorTest,GetTargetBrightness)2138 TEST(LayerAnimatorTest, GetTargetBrightness) {
2139   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
2140   animator->set_preemption_strategy(LayerAnimator::ENQUEUE_NEW_ANIMATION);
2141   animator->set_disable_timer_for_test(true);
2142   TestLayerAnimationDelegate delegate;
2143   animator->SetDelegate(&delegate);
2144 
2145   delegate.SetBrightnessFromAnimation(0.0);
2146 
2147   {
2148     ScopedLayerAnimationSettings settings(animator.get());
2149     animator->SetBrightness(0.5);
2150     EXPECT_EQ(0.5, animator->GetTargetBrightness());
2151 
2152     // Because the strategy is ENQUEUE_NEW_ANIMATION the target should now be 1.
2153     animator->SetBrightness(1.0);
2154     EXPECT_EQ(1.0, animator->GetTargetBrightness());
2155   }
2156 }
2157 
2158 // Verifies GetTargetGrayscale() works when multiple sequences are scheduled.
TEST(LayerAnimatorTest,GetTargetGrayscale)2159 TEST(LayerAnimatorTest, GetTargetGrayscale) {
2160   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
2161   animator->set_preemption_strategy(LayerAnimator::ENQUEUE_NEW_ANIMATION);
2162   animator->set_disable_timer_for_test(true);
2163   TestLayerAnimationDelegate delegate;
2164   animator->SetDelegate(&delegate);
2165 
2166   delegate.SetGrayscaleFromAnimation(0.0);
2167 
2168   {
2169     ScopedLayerAnimationSettings settings(animator.get());
2170     animator->SetGrayscale(0.5);
2171     EXPECT_EQ(0.5, animator->GetTargetGrayscale());
2172 
2173     // Because the strategy is ENQUEUE_NEW_ANIMATION the target should now be 1.
2174     animator->SetGrayscale(1.0);
2175     EXPECT_EQ(1.0, animator->GetTargetGrayscale());
2176   }
2177 }
2178 
2179 // Verifies color property is modified appropriately.
TEST(LayerAnimatorTest,Color)2180 TEST(LayerAnimatorTest, Color) {
2181   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
2182   animator->set_disable_timer_for_test(true);
2183   TestLayerAnimationDelegate delegate;
2184   animator->SetDelegate(&delegate);
2185 
2186   SkColor start_color  = SkColorSetARGB( 64, 20, 40,  60);
2187   SkColor middle_color = SkColorSetARGB(128, 35, 70, 120);
2188   SkColor target_color = SkColorSetARGB(192, 40, 80, 140);
2189 
2190   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
2191 
2192   delegate.SetColorFromAnimation(start_color);
2193 
2194   animator->ScheduleAnimation(
2195       new LayerAnimationSequence(
2196           LayerAnimationElement::CreateColorElement(target_color, delta)));
2197 
2198   EXPECT_TRUE(animator->is_animating());
2199   EXPECT_EQ(ColorToString(start_color),
2200             ColorToString(delegate.GetColorForAnimation()));
2201 
2202   base::TimeTicks start_time = animator->last_step_time();
2203 
2204   animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
2205 
2206   EXPECT_TRUE(animator->is_animating());
2207   EXPECT_EQ(ColorToString(middle_color),
2208             ColorToString(delegate.GetColorForAnimation()));
2209 
2210   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
2211 
2212   EXPECT_FALSE(animator->is_animating());
2213   EXPECT_EQ(ColorToString(target_color),
2214             ColorToString(delegate.GetColorForAnimation()));
2215 }
2216 
2217 // Verifies SchedulePauseForProperties().
TEST(LayerAnimatorTest,SchedulePauseForProperties)2218 TEST(LayerAnimatorTest, SchedulePauseForProperties) {
2219   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
2220   animator->set_preemption_strategy(LayerAnimator::ENQUEUE_NEW_ANIMATION);
2221   animator->SchedulePauseForProperties(
2222       base::TimeDelta::FromMilliseconds(100),
2223       LayerAnimationElement::TRANSFORM | LayerAnimationElement::BOUNDS);
2224   EXPECT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::TRANSFORM));
2225   EXPECT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
2226   EXPECT_FALSE(animator->IsAnimatingProperty(LayerAnimationElement::OPACITY));
2227 }
2228 
2229 
2230 class AnimatorOwner {
2231 public:
AnimatorOwner()2232   AnimatorOwner()
2233       : animator_(LayerAnimator::CreateDefaultAnimator()) {
2234   }
2235 
animator()2236   LayerAnimator* animator() { return animator_.get(); }
2237 
2238 private:
2239   scoped_refptr<LayerAnimator> animator_;
2240 
2241   DISALLOW_COPY_AND_ASSIGN(AnimatorOwner);
2242 };
2243 
2244 class DeletingObserver : public LayerAnimationObserver {
2245 public:
DeletingObserver(bool * was_deleted)2246   DeletingObserver(bool* was_deleted)
2247       : animator_owner_(new AnimatorOwner),
2248         delete_on_animation_ended_(false),
2249         delete_on_animation_aborted_(false),
2250         delete_on_animation_scheduled_(false),
2251         was_deleted_(was_deleted) {
2252     animator()->AddObserver(this);
2253   }
2254 
~DeletingObserver()2255   virtual ~DeletingObserver() {
2256     animator()->RemoveObserver(this);
2257     *was_deleted_ = true;
2258   }
2259 
animator()2260   LayerAnimator* animator() { return animator_owner_->animator(); }
2261 
delete_on_animation_ended() const2262   bool delete_on_animation_ended() const {
2263     return delete_on_animation_ended_;
2264   }
set_delete_on_animation_ended(bool enabled)2265   void set_delete_on_animation_ended(bool enabled) {
2266     delete_on_animation_ended_ = enabled;
2267   }
2268 
delete_on_animation_aborted() const2269   bool delete_on_animation_aborted() const {
2270     return delete_on_animation_aborted_;
2271   }
set_delete_on_animation_aborted(bool enabled)2272   void set_delete_on_animation_aborted(bool enabled) {
2273     delete_on_animation_aborted_ = enabled;
2274   }
2275 
delete_on_animation_scheduled() const2276   bool delete_on_animation_scheduled() const {
2277     return delete_on_animation_scheduled_;
2278   }
set_delete_on_animation_scheduled(bool enabled)2279   void set_delete_on_animation_scheduled(bool enabled) {
2280     delete_on_animation_scheduled_ = enabled;
2281   }
2282 
2283   // LayerAnimationObserver implementation.
OnLayerAnimationEnded(LayerAnimationSequence * sequence)2284   virtual void OnLayerAnimationEnded(
2285       LayerAnimationSequence* sequence) OVERRIDE {
2286     if (delete_on_animation_ended_)
2287       delete this;
2288   }
2289 
OnLayerAnimationAborted(LayerAnimationSequence * sequence)2290   virtual void OnLayerAnimationAborted(
2291       LayerAnimationSequence* sequence) OVERRIDE {
2292     if (delete_on_animation_aborted_)
2293       delete this;
2294   }
2295 
OnLayerAnimationScheduled(LayerAnimationSequence * sequence)2296   virtual void OnLayerAnimationScheduled(
2297       LayerAnimationSequence* sequence) OVERRIDE {
2298     if (delete_on_animation_scheduled_)
2299       delete this;
2300   }
2301 
2302 private:
2303   scoped_ptr<AnimatorOwner> animator_owner_;
2304   bool delete_on_animation_ended_;
2305   bool delete_on_animation_aborted_;
2306   bool delete_on_animation_scheduled_;
2307   bool* was_deleted_;
2308 
2309   DISALLOW_COPY_AND_ASSIGN(DeletingObserver);
2310 };
2311 
TEST(LayerAnimatorTest,ObserverDeletesAnimatorAfterFinishingAnimation)2312 TEST(LayerAnimatorTest, ObserverDeletesAnimatorAfterFinishingAnimation) {
2313   bool observer_was_deleted = false;
2314   DeletingObserver* observer = new DeletingObserver(&observer_was_deleted);
2315   observer->set_delete_on_animation_ended(true);
2316   observer->set_delete_on_animation_aborted(true);
2317   LayerAnimator* animator = observer->animator();
2318   animator->set_disable_timer_for_test(true);
2319   TestLayerAnimationDelegate delegate;
2320   animator->SetDelegate(&delegate);
2321 
2322   delegate.SetBrightnessFromAnimation(0.0f);
2323 
2324   gfx::Rect start_bounds(0, 0, 50, 50);
2325   gfx::Rect target_bounds(10, 10, 100, 100);
2326 
2327   delegate.SetBoundsFromAnimation(start_bounds);
2328 
2329   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
2330   LayerAnimationSequence* brightness_sequence = new LayerAnimationSequence(
2331       LayerAnimationElement::CreateBrightnessElement(1.0f, delta));
2332   animator->StartAnimation(brightness_sequence);
2333 
2334   delta = base::TimeDelta::FromSeconds(2);
2335   LayerAnimationSequence* bounds_sequence = new LayerAnimationSequence(
2336       LayerAnimationElement::CreateBoundsElement(target_bounds, delta));
2337   animator->StartAnimation(bounds_sequence);
2338 
2339   base::TimeTicks start_time = animator->last_step_time();
2340   animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
2341 
2342   EXPECT_TRUE(observer_was_deleted);
2343 }
2344 
TEST(LayerAnimatorTest,ObserverDeletesAnimatorAfterStoppingAnimating)2345 TEST(LayerAnimatorTest, ObserverDeletesAnimatorAfterStoppingAnimating) {
2346   bool observer_was_deleted = false;
2347   DeletingObserver* observer = new DeletingObserver(&observer_was_deleted);
2348   observer->set_delete_on_animation_ended(true);
2349   observer->set_delete_on_animation_aborted(true);
2350   LayerAnimator* animator = observer->animator();
2351   animator->set_disable_timer_for_test(true);
2352   TestLayerAnimationDelegate delegate;
2353   animator->SetDelegate(&delegate);
2354 
2355   delegate.SetOpacityFromAnimation(0.0f);
2356 
2357   gfx::Rect start_bounds(0, 0, 50, 50);
2358   gfx::Rect target_bounds(10, 10, 100, 100);
2359 
2360   delegate.SetBoundsFromAnimation(start_bounds);
2361 
2362   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
2363   LayerAnimationSequence* opacity_sequence = new LayerAnimationSequence(
2364       LayerAnimationElement::CreateOpacityElement(1.0f, delta));
2365   animator->StartAnimation(opacity_sequence);
2366 
2367   delta = base::TimeDelta::FromSeconds(2);
2368   LayerAnimationSequence* bounds_sequence = new LayerAnimationSequence(
2369       LayerAnimationElement::CreateBoundsElement(target_bounds, delta));
2370   animator->StartAnimation(bounds_sequence);
2371 
2372   animator->StopAnimating();
2373 
2374   EXPECT_TRUE(observer_was_deleted);
2375 }
2376 
TEST(LayerAnimatorTest,ObserverDeletesAnimatorAfterScheduling)2377 TEST(LayerAnimatorTest, ObserverDeletesAnimatorAfterScheduling) {
2378   bool observer_was_deleted = false;
2379   TestLayerAnimationDelegate delegate;
2380   DeletingObserver* observer = new DeletingObserver(&observer_was_deleted);
2381   observer->set_delete_on_animation_scheduled(true);
2382   LayerAnimator* animator = observer->animator();
2383   animator->set_disable_timer_for_test(true);
2384   animator->SetDelegate(&delegate);
2385 
2386   delegate.SetOpacityFromAnimation(0.0f);
2387 
2388   gfx::Rect start_bounds(0, 0, 50, 50);
2389   gfx::Rect target_bounds(10, 10, 100, 100);
2390 
2391   delegate.SetBoundsFromAnimation(start_bounds);
2392 
2393   std::vector<LayerAnimationSequence*> to_start;
2394 
2395   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
2396   to_start.push_back(new LayerAnimationSequence(
2397       LayerAnimationElement::CreateOpacityElement(1.0f, delta)));
2398 
2399   delta = base::TimeDelta::FromSeconds(2);
2400   to_start.push_back(new LayerAnimationSequence(
2401       LayerAnimationElement::CreateBoundsElement(target_bounds, delta)));
2402 
2403   animator->ScheduleTogether(to_start);
2404 
2405   EXPECT_TRUE(observer_was_deleted);
2406 }
2407 
TEST(LayerAnimatorTest,ObserverDeletesAnimatorAfterAborted)2408 TEST(LayerAnimatorTest, ObserverDeletesAnimatorAfterAborted) {
2409   bool observer_was_deleted = false;
2410   DeletingObserver* observer = new DeletingObserver(&observer_was_deleted);
2411   TestLayerAnimationDelegate delegate;
2412   observer->set_delete_on_animation_aborted(true);
2413   LayerAnimator* animator = observer->animator();
2414   animator->set_preemption_strategy(
2415       LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
2416   animator->set_disable_timer_for_test(true);
2417   animator->SetDelegate(&delegate);
2418 
2419   delegate.SetOpacityFromAnimation(0.0f);
2420 
2421   gfx::Rect start_bounds(0, 0, 50, 50);
2422   gfx::Rect target_bounds(10, 10, 100, 100);
2423 
2424   delegate.SetBoundsFromAnimation(start_bounds);
2425 
2426   std::vector<LayerAnimationSequence*> to_start;
2427 
2428   base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
2429   to_start.push_back(new LayerAnimationSequence(
2430       LayerAnimationElement::CreateOpacityElement(1.0f, delta)));
2431 
2432   delta = base::TimeDelta::FromSeconds(2);
2433   to_start.push_back(new LayerAnimationSequence(
2434       LayerAnimationElement::CreateBoundsElement(target_bounds, delta)));
2435 
2436   animator->ScheduleTogether(to_start);
2437 
2438   EXPECT_FALSE(observer_was_deleted);
2439 
2440   animator->StartAnimation(new LayerAnimationSequence(
2441       LayerAnimationElement::CreateOpacityElement(1.0f, delta)));
2442 
2443   EXPECT_TRUE(observer_was_deleted);
2444 }
2445 
2446 
TEST(LayerAnimatorTest,TestSetterRespectEnqueueStrategy)2447 TEST(LayerAnimatorTest, TestSetterRespectEnqueueStrategy) {
2448   TestLayerAnimationDelegate delegate;
2449   scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
2450   animator->set_disable_timer_for_test(true);
2451 
2452   animator->SetDelegate(&delegate);
2453 
2454   float start_opacity = 0.0f;
2455   float target_opacity = 1.0f;
2456   float magic_opacity = 0.123f;
2457 
2458   delegate.SetOpacityFromAnimation(start_opacity);
2459 
2460   ScopedLayerAnimationSettings settings(animator.get());
2461   settings.SetPreemptionStrategy(
2462       LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
2463   settings.SetTransitionDuration(base::TimeDelta::FromSeconds(1));
2464   animator->SetOpacity(target_opacity);
2465 
2466   EXPECT_EQ(start_opacity, delegate.GetOpacityForAnimation());
2467 
2468   settings.SetPreemptionStrategy(
2469       LayerAnimator::ENQUEUE_NEW_ANIMATION);
2470   settings.SetTransitionDuration(base::TimeDelta());
2471   animator->SetOpacity(magic_opacity);
2472 
2473   EXPECT_EQ(start_opacity, delegate.GetOpacityForAnimation());
2474 }
2475 
TEST(LayerAnimatorTest,TestScopedCounterAnimation)2476 TEST(LayerAnimatorTest, TestScopedCounterAnimation) {
2477   Layer parent, child;
2478   parent.Add(&child);
2479 
2480   gfx::Transform parent_begin, parent_end;
2481 
2482   parent_end.Scale3d(2.0, 0.5, 1.0);
2483 
2484   // Parent animates from identity to the end value. The counter animation will
2485   // start at the end value and animate back to identity.
2486   gfx::Transform child_begin(parent_end);
2487 
2488   child.SetTransform(child_begin);
2489   parent.SetTransform(parent_begin);
2490 
2491   EXPECT_FALSE(child.GetAnimator()->is_animating());
2492 
2493   ScopedLayerAnimationSettings settings(parent.GetAnimator());
2494   settings.SetInverselyAnimatedBaseLayer(&parent);
2495   settings.AddInverselyAnimatedLayer(&child);
2496 
2497   parent.SetTransform(parent_end);
2498 
2499   EXPECT_TRUE(child.GetAnimator()->is_animating());
2500   EXPECT_TRUE(child.GetTargetTransform().IsIdentity())
2501     << child.GetTargetTransform().ToString();
2502 
2503 }
2504 
2505 class CollectionLayerAnimationDelegate : public TestLayerAnimationDelegate {
2506  public:
CollectionLayerAnimationDelegate()2507   CollectionLayerAnimationDelegate() : collection(NULL) {}
~CollectionLayerAnimationDelegate()2508   virtual ~CollectionLayerAnimationDelegate() {}
2509 
2510   // LayerAnimationDelegate:
GetLayerAnimatorCollection()2511   virtual LayerAnimatorCollection* GetLayerAnimatorCollection() OVERRIDE {
2512     return &collection;
2513   }
2514 
2515  private:
2516   LayerAnimatorCollection collection;
2517 };
2518 
TEST(LayerAnimatorTest,LayerAnimatorCollectionTickTime)2519 TEST(LayerAnimatorTest, LayerAnimatorCollectionTickTime) {
2520   Layer layer;
2521   LayerAnimator* animator = layer.GetAnimator();
2522   CollectionLayerAnimationDelegate delegate;
2523   animator->SetDelegate(&delegate);
2524 
2525   LayerAnimatorCollection* collection = delegate.GetLayerAnimatorCollection();
2526   base::TimeTicks null;
2527   collection->Progress(null);
2528   EXPECT_TRUE(collection->last_tick_time().is_null());
2529 
2530   // Adding an animator to the collection should update the last tick time.
2531   collection->StartAnimator(layer.GetAnimator());
2532   EXPECT_TRUE(collection->HasActiveAnimators());
2533   EXPECT_FALSE(collection->last_tick_time().is_null());
2534 
2535   collection->StopAnimator(layer.GetAnimator());
2536   EXPECT_FALSE(collection->HasActiveAnimators());
2537 }
2538 
TEST(LayerAnimatorTest,AnimatorStartedCorrectly)2539 TEST(LayerAnimatorTest, AnimatorStartedCorrectly) {
2540   Layer layer;
2541   LayerAnimatorTestController test_controller(layer.GetAnimator());
2542   LayerAnimator* animator = test_controller.animator();
2543   ASSERT_FALSE(animator->is_started_);
2544 
2545   TestLayerAnimationDelegate test_delegate;
2546   animator->SetDelegate(&test_delegate);
2547   double target_opacity = 1.0;
2548   base::TimeDelta time_delta = base::TimeDelta::FromSeconds(1);
2549   animator->ScheduleAnimation(new LayerAnimationSequence(
2550       LayerAnimationElement::CreateOpacityElement(target_opacity, time_delta)));
2551   EXPECT_FALSE(animator->is_started_);
2552 
2553   CollectionLayerAnimationDelegate collection_delegate;
2554   animator->SetDelegate(&collection_delegate);
2555   animator->UpdateAnimationState();
2556   EXPECT_TRUE(animator->is_started_);
2557   animator->SetDelegate(NULL);
2558 }
2559 
TEST(LayerAnimatorTest,AnimatorRemovedFromCollectionWhenLayerIsDestroyed)2560 TEST(LayerAnimatorTest, AnimatorRemovedFromCollectionWhenLayerIsDestroyed) {
2561   scoped_ptr<Layer> layer(new Layer(LAYER_TEXTURED));
2562   LayerAnimatorTestController test_controller(layer->GetAnimator());
2563   scoped_refptr<LayerAnimator> animator = test_controller.animator();
2564   CollectionLayerAnimationDelegate collection_delegate;
2565   animator->SetDelegate(&collection_delegate);
2566 
2567   double target_opacity = 1.0;
2568   base::TimeDelta time_delta = base::TimeDelta::FromSeconds(1);
2569   animator->ScheduleAnimation(new LayerAnimationSequence(
2570       LayerAnimationElement::CreateOpacityElement(target_opacity, time_delta)));
2571 
2572   EXPECT_TRUE(
2573       collection_delegate.GetLayerAnimatorCollection()->HasActiveAnimators());
2574 
2575   layer.reset();
2576   EXPECT_EQ(NULL, animator->delegate());
2577   EXPECT_FALSE(
2578       collection_delegate.GetLayerAnimatorCollection()->HasActiveAnimators());
2579 }
2580 
TEST(LayerAnimatorTest,LayerMovedBetweenCompositorsDuringAnimation)2581 TEST(LayerAnimatorTest, LayerMovedBetweenCompositorsDuringAnimation) {
2582   bool enable_pixel_output = false;
2583   ui::ContextFactory* context_factory =
2584       InitializeContextFactoryForTests(enable_pixel_output);
2585   const gfx::Rect bounds(10, 10, 100, 100);
2586   scoped_ptr<TestCompositorHost> host_1(
2587       TestCompositorHost::Create(bounds, context_factory));
2588   scoped_ptr<TestCompositorHost> host_2(
2589       TestCompositorHost::Create(bounds, context_factory));
2590   host_1->Show();
2591   host_2->Show();
2592 
2593   Compositor* compositor_1 = host_1->GetCompositor();
2594   Layer root_1;
2595   compositor_1->SetRootLayer(&root_1);
2596 
2597   Compositor* compositor_2 = host_2->GetCompositor();
2598   Layer root_2;
2599   compositor_2->SetRootLayer(&root_2);
2600 
2601   // Verify that neither compositor has active animators.
2602   EXPECT_FALSE(compositor_1->layer_animator_collection()->HasActiveAnimators());
2603   EXPECT_FALSE(compositor_2->layer_animator_collection()->HasActiveAnimators());
2604 
2605   Layer layer;
2606   root_1.Add(&layer);
2607   LayerAnimator* animator = layer.GetAnimator();
2608   double target_opacity = 1.0;
2609   base::TimeDelta time_delta = base::TimeDelta::FromSeconds(1);
2610   animator->ScheduleAnimation(new LayerAnimationSequence(
2611       LayerAnimationElement::CreateOpacityElement(target_opacity, time_delta)));
2612   EXPECT_TRUE(compositor_1->layer_animator_collection()->HasActiveAnimators());
2613   EXPECT_FALSE(compositor_2->layer_animator_collection()->HasActiveAnimators());
2614 
2615   root_2.Add(&layer);
2616   EXPECT_FALSE(compositor_1->layer_animator_collection()->HasActiveAnimators());
2617   EXPECT_TRUE(compositor_2->layer_animator_collection()->HasActiveAnimators());
2618   host_2.reset();
2619   host_1.reset();
2620   TerminateContextFactoryForTests();
2621 }
2622 
2623 }  // namespace ui
2624