| Index: cc/trees/layer_tree_host_unittest_animation.cc
|
| diff --git a/cc/trees/layer_tree_host_unittest_animation.cc b/cc/trees/layer_tree_host_unittest_animation.cc
|
| index 795ded5749d7dc062a0af3213c800f71e58b8be0..2e04acc43cfb987ff6e83ea96bbe64baedaf155e 100644
|
| --- a/cc/trees/layer_tree_host_unittest_animation.cc
|
| +++ b/cc/trees/layer_tree_host_unittest_animation.cc
|
| @@ -9,9 +9,11 @@
|
| #include "cc/animation/timing_function.h"
|
| #include "cc/layers/layer.h"
|
| #include "cc/layers/layer_impl.h"
|
| +#include "cc/test/animation_test_common.h"
|
| #include "cc/test/fake_content_layer.h"
|
| #include "cc/test/fake_content_layer_client.h"
|
| #include "cc/test/layer_tree_test.h"
|
| +#include "cc/trees/layer_tree_impl.h"
|
|
|
| namespace cc {
|
| namespace {
|
| @@ -118,11 +120,11 @@ class LayerTreeHostAnimationTestAddAnimation
|
| }
|
|
|
| virtual void BeginTest() OVERRIDE {
|
| - PostAddInstantAnimationToMainThread();
|
| + PostAddInstantAnimationToMainThread(layer_tree_host()->root_layer());
|
| }
|
|
|
| virtual void UpdateAnimationState(
|
| - LayerTreeHostImpl* impl_host,
|
| + LayerTreeHostImpl* host_impl,
|
| bool has_unfinished_animation) OVERRIDE {
|
| if (!num_animates_) {
|
| // The animation had zero duration so LayerTreeHostImpl should no
|
| @@ -134,6 +136,14 @@ class LayerTreeHostAnimationTestAddAnimation
|
|
|
| if (received_animation_started_notification_) {
|
| EXPECT_LT(0.0, start_time_);
|
| +
|
| + LayerAnimationController* controller_impl =
|
| + host_impl->active_tree()->root_layer()->layer_animation_controller();
|
| + Animation* animation_impl =
|
| + controller_impl->GetAnimation(0, Animation::Opacity);
|
| + if (animation_impl)
|
| + controller_impl->RemoveAnimation(animation_impl->id());
|
| +
|
| EndTest();
|
| }
|
| }
|
| @@ -143,6 +153,14 @@ class LayerTreeHostAnimationTestAddAnimation
|
| start_time_ = wall_clock_time;
|
| if (num_animates_) {
|
| EXPECT_LT(0.0, start_time_);
|
| +
|
| + LayerAnimationController* controller =
|
| + layer_tree_host()->root_layer()->layer_animation_controller();
|
| + Animation* animation =
|
| + controller->GetAnimation(0, Animation::Opacity);
|
| + if (animation)
|
| + controller->RemoveAnimation(animation->id());
|
| +
|
| EndTest();
|
| }
|
| }
|
| @@ -155,7 +173,7 @@ class LayerTreeHostAnimationTestAddAnimation
|
| double start_time_;
|
| };
|
|
|
| -MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestAddAnimation);
|
| +SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestAddAnimation);
|
|
|
| // Add a layer animation to a layer, but continually fail to draw. Confirm that
|
| // after a while, we do eventually force a draw.
|
| @@ -240,15 +258,23 @@ class LayerTreeHostAnimationTestAddAnimationWithTimingFunction
|
| public:
|
| LayerTreeHostAnimationTestAddAnimationWithTimingFunction() {}
|
|
|
| + virtual void SetupTree() OVERRIDE {
|
| + LayerTreeHostAnimationTest::SetupTree();
|
| + content_ = FakeContentLayer::Create(&client_);
|
| + content_->SetBounds(gfx::Size(4, 4));
|
| + layer_tree_host()->root_layer()->AddChild(content_);
|
| + }
|
| +
|
| virtual void BeginTest() OVERRIDE {
|
| - PostAddAnimationToMainThread(layer_tree_host()->root_layer());
|
| + PostAddAnimationToMainThread(content_);
|
| }
|
|
|
| virtual void AnimateLayers(
|
| LayerTreeHostImpl* host_impl,
|
| base::TimeTicks monotonic_time) OVERRIDE {
|
| LayerAnimationController* controller =
|
| - layer_tree_host()->root_layer()->layer_animation_controller();
|
| + layer_tree_host()->root_layer()->children()[0]->
|
| + layer_animation_controller();
|
| Animation* animation =
|
| controller->GetAnimation(0, Animation::Opacity);
|
| if (!animation)
|
| @@ -267,7 +293,8 @@ class LayerTreeHostAnimationTestAddAnimationWithTimingFunction
|
| EXPECT_FLOAT_EQ(linearly_interpolated_opacity, curve->GetValue(time));
|
|
|
| LayerAnimationController* controller_impl =
|
| - host_impl->RootLayer()->layer_animation_controller();
|
| + host_impl->active_tree()->root_layer()->children()[0]->
|
| + layer_animation_controller();
|
| Animation* animation_impl =
|
| controller_impl->GetAnimation(0, Animation::Opacity);
|
|
|
| @@ -277,6 +304,9 @@ class LayerTreeHostAnimationTestAddAnimationWithTimingFunction
|
| }
|
|
|
| virtual void AfterTest() OVERRIDE {}
|
| +
|
| + FakeContentLayerClient client_;
|
| + scoped_refptr<FakeContentLayer> content_;
|
| };
|
|
|
| SINGLE_AND_MULTI_THREAD_TEST_F(
|
| @@ -291,13 +321,22 @@ class LayerTreeHostAnimationTestSynchronizeAnimationStartTimes
|
| : main_start_time_(-1.0),
|
| impl_start_time_(-1.0) {}
|
|
|
| + virtual void SetupTree() OVERRIDE {
|
| + LayerTreeHostAnimationTest::SetupTree();
|
| + content_ = FakeContentLayer::Create(&client_);
|
| + content_->SetBounds(gfx::Size(4, 4));
|
| + content_->set_layer_animation_delegate(this);
|
| + layer_tree_host()->root_layer()->AddChild(content_);
|
| + }
|
| +
|
| virtual void BeginTest() OVERRIDE {
|
| - PostAddAnimationToMainThread(layer_tree_host()->root_layer());
|
| + PostAddAnimationToMainThread(content_);
|
| }
|
|
|
| virtual void notifyAnimationStarted(double time) OVERRIDE {
|
| LayerAnimationController* controller =
|
| - layer_tree_host()->root_layer()->layer_animation_controller();
|
| + layer_tree_host()->root_layer()->children()[0]->
|
| + layer_animation_controller();
|
| Animation* animation =
|
| controller->GetAnimation(0, Animation::Opacity);
|
| main_start_time_ = animation->start_time();
|
| @@ -311,7 +350,8 @@ class LayerTreeHostAnimationTestSynchronizeAnimationStartTimes
|
| LayerTreeHostImpl* impl_host,
|
| bool has_unfinished_animation) OVERRIDE {
|
| LayerAnimationController* controller =
|
| - impl_host->RootLayer()->layer_animation_controller();
|
| + impl_host->active_tree()->root_layer()->children()[0]->
|
| + layer_animation_controller();
|
| Animation* animation =
|
| controller->GetAnimation(0, Animation::Opacity);
|
| if (!animation)
|
| @@ -331,6 +371,8 @@ class LayerTreeHostAnimationTestSynchronizeAnimationStartTimes
|
| private:
|
| double main_start_time_;
|
| double impl_start_time_;
|
| + FakeContentLayerClient client_;
|
| + scoped_refptr<FakeContentLayer> content_;
|
| };
|
|
|
| SINGLE_AND_MULTI_THREAD_TEST_F(
|
| @@ -343,7 +385,7 @@ class LayerTreeHostAnimationTestAnimationFinishedEvents
|
| LayerTreeHostAnimationTestAnimationFinishedEvents() {}
|
|
|
| virtual void BeginTest() OVERRIDE {
|
| - PostAddInstantAnimationToMainThread();
|
| + PostAddInstantAnimationToMainThread(layer_tree_host()->root_layer());
|
| }
|
|
|
| virtual void notifyAnimationFinished(double time) OVERRIDE {
|
| @@ -381,7 +423,12 @@ class LayerTreeHostAnimationTestDoNotSkipLayersWithAnimatedOpacity
|
| PostAddAnimationToMainThread(update_check_layer_.get());
|
| }
|
|
|
| - virtual void CommitCompleteOnThread(LayerTreeHostImpl* tree_impl) OVERRIDE {
|
| + virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
|
| + LayerAnimationController* controller_impl =
|
| + host_impl->active_tree()->root_layer()->layer_animation_controller();
|
| + Animation* animation_impl =
|
| + controller_impl->GetAnimation(0, Animation::Opacity);
|
| + controller_impl->RemoveAnimation(animation_impl->id());
|
| EndTest();
|
| }
|
|
|
| @@ -399,7 +446,7 @@ class LayerTreeHostAnimationTestDoNotSkipLayersWithAnimatedOpacity
|
| scoped_refptr<FakeContentLayer> update_check_layer_;
|
| };
|
|
|
| -MULTI_THREAD_TEST_F(
|
| +SINGLE_AND_MULTI_THREAD_TEST_F(
|
| LayerTreeHostAnimationTestDoNotSkipLayersWithAnimatedOpacity);
|
|
|
| // Layers added to tree with existing active animations should have the
|
| @@ -537,5 +584,180 @@ class LayerTreeHostAnimationTestContinuousAnimate
|
|
|
| MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestContinuousAnimate);
|
|
|
| +// Make sure the main thread can still execute animations when CanDraw() is not
|
| +// true.
|
| +class LayerTreeHostAnimationTestRunAnimationWhenNotCanDraw
|
| + : public LayerTreeHostAnimationTest {
|
| + public:
|
| + LayerTreeHostAnimationTestRunAnimationWhenNotCanDraw() : started_times_(0) {}
|
| +
|
| + virtual void SetupTree() OVERRIDE {
|
| + LayerTreeHostAnimationTest::SetupTree();
|
| + content_ = FakeContentLayer::Create(&client_);
|
| + content_->SetBounds(gfx::Size(4, 4));
|
| + content_->set_layer_animation_delegate(this);
|
| + layer_tree_host()->root_layer()->AddChild(content_);
|
| + }
|
| +
|
| + virtual void BeginTest() OVERRIDE {
|
| + layer_tree_host()->SetViewportSize(gfx::Size(), gfx::Size());
|
| + PostAddAnimationToMainThread(content_);
|
| + }
|
| +
|
| + virtual void notifyAnimationStarted(double wall_clock_time) OVERRIDE {
|
| + started_times_++;
|
| + // TODO(ajuma): Remove this EndTest() so we test animation finishing.
|
| + EndTest();
|
| + }
|
| +
|
| + virtual void notifyAnimationFinished(double wall_clock_time) OVERRIDE {
|
| + EndTest();
|
| + }
|
| +
|
| + virtual void AfterTest() OVERRIDE {
|
| + EXPECT_EQ(1, started_times_);
|
| + }
|
| +
|
| + private:
|
| + int started_times_;
|
| + FakeContentLayerClient client_;
|
| + scoped_refptr<FakeContentLayer> content_;
|
| +};
|
| +
|
| +SINGLE_AND_MULTI_THREAD_TEST_F(
|
| + LayerTreeHostAnimationTestRunAnimationWhenNotCanDraw);
|
| +
|
| +// Make sure the main thread can still execute animations when the renderer is
|
| +// backgrounded.
|
| +class LayerTreeHostAnimationTestRunAnimationWhenNotVisible
|
| + : public LayerTreeHostAnimationTest {
|
| + public:
|
| + LayerTreeHostAnimationTestRunAnimationWhenNotVisible() : started_times_(0) {}
|
| +
|
| + virtual void SetupTree() OVERRIDE {
|
| + LayerTreeHostAnimationTest::SetupTree();
|
| + content_ = FakeContentLayer::Create(&client_);
|
| + content_->SetBounds(gfx::Size(4, 4));
|
| + content_->set_layer_animation_delegate(this);
|
| + layer_tree_host()->root_layer()->AddChild(content_);
|
| + }
|
| +
|
| + virtual void BeginTest() OVERRIDE {
|
| + visible_ = true;
|
| + PostAddAnimationToMainThread(content_);
|
| + }
|
| +
|
| + virtual void DidCommit() OVERRIDE {
|
| + visible_ = false;
|
| + layer_tree_host()->SetVisible(false);
|
| + }
|
| +
|
| + virtual void notifyAnimationStarted(double wall_clock_time) OVERRIDE {
|
| + EXPECT_FALSE(visible_);
|
| + started_times_++;
|
| + }
|
| +
|
| + virtual void notifyAnimationFinished(double wall_clock_time) OVERRIDE {
|
| + EXPECT_FALSE(visible_);
|
| + EXPECT_EQ(1, started_times_);
|
| + EndTest();
|
| + }
|
| +
|
| + virtual void AfterTest() OVERRIDE {}
|
| +
|
| + private:
|
| + bool visible_;
|
| + int started_times_;
|
| + FakeContentLayerClient client_;
|
| + scoped_refptr<FakeContentLayer> content_;
|
| +};
|
| +
|
| +SINGLE_AND_MULTI_THREAD_TEST_F(
|
| + LayerTreeHostAnimationTestRunAnimationWhenNotVisible);
|
| +
|
| +// Animations should not be started when frames are being skipped due to
|
| +// checkerboard.
|
| +class LayerTreeHostAnimationTestCheckerboardDoesntStartAnimations
|
| + : public LayerTreeHostAnimationTest {
|
| + virtual void SetupTree() OVERRIDE {
|
| + LayerTreeHostAnimationTest::SetupTree();
|
| + content_ = FakeContentLayer::Create(&client_);
|
| + content_->SetBounds(gfx::Size(4, 4));
|
| + content_->set_layer_animation_delegate(this);
|
| + layer_tree_host()->root_layer()->AddChild(content_);
|
| + }
|
| +
|
| + virtual void BeginTest() OVERRIDE {
|
| + added_animations_ = 0;
|
| + started_times_ = 0;
|
| + finished_times_ = 0;
|
| +
|
| + PostSetNeedsCommitToMainThread();
|
| + }
|
| +
|
| + virtual void DispatchAddInstantAnimation(Layer* layer_to_receive_animation)
|
| + OVERRIDE {
|
| + LayerTreeHostAnimationTest::DispatchAddInstantAnimation(
|
| + layer_to_receive_animation);
|
| + added_animations_++;
|
| + }
|
| +
|
| + virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
|
| + LayerTreeHostImpl::FrameData* frame_data,
|
| + bool result) {
|
| + if (added_animations_ < 2)
|
| + return result;
|
| + // Act like there is checkerboard when the second animation wants to draw.
|
| + return false;
|
| + }
|
| +
|
| + virtual void DidCommitAndDrawFrame() OVERRIDE {
|
| + switch (layer_tree_host()->commit_number()) {
|
| + case 1:
|
| + // The animation is longer than 1 vsync.
|
| + AddOpacityTransitionToLayer(content_, 0.1, 0.2f, 0.8f, false);
|
| + added_animations_++;
|
| + break;
|
| + case 2:
|
| + // This second animation will not be drawn so it should not start.
|
| + AddAnimatedTransformToLayer(content_, 0.1, 5, 5);
|
| + added_animations_++;
|
| + break;
|
| + case 3:
|
| + EndTest();
|
| + break;
|
| + }
|
| + }
|
| +
|
| + virtual void notifyAnimationStarted(double wall_clock_time) OVERRIDE {
|
| + started_times_++;
|
| + }
|
| +
|
| + virtual void notifyAnimationFinished(double wall_clock_time) OVERRIDE {
|
| + // We should be checkerboarding already, but it should still finish the
|
| + // first animation.
|
| + EXPECT_EQ(2, added_animations_);
|
| + finished_times_++;
|
| + }
|
| +
|
| + virtual void AfterTest() OVERRIDE {
|
| + // The first animation should be started, but the second should not because
|
| + // of checkerboard.
|
| + EXPECT_EQ(1, started_times_);
|
| + // The first animation should still be finished.
|
| + // TODO(ajuma): The first animation is not being finished, but it should be.
|
| + //EXPECT_EQ(1, finished_times_);
|
| + }
|
| +
|
| + int added_animations_;
|
| + int started_times_;
|
| + int finished_times_;
|
| + FakeContentLayerClient client_;
|
| + scoped_refptr<FakeContentLayer> content_;
|
| +};
|
| +
|
| +MULTI_THREAD_TEST_F(
|
| + LayerTreeHostAnimationTestCheckerboardDoesntStartAnimations);
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|