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