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

Unified Diff: ui/compositor/layer_animator_unittest.cc

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/compositor/layer_animator_collection.cc ('k') | ui/compositor/layer_delegate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/compositor/layer_animator_unittest.cc
diff --git a/ui/compositor/layer_animator_unittest.cc b/ui/compositor/layer_animator_unittest.cc
deleted file mode 100644
index ad4ff618ab957c964924aa35ca743f4ac3b8067d..0000000000000000000000000000000000000000
--- a/ui/compositor/layer_animator_unittest.cc
+++ /dev/null
@@ -1,2623 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/compositor/layer_animator.h"
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/strings/stringprintf.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/compositor/layer.h"
-#include "ui/compositor/layer_animation_delegate.h"
-#include "ui/compositor/layer_animation_element.h"
-#include "ui/compositor/layer_animation_sequence.h"
-#include "ui/compositor/layer_animator_collection.h"
-#include "ui/compositor/scoped_animation_duration_scale_mode.h"
-#include "ui/compositor/scoped_layer_animation_settings.h"
-#include "ui/compositor/test/context_factories_for_test.h"
-#include "ui/compositor/test/layer_animator_test_controller.h"
-#include "ui/compositor/test/test_compositor_host.h"
-#include "ui/compositor/test/test_layer_animation_delegate.h"
-#include "ui/compositor/test/test_layer_animation_observer.h"
-#include "ui/compositor/test/test_utils.h"
-#include "ui/gfx/frame_time.h"
-#include "ui/gfx/rect.h"
-#include "ui/gfx/transform.h"
-
-namespace ui {
-
-namespace {
-
-// Converts |color| to a string. Each component of the color is separated by a
-// space and the order if A R G B.
-std::string ColorToString(SkColor color) {
- return base::StringPrintf("%d %d %d %d", SkColorGetA(color),
- SkColorGetR(color), SkColorGetG(color),
- SkColorGetB(color));
-}
-
-// Creates vector with two LayerAnimationSequences, based on |first| and
-// |second| layer animation elements.
-std::vector<LayerAnimationSequence*> CreateMultiSequence(
- LayerAnimationElement* first,
- LayerAnimationElement* second) {
- LayerAnimationSequence* first_sequence = new LayerAnimationSequence();
- first_sequence->AddElement(first);
- LayerAnimationSequence* second_sequence = new LayerAnimationSequence();
- second_sequence->AddElement(second);
-
- std::vector<ui::LayerAnimationSequence*> animations;
- animations.push_back(first_sequence);
- animations.push_back(second_sequence);
- return animations;
-}
-
-class TestImplicitAnimationObserver : public ImplicitAnimationObserver {
- public:
- explicit TestImplicitAnimationObserver(bool notify_when_animator_destructed)
- : animations_completed_(false),
- notify_when_animator_destructed_(notify_when_animator_destructed) {
- }
-
- bool animations_completed() const { return animations_completed_; }
- void set_animations_completed(bool completed) {
- animations_completed_ = completed;
- }
-
- bool WasAnimationAbortedForProperty(
- LayerAnimationElement::AnimatableProperty property) const {
- return ImplicitAnimationObserver::WasAnimationAbortedForProperty(property);
- }
-
- bool WasAnimationCompletedForProperty(
- LayerAnimationElement::AnimatableProperty property) const {
- return ImplicitAnimationObserver::WasAnimationCompletedForProperty(
- property);
- }
-
- private:
- // ImplicitAnimationObserver implementation
- virtual void OnImplicitAnimationsCompleted() override {
- animations_completed_ = true;
- }
-
- virtual bool RequiresNotificationWhenAnimatorDestroyed() const override {
- return notify_when_animator_destructed_;
- }
-
- bool animations_completed_;
- bool notify_when_animator_destructed_;
-
- DISALLOW_COPY_AND_ASSIGN(TestImplicitAnimationObserver);
-};
-
-// When notified that an animation has ended, stops all other animations.
-class DeletingLayerAnimationObserver : public LayerAnimationObserver {
- public:
- DeletingLayerAnimationObserver(LayerAnimator* animator)
- : animator_(animator) {
- }
-
- virtual void OnLayerAnimationEnded(
- LayerAnimationSequence* sequence) override {
- animator_->StopAnimating();
- }
-
- virtual void OnLayerAnimationAborted(
- LayerAnimationSequence* sequence) override {
- animator_->StopAnimating();
- }
-
- virtual void OnLayerAnimationScheduled(
- LayerAnimationSequence* sequence) override {
- }
-
- private:
- LayerAnimator* animator_;
-
- DISALLOW_COPY_AND_ASSIGN(DeletingLayerAnimationObserver);
-};
-
-class LayerAnimatorDestructionObserver {
- public:
- LayerAnimatorDestructionObserver() : animator_deleted_(false) {}
- virtual ~LayerAnimatorDestructionObserver() {}
-
- void NotifyAnimatorDeleted() {
- animator_deleted_ = true;
- }
-
- bool IsAnimatorDeleted() {
- return animator_deleted_;
- }
-
- private:
- bool animator_deleted_;
-
- DISALLOW_COPY_AND_ASSIGN(LayerAnimatorDestructionObserver);
-};
-
-class TestLayerAnimator : public LayerAnimator {
- public:
- TestLayerAnimator() : LayerAnimator(base::TimeDelta::FromSeconds(0)),
- destruction_observer_(NULL) {}
-
- void SetDestructionObserver(
- LayerAnimatorDestructionObserver* observer) {
- destruction_observer_ = observer;
- }
-
- protected:
- virtual ~TestLayerAnimator() {
- if (destruction_observer_) {
- destruction_observer_->NotifyAnimatorDeleted();
- }
- }
-
- virtual void ProgressAnimation(LayerAnimationSequence* sequence,
- base::TimeTicks now) override {
- EXPECT_TRUE(HasAnimation(sequence));
- LayerAnimator::ProgressAnimation(sequence, now);
- }
-
- private:
- LayerAnimatorDestructionObserver* destruction_observer_;
-
- DISALLOW_COPY_AND_ASSIGN(TestLayerAnimator);
-};
-
-// The test layer animation sequence updates a live instances count when it is
-// created and destroyed.
-class TestLayerAnimationSequence : public LayerAnimationSequence {
- public:
- TestLayerAnimationSequence(LayerAnimationElement* element,
- int* num_live_instances)
- : LayerAnimationSequence(element),
- num_live_instances_(num_live_instances) {
- (*num_live_instances_)++;
- }
-
- virtual ~TestLayerAnimationSequence() {
- (*num_live_instances_)--;
- }
-
- private:
- int* num_live_instances_;
-
- DISALLOW_COPY_AND_ASSIGN(TestLayerAnimationSequence);
-};
-
-} // namespace
-
-// Checks that setting a property on an implicit animator causes an animation to
-// happen.
-TEST(LayerAnimatorTest, ImplicitAnimation) {
- scoped_refptr<LayerAnimator> animator(
- LayerAnimator::CreateImplicitAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
- base::TimeTicks now = gfx::FrameTime::Now();
- animator->SetBrightness(0.5);
- EXPECT_TRUE(animator->is_animating());
- animator->Step(now + base::TimeDelta::FromSeconds(1));
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), 0.5);
-}
-
-// Checks that if the animator is a default animator, that implicit animations
-// are not started.
-TEST(LayerAnimatorTest, NoImplicitAnimation) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
- animator->SetBrightness(0.5);
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), 0.5);
-}
-
-// Checks that StopAnimatingProperty stops animation for that property, and also
-// skips the stopped animation to the end.
-TEST(LayerAnimatorTest, StopAnimatingProperty) {
- scoped_refptr<LayerAnimator> animator(
- LayerAnimator::CreateImplicitAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
- double target_opacity(0.5);
- gfx::Rect target_bounds(0, 0, 50, 50);
- animator->SetOpacity(target_opacity);
- animator->SetBounds(target_bounds);
- animator->StopAnimatingProperty(LayerAnimationElement::OPACITY);
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), 0.5);
- animator->StopAnimatingProperty(LayerAnimationElement::BOUNDS);
- EXPECT_FALSE(animator->is_animating());
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
-}
-
-// Checks that multiple running animation for separate properties can be stopped
-// simultaneously and that all animations are advanced to their target values.
-TEST(LayerAnimatorTest, StopAnimating) {
- scoped_refptr<LayerAnimator> animator(
- LayerAnimator::CreateImplicitAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
- double target_opacity(0.5);
- gfx::Rect target_bounds(0, 0, 50, 50);
- animator->SetOpacity(target_opacity);
- animator->SetBounds(target_bounds);
- EXPECT_TRUE(animator->is_animating());
- animator->StopAnimating();
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), 0.5);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
-}
-
-// Checks that multiple running animation for separate properties can be stopped
-// simultaneously and that all animations are advanced to their target values.
-TEST(LayerAnimatorTest, AbortAllAnimations) {
- scoped_refptr<LayerAnimator> animator(
- LayerAnimator::CreateImplicitAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- double initial_opacity(1.0);
- gfx::Rect initial_bounds(0, 0, 10, 10);
- delegate.SetOpacityFromAnimation(initial_opacity);
- delegate.SetBoundsFromAnimation(initial_bounds);
- animator->SetDelegate(&delegate);
- double target_opacity(0.5);
- gfx::Rect target_bounds(0, 0, 50, 50);
- animator->SetOpacity(target_opacity);
- animator->SetBounds(target_bounds);
- EXPECT_TRUE(animator->is_animating());
- animator->AbortAllAnimations();
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(initial_opacity, delegate.GetOpacityForAnimation());
- CheckApproximatelyEqual(initial_bounds, delegate.GetBoundsForAnimation());
-}
-
-// Schedule a non-threaded animation that can run immediately. This is the
-// trivial case and should result in the animation being started immediately.
-TEST(LayerAnimatorTest, ScheduleAnimationThatCanRunImmediately) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_brightness(0.0);
- double middle_brightness(0.5);
- double target_brightness(1.0);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetBrightnessFromAnimation(start_brightness);
-
- animator->ScheduleAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(target_brightness,
- delta)));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
-}
-
-// Schedule a threaded animation that can run immediately.
-TEST(LayerAnimatorTest, ScheduleThreadedAnimationThatCanRunImmediately) {
- double epsilon = 0.00001;
- LayerAnimatorTestController test_controller(
- LayerAnimator::CreateDefaultAnimator());
- LayerAnimator* animator = test_controller.animator();
- test_controller.animator()->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- test_controller.animator()->SetDelegate(&delegate);
-
- double start_opacity(0.0);
- double target_opacity(1.0);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetOpacityFromAnimation(start_opacity);
-
- test_controller.animator()->ScheduleAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
-
- base::TimeTicks start_time = test_controller.animator()->last_step_time();
- base::TimeTicks effective_start = start_time + delta;
-
- test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
- cc::AnimationEvent::Started,
- 0,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
- ->animation_group_id(),
- cc::Animation::Opacity,
- effective_start));
-
- animator->Step(effective_start + delta / 2);
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_NEAR(
- 0.5,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)->
- last_progressed_fraction(),
- epsilon);
-
- animator->Step(effective_start + delta);
-
- EXPECT_FALSE(test_controller.animator()->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
-}
-
-// Schedule two non-threaded animations on separate properties. Both animations
-// should start immediately and should progress in lock step.
-TEST(LayerAnimatorTest, ScheduleTwoAnimationsThatCanRunImmediately) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_brightness(0.0);
- double middle_brightness(0.5);
- double target_brightness(1.0);
-
- gfx::Rect start_bounds, target_bounds, middle_bounds;
- start_bounds = target_bounds = middle_bounds = gfx::Rect(0, 0, 50, 50);
- start_bounds.set_x(-90);
- target_bounds.set_x(90);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetBrightnessFromAnimation(start_brightness);
- delegate.SetBoundsFromAnimation(start_bounds);
-
- animator->ScheduleAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(target_brightness,
- delta)));
-
- animator->ScheduleAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBoundsElement(target_bounds, delta)));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), middle_bounds);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
-}
-
-// Schedule a threaded and a non-threaded animation on separate properties. Both
-// animations should progress in lock step.
-TEST(LayerAnimatorTest, ScheduleThreadedAndNonThreadedAnimations) {
- double epsilon = 0.00001;
- LayerAnimatorTestController test_controller(
- LayerAnimator::CreateDefaultAnimator());
- LayerAnimator* animator = test_controller.animator();
- test_controller.animator()->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- test_controller.animator()->SetDelegate(&delegate);
-
- double start_opacity(0.0);
- double target_opacity(1.0);
-
- gfx::Rect start_bounds, target_bounds, middle_bounds;
- start_bounds = target_bounds = middle_bounds = gfx::Rect(0, 0, 50, 50);
- start_bounds.set_x(-90);
- target_bounds.set_x(90);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetOpacityFromAnimation(start_opacity);
- delegate.SetBoundsFromAnimation(start_bounds);
-
- std::vector<LayerAnimationSequence*> animations;
- animations.push_back(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
-
- animations.push_back(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBoundsElement(target_bounds, delta)));
-
- test_controller.animator()->ScheduleTogether(animations);
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
-
- base::TimeTicks start_time = test_controller.animator()->last_step_time();
- base::TimeTicks effective_start = start_time + delta;
-
- test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
- cc::AnimationEvent::Started,
- 0,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
- ->animation_group_id(),
- cc::Animation::Opacity,
- effective_start));
-
- animator->Step(effective_start + delta / 2);
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_NEAR(
- 0.5,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)->
- last_progressed_fraction(),
- epsilon);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), middle_bounds);
-
- animator->Step(effective_start + delta);
-
- EXPECT_FALSE(test_controller.animator()->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
-}
-
-// Schedule two animations on the same property. In this case, the two
-// animations should run one after another.
-TEST(LayerAnimatorTest, ScheduleTwoAnimationsOnSameProperty) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_brightness(0.0);
- double middle_brightness(0.5);
- double target_brightness(1.0);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetBrightnessFromAnimation(start_brightness);
-
- animator->ScheduleAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(target_brightness,
- delta)));
-
- animator->ScheduleAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(start_brightness,
- delta)));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
-}
-
-// Schedule [{g}, {g,b}, {b}] and ensure that {b} doesn't run right away. That
-// is, ensure that all animations targetting a particular property are run in
-// order.
-TEST(LayerAnimatorTest, ScheduleBlockedAnimation) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_grayscale(0.0);
- double middle_grayscale(0.5);
- double target_grayscale(1.0);
-
- gfx::Rect start_bounds, target_bounds, middle_bounds;
- start_bounds = target_bounds = middle_bounds = gfx::Rect(0, 0, 50, 50);
- start_bounds.set_x(-90);
- target_bounds.set_x(90);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetGrayscaleFromAnimation(start_grayscale);
- delegate.SetBoundsFromAnimation(start_bounds);
-
- animator->ScheduleAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateGrayscaleElement(target_grayscale,
- delta)));
-
- scoped_ptr<LayerAnimationSequence> bounds_and_grayscale(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateGrayscaleElement(start_grayscale,
- delta)));
-
- bounds_and_grayscale->AddElement(
- LayerAnimationElement::CreateBoundsElement(target_bounds, delta));
-
- animator->ScheduleAnimation(bounds_and_grayscale.release());
-
- animator->ScheduleAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBoundsElement(start_bounds, delta)));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), middle_grayscale);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), target_grayscale);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(3000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(4000));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
-}
-
-// Schedule {g} and then schedule {g} and {b} together. In this case, since
-// ScheduleTogether is being used, the bounds animation should not start until
-// the second grayscale animation starts.
-TEST(LayerAnimatorTest, ScheduleTogether) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_grayscale(0.0);
- double target_grayscale(1.0);
-
- gfx::Rect start_bounds, target_bounds, middle_bounds;
- start_bounds = target_bounds = gfx::Rect(0, 0, 50, 50);
- start_bounds.set_x(-90);
- target_bounds.set_x(90);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetGrayscaleFromAnimation(start_grayscale);
- delegate.SetBoundsFromAnimation(start_bounds);
-
- animator->ScheduleAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateGrayscaleElement(target_grayscale,
- delta)));
-
- std::vector<LayerAnimationSequence*> sequences;
- sequences.push_back(new LayerAnimationSequence(
- LayerAnimationElement::CreateGrayscaleElement(start_grayscale, delta)));
- sequences.push_back(new LayerAnimationSequence(
- LayerAnimationElement::CreateBoundsElement(target_bounds, delta)));
-
- animator->ScheduleTogether(sequences);
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), target_grayscale);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), start_bounds);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
-}
-
-// Start non-threaded animation (that can run immediately). This is the trivial
-// case (see the trival case for ScheduleAnimation).
-TEST(LayerAnimatorTest, StartAnimationThatCanRunImmediately) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_brightness(0.0);
- double middle_brightness(0.5);
- double target_brightness(1.0);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetBrightnessFromAnimation(start_brightness);
-
- animator->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(target_brightness,
- delta)));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
-}
-
-// Start threaded animation (that can run immediately).
-TEST(LayerAnimatorTest, StartThreadedAnimationThatCanRunImmediately) {
- double epsilon = 0.00001;
- LayerAnimatorTestController test_controller(
- LayerAnimator::CreateDefaultAnimator());
- LayerAnimator* animator = test_controller.animator();
- test_controller.animator()->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- test_controller.animator()->SetDelegate(&delegate);
-
- double start_opacity(0.0);
- double target_opacity(1.0);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetOpacityFromAnimation(start_opacity);
-
- test_controller.animator()->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
-
- base::TimeTicks start_time = test_controller.animator()->last_step_time();
- base::TimeTicks effective_start = start_time + delta;
-
- test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
- cc::AnimationEvent::Started,
- 0,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
- ->animation_group_id(),
- cc::Animation::Opacity,
- effective_start));
-
- animator->Step(effective_start + delta / 2);
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_NEAR(
- 0.5,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)->
- last_progressed_fraction(),
- epsilon);
-
- animator->Step(effective_start + delta);
- EXPECT_FALSE(test_controller.animator()->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
-}
-
-// Preempt by immediately setting new target.
-TEST(LayerAnimatorTest, PreemptBySettingNewTarget) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_opacity(0.0);
- double target_opacity(1.0);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetOpacityFromAnimation(start_opacity);
-
- animator->set_preemption_strategy(LayerAnimator::IMMEDIATELY_SET_NEW_TARGET);
-
- animator->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
-
- animator->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(start_opacity, delta)));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
-}
-
-// Preempt by animating to new target, with a non-threaded animation.
-TEST(LayerAnimatorTest, PreemptByImmediatelyAnimatingToNewTarget) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_brightness(0.0);
- double middle_brightness(0.5);
- double target_brightness(1.0);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetBrightnessFromAnimation(start_brightness);
-
- animator->set_preemption_strategy(
- LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
-
- animator->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(target_brightness,
- delta)));
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
-
- animator->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(start_brightness,
- delta)));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
-
- animator->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(start_brightness,
- delta)));
-
- EXPECT_TRUE(animator->is_animating());
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(),
- 0.5 * (start_brightness + middle_brightness));
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
-}
-
-// Preempt by animating to new target, with a threaded animation.
-TEST(LayerAnimatorTest, PreemptThreadedByImmediatelyAnimatingToNewTarget) {
- double epsilon = 0.00001;
- LayerAnimatorTestController test_controller(
- LayerAnimator::CreateDefaultAnimator());
- LayerAnimator* animator = test_controller.animator();
- test_controller.animator()->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- test_controller.animator()->SetDelegate(&delegate);
-
- double start_opacity(0.0);
- double middle_opacity(0.5);
- double target_opacity(1.0);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetOpacityFromAnimation(start_opacity);
-
- test_controller.animator()->set_preemption_strategy(
- LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
-
- test_controller.animator()->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
-
- base::TimeTicks start_time = test_controller.animator()->last_step_time();
- base::TimeTicks effective_start = start_time + delta;
-
- test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
- cc::AnimationEvent::Started,
- 0,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
- ->animation_group_id(),
- cc::Animation::Opacity,
- effective_start));
-
- animator->Step(effective_start + delta / 2);
-
- test_controller.animator()->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(start_opacity, delta)));
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_NEAR(delegate.GetOpacityForAnimation(), middle_opacity, epsilon);
-
- test_controller.animator()->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(start_opacity, delta)));
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
-
- base::TimeTicks second_effective_start = effective_start + delta;
-
- test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
- cc::AnimationEvent::Started,
- 0,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
- ->animation_group_id(),
- cc::Animation::Opacity,
- second_effective_start));
-
- animator->Step(second_effective_start + delta / 2);
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_NEAR(
- 0.5,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)->
- last_progressed_fraction(),
- epsilon);
-
- animator->Step(second_effective_start + delta);
-
- EXPECT_FALSE(test_controller.animator()->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
-}
-
-// Preempt by enqueuing the new animation.
-TEST(LayerAnimatorTest, PreemptEnqueueNewAnimation) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_brightness(0.0);
- double middle_brightness(0.5);
- double target_brightness(1.0);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetBrightnessFromAnimation(start_brightness);
-
- animator->set_preemption_strategy(LayerAnimator::ENQUEUE_NEW_ANIMATION);
-
- animator->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(target_brightness,
- delta)));
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
-
- animator->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(start_brightness,
- delta)));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
-
- EXPECT_TRUE(animator->is_animating());
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
-}
-
-// Start an animation when there are sequences waiting in the queue. In this
-// case, all pending and running animations should be finished, and the new
-// animation started.
-TEST(LayerAnimatorTest, PreemptyByReplacingQueuedAnimations) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_brightness(0.0);
- double middle_brightness(0.5);
- double target_brightness(1.0);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetBrightnessFromAnimation(start_brightness);
-
- animator->set_preemption_strategy(LayerAnimator::REPLACE_QUEUED_ANIMATIONS);
-
- animator->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(target_brightness,
- delta)));
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
-
- animator->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(middle_brightness,
- delta)));
-
- // Queue should now have two animations. Starting a third should replace the
- // second.
- animator->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(start_brightness,
- delta)));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
-}
-
-TEST(LayerAnimatorTest, StartTogetherSetsLastStepTime) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_grayscale(0.0);
- double target_grayscale(1.0);
- double start_brightness(0.1);
- double target_brightness(0.9);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetGrayscaleFromAnimation(start_grayscale);
- delegate.SetBrightnessFromAnimation(start_brightness);
-
- animator->set_preemption_strategy(
- LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
-
- animator->set_last_step_time(base::TimeTicks());
-
- animator->StartTogether(
- CreateMultiSequence(
- LayerAnimationElement::CreateGrayscaleElement(target_grayscale,
- delta),
- LayerAnimationElement::CreateBrightnessElement(target_brightness,
- delta)
- ));
-
- // If last step time was not set correctly, the resulting delta should be
- // miniscule (fractions of a millisecond). If set correctly, then the delta
- // should be enormous. Arbitrarily choosing 1 minute as the threshold,
- // though a much smaller value would probably have sufficed.
- delta = gfx::FrameTime::Now() - animator->last_step_time();
- EXPECT_GT(60.0, delta.InSecondsF());
-}
-
-//-------------------------------------------------------
-// Preempt by immediately setting new target.
-TEST(LayerAnimatorTest, MultiPreemptBySettingNewTarget) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_opacity(0.0);
- double target_opacity(1.0);
- double start_brightness(0.1);
- double target_brightness(0.9);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetOpacityFromAnimation(start_opacity);
- delegate.SetBrightnessFromAnimation(start_brightness);
-
- animator->set_preemption_strategy(LayerAnimator::IMMEDIATELY_SET_NEW_TARGET);
-
- animator->StartTogether(
- CreateMultiSequence(
- LayerAnimationElement::CreateOpacityElement(target_opacity, delta),
- LayerAnimationElement::CreateBrightnessElement(target_brightness,
- delta)
- ));
-
- animator->StartTogether(
- CreateMultiSequence(
- LayerAnimationElement::CreateOpacityElement(start_opacity, delta),
- LayerAnimationElement::CreateBrightnessElement(start_brightness,
- delta)
- ));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
-}
-
-// Preempt by animating to new target.
-TEST(LayerAnimatorTest, MultiPreemptByImmediatelyAnimatingToNewTarget) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_grayscale(0.0);
- double middle_grayscale(0.5);
- double target_grayscale(1.0);
-
- double start_brightness(0.1);
- double middle_brightness(0.2);
- double target_brightness(0.3);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetGrayscaleFromAnimation(start_grayscale);
- delegate.SetBrightnessFromAnimation(start_brightness);
-
- animator->set_preemption_strategy(
- LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
-
- animator->StartTogether(
- CreateMultiSequence(
- LayerAnimationElement::CreateGrayscaleElement(target_grayscale,
- delta),
- LayerAnimationElement::CreateBrightnessElement(target_brightness,
- delta)
- ));
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
-
- animator->StartTogether(
- CreateMultiSequence(
- LayerAnimationElement::CreateGrayscaleElement(start_grayscale, delta),
- LayerAnimationElement::CreateBrightnessElement(start_brightness,
- delta)));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), middle_grayscale);
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
-
- animator->StartTogether(
- CreateMultiSequence(
- LayerAnimationElement::CreateGrayscaleElement(start_grayscale, delta),
- LayerAnimationElement::CreateBrightnessElement(start_brightness,
- delta)));
-
- EXPECT_TRUE(animator->is_animating());
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(),
- 0.5 * (start_grayscale + middle_grayscale));
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(),
- 0.5 * (start_brightness + middle_brightness));
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
-}
-
-// Preempt a threaded animation by animating to new target.
-TEST(LayerAnimatorTest, MultiPreemptThreadedByImmediatelyAnimatingToNewTarget) {
- double epsilon = 0.00001;
- LayerAnimatorTestController test_controller(
- LayerAnimator::CreateDefaultAnimator());
- LayerAnimator* animator = test_controller.animator();
- test_controller.animator()->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- test_controller.animator()->SetDelegate(&delegate);
-
- double start_opacity(0.0);
- double middle_opacity(0.5);
- double target_opacity(1.0);
-
- double start_brightness(0.1);
- double middle_brightness(0.2);
- double target_brightness(0.3);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetOpacityFromAnimation(start_opacity);
- delegate.SetBrightnessFromAnimation(start_brightness);
-
- test_controller.animator()->set_preemption_strategy(
- LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
-
- test_controller.animator()->StartTogether(
- CreateMultiSequence(
- LayerAnimationElement::CreateOpacityElement(target_opacity, delta),
- LayerAnimationElement::CreateBrightnessElement(target_brightness,
- delta)
- ));
-
- base::TimeTicks start_time = test_controller.animator()->last_step_time();
- base::TimeTicks effective_start = start_time + delta;
-
- test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
- cc::AnimationEvent::Started,
- 0,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
- ->animation_group_id(),
- cc::Animation::Opacity,
- effective_start));
-
- animator->Step(effective_start + delta / 2);
-
- test_controller.animator()->StartTogether(
- CreateMultiSequence(
- LayerAnimationElement::CreateOpacityElement(start_opacity, delta),
- LayerAnimationElement::CreateBrightnessElement(start_brightness,
- delta)));
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_NEAR(delegate.GetOpacityForAnimation(), middle_opacity, epsilon);
- EXPECT_NEAR(delegate.GetBrightnessForAnimation(), middle_brightness, epsilon);
-
- test_controller.animator()->StartTogether(
- CreateMultiSequence(
- LayerAnimationElement::CreateOpacityElement(start_opacity, delta),
- LayerAnimationElement::CreateBrightnessElement(start_brightness,
- delta)));
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
-
- base::TimeTicks second_effective_start = effective_start + delta;
-
- test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
- cc::AnimationEvent::Started,
- 0,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
- ->animation_group_id(),
- cc::Animation::Opacity,
- second_effective_start));
-
- animator->Step(second_effective_start + delta / 2);
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_NEAR(
- 0.5,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)->
- last_progressed_fraction(),
- epsilon);
- EXPECT_NEAR(delegate.GetBrightnessForAnimation(),
- 0.5 * (start_brightness + middle_brightness),
- epsilon);
-
- animator->Step(second_effective_start + delta);
-
- EXPECT_FALSE(test_controller.animator()->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
-}
-
-// Preempt by enqueuing the new animation.
-TEST(LayerAnimatorTest, MultiPreemptEnqueueNewAnimation) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_grayscale(0.0);
- double middle_grayscale(0.5);
- double target_grayscale(1.0);
-
- double start_brightness(0.1);
- double middle_brightness(0.2);
- double target_brightness(0.3);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetGrayscaleFromAnimation(start_grayscale);
- delegate.SetBrightnessFromAnimation(start_brightness);
-
- animator->set_preemption_strategy(LayerAnimator::ENQUEUE_NEW_ANIMATION);
-
- animator->StartTogether(
- CreateMultiSequence(
- LayerAnimationElement::CreateGrayscaleElement(target_grayscale,
- delta),
- LayerAnimationElement::CreateBrightnessElement(target_brightness,
- delta)));
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
-
- animator->StartTogether(
- CreateMultiSequence(
- LayerAnimationElement::CreateGrayscaleElement(start_grayscale, delta),
- LayerAnimationElement::CreateBrightnessElement(start_brightness,
- delta)));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), middle_grayscale);
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
-
- EXPECT_TRUE(animator->is_animating());
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), target_grayscale);
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), middle_grayscale);
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
-}
-
-// Start an animation when there are sequences waiting in the queue. In this
-// case, all pending and running animations should be finished, and the new
-// animation started.
-TEST(LayerAnimatorTest, MultiPreemptByReplacingQueuedAnimations) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_grayscale(0.0);
- double middle_grayscale(0.5);
- double target_grayscale(1.0);
-
- double start_brightness(0.1);
- double middle_brightness(0.2);
- double target_brightness(0.3);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetGrayscaleFromAnimation(start_grayscale);
- delegate.SetBrightnessFromAnimation(start_brightness);
-
- animator->set_preemption_strategy(LayerAnimator::REPLACE_QUEUED_ANIMATIONS);
-
- animator->StartTogether(
- CreateMultiSequence(
- LayerAnimationElement::CreateGrayscaleElement(target_grayscale,
- delta),
- LayerAnimationElement::CreateBrightnessElement(target_brightness,
- delta)));
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
-
- animator->StartTogether(
- CreateMultiSequence(
- LayerAnimationElement::CreateGrayscaleElement(middle_grayscale,
- delta),
- LayerAnimationElement::CreateBrightnessElement(middle_brightness,
- delta)));
-
- // Queue should now have two animations. Starting a third should replace the
- // second.
- animator->StartTogether(
- CreateMultiSequence(
- LayerAnimationElement::CreateGrayscaleElement(start_grayscale, delta),
- LayerAnimationElement::CreateBrightnessElement(start_brightness,
- delta)));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), middle_grayscale);
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), target_grayscale);
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), middle_grayscale);
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), middle_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), start_grayscale);
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
-}
-//-------------------------------------------------------
-// Test that non-threaded cyclic sequences continue to animate.
-TEST(LayerAnimatorTest, CyclicSequences) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_brightness(0.0);
- double target_brightness(1.0);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetBrightnessFromAnimation(start_brightness);
-
- scoped_ptr<LayerAnimationSequence> sequence(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(target_brightness,
- delta)));
-
- sequence->AddElement(
- LayerAnimationElement::CreateBrightnessElement(start_brightness, delta));
-
- sequence->set_is_cyclic(true);
-
- animator->StartAnimation(sequence.release());
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(2000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(3000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
-
- // Skip ahead by a lot.
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000000000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), start_brightness);
-
- // Skip ahead by a lot.
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000001000));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), target_brightness);
-
- animator->StopAnimatingProperty(LayerAnimationElement::BRIGHTNESS);
-
- EXPECT_FALSE(animator->is_animating());
-}
-
-// Test that threaded cyclic sequences continue to animate.
-TEST(LayerAnimatorTest, ThreadedCyclicSequences) {
- LayerAnimatorTestController test_controller(
- LayerAnimator::CreateDefaultAnimator());
- LayerAnimator* animator = test_controller.animator();
- test_controller.animator()->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- test_controller.animator()->SetDelegate(&delegate);
-
- double start_opacity(0.0);
- double target_opacity(1.0);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetOpacityFromAnimation(start_opacity);
-
- scoped_ptr<LayerAnimationSequence> sequence(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
-
- sequence->AddElement(
- LayerAnimationElement::CreateOpacityElement(start_opacity, delta));
-
- sequence->set_is_cyclic(true);
-
- test_controller.animator()->StartAnimation(sequence.release());
-
- base::TimeTicks start_time = test_controller.animator()->last_step_time();
- base::TimeTicks effective_start = start_time + delta;
-
- test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
- cc::AnimationEvent::Started,
- 0,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
- ->animation_group_id(),
- cc::Animation::Opacity,
- effective_start));
-
- animator->Step(effective_start + delta);
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
-
- base::TimeTicks second_effective_start = effective_start + 2 * delta;
- test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
- cc::AnimationEvent::Started,
- 0,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
- ->animation_group_id(),
- cc::Animation::Opacity,
- second_effective_start));
-
- animator->Step(second_effective_start + delta);
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
-
- base::TimeTicks third_effective_start = second_effective_start + 2 * delta;
- test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
- cc::AnimationEvent::Started,
- 0,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
- ->animation_group_id(),
- cc::Animation::Opacity,
- third_effective_start));
-
- animator->Step(third_effective_start + delta);
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
-
- base::TimeTicks fourth_effective_start = third_effective_start + 2 * delta;
- test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
- cc::AnimationEvent::Started,
- 0,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
- ->animation_group_id(),
- cc::Animation::Opacity,
- fourth_effective_start));
-
- // Skip ahead by a lot.
- animator->Step(fourth_effective_start + 1000 * delta);
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), target_opacity);
-
- base::TimeTicks fifth_effective_start = fourth_effective_start + 1001 * delta;
- test_controller.animator()->OnThreadedAnimationStarted(cc::AnimationEvent(
- cc::AnimationEvent::Started,
- 0,
- test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
- ->animation_group_id(),
- cc::Animation::Opacity,
- fifth_effective_start));
-
- // Skip ahead by a lot.
- animator->Step(fifth_effective_start + 999 * delta);
-
- EXPECT_TRUE(test_controller.animator()->is_animating());
- EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), start_opacity);
-
- test_controller.animator()->StopAnimatingProperty(
- LayerAnimationElement::OPACITY);
-
- EXPECT_FALSE(test_controller.animator()->is_animating());
-}
-
-TEST(LayerAnimatorTest, AddObserverExplicit) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationObserver observer;
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
- animator->AddObserver(&observer);
- observer.set_requires_notification_when_animator_destroyed(true);
-
- EXPECT_TRUE(!observer.last_ended_sequence());
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetBrightnessFromAnimation(0.0f);
-
- LayerAnimationSequence* sequence = new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(1.0f, delta));
-
- animator->StartAnimation(sequence);
-
- EXPECT_EQ(observer.last_scheduled_sequence(), sequence);
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_EQ(observer.last_ended_sequence(), sequence);
-
- // |sequence| has been destroyed. Recreate it to test abort.
- sequence = new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(1.0f, delta));
-
- animator->StartAnimation(sequence);
-
- animator = NULL;
-
- EXPECT_EQ(observer.last_aborted_sequence(), sequence);
-}
-
-// Tests that an observer added to a scoped settings object is still notified
-// when the object goes out of scope.
-TEST(LayerAnimatorTest, ImplicitAnimationObservers) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestImplicitAnimationObserver observer(false);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- EXPECT_FALSE(observer.animations_completed());
- animator->SetBrightness(1.0f);
-
- {
- ScopedLayerAnimationSettings settings(animator.get());
- settings.AddObserver(&observer);
- animator->SetBrightness(0.0f);
- }
-
- EXPECT_FALSE(observer.animations_completed());
- base::TimeTicks start_time = animator->last_step_time();
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
- EXPECT_TRUE(observer.animations_completed());
- EXPECT_TRUE(observer.WasAnimationCompletedForProperty(
- LayerAnimationElement::BRIGHTNESS));
- EXPECT_FLOAT_EQ(0.0f, delegate.GetBrightnessForAnimation());
-}
-
-// Tests that an observer added to a scoped settings object is still notified
-// when the object goes out of scope due to the animation being interrupted.
-TEST(LayerAnimatorTest, InterruptedImplicitAnimationObservers) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestImplicitAnimationObserver observer(false);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- EXPECT_FALSE(observer.animations_completed());
- animator->SetBrightness(1.0f);
-
- {
- ScopedLayerAnimationSettings settings(animator.get());
- settings.AddObserver(&observer);
- animator->SetBrightness(0.0f);
- }
-
- EXPECT_FALSE(observer.animations_completed());
- // This should interrupt the implicit animation causing the observer to be
- // notified immediately.
- animator->SetBrightness(1.0f);
- EXPECT_TRUE(observer.animations_completed());
- EXPECT_TRUE(observer.WasAnimationCompletedForProperty(
- LayerAnimationElement::BRIGHTNESS));
- EXPECT_FLOAT_EQ(1.0f, delegate.GetBrightnessForAnimation());
-}
-
-// Tests that LayerAnimator is not deleted after the animation completes as long
-// as there is a live ScopedLayerAnimationSettings object wrapped around it.
-TEST(LayerAnimatorTest, AnimatorKeptAliveBySettings) {
- // Note we are using a raw pointer unlike in other tests.
- TestLayerAnimator* animator = new TestLayerAnimator();
- LayerAnimatorDestructionObserver destruction_observer;
- animator->SetDestructionObserver(&destruction_observer);
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
- {
- // ScopedLayerAnimationSettings should keep the Animator alive as long as
- // it is alive, even beyond the end of the animation.
- ScopedLayerAnimationSettings settings(animator);
- base::TimeTicks now = gfx::FrameTime::Now();
- animator->SetBrightness(0.5);
- animator->Step(now + base::TimeDelta::FromSeconds(1));
- EXPECT_FALSE(destruction_observer.IsAnimatorDeleted());
- }
- // ScopedLayerAnimationSettings was destroyed, so Animator should be deleted.
- EXPECT_TRUE(destruction_observer.IsAnimatorDeleted());
-}
-
-// Tests that an observer added to a scoped settings object is not notified
-// when the animator is destroyed unless explicitly requested.
-TEST(LayerAnimatorTest, ImplicitObserversAtAnimatorDestruction) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestImplicitAnimationObserver observer_notify(true);
- TestImplicitAnimationObserver observer_do_not_notify(false);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- EXPECT_FALSE(observer_notify.animations_completed());
- EXPECT_FALSE(observer_do_not_notify.animations_completed());
-
- animator->SetBrightness(1.0f);
-
- {
- ScopedLayerAnimationSettings settings(animator.get());
- settings.AddObserver(&observer_notify);
- settings.AddObserver(&observer_do_not_notify);
- animator->SetBrightness(0.0f);
- }
-
- EXPECT_FALSE(observer_notify.animations_completed());
- EXPECT_FALSE(observer_do_not_notify.animations_completed());
- animator = NULL;
- EXPECT_TRUE(observer_notify.animations_completed());
- EXPECT_TRUE(observer_notify.WasAnimationAbortedForProperty(
- LayerAnimationElement::BRIGHTNESS));
- EXPECT_FALSE(observer_do_not_notify.animations_completed());
-}
-
-TEST(LayerAnimatorTest, AbortedAnimationStatusInImplicitObservers) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestImplicitAnimationObserver observer(false);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- EXPECT_FALSE(observer.animations_completed());
- animator->SetBrightness(1.0f);
-
- {
- ScopedLayerAnimationSettings settings(animator.get());
- settings.AddObserver(&observer);
- animator->SetBrightness(0.0f);
- }
- EXPECT_FALSE(observer.animations_completed());
-
- animator->AbortAllAnimations();
- EXPECT_TRUE(observer.animations_completed());
- EXPECT_TRUE(observer.WasAnimationAbortedForProperty(
- LayerAnimationElement::BRIGHTNESS));
- EXPECT_FALSE(observer.WasAnimationAbortedForProperty(
- LayerAnimationElement::OPACITY));
-
- observer.set_animations_completed(false);
- {
- ScopedLayerAnimationSettings settings(animator.get());
- settings.AddObserver(&observer);
- animator->SetOpacity(0.0f);
- }
- EXPECT_FALSE(observer.animations_completed());
-
- animator->AbortAllAnimations();
- EXPECT_TRUE(observer.animations_completed());
- EXPECT_TRUE(observer.WasAnimationAbortedForProperty(
- LayerAnimationElement::BRIGHTNESS));
- EXPECT_TRUE(observer.WasAnimationAbortedForProperty(
- LayerAnimationElement::OPACITY));
-}
-
-TEST(LayerAnimatorTest, RemoveObserverShouldRemoveFromSequences) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationObserver observer;
- TestLayerAnimationObserver removed_observer;
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- LayerAnimationSequence* sequence = new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(1.0f, delta));
-
- sequence->AddObserver(&observer);
- sequence->AddObserver(&removed_observer);
-
- animator->StartAnimation(sequence);
-
- EXPECT_EQ(observer.last_scheduled_sequence(), sequence);
- EXPECT_TRUE(!observer.last_ended_sequence());
- EXPECT_EQ(removed_observer.last_scheduled_sequence(), sequence);
- EXPECT_TRUE(!removed_observer.last_ended_sequence());
-
- // This should stop the observer from observing sequence.
- animator->RemoveObserver(&removed_observer);
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_EQ(observer.last_ended_sequence(), sequence);
- EXPECT_TRUE(!removed_observer.last_ended_sequence());
-}
-
-TEST(LayerAnimatorTest, ObserverReleasedBeforeAnimationSequenceEnds) {
- TestLayerAnimationDelegate delegate;
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
-
- scoped_ptr<TestLayerAnimationObserver> observer(
- new TestLayerAnimationObserver);
- animator->SetDelegate(&delegate);
- animator->AddObserver(observer.get());
-
- delegate.SetOpacityFromAnimation(0.0f);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
- LayerAnimationSequence* sequence = new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(1.0f, delta));
-
- animator->StartAnimation(sequence);
-
- // |observer| should be attached to |sequence|.
- EXPECT_TRUE(sequence->observers_.might_have_observers());
-
- // Now, release |observer|
- observer.reset();
-
- // And |sequence| should no longer be attached to |observer|.
- EXPECT_FALSE(sequence->observers_.might_have_observers());
-}
-
-TEST(LayerAnimatorTest, ObserverAttachedAfterAnimationStarted) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
-
- TestImplicitAnimationObserver observer(false);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- delegate.SetBrightnessFromAnimation(0.0f);
-
- {
- ScopedLayerAnimationSettings setter(animator.get());
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
- LayerAnimationSequence* sequence = new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(1.0f, delta));
-
- animator->StartAnimation(sequence);
- base::TimeTicks start_time = animator->last_step_time();
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
-
- setter.AddObserver(&observer);
-
- // Start observing an in-flight animation.
- sequence->AddObserver(&observer);
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
- }
-
- EXPECT_TRUE(observer.animations_completed());
- EXPECT_TRUE(observer.WasAnimationCompletedForProperty(
- LayerAnimationElement::BRIGHTNESS));
-}
-
-TEST(LayerAnimatorTest, ObserverDetachedBeforeAnimationFinished) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
-
- TestImplicitAnimationObserver observer(false);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- delegate.SetBrightnessFromAnimation(0.0f);
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
- LayerAnimationSequence* sequence = new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(1.0f, delta));
-
- {
- ScopedLayerAnimationSettings setter(animator.get());
- setter.AddObserver(&observer);
-
- animator->StartAnimation(sequence);
- base::TimeTicks start_time = animator->last_step_time();
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
- }
-
- EXPECT_FALSE(observer.animations_completed());
-
- // Stop observing an in-flight animation.
- sequence->RemoveObserver(&observer);
-
- EXPECT_TRUE(observer.animations_completed());
-
- // The animation didn't complete, and neither was it aborted.
- EXPECT_FALSE(observer.WasAnimationCompletedForProperty(
- LayerAnimationElement::BRIGHTNESS));
- EXPECT_FALSE(observer.WasAnimationAbortedForProperty(
- LayerAnimationElement::BRIGHTNESS));
-}
-
-// This checks that if an animation is deleted due to a callback, that the
-// animator does not try to use the deleted animation. For example, if we have
-// two running animations, and the first finishes and the resulting callback
-// causes the second to be deleted, we should not attempt to animate the second
-// animation.
-TEST(LayerAnimatorTest, ObserverDeletesAnimationsOnEnd) {
- ScopedAnimationDurationScaleMode normal_duration_mode(
- ScopedAnimationDurationScaleMode::NORMAL_DURATION);
- scoped_refptr<LayerAnimator> animator(new TestLayerAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_brightness(0.0);
- double target_brightness(1.0);
-
- gfx::Rect start_bounds(0, 0, 50, 50);
- gfx::Rect target_bounds(5, 5, 5, 5);
-
- delegate.SetBrightnessFromAnimation(start_brightness);
- delegate.SetBoundsFromAnimation(start_bounds);
-
- base::TimeDelta brightness_delta = base::TimeDelta::FromSeconds(1);
- base::TimeDelta halfway_delta = base::TimeDelta::FromSeconds(2);
- base::TimeDelta bounds_delta = base::TimeDelta::FromSeconds(3);
-
- scoped_ptr<DeletingLayerAnimationObserver> observer(
- new DeletingLayerAnimationObserver(animator.get()));
-
- animator->AddObserver(observer.get());
-
- animator->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(
- target_brightness, brightness_delta)));
-
- animator->StartAnimation(new LayerAnimationSequence(
- LayerAnimationElement::CreateBoundsElement(
- target_bounds, bounds_delta)));
- ASSERT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
-
- base::TimeTicks start_time = animator->last_step_time();
- animator->Step(start_time + halfway_delta);
-
- // Completing the brightness animation should have stopped the bounds
- // animation.
- ASSERT_FALSE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
-
- animator->RemoveObserver(observer.get());
-}
-
-// Ensure that stopping animation in a bounds change does not crash and that
-// animation gets stopped correctly.
-// This scenario is possible when animation is restarted from inside a
-// callback triggered by the animation progress.
-TEST(LayerAnimatorTest, CallbackDeletesAnimationInProgress) {
-
- class TestLayerAnimationDeletingDelegate : public TestLayerAnimationDelegate {
- public:
- TestLayerAnimationDeletingDelegate(LayerAnimator* animator, int max_width)
- : animator_(animator),
- max_width_(max_width) {
- }
-
- virtual void SetBoundsFromAnimation(const gfx::Rect& bounds) override {
- TestLayerAnimationDelegate::SetBoundsFromAnimation(bounds);
- if (bounds.width() > max_width_)
- animator_->StopAnimating();
- }
- private:
- LayerAnimator* animator_;
- int max_width_;
- // Allow copy and assign.
- };
-
- ScopedAnimationDurationScaleMode normal_duration_mode(
- ScopedAnimationDurationScaleMode::NORMAL_DURATION);
- scoped_refptr<LayerAnimator> animator(new TestLayerAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDeletingDelegate delegate(animator.get(), 30);
- animator->SetDelegate(&delegate);
-
- gfx::Rect start_bounds(0, 0, 0, 0);
- gfx::Rect target_bounds(5, 5, 50, 50);
-
- delegate.SetBoundsFromAnimation(start_bounds);
-
- base::TimeDelta bounds_delta1 = base::TimeDelta::FromMilliseconds(333);
- base::TimeDelta bounds_delta2 = base::TimeDelta::FromMilliseconds(666);
- base::TimeDelta bounds_delta = base::TimeDelta::FromMilliseconds(1000);
- base::TimeDelta final_delta = base::TimeDelta::FromMilliseconds(1500);
-
- animator->StartAnimation(new LayerAnimationSequence(
- LayerAnimationElement::CreateBoundsElement(
- target_bounds, bounds_delta)));
- ASSERT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
-
- base::TimeTicks start_time = animator->last_step_time();
- ASSERT_NO_FATAL_FAILURE(animator->Step(start_time + bounds_delta1));
- ASSERT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
-
- // The next step should change the animated bounds past the threshold and
- // cause the animaton to stop.
- ASSERT_NO_FATAL_FAILURE(animator->Step(start_time + bounds_delta2));
- ASSERT_FALSE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
- ASSERT_NO_FATAL_FAILURE(animator->Step(start_time + final_delta));
-
- // Completing the animation should have stopped the bounds
- // animation.
- ASSERT_FALSE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
-}
-
-// Similar to the ObserverDeletesAnimationsOnEnd test above except that it
-// tests the behavior when the OnLayerAnimationAborted() callback causes
-// all of the animator's other animations to be deleted.
-TEST(LayerAnimatorTest, ObserverDeletesAnimationsOnAbort) {
- ScopedAnimationDurationScaleMode test_duration_mode(
- ScopedAnimationDurationScaleMode::NON_ZERO_DURATION);
- scoped_refptr<LayerAnimator> animator(new TestLayerAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_brightness(0.0);
- double target_brightness(1.0);
- gfx::Rect start_bounds(0, 0, 50, 50);
- gfx::Rect target_bounds(5, 5, 5, 5);
- base::TimeDelta brightness_delta = base::TimeDelta::FromSeconds(1);
- base::TimeDelta bounds_delta = base::TimeDelta::FromSeconds(2);
-
- delegate.SetBrightnessFromAnimation(start_brightness);
- delegate.SetBoundsFromAnimation(start_bounds);
-
- scoped_ptr<DeletingLayerAnimationObserver> observer(
- new DeletingLayerAnimationObserver(animator.get()));
- animator->AddObserver(observer.get());
-
- animator->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(
- target_brightness, brightness_delta)));
- animator->StartAnimation(new LayerAnimationSequence(
- LayerAnimationElement::CreateBoundsElement(
- target_bounds, bounds_delta)));
- ASSERT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
-
- animator->set_preemption_strategy(
- LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
- animator->StartAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(
- target_brightness, brightness_delta)));
-
- // Starting the second brightness animation should have aborted the initial
- // brightness animation. |observer| should have stopped the bounds animation
- // as a result.
- ASSERT_FALSE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
-
- animator->RemoveObserver(observer.get());
-}
-
-// Check that setting a property during an animation with a default animator
-// cancels the original animation.
-TEST(LayerAnimatorTest, SettingPropertyDuringAnAnimation) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- double start_opacity(0.0);
- double target_opacity(1.0);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetOpacityFromAnimation(start_opacity);
-
- scoped_ptr<LayerAnimationSequence> sequence(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(target_opacity, delta)));
-
- animator->StartAnimation(sequence.release());
-
- animator->SetOpacity(0.5);
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_EQ(0.5, animator->GetTargetOpacity());
-}
-
-// Tests that the preemption mode IMMEDIATELY_SET_NEW_TARGET, doesn't cause the
-// second sequence to be leaked.
-TEST(LayerAnimatorTest, ImmediatelySettingNewTargetDoesNotLeak) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_preemption_strategy(LayerAnimator::IMMEDIATELY_SET_NEW_TARGET);
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- gfx::Rect start_bounds(0, 0, 50, 50);
- gfx::Rect middle_bounds(10, 10, 100, 100);
- gfx::Rect target_bounds(5, 5, 5, 5);
-
- delegate.SetBoundsFromAnimation(start_bounds);
-
- {
- // start an implicit bounds animation.
- ScopedLayerAnimationSettings settings(animator.get());
- animator->SetBounds(middle_bounds);
- }
-
- EXPECT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
-
- int num_live_instances = 0;
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
- scoped_ptr<TestLayerAnimationSequence> sequence(
- new TestLayerAnimationSequence(
- LayerAnimationElement::CreateBoundsElement(target_bounds, delta),
- &num_live_instances));
-
- EXPECT_EQ(1, num_live_instances);
-
- // This should interrupt the running sequence causing us to immediately set
- // the target value. The sequence should alse be destructed.
- animator->StartAnimation(sequence.release());
-
- EXPECT_FALSE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
- EXPECT_EQ(0, num_live_instances);
- CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), target_bounds);
-}
-
-// Verifies GetTargetOpacity() works when multiple sequences are scheduled.
-TEST(LayerAnimatorTest, GetTargetOpacity) {
- TestLayerAnimationDelegate delegate;
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_preemption_strategy(LayerAnimator::ENQUEUE_NEW_ANIMATION);
- animator->set_disable_timer_for_test(true);
- animator->SetDelegate(&delegate);
-
- delegate.SetOpacityFromAnimation(0.0);
-
- {
- ScopedLayerAnimationSettings settings(animator.get());
- animator->SetOpacity(0.5);
- EXPECT_EQ(0.5, animator->GetTargetOpacity());
-
- // Because the strategy is ENQUEUE_NEW_ANIMATION the target should now be 1.
- animator->SetOpacity(1.0);
- EXPECT_EQ(1.0, animator->GetTargetOpacity());
- }
-}
-
-// Verifies GetTargetBrightness() works when multiple sequences are scheduled.
-TEST(LayerAnimatorTest, GetTargetBrightness) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_preemption_strategy(LayerAnimator::ENQUEUE_NEW_ANIMATION);
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- delegate.SetBrightnessFromAnimation(0.0);
-
- {
- ScopedLayerAnimationSettings settings(animator.get());
- animator->SetBrightness(0.5);
- EXPECT_EQ(0.5, animator->GetTargetBrightness());
-
- // Because the strategy is ENQUEUE_NEW_ANIMATION the target should now be 1.
- animator->SetBrightness(1.0);
- EXPECT_EQ(1.0, animator->GetTargetBrightness());
- }
-}
-
-// Verifies GetTargetGrayscale() works when multiple sequences are scheduled.
-TEST(LayerAnimatorTest, GetTargetGrayscale) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_preemption_strategy(LayerAnimator::ENQUEUE_NEW_ANIMATION);
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- delegate.SetGrayscaleFromAnimation(0.0);
-
- {
- ScopedLayerAnimationSettings settings(animator.get());
- animator->SetGrayscale(0.5);
- EXPECT_EQ(0.5, animator->GetTargetGrayscale());
-
- // Because the strategy is ENQUEUE_NEW_ANIMATION the target should now be 1.
- animator->SetGrayscale(1.0);
- EXPECT_EQ(1.0, animator->GetTargetGrayscale());
- }
-}
-
-// Verifies color property is modified appropriately.
-TEST(LayerAnimatorTest, Color) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- SkColor start_color = SkColorSetARGB( 64, 20, 40, 60);
- SkColor middle_color = SkColorSetARGB(128, 35, 70, 120);
- SkColor target_color = SkColorSetARGB(192, 40, 80, 140);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
- delegate.SetColorFromAnimation(start_color);
-
- animator->ScheduleAnimation(
- new LayerAnimationSequence(
- LayerAnimationElement::CreateColorElement(target_color, delta)));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_EQ(ColorToString(start_color),
- ColorToString(delegate.GetColorForAnimation()));
-
- base::TimeTicks start_time = animator->last_step_time();
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(500));
-
- EXPECT_TRUE(animator->is_animating());
- EXPECT_EQ(ColorToString(middle_color),
- ColorToString(delegate.GetColorForAnimation()));
-
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000));
-
- EXPECT_FALSE(animator->is_animating());
- EXPECT_EQ(ColorToString(target_color),
- ColorToString(delegate.GetColorForAnimation()));
-}
-
-// Verifies SchedulePauseForProperties().
-TEST(LayerAnimatorTest, SchedulePauseForProperties) {
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_preemption_strategy(LayerAnimator::ENQUEUE_NEW_ANIMATION);
- animator->SchedulePauseForProperties(
- base::TimeDelta::FromMilliseconds(100),
- LayerAnimationElement::TRANSFORM | LayerAnimationElement::BOUNDS);
- EXPECT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::TRANSFORM));
- EXPECT_TRUE(animator->IsAnimatingProperty(LayerAnimationElement::BOUNDS));
- EXPECT_FALSE(animator->IsAnimatingProperty(LayerAnimationElement::OPACITY));
-}
-
-
-class AnimatorOwner {
-public:
- AnimatorOwner()
- : animator_(LayerAnimator::CreateDefaultAnimator()) {
- }
-
- LayerAnimator* animator() { return animator_.get(); }
-
-private:
- scoped_refptr<LayerAnimator> animator_;
-
- DISALLOW_COPY_AND_ASSIGN(AnimatorOwner);
-};
-
-class DeletingObserver : public LayerAnimationObserver {
-public:
- DeletingObserver(bool* was_deleted)
- : animator_owner_(new AnimatorOwner),
- delete_on_animation_ended_(false),
- delete_on_animation_aborted_(false),
- delete_on_animation_scheduled_(false),
- was_deleted_(was_deleted) {
- animator()->AddObserver(this);
- }
-
- virtual ~DeletingObserver() {
- animator()->RemoveObserver(this);
- *was_deleted_ = true;
- }
-
- LayerAnimator* animator() { return animator_owner_->animator(); }
-
- bool delete_on_animation_ended() const {
- return delete_on_animation_ended_;
- }
- void set_delete_on_animation_ended(bool enabled) {
- delete_on_animation_ended_ = enabled;
- }
-
- bool delete_on_animation_aborted() const {
- return delete_on_animation_aborted_;
- }
- void set_delete_on_animation_aborted(bool enabled) {
- delete_on_animation_aborted_ = enabled;
- }
-
- bool delete_on_animation_scheduled() const {
- return delete_on_animation_scheduled_;
- }
- void set_delete_on_animation_scheduled(bool enabled) {
- delete_on_animation_scheduled_ = enabled;
- }
-
- // LayerAnimationObserver implementation.
- virtual void OnLayerAnimationEnded(
- LayerAnimationSequence* sequence) override {
- if (delete_on_animation_ended_)
- delete this;
- }
-
- virtual void OnLayerAnimationAborted(
- LayerAnimationSequence* sequence) override {
- if (delete_on_animation_aborted_)
- delete this;
- }
-
- virtual void OnLayerAnimationScheduled(
- LayerAnimationSequence* sequence) override {
- if (delete_on_animation_scheduled_)
- delete this;
- }
-
-private:
- scoped_ptr<AnimatorOwner> animator_owner_;
- bool delete_on_animation_ended_;
- bool delete_on_animation_aborted_;
- bool delete_on_animation_scheduled_;
- bool* was_deleted_;
-
- DISALLOW_COPY_AND_ASSIGN(DeletingObserver);
-};
-
-TEST(LayerAnimatorTest, ObserverDeletesAnimatorAfterFinishingAnimation) {
- bool observer_was_deleted = false;
- DeletingObserver* observer = new DeletingObserver(&observer_was_deleted);
- observer->set_delete_on_animation_ended(true);
- observer->set_delete_on_animation_aborted(true);
- LayerAnimator* animator = observer->animator();
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- delegate.SetBrightnessFromAnimation(0.0f);
-
- gfx::Rect start_bounds(0, 0, 50, 50);
- gfx::Rect target_bounds(10, 10, 100, 100);
-
- delegate.SetBoundsFromAnimation(start_bounds);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
- LayerAnimationSequence* brightness_sequence = new LayerAnimationSequence(
- LayerAnimationElement::CreateBrightnessElement(1.0f, delta));
- animator->StartAnimation(brightness_sequence);
-
- delta = base::TimeDelta::FromSeconds(2);
- LayerAnimationSequence* bounds_sequence = new LayerAnimationSequence(
- LayerAnimationElement::CreateBoundsElement(target_bounds, delta));
- animator->StartAnimation(bounds_sequence);
-
- base::TimeTicks start_time = animator->last_step_time();
- animator->Step(start_time + base::TimeDelta::FromMilliseconds(1500));
-
- EXPECT_TRUE(observer_was_deleted);
-}
-
-TEST(LayerAnimatorTest, ObserverDeletesAnimatorAfterStoppingAnimating) {
- bool observer_was_deleted = false;
- DeletingObserver* observer = new DeletingObserver(&observer_was_deleted);
- observer->set_delete_on_animation_ended(true);
- observer->set_delete_on_animation_aborted(true);
- LayerAnimator* animator = observer->animator();
- animator->set_disable_timer_for_test(true);
- TestLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- delegate.SetOpacityFromAnimation(0.0f);
-
- gfx::Rect start_bounds(0, 0, 50, 50);
- gfx::Rect target_bounds(10, 10, 100, 100);
-
- delegate.SetBoundsFromAnimation(start_bounds);
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
- LayerAnimationSequence* opacity_sequence = new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(1.0f, delta));
- animator->StartAnimation(opacity_sequence);
-
- delta = base::TimeDelta::FromSeconds(2);
- LayerAnimationSequence* bounds_sequence = new LayerAnimationSequence(
- LayerAnimationElement::CreateBoundsElement(target_bounds, delta));
- animator->StartAnimation(bounds_sequence);
-
- animator->StopAnimating();
-
- EXPECT_TRUE(observer_was_deleted);
-}
-
-TEST(LayerAnimatorTest, ObserverDeletesAnimatorAfterScheduling) {
- bool observer_was_deleted = false;
- TestLayerAnimationDelegate delegate;
- DeletingObserver* observer = new DeletingObserver(&observer_was_deleted);
- observer->set_delete_on_animation_scheduled(true);
- LayerAnimator* animator = observer->animator();
- animator->set_disable_timer_for_test(true);
- animator->SetDelegate(&delegate);
-
- delegate.SetOpacityFromAnimation(0.0f);
-
- gfx::Rect start_bounds(0, 0, 50, 50);
- gfx::Rect target_bounds(10, 10, 100, 100);
-
- delegate.SetBoundsFromAnimation(start_bounds);
-
- std::vector<LayerAnimationSequence*> to_start;
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
- to_start.push_back(new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(1.0f, delta)));
-
- delta = base::TimeDelta::FromSeconds(2);
- to_start.push_back(new LayerAnimationSequence(
- LayerAnimationElement::CreateBoundsElement(target_bounds, delta)));
-
- animator->ScheduleTogether(to_start);
-
- EXPECT_TRUE(observer_was_deleted);
-}
-
-TEST(LayerAnimatorTest, ObserverDeletesAnimatorAfterAborted) {
- bool observer_was_deleted = false;
- DeletingObserver* observer = new DeletingObserver(&observer_was_deleted);
- TestLayerAnimationDelegate delegate;
- observer->set_delete_on_animation_aborted(true);
- LayerAnimator* animator = observer->animator();
- animator->set_preemption_strategy(
- LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
- animator->set_disable_timer_for_test(true);
- animator->SetDelegate(&delegate);
-
- delegate.SetOpacityFromAnimation(0.0f);
-
- gfx::Rect start_bounds(0, 0, 50, 50);
- gfx::Rect target_bounds(10, 10, 100, 100);
-
- delegate.SetBoundsFromAnimation(start_bounds);
-
- std::vector<LayerAnimationSequence*> to_start;
-
- base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
- to_start.push_back(new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(1.0f, delta)));
-
- delta = base::TimeDelta::FromSeconds(2);
- to_start.push_back(new LayerAnimationSequence(
- LayerAnimationElement::CreateBoundsElement(target_bounds, delta)));
-
- animator->ScheduleTogether(to_start);
-
- EXPECT_FALSE(observer_was_deleted);
-
- animator->StartAnimation(new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(1.0f, delta)));
-
- EXPECT_TRUE(observer_was_deleted);
-}
-
-
-TEST(LayerAnimatorTest, TestSetterRespectEnqueueStrategy) {
- TestLayerAnimationDelegate delegate;
- scoped_refptr<LayerAnimator> animator(LayerAnimator::CreateDefaultAnimator());
- animator->set_disable_timer_for_test(true);
-
- animator->SetDelegate(&delegate);
-
- float start_opacity = 0.0f;
- float target_opacity = 1.0f;
- float magic_opacity = 0.123f;
-
- delegate.SetOpacityFromAnimation(start_opacity);
-
- ScopedLayerAnimationSettings settings(animator.get());
- settings.SetPreemptionStrategy(
- LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
- settings.SetTransitionDuration(base::TimeDelta::FromSeconds(1));
- animator->SetOpacity(target_opacity);
-
- EXPECT_EQ(start_opacity, delegate.GetOpacityForAnimation());
-
- settings.SetPreemptionStrategy(
- LayerAnimator::ENQUEUE_NEW_ANIMATION);
- settings.SetTransitionDuration(base::TimeDelta());
- animator->SetOpacity(magic_opacity);
-
- EXPECT_EQ(start_opacity, delegate.GetOpacityForAnimation());
-}
-
-TEST(LayerAnimatorTest, TestScopedCounterAnimation) {
- Layer parent, child;
- parent.Add(&child);
-
- gfx::Transform parent_begin, parent_end;
-
- parent_end.Scale3d(2.0, 0.5, 1.0);
-
- // Parent animates from identity to the end value. The counter animation will
- // start at the end value and animate back to identity.
- gfx::Transform child_begin(parent_end);
-
- child.SetTransform(child_begin);
- parent.SetTransform(parent_begin);
-
- EXPECT_FALSE(child.GetAnimator()->is_animating());
-
- ScopedLayerAnimationSettings settings(parent.GetAnimator());
- settings.SetInverselyAnimatedBaseLayer(&parent);
- settings.AddInverselyAnimatedLayer(&child);
-
- parent.SetTransform(parent_end);
-
- EXPECT_TRUE(child.GetAnimator()->is_animating());
- EXPECT_TRUE(child.GetTargetTransform().IsIdentity())
- << child.GetTargetTransform().ToString();
-
-}
-
-class CollectionLayerAnimationDelegate : public TestLayerAnimationDelegate {
- public:
- CollectionLayerAnimationDelegate() : collection(NULL) {}
- virtual ~CollectionLayerAnimationDelegate() {}
-
- // LayerAnimationDelegate:
- virtual LayerAnimatorCollection* GetLayerAnimatorCollection() override {
- return &collection;
- }
-
- private:
- LayerAnimatorCollection collection;
-};
-
-TEST(LayerAnimatorTest, LayerAnimatorCollectionTickTime) {
- Layer layer;
- LayerAnimator* animator = layer.GetAnimator();
- CollectionLayerAnimationDelegate delegate;
- animator->SetDelegate(&delegate);
-
- LayerAnimatorCollection* collection = delegate.GetLayerAnimatorCollection();
- base::TimeTicks null;
- collection->OnAnimationStep(null);
- EXPECT_TRUE(collection->last_tick_time().is_null());
-
- // Adding an animator to the collection should update the last tick time.
- collection->StartAnimator(layer.GetAnimator());
- EXPECT_TRUE(collection->HasActiveAnimators());
- EXPECT_FALSE(collection->last_tick_time().is_null());
-
- collection->StopAnimator(layer.GetAnimator());
- EXPECT_FALSE(collection->HasActiveAnimators());
-}
-
-TEST(LayerAnimatorTest, AnimatorStartedCorrectly) {
- Layer layer;
- LayerAnimatorTestController test_controller(layer.GetAnimator());
- LayerAnimator* animator = test_controller.animator();
- ASSERT_FALSE(animator->is_started_);
-
- TestLayerAnimationDelegate test_delegate;
- animator->SetDelegate(&test_delegate);
- double target_opacity = 1.0;
- base::TimeDelta time_delta = base::TimeDelta::FromSeconds(1);
- animator->ScheduleAnimation(new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(target_opacity, time_delta)));
- EXPECT_FALSE(animator->is_started_);
-
- CollectionLayerAnimationDelegate collection_delegate;
- animator->SetDelegate(&collection_delegate);
- animator->UpdateAnimationState();
- EXPECT_TRUE(animator->is_started_);
- animator->SetDelegate(NULL);
-}
-
-TEST(LayerAnimatorTest, AnimatorRemovedFromCollectionWhenLayerIsDestroyed) {
- scoped_ptr<Layer> layer(new Layer(LAYER_TEXTURED));
- LayerAnimatorTestController test_controller(layer->GetAnimator());
- scoped_refptr<LayerAnimator> animator = test_controller.animator();
- CollectionLayerAnimationDelegate collection_delegate;
- animator->SetDelegate(&collection_delegate);
-
- double target_opacity = 1.0;
- base::TimeDelta time_delta = base::TimeDelta::FromSeconds(1);
- animator->ScheduleAnimation(new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(target_opacity, time_delta)));
-
- EXPECT_TRUE(
- collection_delegate.GetLayerAnimatorCollection()->HasActiveAnimators());
-
- layer.reset();
- EXPECT_EQ(NULL, animator->delegate());
- EXPECT_FALSE(
- collection_delegate.GetLayerAnimatorCollection()->HasActiveAnimators());
-}
-
-TEST(LayerAnimatorTest, LayerMovedBetweenCompositorsDuringAnimation) {
- bool enable_pixel_output = false;
- ui::ContextFactory* context_factory =
- InitializeContextFactoryForTests(enable_pixel_output);
- const gfx::Rect bounds(10, 10, 100, 100);
- scoped_ptr<TestCompositorHost> host_1(
- TestCompositorHost::Create(bounds, context_factory));
- scoped_ptr<TestCompositorHost> host_2(
- TestCompositorHost::Create(bounds, context_factory));
- host_1->Show();
- host_2->Show();
-
- Compositor* compositor_1 = host_1->GetCompositor();
- Layer root_1;
- compositor_1->SetRootLayer(&root_1);
-
- Compositor* compositor_2 = host_2->GetCompositor();
- Layer root_2;
- compositor_2->SetRootLayer(&root_2);
-
- // Verify that neither compositor has active animators.
- EXPECT_FALSE(compositor_1->layer_animator_collection()->HasActiveAnimators());
- EXPECT_FALSE(compositor_2->layer_animator_collection()->HasActiveAnimators());
-
- Layer layer;
- root_1.Add(&layer);
- LayerAnimator* animator = layer.GetAnimator();
- double target_opacity = 1.0;
- base::TimeDelta time_delta = base::TimeDelta::FromSeconds(1);
- animator->ScheduleAnimation(new LayerAnimationSequence(
- LayerAnimationElement::CreateOpacityElement(target_opacity, time_delta)));
- EXPECT_TRUE(compositor_1->layer_animator_collection()->HasActiveAnimators());
- EXPECT_FALSE(compositor_2->layer_animator_collection()->HasActiveAnimators());
-
- root_2.Add(&layer);
- EXPECT_FALSE(compositor_1->layer_animator_collection()->HasActiveAnimators());
- EXPECT_TRUE(compositor_2->layer_animator_collection()->HasActiveAnimators());
- host_2.reset();
- host_1.reset();
- TerminateContextFactoryForTests();
-}
-
-} // namespace ui
« no previous file with comments | « ui/compositor/layer_animator_collection.cc ('k') | ui/compositor/layer_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698