Home | History | Annotate | Download | only in compositor
      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.
     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.
     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:
     60   explicit TestImplicitAnimationObserver(bool notify_when_animator_destructed)
     61     : animations_completed_(false),
     62       notify_when_animator_destructed_(notify_when_animator_destructed) {
     63   }
     64 
     65   bool animations_completed() const { return animations_completed_; }
     66   void set_animations_completed(bool completed) {
     67     animations_completed_ = completed;
     68   }
     69 
     70   bool WasAnimationAbortedForProperty(
     71       LayerAnimationElement::AnimatableProperty property) const {
     72     return ImplicitAnimationObserver::WasAnimationAbortedForProperty(property);
     73   }
     74 
     75   bool WasAnimationCompletedForProperty(
     76       LayerAnimationElement::AnimatableProperty property) const {
     77     return ImplicitAnimationObserver::WasAnimationCompletedForProperty(
     78         property);
     79   }
     80 
     81  private:
     82   // ImplicitAnimationObserver implementation
     83   virtual void OnImplicitAnimationsCompleted() OVERRIDE {
     84     animations_completed_ = true;
     85   }
     86 
     87   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:
    100   DeletingLayerAnimationObserver(LayerAnimator* animator)
    101     : animator_(animator) {
    102   }
    103 
    104   virtual void OnLayerAnimationEnded(
    105       LayerAnimationSequence* sequence) OVERRIDE {
    106     animator_->StopAnimating();
    107   }
    108 
    109   virtual void OnLayerAnimationAborted(
    110       LayerAnimationSequence* sequence) OVERRIDE {
    111     animator_->StopAnimating();
    112   }
    113 
    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:
    126   LayerAnimatorDestructionObserver() : animator_deleted_(false) {}
    127   virtual ~LayerAnimatorDestructionObserver() {}
    128 
    129   void NotifyAnimatorDeleted() {
    130     animator_deleted_ = true;
    131   }
    132 
    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:
    145   TestLayerAnimator() : LayerAnimator(base::TimeDelta::FromSeconds(0)),
    146       destruction_observer_(NULL) {}
    147 
    148   void SetDestructionObserver(
    149       LayerAnimatorDestructionObserver* observer) {
    150     destruction_observer_ = observer;
    151   }
    152 
    153  protected:
    154   virtual ~TestLayerAnimator() {
    155     if (destruction_observer_) {
    156       destruction_observer_->NotifyAnimatorDeleted();
    157     }
    158   }
    159 
    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:
    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 
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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).
    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).
    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.
    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.
    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.
    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.
    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.
    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 
   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.
   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.
   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.
   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.
   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.
   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.
   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.
   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 
   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.
   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.
   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.
   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.
   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 
   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 
   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 
   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 
   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 
   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.
   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.
   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.
   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.
   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.
   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.
   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.
   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.
   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.
   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().
   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:
   2232   AnimatorOwner()
   2233       : animator_(LayerAnimator::CreateDefaultAnimator()) {
   2234   }
   2235 
   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:
   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 
   2255   virtual ~DeletingObserver() {
   2256     animator()->RemoveObserver(this);
   2257     *was_deleted_ = true;
   2258   }
   2259 
   2260   LayerAnimator* animator() { return animator_owner_->animator(); }
   2261 
   2262   bool delete_on_animation_ended() const {
   2263     return delete_on_animation_ended_;
   2264   }
   2265   void set_delete_on_animation_ended(bool enabled) {
   2266     delete_on_animation_ended_ = enabled;
   2267   }
   2268 
   2269   bool delete_on_animation_aborted() const {
   2270     return delete_on_animation_aborted_;
   2271   }
   2272   void set_delete_on_animation_aborted(bool enabled) {
   2273     delete_on_animation_aborted_ = enabled;
   2274   }
   2275 
   2276   bool delete_on_animation_scheduled() const {
   2277     return delete_on_animation_scheduled_;
   2278   }
   2279   void set_delete_on_animation_scheduled(bool enabled) {
   2280     delete_on_animation_scheduled_ = enabled;
   2281   }
   2282 
   2283   // LayerAnimationObserver implementation.
   2284   virtual void OnLayerAnimationEnded(
   2285       LayerAnimationSequence* sequence) OVERRIDE {
   2286     if (delete_on_animation_ended_)
   2287       delete this;
   2288   }
   2289 
   2290   virtual void OnLayerAnimationAborted(
   2291       LayerAnimationSequence* sequence) OVERRIDE {
   2292     if (delete_on_animation_aborted_)
   2293       delete this;
   2294   }
   2295 
   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 
   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 
   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 
   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 
   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 
   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 
   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:
   2507   CollectionLayerAnimationDelegate() : collection(NULL) {}
   2508   virtual ~CollectionLayerAnimationDelegate() {}
   2509 
   2510   // LayerAnimationDelegate:
   2511   virtual LayerAnimatorCollection* GetLayerAnimatorCollection() OVERRIDE {
   2512     return &collection;
   2513   }
   2514 
   2515  private:
   2516   LayerAnimatorCollection collection;
   2517 };
   2518 
   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 
   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 
   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 
   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