diff options
author | skyostil@chromium.org <skyostil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-03 21:03:40 +0000 |
---|---|---|
committer | skyostil@chromium.org <skyostil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-03 21:03:40 +0000 |
commit | 5f6fe596dd617e14bacddacd814fa1bf2ce421f7 (patch) | |
tree | 3d51311e6216a2b1dbb25c50b5762387357a48e0 /cc/trees/layer_tree_host_unittest_animation.cc | |
parent | 905b2785847d3dc97ca8da217066732b710d1a98 (diff) | |
download | chromium_src-5f6fe596dd617e14bacddacd814fa1bf2ce421f7.zip chromium_src-5f6fe596dd617e14bacddacd814fa1bf2ce421f7.tar.gz chromium_src-5f6fe596dd617e14bacddacd814fa1bf2ce421f7.tar.bz2 |
Make it possible to cancel commits following an animation
If we didn't invalidate anything when running main thread animations, there is
no need to continue with the commit.
BUG=345584,347255,348433
Review URL: https://codereview.chromium.org/178123003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@254558 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/trees/layer_tree_host_unittest_animation.cc')
-rw-r--r-- | cc/trees/layer_tree_host_unittest_animation.cc | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/cc/trees/layer_tree_host_unittest_animation.cc b/cc/trees/layer_tree_host_unittest_animation.cc index 165d30b..ee12e5c 100644 --- a/cc/trees/layer_tree_host_unittest_animation.cc +++ b/cc/trees/layer_tree_host_unittest_animation.cc @@ -783,6 +783,15 @@ class LayerTreeHostAnimationTestContinuousAnimate num_draw_layers_(0) { } + virtual void SetupTree() OVERRIDE { + LayerTreeHostAnimationTest::SetupTree(); + // Create a fake content layer so we actually produce new content for every + // animation frame. + content_ = FakeContentLayer::Create(&client_); + content_->set_always_update_resources(true); + layer_tree_host()->root_layer()->AddChild(content_); + } + virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } @@ -816,10 +825,118 @@ class LayerTreeHostAnimationTestContinuousAnimate private: int num_commit_complete_; int num_draw_layers_; + FakeContentLayerClient client_; + scoped_refptr<FakeContentLayer> content_; }; MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestContinuousAnimate); +class LayerTreeHostAnimationTestCancelAnimateCommit + : public LayerTreeHostAnimationTest { + public: + LayerTreeHostAnimationTestCancelAnimateCommit() : num_animate_calls_(0) {} + + virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } + + virtual void Animate(base::TimeTicks) OVERRIDE { + // No-op animate will cancel the commit. + if (++num_animate_calls_ == 2) { + EndTest(); + return; + } + layer_tree_host()->SetNeedsAnimate(); + } + + virtual void CommitCompleteOnThread(LayerTreeHostImpl* tree_impl) OVERRIDE { + if (num_animate_calls_ > 1) + FAIL() << "Commit should have been canceled."; + } + + virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { + if (num_animate_calls_ > 1) + FAIL() << "Draw should have been canceled."; + } + + virtual void AfterTest() OVERRIDE { EXPECT_EQ(2, num_animate_calls_); } + + private: + int num_animate_calls_; + FakeContentLayerClient client_; + scoped_refptr<FakeContentLayer> content_; +}; + +MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestCancelAnimateCommit); + +class LayerTreeHostAnimationTestForceRedraw + : public LayerTreeHostAnimationTest { + public: + LayerTreeHostAnimationTestForceRedraw() + : num_animate_(0), num_draw_layers_(0) {} + + virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } + + virtual void Animate(base::TimeTicks) OVERRIDE { + if (++num_animate_ < 2) + layer_tree_host()->SetNeedsAnimate(); + } + + virtual void Layout() OVERRIDE { + layer_tree_host()->SetNextCommitForcesRedraw(); + } + + virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { + if (++num_draw_layers_ == 2) + EndTest(); + } + + virtual void AfterTest() OVERRIDE { + // The first commit will always draw; make sure the second draw triggered + // by the animation was not cancelled. + EXPECT_EQ(2, num_draw_layers_); + EXPECT_EQ(2, num_animate_); + } + + private: + int num_animate_; + int num_draw_layers_; +}; + +MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestForceRedraw); + +class LayerTreeHostAnimationTestAnimateAfterSetNeedsCommit + : public LayerTreeHostAnimationTest { + public: + LayerTreeHostAnimationTestAnimateAfterSetNeedsCommit() + : num_animate_(0), num_draw_layers_(0) {} + + virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } + + virtual void Animate(base::TimeTicks) OVERRIDE { + if (++num_animate_ <= 2) { + layer_tree_host()->SetNeedsCommit(); + layer_tree_host()->SetNeedsAnimate(); + } + } + + virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { + if (++num_draw_layers_ == 2) + EndTest(); + } + + virtual void AfterTest() OVERRIDE { + // The first commit will always draw; make sure the second draw triggered + // by the SetNeedsCommit was not cancelled. + EXPECT_EQ(2, num_draw_layers_); + EXPECT_GE(num_animate_, 2); + } + + private: + int num_animate_; + int num_draw_layers_; +}; + +MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestAnimateAfterSetNeedsCommit); + // Make sure the main thread can still execute animations when CanDraw() is not // true. class LayerTreeHostAnimationTestRunAnimationWhenNotCanDraw |