Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Side by Side Diff: ui/gfx/compositor/layer_animator_unittest.cc

Issue 10365007: ui: Move compositor/ directory out of gfx/, up to ui/. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix DEPS Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ui/gfx/compositor/layer_animator.cc ('k') | ui/gfx/compositor/layer_delegate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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/gfx/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/time.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "ui/gfx/rect.h"
13 #include "ui/gfx/transform.h"
14 #include "ui/gfx/compositor/layer_animation_delegate.h"
15 #include "ui/gfx/compositor/layer_animation_element.h"
16 #include "ui/gfx/compositor/layer_animation_sequence.h"
17 #include "ui/gfx/compositor/scoped_layer_animation_settings.h"
18 #include "ui/gfx/compositor/test/test_layer_animation_delegate.h"
19 #include "ui/gfx/compositor/test/test_layer_animation_observer.h"
20 #include "ui/gfx/compositor/test/test_utils.h"
21
22 namespace ui {
23
24 namespace {
25
26 class TestImplicitAnimationObserver : public ImplicitAnimationObserver {
27 public:
28 explicit TestImplicitAnimationObserver(bool notify_when_animator_destructed)
29 : animations_completed_(false),
30 notify_when_animator_destructed_(notify_when_animator_destructed) {
31 }
32
33 bool animations_completed() const { return animations_completed_; }
34 void set_animations_completed(bool completed) {
35 animations_completed_ = completed;
36 }
37
38 private:
39 // ImplicitAnimationObserver implementation
40 virtual void OnImplicitAnimationsCompleted() OVERRIDE {
41 animations_completed_ = true;
42 }
43
44 virtual bool RequiresNotificationWhenAnimatorDestroyed() const OVERRIDE {
45 return notify_when_animator_destructed_;
46 }
47
48 bool animations_completed_;
49 bool notify_when_animator_destructed_;
50
51 DISALLOW_COPY_AND_ASSIGN(TestImplicitAnimationObserver);
52 };
53
54 // When notified that an animation has ended, stops all other animations.
55 class DeletingLayerAnimationObserver : public LayerAnimationObserver {
56 public:
57 DeletingLayerAnimationObserver(LayerAnimator* animator,
58 LayerAnimationSequence* sequence)
59 : animator_(animator),
60 sequence_(sequence) {
61 }
62
63 virtual void OnLayerAnimationEnded(LayerAnimationSequence* sequence) {
64 animator_->StopAnimating();
65 }
66
67 virtual void OnLayerAnimationAborted(LayerAnimationSequence* sequence) {}
68
69 virtual void OnLayerAnimationScheduled(LayerAnimationSequence* sequence) {}
70
71 private:
72 LayerAnimator* animator_;
73 LayerAnimationSequence* sequence_;
74
75 DISALLOW_COPY_AND_ASSIGN(DeletingLayerAnimationObserver);
76 };
77
78 class TestLayerAnimator : public LayerAnimator {
79 public:
80 TestLayerAnimator() : LayerAnimator(base::TimeDelta::FromSeconds(0)) {}
81 virtual ~TestLayerAnimator() {}
82
83 protected:
84 virtual bool ProgressAnimation(LayerAnimationSequence* sequence,
85 base::TimeDelta delta) OVERRIDE {
86 EXPECT_TRUE(HasAnimation(sequence));
87 return LayerAnimator::ProgressAnimation(sequence, delta);
88 }
89
90 private:
91 DISALLOW_COPY_AND_ASSIGN(TestLayerAnimator);
92 };
93
94 // The test layer animation sequence updates a live instances count when it is
95 // created and destroyed.
96 class TestLayerAnimationSequence : public LayerAnimationSequence {
97 public:
98 TestLayerAnimationSequence(LayerAnimationElement* element,
99 int* num_live_instances)
100 : LayerAnimationSequence(element),
101 num_live_instances_(num_live_instances) {
102 (*num_live_instances_)++;
103 }
104
105 virtual ~TestLayerAnimationSequence() {
106 (*num_live_instances_)--;
107 }
108
109 private:
110 int* num_live_instances_;
111
112 DISALLOW_COPY_AND_ASSIGN(TestLayerAnimationSequence);
113 };
114
115 } // namespace
116
117 // Checks that setting a property on an implicit animator causes an animation to
118 // happen.
119 TEST(LayerAnimatorTest, ImplicitAnimation) {
120 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateImplicitAnimator());
121 AnimationContainerElement* element = animator.get();
122 animator->set_disable_timer_for_test(true);
123 TestLayerAnimationDelegate delegate;
124 animator->SetDelegate(&delegate);
125 base::TimeTicks now = base::TimeTicks::Now();
126 animator->SetOpacity(0.5);
127 EXPECT_TRUE(animator->is_animating());
128 element->Step(now + base::TimeDelta::FromSeconds(1));
129 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), 0.5);
130 }
131
132 // Checks that if the animator is a default animator, that implicit animations
133 // are not started.
134 TEST(LayerAnimatorTest, NoImplicitAnimation) {
135 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
136 animator->set_disable_timer_for_test(true);
137 TestLayerAnimationDelegate delegate;
138 animator->SetDelegate(&delegate);
139 animator->SetOpacity(0.5);
140 EXPECT_FALSE(animator->is_animating());
141 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), 0.5);
142 }
143
144 // Checks that StopAnimatingProperty stops animation for that property, and also
145 // skips the stopped animation to the end.
146 TEST(LayerAnimatorTest, StopAnimatingProperty) {
147 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateImplicitAnimator());
148 animator->set_disable_timer_for_test(true);
149 TestLayerAnimationDelegate delegate;
150 animator->SetDelegate(&delegate);
151 double target_opacity(0.5);
152 gfx::Rect target_bounds(0, 0, 50, 50);
153 animator->SetOpacity(target_opacity);
154 animator->SetBounds(target_bounds);
155 animator->StopAnimatingProperty(LayerAnimationElement::OPACITY);
156 EXPECT_TRUE(animator->is_animating());
157 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), 0.5);
158 animator->StopAnimatingProperty(LayerAnimationElement::BOUNDS);
159 EXPECT_FALSE(animator->is_animating());
160 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
161 }
162
163 // Checks that multiple running animation for separate properties can be stopped
164 // simultaneously and that all animations are advanced to their target values.
165 TEST(LayerAnimatorTest, StopAnimating) {
166 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateImplicitAnimator());
167 animator->set_disable_timer_for_test(true);
168 TestLayerAnimationDelegate delegate;
169 animator->SetDelegate(&delegate);
170 double target_opacity(0.5);
171 gfx::Rect target_bounds(0, 0, 50, 50);
172 animator->SetOpacity(target_opacity);
173 animator->SetBounds(target_bounds);
174 EXPECT_TRUE(animator->is_animating());
175 animator->StopAnimating();
176 EXPECT_FALSE(animator->is_animating());
177 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), 0.5);
178 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
179 }
180
181 // Schedule an animation that can run immediately. This is the trivial case and
182 // should result in the animation being started immediately.
183 TEST(LayerAnimatorTest, ScheduleAnimationThatCanRunImmediately) {
184 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
185 AnimationContainerElement* element = animator.get();
186 animator->set_disable_timer_for_test(true);
187 TestLayerAnimationDelegate delegate;
188 animator->SetDelegate(&delegate);
189
190 double start_opacity(0.0);
191 double middle_opacity(0.5);
192 double target_opacity(1.0);
193
194 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
195
196 delegate.SetOpacityFromAnimation(start_opacity);
197
198 animator->ScheduleAnimation(
199 new LayerAnimationSequence(
200 LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
201
202 EXPECT_TRUE(animator->is_animating());
203 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
204
205 base::TimeTicks start_time = animator->last_step_time();
206
207 element->Step(start_time + base::TimeDelta::FromMilliseconds(500));
208
209 EXPECT_TRUE(animator->is_animating());
210 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), middle_opacity);
211
212 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
213
214 EXPECT_FALSE(animator->is_animating());
215 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
216 }
217
218 // Schedule two animations on separate properties. Both animations should
219 // start immediately and should progress in lock step.
220 TEST(LayerAnimatorTest, ScheduleTwoAnimationsThatCanRunImmediately) {
221 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
222 AnimationContainerElement* element = animator.get();
223 animator->set_disable_timer_for_test(true);
224 TestLayerAnimationDelegate delegate;
225 animator->SetDelegate(&delegate);
226
227 double start_opacity(0.0);
228 double middle_opacity(0.5);
229 double target_opacity(1.0);
230
231 gfx::Rect start_bounds, target_bounds, middle_bounds;
232 start_bounds = target_bounds = middle_bounds = gfx::Rect(0, 0, 50, 50);
233 start_bounds.set_x(-90);
234 target_bounds.set_x(90);
235
236 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
237
238 delegate.SetOpacityFromAnimation(start_opacity);
239 delegate.SetBoundsFromAnimation(start_bounds);
240
241 animator->ScheduleAnimation(
242 new LayerAnimationSequence(
243 LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
244
245 animator->ScheduleAnimation(
246 new LayerAnimationSequence(
247 LayerAnimationElement::CreateBoundsElement(target_bounds, delta)));
248
249 EXPECT_TRUE(animator->is_animating());
250 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
251 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
252
253 base::TimeTicks start_time = animator->last_step_time();
254
255 element->Step(start_time + base::TimeDelta::FromMilliseconds(500));
256
257 EXPECT_TRUE(animator->is_animating());
258 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), middle_opacity);
259 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), middle_bounds);
260
261 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
262
263 EXPECT_FALSE(animator->is_animating());
264 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
265 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
266 }
267
268 // Schedule two animations on the same property. In this case, the two
269 // animations should run one after another.
270 TEST(LayerAnimatorTest, ScheduleTwoAnimationsOnSameProperty) {
271 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
272 AnimationContainerElement* element = animator.get();
273 animator->set_disable_timer_for_test(true);
274 TestLayerAnimationDelegate delegate;
275 animator->SetDelegate(&delegate);
276
277 double start_opacity(0.0);
278 double middle_opacity(0.5);
279 double target_opacity(1.0);
280
281 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
282
283 delegate.SetOpacityFromAnimation(start_opacity);
284
285 animator->ScheduleAnimation(
286 new LayerAnimationSequence(
287 LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
288
289 animator->ScheduleAnimation(
290 new LayerAnimationSequence(
291 LayerAnimationElement::CreateOpacityElement(start_opacity, delta)));
292
293 EXPECT_TRUE(animator->is_animating());
294 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
295
296 base::TimeTicks start_time = animator->last_step_time();
297
298 element->Step(start_time + base::TimeDelta::FromMilliseconds(500));
299
300 EXPECT_TRUE(animator->is_animating());
301 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), middle_opacity);
302
303 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
304
305 EXPECT_TRUE(animator->is_animating());
306 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
307
308 element->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
309
310 EXPECT_TRUE(animator->is_animating());
311 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), middle_opacity);
312
313 element->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
314
315 EXPECT_FALSE(animator->is_animating());
316 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
317 }
318
319 // Schedule [{o}, {o,b}, {b}] and ensure that {b} doesn't run right away. That
320 // is, ensure that all animations targetting a particular property are run in
321 // order.
322 TEST(LayerAnimatorTest, ScheduleBlockedAnimation) {
323 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
324 AnimationContainerElement* element = animator.get();
325 animator->set_disable_timer_for_test(true);
326 TestLayerAnimationDelegate delegate;
327 animator->SetDelegate(&delegate);
328
329 double start_opacity(0.0);
330 double middle_opacity(0.5);
331 double target_opacity(1.0);
332
333 gfx::Rect start_bounds, target_bounds, middle_bounds;
334 start_bounds = target_bounds = middle_bounds = gfx::Rect(0, 0, 50, 50);
335 start_bounds.set_x(-90);
336 target_bounds.set_x(90);
337
338 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
339
340 delegate.SetOpacityFromAnimation(start_opacity);
341 delegate.SetBoundsFromAnimation(start_bounds);
342
343 animator->ScheduleAnimation(
344 new LayerAnimationSequence(
345 LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
346
347 scoped_ptr<LayerAnimationSequence> bounds_and_opacity(
348 new LayerAnimationSequence(
349 LayerAnimationElement::CreateOpacityElement(start_opacity, delta)));
350
351 bounds_and_opacity->AddElement(
352 LayerAnimationElement::CreateBoundsElement(target_bounds, delta));
353
354 animator->ScheduleAnimation(bounds_and_opacity.release());
355
356 animator->ScheduleAnimation(
357 new LayerAnimationSequence(
358 LayerAnimationElement::CreateBoundsElement(start_bounds, delta)));
359
360 EXPECT_TRUE(animator->is_animating());
361 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
362 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
363
364 base::TimeTicks start_time = animator->last_step_time();
365
366 element->Step(start_time + base::TimeDelta::FromMilliseconds(500));
367
368 EXPECT_TRUE(animator->is_animating());
369 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), middle_opacity);
370 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
371
372 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
373
374 EXPECT_TRUE(animator->is_animating());
375 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
376 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
377
378 element->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
379
380 EXPECT_TRUE(animator->is_animating());
381 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
382 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
383
384 element->Step(start_time + base::TimeDelta::FromMilliseconds(3000));
385
386 EXPECT_TRUE(animator->is_animating());
387 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
388 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
389
390 element->Step(start_time + base::TimeDelta::FromMilliseconds(4000));
391
392 EXPECT_FALSE(animator->is_animating());
393 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
394 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
395 }
396
397 // Schedule {o} and then schedule {o} and {b} together. In this case, since
398 // ScheduleTogether is being used, the bounds animation should not start until
399 // the second opacity animation starts.
400 TEST(LayerAnimatorTest, ScheduleTogether) {
401 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
402 AnimationContainerElement* element = animator.get();
403 animator->set_disable_timer_for_test(true);
404 TestLayerAnimationDelegate delegate;
405 animator->SetDelegate(&delegate);
406
407 double start_opacity(0.0);
408 double target_opacity(1.0);
409
410 gfx::Rect start_bounds, target_bounds, middle_bounds;
411 start_bounds = target_bounds = gfx::Rect(0, 0, 50, 50);
412 start_bounds.set_x(-90);
413 target_bounds.set_x(90);
414
415 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
416
417 delegate.SetOpacityFromAnimation(start_opacity);
418 delegate.SetBoundsFromAnimation(start_bounds);
419
420 animator->ScheduleAnimation(
421 new LayerAnimationSequence(
422 LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
423
424 std::vector<LayerAnimationSequence*> sequences;
425 sequences.push_back(new LayerAnimationSequence(
426 LayerAnimationElement::CreateOpacityElement(start_opacity, delta)));
427 sequences.push_back(new LayerAnimationSequence(
428 LayerAnimationElement::CreateBoundsElement(target_bounds, delta)));
429
430 animator->ScheduleTogether(sequences);
431
432 EXPECT_TRUE(animator->is_animating());
433 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
434 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
435
436 base::TimeTicks start_time = animator->last_step_time();
437
438 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
439
440 EXPECT_TRUE(animator->is_animating());
441 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
442 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
443
444 element->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
445
446 EXPECT_FALSE(animator->is_animating());
447 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
448 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
449 }
450
451 // Start animation (that can run immediately). This is the trivial case (see
452 // the trival case for ScheduleAnimation).
453 TEST(LayerAnimatorTest, StartAnimationThatCanRunImmediately) {
454 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
455 AnimationContainerElement* element = animator.get();
456 animator->set_disable_timer_for_test(true);
457 TestLayerAnimationDelegate delegate;
458 animator->SetDelegate(&delegate);
459
460 double start_opacity(0.0);
461 double middle_opacity(0.5);
462 double target_opacity(1.0);
463
464 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
465
466 delegate.SetOpacityFromAnimation(start_opacity);
467
468 animator->StartAnimation(
469 new LayerAnimationSequence(
470 LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
471
472 EXPECT_TRUE(animator->is_animating());
473 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
474
475 base::TimeTicks start_time = animator->last_step_time();
476
477 element->Step(start_time + base::TimeDelta::FromMilliseconds(500));
478
479 EXPECT_TRUE(animator->is_animating());
480 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), middle_opacity);
481
482 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
483
484 EXPECT_FALSE(animator->is_animating());
485 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
486 }
487
488 // Preempt by immediately setting new target.
489 TEST(LayerAnimatorTest, PreemptBySettingNewTarget) {
490 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
491 animator->set_disable_timer_for_test(true);
492 TestLayerAnimationDelegate delegate;
493 animator->SetDelegate(&delegate);
494
495 double start_opacity(0.0);
496 double target_opacity(1.0);
497
498 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
499
500 delegate.SetOpacityFromAnimation(start_opacity);
501
502 animator->set_preemption_strategy(LayerAnimator::IMMEDIATELY_SET_NEW_TARGET);
503
504 animator->StartAnimation(
505 new LayerAnimationSequence(
506 LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
507
508 animator->StartAnimation(
509 new LayerAnimationSequence(
510 LayerAnimationElement::CreateOpacityElement(start_opacity, delta)));
511
512 EXPECT_FALSE(animator->is_animating());
513 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
514 }
515
516 // Preempt by animating to new target.
517 TEST(LayerAnimatorTest, PreemptByImmediatelyAnimatingToNewTarget) {
518 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
519 AnimationContainerElement* element = animator.get();
520 animator->set_disable_timer_for_test(true);
521 TestLayerAnimationDelegate delegate;
522 animator->SetDelegate(&delegate);
523
524 double start_opacity(0.0);
525 double middle_opacity(0.5);
526 double target_opacity(1.0);
527
528 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
529
530 delegate.SetOpacityFromAnimation(start_opacity);
531
532 animator->set_preemption_strategy(
533 LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
534
535 animator->StartAnimation(
536 new LayerAnimationSequence(
537 LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
538
539 base::TimeTicks start_time = animator->last_step_time();
540
541 element->Step(start_time + base::TimeDelta::FromMilliseconds(500));
542
543 animator->StartAnimation(
544 new LayerAnimationSequence(
545 LayerAnimationElement::CreateOpacityElement(start_opacity, delta)));
546
547 EXPECT_TRUE(animator->is_animating());
548 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), middle_opacity);
549
550 animator->StartAnimation(
551 new LayerAnimationSequence(
552 LayerAnimationElement::CreateOpacityElement(start_opacity, delta)));
553
554 EXPECT_TRUE(animator->is_animating());
555
556 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
557
558 EXPECT_TRUE(animator->is_animating());
559 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(),
560 0.5 * (start_opacity + middle_opacity));
561
562 element->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
563
564 EXPECT_FALSE(animator->is_animating());
565 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
566 }
567
568 // Preempt by enqueuing the new animation.
569 TEST(LayerAnimatorTest, PreemptEnqueueNewAnimation) {
570 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
571 AnimationContainerElement* element = animator.get();
572 animator->set_disable_timer_for_test(true);
573 TestLayerAnimationDelegate delegate;
574 animator->SetDelegate(&delegate);
575
576 double start_opacity(0.0);
577 double middle_opacity(0.5);
578 double target_opacity(1.0);
579
580 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
581
582 delegate.SetOpacityFromAnimation(start_opacity);
583
584 animator->set_preemption_strategy(LayerAnimator::ENQUEUE_NEW_ANIMATION);
585
586 animator->StartAnimation(
587 new LayerAnimationSequence(
588 LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
589
590 base::TimeTicks start_time = animator->last_step_time();
591
592 element->Step(start_time + base::TimeDelta::FromMilliseconds(500));
593
594 animator->StartAnimation(
595 new LayerAnimationSequence(
596 LayerAnimationElement::CreateOpacityElement(start_opacity, delta)));
597
598 EXPECT_TRUE(animator->is_animating());
599 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), middle_opacity);
600
601 EXPECT_TRUE(animator->is_animating());
602
603 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
604
605 EXPECT_TRUE(animator->is_animating());
606 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
607
608 element->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
609
610 EXPECT_TRUE(animator->is_animating());
611 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), middle_opacity);
612
613 element->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
614
615 EXPECT_FALSE(animator->is_animating());
616 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
617 }
618
619 // Start an animation when there are sequences waiting in the queue. In this
620 // case, all pending and running animations should be finished, and the new
621 // animation started.
622 TEST(LayerAnimatorTest, PreemptyByReplacingQueuedAnimations) {
623 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
624 AnimationContainerElement* element = animator.get();
625 animator->set_disable_timer_for_test(true);
626 TestLayerAnimationDelegate delegate;
627 animator->SetDelegate(&delegate);
628
629 double start_opacity(0.0);
630 double middle_opacity(0.5);
631 double target_opacity(1.0);
632
633 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
634
635 delegate.SetOpacityFromAnimation(start_opacity);
636
637 animator->set_preemption_strategy(LayerAnimator::REPLACE_QUEUED_ANIMATIONS);
638
639 animator->StartAnimation(
640 new LayerAnimationSequence(
641 LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
642
643 base::TimeTicks start_time = animator->last_step_time();
644
645 element->Step(start_time + base::TimeDelta::FromMilliseconds(500));
646
647 animator->StartAnimation(
648 new LayerAnimationSequence(
649 LayerAnimationElement::CreateOpacityElement(middle_opacity, delta)));
650
651 // Queue should now have two animations. Starting a third should replace the
652 // second.
653 animator->StartAnimation(
654 new LayerAnimationSequence(
655 LayerAnimationElement::CreateOpacityElement(start_opacity, delta)));
656
657 EXPECT_TRUE(animator->is_animating());
658 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), middle_opacity);
659
660 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
661
662 EXPECT_TRUE(animator->is_animating());
663 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
664
665 element->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
666
667 EXPECT_TRUE(animator->is_animating());
668 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), middle_opacity);
669
670 element->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
671
672 EXPECT_FALSE(animator->is_animating());
673 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
674 }
675
676 // Test that cyclic sequences continue to animate.
677 TEST(LayerAnimatorTest, CyclicSequences) {
678 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
679 AnimationContainerElement* element = animator.get();
680 animator->set_disable_timer_for_test(true);
681 TestLayerAnimationDelegate delegate;
682 animator->SetDelegate(&delegate);
683
684 double start_opacity(0.0);
685 double target_opacity(1.0);
686
687 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
688
689 delegate.SetOpacityFromAnimation(start_opacity);
690
691 scoped_ptr<LayerAnimationSequence> sequence(
692 new LayerAnimationSequence(
693 LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
694
695 sequence->AddElement(
696 LayerAnimationElement::CreateOpacityElement(start_opacity, delta));
697
698 sequence->set_is_cyclic(true);
699
700 animator->StartAnimation(sequence.release());
701
702 base::TimeTicks start_time = animator->last_step_time();
703
704 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
705
706 EXPECT_TRUE(animator->is_animating());
707 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
708
709 element->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
710
711 EXPECT_TRUE(animator->is_animating());
712 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
713
714 element->Step(start_time + base::TimeDelta::FromMilliseconds(3000));
715
716 EXPECT_TRUE(animator->is_animating());
717 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
718
719 // Skip ahead by a lot.
720 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000000000));
721
722 EXPECT_TRUE(animator->is_animating());
723 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
724
725 // Skip ahead by a lot.
726 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000001000));
727
728 EXPECT_TRUE(animator->is_animating());
729 EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
730
731 animator->StopAnimatingProperty(LayerAnimationElement::OPACITY);
732
733 EXPECT_FALSE(animator->is_animating());
734 }
735
736 TEST(LayerAnimatorTest, AddObserverExplicit) {
737 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
738 AnimationContainerElement* element = animator.get();
739 animator->set_disable_timer_for_test(true);
740 TestLayerAnimationObserver observer;
741 TestLayerAnimationDelegate delegate;
742 animator->SetDelegate(&delegate);
743 animator->AddObserver(&observer);
744 observer.set_requires_notification_when_animator_destroyed(true);
745
746 EXPECT_TRUE(!observer.last_ended_sequence());
747
748 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
749
750 delegate.SetOpacityFromAnimation(0.0f);
751
752 LayerAnimationSequence* sequence = new LayerAnimationSequence(
753 LayerAnimationElement::CreateOpacityElement(1.0f, delta));
754
755 animator->StartAnimation(sequence);
756
757 EXPECT_EQ(observer.last_scheduled_sequence(), sequence);
758
759 base::TimeTicks start_time = animator->last_step_time();
760
761 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
762
763 EXPECT_EQ(observer.last_ended_sequence(), sequence);
764
765 // |sequence| has been destroyed. Recreate it to test abort.
766 sequence = new LayerAnimationSequence(
767 LayerAnimationElement::CreateOpacityElement(1.0f, delta));
768
769 animator->StartAnimation(sequence);
770
771 animator.reset();
772
773 EXPECT_EQ(observer.last_aborted_sequence(), sequence);
774 }
775
776 // Tests that an observer added to a scoped settings object is still notified
777 // when the object goes out of scope.
778 TEST(LayerAnimatorTest, ImplicitAnimationObservers) {
779 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
780 AnimationContainerElement* element = animator.get();
781 animator->set_disable_timer_for_test(true);
782 TestImplicitAnimationObserver observer(false);
783 TestLayerAnimationDelegate delegate;
784 animator->SetDelegate(&delegate);
785
786 EXPECT_FALSE(observer.animations_completed());
787 animator->SetOpacity(1.0f);
788
789 {
790 ScopedLayerAnimationSettings settings(animator.get());
791 settings.AddObserver(&observer);
792 animator->SetOpacity(0.0f);
793 }
794
795 EXPECT_FALSE(observer.animations_completed());
796 base::TimeTicks start_time = animator->last_step_time();
797 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
798 EXPECT_TRUE(observer.animations_completed());
799 EXPECT_FLOAT_EQ(0.0f, delegate.GetOpacityForAnimation());
800 }
801
802 // Tests that an observer added to a scoped settings object is still notified
803 // when the object goes out of scope due to the animation being interrupted.
804 TEST(LayerAnimatorTest, InterruptedImplicitAnimationObservers) {
805 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
806 animator->set_disable_timer_for_test(true);
807 TestImplicitAnimationObserver observer(false);
808 TestLayerAnimationDelegate delegate;
809 animator->SetDelegate(&delegate);
810
811 EXPECT_FALSE(observer.animations_completed());
812 animator->SetOpacity(1.0f);
813
814 {
815 ScopedLayerAnimationSettings settings(animator.get());
816 settings.AddObserver(&observer);
817 animator->SetOpacity(0.0f);
818 }
819
820 EXPECT_FALSE(observer.animations_completed());
821 // This should interrupt the implicit animation causing the observer to be
822 // notified immediately.
823 animator->SetOpacity(1.0f);
824 EXPECT_TRUE(observer.animations_completed());
825 EXPECT_FLOAT_EQ(1.0f, delegate.GetOpacityForAnimation());
826 }
827
828 // Tests that an observer added to a scoped settings object is not notified
829 // when the animator is destroyed unless explicitly requested.
830 TEST(LayerAnimatorTest, ImplicitObserversAtAnimatorDestruction) {
831 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
832 animator->set_disable_timer_for_test(true);
833 TestImplicitAnimationObserver observer_notify(true);
834 TestImplicitAnimationObserver observer_do_not_notify(false);
835 TestLayerAnimationDelegate delegate;
836 animator->SetDelegate(&delegate);
837
838 EXPECT_FALSE(observer_notify.animations_completed());
839 EXPECT_FALSE(observer_do_not_notify.animations_completed());
840
841 animator->SetOpacity(1.0f);
842
843 {
844 ScopedLayerAnimationSettings settings(animator.get());
845 settings.AddObserver(&observer_notify);
846 settings.AddObserver(&observer_do_not_notify);
847 animator->SetOpacity(0.0f);
848 }
849
850 EXPECT_FALSE(observer_notify.animations_completed());
851 EXPECT_FALSE(observer_do_not_notify.animations_completed());
852 animator.reset(NULL);
853 EXPECT_TRUE(observer_notify.animations_completed());
854 EXPECT_FALSE(observer_do_not_notify.animations_completed());
855 }
856
857
858 TEST(LayerAnimatorTest, RemoveObserverShouldRemoveFromSequences) {
859 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
860 AnimationContainerElement* element = animator.get();
861 animator->set_disable_timer_for_test(true);
862 TestLayerAnimationObserver observer;
863 TestLayerAnimationObserver removed_observer;
864 TestLayerAnimationDelegate delegate;
865 animator->SetDelegate(&delegate);
866
867 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
868
869 LayerAnimationSequence* sequence = new LayerAnimationSequence(
870 LayerAnimationElement::CreateOpacityElement(1.0f, delta));
871
872 sequence->AddObserver(&observer);
873 sequence->AddObserver(&removed_observer);
874
875 animator->StartAnimation(sequence);
876
877 EXPECT_EQ(observer.last_scheduled_sequence(), sequence);
878 EXPECT_TRUE(!observer.last_ended_sequence());
879 EXPECT_EQ(removed_observer.last_scheduled_sequence(), sequence);
880 EXPECT_TRUE(!removed_observer.last_ended_sequence());
881
882 // This should stop the observer from observing sequence.
883 animator->RemoveObserver(&removed_observer);
884
885 base::TimeTicks start_time = animator->last_step_time();
886
887 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
888
889 EXPECT_EQ(observer.last_ended_sequence(), sequence);
890 EXPECT_TRUE(!removed_observer.last_ended_sequence());
891 }
892
893 TEST(LayerAnimatorTest, ObserverReleasedBeforeAnimationSequenceEnds) {
894 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
895 animator->set_disable_timer_for_test(true);
896
897 scoped_ptr<TestLayerAnimationObserver> observer(
898 new TestLayerAnimationObserver);
899 TestLayerAnimationDelegate delegate;
900 animator->SetDelegate(&delegate);
901 animator->AddObserver(observer.get());
902
903 delegate.SetOpacityFromAnimation(0.0f);
904
905 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
906 LayerAnimationSequence* sequence = new LayerAnimationSequence(
907 LayerAnimationElement::CreateOpacityElement(1.0f, delta));
908
909 animator->StartAnimation(sequence);
910
911 // |observer| should be attached to |sequence|.
912 EXPECT_EQ(static_cast<size_t>(1), sequence->observers_.size());
913
914 // Now, release |observer|
915 observer.reset();
916
917 // And |sequence| should no longer be attached to |observer|.
918 EXPECT_EQ(static_cast<size_t>(0), sequence->observers_.size());
919 }
920
921 TEST(LayerAnimatorTest, ObserverAttachedAfterAnimationStarted) {
922 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
923 AnimationContainerElement* element = animator.get();
924 animator->set_disable_timer_for_test(true);
925
926 TestImplicitAnimationObserver observer(false);
927 TestLayerAnimationDelegate delegate;
928 animator->SetDelegate(&delegate);
929
930 delegate.SetOpacityFromAnimation(0.0f);
931
932 {
933 ScopedLayerAnimationSettings setter(animator.get());
934
935 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
936 LayerAnimationSequence* sequence = new LayerAnimationSequence(
937 LayerAnimationElement::CreateOpacityElement(1.0f, delta));
938
939 animator->StartAnimation(sequence);
940 base::TimeTicks start_time = animator->last_step_time();
941 element->Step(start_time + base::TimeDelta::FromMilliseconds(500));
942
943 setter.AddObserver(&observer);
944
945 // Start observing an in-flight animation.
946 sequence->AddObserver(&observer);
947
948 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
949 }
950
951 EXPECT_TRUE(observer.animations_completed());
952 }
953
954 TEST(LayerAnimatorTest, ObserverDetachedBeforeAnimationFinished) {
955 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
956 AnimationContainerElement* element = animator.get();
957 animator->set_disable_timer_for_test(true);
958
959 TestImplicitAnimationObserver observer(false);
960 TestLayerAnimationDelegate delegate;
961 animator->SetDelegate(&delegate);
962
963 delegate.SetOpacityFromAnimation(0.0f);
964 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
965 LayerAnimationSequence* sequence = new LayerAnimationSequence(
966 LayerAnimationElement::CreateOpacityElement(1.0f, delta));
967
968 {
969 ScopedLayerAnimationSettings setter(animator.get());
970 setter.AddObserver(&observer);
971
972 animator->StartAnimation(sequence);
973 base::TimeTicks start_time = animator->last_step_time();
974 element->Step(start_time + base::TimeDelta::FromMilliseconds(500));
975 }
976
977 EXPECT_FALSE(observer.animations_completed());
978
979 // Stop observing an in-flight animation.
980 sequence->RemoveObserver(&observer);
981
982 EXPECT_TRUE(observer.animations_completed());
983 }
984
985 // This checks that if an animation is deleted due to a callback, that the
986 // animator does not try to use the deleted animation. For example, if we have
987 // two running animations, and the first finishes and the resulting callback
988 // causes the second to be deleted, we should not attempt to animate the second
989 // animation.
990 TEST(LayerAnimatorTest, ObserverDeletesAnimations) {
991 LayerAnimator::set_disable_animations_for_test(false);
992 scoped_ptr<LayerAnimator> animator(new TestLayerAnimator());
993 AnimationContainerElement* element = animator.get();
994 animator->set_disable_timer_for_test(true);
995 TestLayerAnimationDelegate delegate;
996 animator->SetDelegate(&delegate);
997
998 double start_opacity(0.0);
999 double target_opacity(1.0);
1000
1001 gfx::Rect start_bounds(0, 0, 50, 50);
1002 gfx::Rect target_bounds(5, 5, 5, 5);
1003
1004 delegate.SetOpacityFromAnimation(start_opacity);
1005 delegate.SetBoundsFromAnimation(start_bounds);
1006
1007 base::TimeDelta opacity_delta = base::TimeDelta::FromSeconds(1);
1008 base::TimeDelta halfway_delta = base::TimeDelta::FromSeconds(2);
1009 base::TimeDelta bounds_delta = base::TimeDelta::FromSeconds(3);
1010
1011 LayerAnimationSequence* to_delete = new LayerAnimationSequence(
1012 LayerAnimationElement::CreateBoundsElement(target_bounds, bounds_delta));
1013
1014 scoped_ptr<DeletingLayerAnimationObserver> observer(
1015 new DeletingLayerAnimationObserver(animator.get(), to_delete));
1016
1017 animator->AddObserver(observer.get());
1018
1019 animator->StartAnimation(
1020 new LayerAnimationSequence(
1021 LayerAnimationElement::CreateOpacityElement(
1022 target_opacity, opacity_delta)));
1023
1024 animator->StartAnimation(to_delete);
1025
1026 base::TimeTicks start_time = animator->last_step_time();
1027 element->Step(start_time + halfway_delta);
1028
1029 animator->RemoveObserver(observer.get());
1030 }
1031
1032 // Check that setting a property during an animation with a default animator
1033 // cancels the original animation.
1034 TEST(LayerAnimatorTest, SettingPropertyDuringAnAnimation) {
1035 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1036 animator->set_disable_timer_for_test(true);
1037 TestLayerAnimationDelegate delegate;
1038 animator->SetDelegate(&delegate);
1039
1040 double start_opacity(0.0);
1041 double target_opacity(1.0);
1042
1043 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1044
1045 delegate.SetOpacityFromAnimation(start_opacity);
1046
1047 scoped_ptr<LayerAnimationSequence> sequence(
1048 new LayerAnimationSequence(
1049 LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
1050
1051 animator->StartAnimation(sequence.release());
1052
1053 animator->SetOpacity(0.5);
1054
1055 EXPECT_FALSE(animator->is_animating());
1056 EXPECT_EQ(0.5, animator->GetTargetOpacity());
1057 }
1058
1059 // Tests that the preemption mode IMMEDIATELY_SET_NEW_TARGET, doesn't cause the
1060 // second sequence to be leaked.
1061 TEST(LayerAnimatorTest, ImmediatelySettingNewTargetDoesNotLeak) {
1062 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1063 animator->set_preemption_strategy(LayerAnimator::IMMEDIATELY_SET_NEW_TARGET);
1064 animator->set_disable_timer_for_test(true);
1065 TestLayerAnimationDelegate delegate;
1066 animator->SetDelegate(&delegate);
1067
1068 gfx::Rect start_bounds(0, 0, 50, 50);
1069 gfx::Rect middle_bounds(10, 10, 100, 100);
1070 gfx::Rect target_bounds(5, 5, 5, 5);
1071
1072 delegate.SetBoundsFromAnimation(start_bounds);
1073
1074 {
1075 // start an implicit bounds animation.
1076 ScopedLayerAnimationSettings settings(animator.get());
1077 animator->SetBounds(middle_bounds);
1078 }
1079
1080 EXPECT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
1081
1082 int num_live_instances = 0;
1083 base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1084 scoped_ptr<TestLayerAnimationSequence> sequence(
1085 new TestLayerAnimationSequence(
1086 LayerAnimationElement::CreateBoundsElement(target_bounds, delta),
1087 &num_live_instances));
1088
1089 EXPECT_EQ(1, num_live_instances);
1090
1091 // This should interrupt the running sequence causing us to immediately set
1092 // the target value. The sequence should alse be destructed.
1093 animator->StartAnimation(sequence.release());
1094
1095 EXPECT_FALSE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
1096 EXPECT_EQ(0, num_live_instances);
1097 CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
1098 }
1099
1100 // Verifies GetTargetOpacity() works when multiple sequences are scheduled.
1101 TEST(LayerAnimatorTest, GetTargetOpacity) {
1102 scoped_ptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
1103 animator->set_preemption_strategy(LayerAnimator::ENQUEUE_NEW_ANIMATION);
1104 animator->set_disable_timer_for_test(true);
1105 TestLayerAnimationDelegate delegate;
1106 animator->SetDelegate(&delegate);
1107
1108 delegate.SetOpacityFromAnimation(0.0);
1109
1110 {
1111 ScopedLayerAnimationSettings settings(animator.get());
1112 animator->SetOpacity(0.5);
1113 EXPECT_EQ(0.5, animator->GetTargetOpacity());
1114
1115 // Because the strategy is ENQUEUE_NEW_ANIMATION the target should now be 1.
1116 animator->SetOpacity(1.0);
1117 EXPECT_EQ(1.0, animator->GetTargetOpacity());
1118 }
1119 }
1120
1121 } // namespace ui
OLDNEW
« no previous file with comments | « ui/gfx/compositor/layer_animator.cc ('k') | ui/gfx/compositor/layer_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698