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 |
deleted file mode 100644 |
index e9b877d0ba6b154e6c41aaf029d78519d0132b6a..0000000000000000000000000000000000000000 |
--- a/cc/trees/layer_tree_host_unittest_animation.cc |
+++ /dev/null |
@@ -1,1275 +0,0 @@ |
-// Copyright 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 "cc/trees/layer_tree_host.h" |
- |
-#include "cc/animation/animation_curve.h" |
-#include "cc/animation/layer_animation_controller.h" |
-#include "cc/animation/scroll_offset_animation_curve.h" |
-#include "cc/animation/timing_function.h" |
-#include "cc/base/time_util.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 { |
- |
-class LayerTreeHostAnimationTest : public LayerTreeTest { |
- public: |
- void SetupTree() override { |
- LayerTreeTest::SetupTree(); |
- layer_tree_host()->root_layer()->set_layer_animation_delegate(this); |
- } |
-}; |
- |
-// Makes sure that SetNeedsAnimate does not cause the CommitRequested() state to |
-// be set. |
-class LayerTreeHostAnimationTestSetNeedsAnimateShouldNotSetCommitRequested |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestSetNeedsAnimateShouldNotSetCommitRequested() |
- : num_commits_(0) {} |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void BeginMainFrame(const BeginFrameArgs& args) override { |
- // We skip the first commit because its the commit that populates the |
- // impl thread with a tree. After the second commit, the test is done. |
- if (num_commits_ != 1) |
- return; |
- |
- layer_tree_host()->SetNeedsAnimate(); |
- // Right now, CommitRequested is going to be true, because during |
- // BeginFrame, we force CommitRequested to true to prevent requests from |
- // hitting the impl thread. But, when the next DidCommit happens, we should |
- // verify that CommitRequested has gone back to false. |
- } |
- |
- void DidCommit() override { |
- if (!num_commits_) { |
- EXPECT_FALSE(layer_tree_host()->CommitRequested()); |
- layer_tree_host()->SetNeedsAnimate(); |
- EXPECT_FALSE(layer_tree_host()->CommitRequested()); |
- } |
- |
- // Verifies that the SetNeedsAnimate we made in ::Animate did not |
- // trigger CommitRequested. |
- EXPECT_FALSE(layer_tree_host()->CommitRequested()); |
- EndTest(); |
- num_commits_++; |
- } |
- |
- void AfterTest() override {} |
- |
- private: |
- int num_commits_; |
-}; |
- |
-MULTI_THREAD_TEST_F( |
- LayerTreeHostAnimationTestSetNeedsAnimateShouldNotSetCommitRequested); |
- |
-// Trigger a frame with SetNeedsCommit. Then, inside the resulting animate |
-// callback, request another frame using SetNeedsAnimate. End the test when |
-// animate gets called yet-again, indicating that the proxy is correctly |
-// handling the case where SetNeedsAnimate() is called inside the BeginFrame |
-// flow. |
-class LayerTreeHostAnimationTestSetNeedsAnimateInsideAnimationCallback |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestSetNeedsAnimateInsideAnimationCallback() |
- : num_begin_frames_(0) {} |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void BeginMainFrame(const BeginFrameArgs& args) override { |
- if (!num_begin_frames_) { |
- layer_tree_host()->SetNeedsAnimate(); |
- num_begin_frames_++; |
- return; |
- } |
- EndTest(); |
- } |
- |
- void AfterTest() override {} |
- |
- private: |
- int num_begin_frames_; |
-}; |
- |
-MULTI_THREAD_TEST_F( |
- LayerTreeHostAnimationTestSetNeedsAnimateInsideAnimationCallback); |
- |
-// Add a layer animation and confirm that |
-// LayerTreeHostImpl::UpdateAnimationState does get called. |
-class LayerTreeHostAnimationTestAddAnimation |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestAddAnimation() |
- : update_animation_state_was_called_(false) {} |
- |
- void BeginTest() override { |
- PostAddInstantAnimationToMainThread(layer_tree_host()->root_layer()); |
- } |
- |
- void UpdateAnimationState(LayerTreeHostImpl* host_impl, |
- bool has_unfinished_animation) override { |
- EXPECT_FALSE(has_unfinished_animation); |
- update_animation_state_was_called_ = true; |
- } |
- |
- void NotifyAnimationStarted(base::TimeTicks monotonic_time, |
- Animation::TargetProperty target_property, |
- int group) override { |
- EXPECT_LT(base::TimeTicks(), monotonic_time); |
- |
- LayerAnimationController* controller = |
- layer_tree_host()->root_layer()->layer_animation_controller(); |
- Animation* animation = controller->GetAnimation(Animation::OPACITY); |
- if (animation) |
- controller->RemoveAnimation(animation->id()); |
- |
- EndTest(); |
- } |
- |
- void AfterTest() override { EXPECT_TRUE(update_animation_state_was_called_); } |
- |
- private: |
- bool update_animation_state_was_called_; |
-}; |
- |
-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. |
-class LayerTreeHostAnimationTestCheckerboardDoesNotStarveDraws |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestCheckerboardDoesNotStarveDraws() |
- : started_animating_(false) {} |
- |
- void BeginTest() override { |
- PostAddAnimationToMainThread(layer_tree_host()->root_layer()); |
- } |
- |
- void AnimateLayers(LayerTreeHostImpl* host_impl, |
- base::TimeTicks monotonic_time) override { |
- started_animating_ = true; |
- } |
- |
- void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override { |
- if (started_animating_) |
- EndTest(); |
- } |
- |
- DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
- LayerTreeHostImpl::FrameData* frame, |
- DrawResult draw_result) override { |
- return DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; |
- } |
- |
- void AfterTest() override {} |
- |
- private: |
- bool started_animating_; |
-}; |
- |
-// Starvation can only be an issue with the MT compositor. |
-MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestCheckerboardDoesNotStarveDraws); |
- |
-// Ensures that animations eventually get deleted. |
-class LayerTreeHostAnimationTestAnimationsGetDeleted |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestAnimationsGetDeleted() |
- : started_animating_(false) {} |
- |
- void BeginTest() override { |
- PostAddAnimationToMainThread(layer_tree_host()->root_layer()); |
- } |
- |
- void AnimateLayers(LayerTreeHostImpl* host_impl, |
- base::TimeTicks monotonic_time) override { |
- bool have_animations = !host_impl->animation_registrar() |
- ->active_animation_controllers_for_testing() |
- .empty(); |
- if (!started_animating_ && have_animations) { |
- started_animating_ = true; |
- return; |
- } |
- |
- if (started_animating_ && !have_animations) |
- EndTest(); |
- } |
- |
- void NotifyAnimationFinished(base::TimeTicks monotonic_time, |
- Animation::TargetProperty target_property, |
- int group) override { |
- // Animations on the impl-side controller only get deleted during a commit, |
- // so we need to schedule a commit. |
- layer_tree_host()->SetNeedsCommit(); |
- } |
- |
- void AfterTest() override {} |
- |
- private: |
- bool started_animating_; |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestAnimationsGetDeleted); |
- |
-// Ensures that animations continue to be ticked when we are backgrounded. |
-class LayerTreeHostAnimationTestTickAnimationWhileBackgrounded |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestTickAnimationWhileBackgrounded() |
- : num_begin_frames_(0) {} |
- |
- void BeginTest() override { |
- PostAddLongAnimationToMainThread(layer_tree_host()->root_layer()); |
- } |
- |
- // Use WillAnimateLayers to set visible false before the animation runs and |
- // causes a commit, so we block the second visible animate in single-thread |
- // mode. |
- void WillAnimateLayers(LayerTreeHostImpl* host_impl, |
- base::TimeTicks monotonic_time) override { |
- // Verify that the host can draw, it's just not visible. |
- EXPECT_TRUE(host_impl->CanDraw()); |
- if (num_begin_frames_ < 2) { |
- if (!num_begin_frames_) { |
- // We have a long animation running. It should continue to tick even |
- // if we are not visible. |
- PostSetVisibleToMainThread(false); |
- } |
- num_begin_frames_++; |
- return; |
- } |
- EndTest(); |
- } |
- |
- void AfterTest() override {} |
- |
- private: |
- int num_begin_frames_; |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_TEST_F( |
- LayerTreeHostAnimationTestTickAnimationWhileBackgrounded); |
- |
-// Ensures that animation time remains monotonic when we switch from foreground |
-// to background ticking and back, even if we're skipping draws due to |
-// checkerboarding when in the foreground. |
-class LayerTreeHostAnimationTestAnimationTickTimeIsMonotonic |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestAnimationTickTimeIsMonotonic() |
- : has_background_ticked_(false), num_foreground_animates_(0) {} |
- |
- void InitializeSettings(LayerTreeSettings* settings) override { |
- // Make sure that drawing many times doesn't cause a checkerboarded |
- // animation to start so we avoid flake in this test. |
- settings->timeout_and_draw_when_animation_checkerboards = false; |
- } |
- |
- void BeginTest() override { |
- PostAddLongAnimationToMainThread(layer_tree_host()->root_layer()); |
- } |
- |
- void AnimateLayers(LayerTreeHostImpl* host_impl, |
- base::TimeTicks monotonic_time) override { |
- EXPECT_GE(monotonic_time, last_tick_time_); |
- last_tick_time_ = monotonic_time; |
- if (host_impl->visible()) { |
- num_foreground_animates_++; |
- if (num_foreground_animates_ > 1 && !has_background_ticked_) |
- PostSetVisibleToMainThread(false); |
- else if (has_background_ticked_) |
- EndTest(); |
- } else { |
- has_background_ticked_ = true; |
- PostSetVisibleToMainThread(true); |
- } |
- } |
- |
- DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
- LayerTreeHostImpl::FrameData* frame, |
- DrawResult draw_result) override { |
- if (TestEnded()) |
- return draw_result; |
- return DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; |
- } |
- |
- void AfterTest() override {} |
- |
- private: |
- bool has_background_ticked_; |
- int num_foreground_animates_; |
- base::TimeTicks last_tick_time_; |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_TEST_F( |
- LayerTreeHostAnimationTestAnimationTickTimeIsMonotonic); |
- |
-// Ensures that animations do not tick when we are backgrounded and |
-// and we have an empty active tree. |
-class LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree |
- : public LayerTreeHostAnimationTest { |
- protected: |
- LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree() |
- : active_tree_was_animated_(false) {} |
- |
- base::TimeDelta BackgroundAnimationInterval(LayerTreeHostImpl* host_impl) { |
- return base::TimeDelta::FromSecondsD( |
- 1.0 / host_impl->settings().background_animation_rate); |
- } |
- |
- void BeginTest() override { |
- PostAddAnimationToMainThread(layer_tree_host()->root_layer()); |
- } |
- |
- void NotifyAnimationFinished(base::TimeTicks monotonic_time, |
- Animation::TargetProperty target_property, |
- int group) override { |
- // Replace animated commits with an empty tree. |
- layer_tree_host()->SetRootLayer(make_scoped_refptr<Layer>(NULL)); |
- } |
- |
- void DidCommit() override { |
- // This alternates setting an empty tree and a non-empty tree with an |
- // animation. |
- switch (layer_tree_host()->source_frame_number()) { |
- case 1: |
- // Wait for NotifyAnimationFinished to commit an empty tree. |
- break; |
- case 2: |
- SetupTree(); |
- AddOpacityTransitionToLayer( |
- layer_tree_host()->root_layer(), 0.000001, 0, 0.5, true); |
- break; |
- case 3: |
- // Wait for NotifyAnimationFinished to commit an empty tree. |
- break; |
- case 4: |
- EndTest(); |
- break; |
- } |
- } |
- |
- void BeginCommitOnThread(LayerTreeHostImpl* host_impl) override { |
- // At the start of every commit, block activations and make sure |
- // we are backgrounded. |
- if (host_impl->settings().impl_side_painting) |
- host_impl->BlockNotifyReadyToActivateForTesting(true); |
- PostSetVisibleToMainThread(false); |
- } |
- |
- void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override { |
- if (!host_impl->settings().impl_side_painting) { |
- // There are no activations to block if we're not impl-side-painting, |
- // so just advance the test immediately. |
- if (host_impl->active_tree()->source_frame_number() < 3) |
- UnblockActivations(host_impl); |
- return; |
- } |
- |
- // We block activation for several ticks to make sure that, even though |
- // there is a pending tree with animations, we still do not background |
- // tick if the active tree is empty. |
- if (host_impl->pending_tree()->source_frame_number() < 3) { |
- base::MessageLoopProxy::current()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind( |
- &LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree:: |
- UnblockActivations, |
- base::Unretained(this), host_impl), |
- 4 * BackgroundAnimationInterval(host_impl)); |
- } |
- } |
- |
- virtual void UnblockActivations(LayerTreeHostImpl* host_impl) { |
- if (host_impl->settings().impl_side_painting) |
- host_impl->BlockNotifyReadyToActivateForTesting(false); |
- } |
- |
- void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { |
- active_tree_was_animated_ = false; |
- |
- // Verify that commits are actually alternating with empty / non-empty |
- // trees. |
- int frame_number = host_impl->active_tree()->source_frame_number(); |
- switch (frame_number) { |
- case 0: |
- case 2: |
- EXPECT_TRUE(host_impl->active_tree()->root_layer()) |
- << "frame: " << frame_number; |
- break; |
- case 1: |
- case 3: |
- EXPECT_FALSE(host_impl->active_tree()->root_layer()) |
- << "frame: " << frame_number; |
- break; |
- } |
- |
- if (host_impl->active_tree()->source_frame_number() < 3) { |
- // Initiate the next commit after a delay to give us a chance to |
- // background tick if the active tree isn't empty. |
- base::MessageLoopProxy::current()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind( |
- &LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree:: |
- InitiateNextCommit, |
- base::Unretained(this), host_impl), |
- 4 * BackgroundAnimationInterval(host_impl)); |
- } |
- } |
- |
- void WillAnimateLayers(LayerTreeHostImpl* host_impl, |
- base::TimeTicks monotonic_time) override { |
- EXPECT_TRUE(host_impl->active_tree()->root_layer()); |
- active_tree_was_animated_ = true; |
- } |
- |
- void InitiateNextCommit(LayerTreeHostImpl* host_impl) { |
- // Verify that we actually animated when we should have. |
- bool has_active_tree = host_impl->active_tree()->root_layer(); |
- EXPECT_EQ(has_active_tree, active_tree_was_animated_); |
- |
- // The next commit is blocked until we become visible again. |
- PostSetVisibleToMainThread(true); |
- } |
- |
- void AfterTest() override {} |
- |
- bool active_tree_was_animated_; |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_BLOCKNOTIFY_TEST_F( |
- LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree); |
- |
-// Ensure that an animation's timing function is respected. |
-class LayerTreeHostAnimationTestAddAnimationWithTimingFunction |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestAddAnimationWithTimingFunction() {} |
- |
- void SetupTree() override { |
- LayerTreeHostAnimationTest::SetupTree(); |
- content_ = FakeContentLayer::Create(&client_); |
- content_->SetBounds(gfx::Size(4, 4)); |
- layer_tree_host()->root_layer()->AddChild(content_); |
- } |
- |
- void BeginTest() override { PostAddAnimationToMainThread(content_.get()); } |
- |
- void AnimateLayers(LayerTreeHostImpl* host_impl, |
- base::TimeTicks monotonic_time) override { |
- LayerAnimationController* controller_impl = |
- host_impl->active_tree()->root_layer()->children()[0]-> |
- layer_animation_controller(); |
- Animation* animation = controller_impl->GetAnimation(Animation::OPACITY); |
- if (!animation) |
- return; |
- |
- const FloatAnimationCurve* curve = |
- animation->curve()->ToFloatAnimationCurve(); |
- float start_opacity = curve->GetValue(base::TimeDelta()); |
- float end_opacity = curve->GetValue(curve->Duration()); |
- float linearly_interpolated_opacity = |
- 0.25f * end_opacity + 0.75f * start_opacity; |
- base::TimeDelta time = TimeUtil::Scale(curve->Duration(), 0.25f); |
- // If the linear timing function associated with this animation was not |
- // picked up, then the linearly interpolated opacity would be different |
- // because of the default ease timing function. |
- EXPECT_FLOAT_EQ(linearly_interpolated_opacity, curve->GetValue(time)); |
- |
- EndTest(); |
- } |
- |
- void AfterTest() override {} |
- |
- FakeContentLayerClient client_; |
- scoped_refptr<FakeContentLayer> content_; |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_TEST_F( |
- LayerTreeHostAnimationTestAddAnimationWithTimingFunction); |
- |
-// Ensures that main thread animations have their start times synchronized with |
-// impl thread animations. |
-class LayerTreeHostAnimationTestSynchronizeAnimationStartTimes |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestSynchronizeAnimationStartTimes() {} |
- |
- 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_); |
- } |
- |
- void BeginTest() override { PostAddAnimationToMainThread(content_.get()); } |
- |
- void NotifyAnimationStarted(base::TimeTicks monotonic_time, |
- Animation::TargetProperty target_property, |
- int group) override { |
- LayerAnimationController* controller = |
- layer_tree_host()->root_layer()->children()[0]-> |
- layer_animation_controller(); |
- Animation* animation = controller->GetAnimation(Animation::OPACITY); |
- main_start_time_ = animation->start_time(); |
- controller->RemoveAnimation(animation->id()); |
- EndTest(); |
- } |
- |
- void UpdateAnimationState(LayerTreeHostImpl* impl_host, |
- bool has_unfinished_animation) override { |
- LayerAnimationController* controller = |
- impl_host->active_tree()->root_layer()->children()[0]-> |
- layer_animation_controller(); |
- Animation* animation = controller->GetAnimation(Animation::OPACITY); |
- if (!animation) |
- return; |
- |
- impl_start_time_ = animation->start_time(); |
- } |
- |
- void AfterTest() override { |
- EXPECT_EQ(impl_start_time_, main_start_time_); |
- EXPECT_LT(base::TimeTicks(), impl_start_time_); |
- } |
- |
- private: |
- base::TimeTicks main_start_time_; |
- base::TimeTicks impl_start_time_; |
- FakeContentLayerClient client_; |
- scoped_refptr<FakeContentLayer> content_; |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_TEST_F( |
- LayerTreeHostAnimationTestSynchronizeAnimationStartTimes); |
- |
-// Ensures that notify animation finished is called. |
-class LayerTreeHostAnimationTestAnimationFinishedEvents |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestAnimationFinishedEvents() {} |
- |
- void BeginTest() override { |
- PostAddInstantAnimationToMainThread(layer_tree_host()->root_layer()); |
- } |
- |
- void NotifyAnimationFinished(base::TimeTicks monotonic_time, |
- Animation::TargetProperty target_property, |
- int group) override { |
- LayerAnimationController* controller = |
- layer_tree_host()->root_layer()->layer_animation_controller(); |
- Animation* animation = controller->GetAnimation(Animation::OPACITY); |
- if (animation) |
- controller->RemoveAnimation(animation->id()); |
- EndTest(); |
- } |
- |
- void AfterTest() override {} |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_TEST_F( |
- LayerTreeHostAnimationTestAnimationFinishedEvents); |
- |
-// Ensures that when opacity is being animated, this value does not cause the |
-// subtree to be skipped. |
-class LayerTreeHostAnimationTestDoNotSkipLayersWithAnimatedOpacity |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestDoNotSkipLayersWithAnimatedOpacity() |
- : update_check_layer_(FakeContentLayer::Create(&client_)) { |
- } |
- |
- void SetupTree() override { |
- update_check_layer_->SetOpacity(0.f); |
- layer_tree_host()->SetRootLayer(update_check_layer_); |
- LayerTreeHostAnimationTest::SetupTree(); |
- } |
- |
- void BeginTest() override { |
- PostAddAnimationToMainThread(update_check_layer_.get()); |
- } |
- |
- void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { |
- LayerAnimationController* controller_impl = |
- host_impl->active_tree()->root_layer()->layer_animation_controller(); |
- Animation* animation_impl = |
- controller_impl->GetAnimation(Animation::OPACITY); |
- controller_impl->RemoveAnimation(animation_impl->id()); |
- EndTest(); |
- } |
- |
- void AfterTest() override { |
- // Update() should have been called once, proving that the layer was not |
- // skipped. |
- EXPECT_EQ(1u, update_check_layer_->update_count()); |
- |
- // clear update_check_layer_ so LayerTreeHost dies. |
- update_check_layer_ = NULL; |
- } |
- |
- private: |
- FakeContentLayerClient client_; |
- scoped_refptr<FakeContentLayer> update_check_layer_; |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_TEST_F( |
- LayerTreeHostAnimationTestDoNotSkipLayersWithAnimatedOpacity); |
- |
-// Layers added to tree with existing active animations should have the |
-// animation correctly recognized. |
-class LayerTreeHostAnimationTestLayerAddedWithAnimation |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestLayerAddedWithAnimation() {} |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void DidCommit() override { |
- if (layer_tree_host()->source_frame_number() == 1) { |
- scoped_refptr<Layer> layer = Layer::Create(); |
- layer->set_layer_animation_delegate(this); |
- |
- // Any valid AnimationCurve will do here. |
- scoped_ptr<AnimationCurve> curve(new FakeFloatAnimationCurve()); |
- scoped_ptr<Animation> animation( |
- Animation::Create(curve.Pass(), 1, 1, Animation::OPACITY)); |
- layer->layer_animation_controller()->AddAnimation(animation.Pass()); |
- |
- // We add the animation *before* attaching the layer to the tree. |
- layer_tree_host()->root_layer()->AddChild(layer); |
- } |
- } |
- |
- void AnimateLayers(LayerTreeHostImpl* impl_host, |
- base::TimeTicks monotonic_time) override { |
- EndTest(); |
- } |
- |
- void AfterTest() override {} |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_TEST_F( |
- LayerTreeHostAnimationTestLayerAddedWithAnimation); |
- |
-class LayerTreeHostAnimationTestCancelAnimateCommit |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestCancelAnimateCommit() |
- : num_begin_frames_(0), num_commit_calls_(0), num_draw_calls_(0) {} |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void BeginMainFrame(const BeginFrameArgs& args) override { |
- num_begin_frames_++; |
- // No-op animate will cancel the commit. |
- if (layer_tree_host()->source_frame_number() == 1) { |
- EndTest(); |
- return; |
- } |
- layer_tree_host()->SetNeedsAnimate(); |
- } |
- |
- void CommitCompleteOnThread(LayerTreeHostImpl* impl) override { |
- num_commit_calls_++; |
- if (impl->active_tree()->source_frame_number() > 1) |
- FAIL() << "Commit should have been canceled."; |
- } |
- |
- void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
- num_draw_calls_++; |
- if (impl->active_tree()->source_frame_number() > 1) |
- FAIL() << "Draw should have been canceled."; |
- } |
- |
- void AfterTest() override { |
- EXPECT_EQ(2, num_begin_frames_); |
- EXPECT_EQ(1, num_commit_calls_); |
- EXPECT_EQ(1, num_draw_calls_); |
- } |
- |
- private: |
- int num_begin_frames_; |
- int num_commit_calls_; |
- int num_draw_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) {} |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void BeginMainFrame(const BeginFrameArgs& args) override { |
- if (++num_animate_ < 2) |
- layer_tree_host()->SetNeedsAnimate(); |
- } |
- |
- void Layout() override { layer_tree_host()->SetNextCommitForcesRedraw(); } |
- |
- void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
- if (++num_draw_layers_ == 2) |
- EndTest(); |
- } |
- |
- 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) {} |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void BeginMainFrame(const BeginFrameArgs& args) override { |
- if (++num_animate_ <= 2) { |
- layer_tree_host()->SetNeedsCommit(); |
- layer_tree_host()->SetNeedsAnimate(); |
- } |
- } |
- |
- void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
- if (++num_draw_layers_ == 2) |
- EndTest(); |
- } |
- |
- 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 |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestRunAnimationWhenNotCanDraw() : started_times_(0) {} |
- |
- 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_); |
- } |
- |
- void BeginTest() override { |
- layer_tree_host()->SetViewportSize(gfx::Size()); |
- PostAddAnimationToMainThread(content_.get()); |
- } |
- |
- void NotifyAnimationStarted(base::TimeTicks monotonic_time, |
- Animation::TargetProperty target_property, |
- int group) override { |
- started_times_++; |
- } |
- |
- void NotifyAnimationFinished(base::TimeTicks monotonic_time, |
- Animation::TargetProperty target_property, |
- int group) override { |
- EndTest(); |
- } |
- |
- 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) {} |
- |
- 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_); |
- } |
- |
- void BeginTest() override { |
- visible_ = true; |
- PostAddAnimationToMainThread(content_.get()); |
- } |
- |
- void DidCommit() override { |
- visible_ = false; |
- layer_tree_host()->SetVisible(false); |
- } |
- |
- void NotifyAnimationStarted(base::TimeTicks monotonic_time, |
- Animation::TargetProperty target_property, |
- int group) override { |
- EXPECT_FALSE(visible_); |
- started_times_++; |
- } |
- |
- void NotifyAnimationFinished(base::TimeTicks monotonic_time, |
- Animation::TargetProperty target_property, |
- int group) override { |
- EXPECT_FALSE(visible_); |
- EXPECT_EQ(1, started_times_); |
- EndTest(); |
- } |
- |
- 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 { |
- 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_); |
- } |
- |
- void InitializeSettings(LayerTreeSettings* settings) override { |
- // Make sure that drawing many times doesn't cause a checkerboarded |
- // animation to start so we avoid flake in this test. |
- settings->timeout_and_draw_when_animation_checkerboards = false; |
- } |
- |
- void BeginTest() override { |
- prevented_draw_ = 0; |
- added_animations_ = 0; |
- started_times_ = 0; |
- |
- PostSetNeedsCommitToMainThread(); |
- } |
- |
- DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
- LayerTreeHostImpl::FrameData* frame_data, |
- DrawResult draw_result) override { |
- if (added_animations_ < 2) |
- return draw_result; |
- if (TestEnded()) |
- return draw_result; |
- // Act like there is checkerboard when the second animation wants to draw. |
- ++prevented_draw_; |
- if (prevented_draw_ > 2) |
- EndTest(); |
- return DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; |
- } |
- |
- void DidCommitAndDrawFrame() override { |
- switch (layer_tree_host()->source_frame_number()) { |
- case 1: |
- // The animation is longer than 1 BeginFrame interval. |
- AddOpacityTransitionToLayer(content_.get(), 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_.get(), 0.1, 5, 5); |
- added_animations_++; |
- break; |
- } |
- } |
- |
- void NotifyAnimationStarted(base::TimeTicks monotonic_time, |
- Animation::TargetProperty target_property, |
- int group) override { |
- if (TestEnded()) |
- return; |
- started_times_++; |
- } |
- |
- void AfterTest() override { |
- // Make sure we tried to draw the second animation but failed. |
- EXPECT_LT(0, prevented_draw_); |
- // The first animation should be started, but the second should not because |
- // of checkerboard. |
- EXPECT_EQ(1, started_times_); |
- } |
- |
- int prevented_draw_; |
- int added_animations_; |
- int started_times_; |
- FakeContentLayerClient client_; |
- scoped_refptr<FakeContentLayer> content_; |
-}; |
- |
-MULTI_THREAD_TEST_F( |
- LayerTreeHostAnimationTestCheckerboardDoesntStartAnimations); |
- |
-// Verifies that scroll offset animations are only accepted when impl-scrolling |
-// is supported, and that when scroll offset animations are accepted, |
-// scroll offset updates are sent back to the main thread. |
-class LayerTreeHostAnimationTestScrollOffsetChangesArePropagated |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestScrollOffsetChangesArePropagated() {} |
- |
- void SetupTree() override { |
- LayerTreeHostAnimationTest::SetupTree(); |
- |
- scroll_layer_ = FakeContentLayer::Create(&client_); |
- scroll_layer_->SetScrollClipLayerId(layer_tree_host()->root_layer()->id()); |
- scroll_layer_->SetBounds(gfx::Size(1000, 1000)); |
- scroll_layer_->SetScrollOffset(gfx::ScrollOffset(10, 20)); |
- layer_tree_host()->root_layer()->AddChild(scroll_layer_); |
- } |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void DidCommit() override { |
- switch (layer_tree_host()->source_frame_number()) { |
- case 1: { |
- scoped_ptr<ScrollOffsetAnimationCurve> curve( |
- ScrollOffsetAnimationCurve::Create( |
- gfx::ScrollOffset(500.f, 550.f), |
- EaseInOutTimingFunction::Create())); |
- scoped_ptr<Animation> animation( |
- Animation::Create(curve.Pass(), 1, 0, Animation::SCROLL_OFFSET)); |
- animation->set_needs_synchronized_start_time(true); |
- bool animation_added = scroll_layer_->AddAnimation(animation.Pass()); |
- bool impl_scrolling_supported = |
- layer_tree_host()->proxy()->SupportsImplScrolling(); |
- EXPECT_EQ(impl_scrolling_supported, animation_added); |
- if (!impl_scrolling_supported) |
- EndTest(); |
- break; |
- } |
- default: |
- if (scroll_layer_->scroll_offset().x() > 10 && |
- scroll_layer_->scroll_offset().y() > 20) |
- EndTest(); |
- } |
- } |
- |
- void AfterTest() override {} |
- |
- private: |
- FakeContentLayerClient client_; |
- scoped_refptr<FakeContentLayer> scroll_layer_; |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_TEST_F( |
- LayerTreeHostAnimationTestScrollOffsetChangesArePropagated); |
- |
-// Verifies that when the main thread removes a scroll animation and sets a new |
-// scroll position, the active tree takes on exactly this new scroll position |
-// after activation, and the main thread doesn't receive a spurious scroll |
-// delta. |
-class LayerTreeHostAnimationTestScrollOffsetAnimationRemoval |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestScrollOffsetAnimationRemoval() |
- : final_postion_(50.0, 100.0) {} |
- |
- void SetupTree() override { |
- LayerTreeHostAnimationTest::SetupTree(); |
- |
- scroll_layer_ = FakeContentLayer::Create(&client_); |
- scroll_layer_->SetScrollClipLayerId(layer_tree_host()->root_layer()->id()); |
- scroll_layer_->SetBounds(gfx::Size(10000, 10000)); |
- scroll_layer_->SetScrollOffset(gfx::ScrollOffset(100.0, 200.0)); |
- layer_tree_host()->root_layer()->AddChild(scroll_layer_); |
- |
- scoped_ptr<ScrollOffsetAnimationCurve> curve( |
- ScrollOffsetAnimationCurve::Create(gfx::ScrollOffset(6500.f, 7500.f), |
- EaseInOutTimingFunction::Create())); |
- scoped_ptr<Animation> animation( |
- Animation::Create(curve.Pass(), 1, 0, Animation::SCROLL_OFFSET)); |
- animation->set_needs_synchronized_start_time(true); |
- scroll_layer_->AddAnimation(animation.Pass()); |
- } |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void BeginMainFrame(const BeginFrameArgs& args) override { |
- switch (layer_tree_host()->source_frame_number()) { |
- case 0: |
- break; |
- case 1: { |
- Animation* animation = |
- scroll_layer_->layer_animation_controller()->GetAnimation( |
- Animation::SCROLL_OFFSET); |
- scroll_layer_->layer_animation_controller()->RemoveAnimation( |
- animation->id()); |
- scroll_layer_->SetScrollOffset(final_postion_); |
- break; |
- } |
- default: |
- EXPECT_EQ(final_postion_, scroll_layer_->scroll_offset()); |
- } |
- } |
- |
- void BeginCommitOnThread(LayerTreeHostImpl* host_impl) override { |
- if (host_impl->settings().impl_side_painting) |
- host_impl->BlockNotifyReadyToActivateForTesting(true); |
- } |
- |
- void WillBeginImplFrameOnThread(LayerTreeHostImpl* host_impl, |
- const BeginFrameArgs& args) override { |
- if (!host_impl->pending_tree()) |
- return; |
- |
- if (!host_impl->active_tree()->root_layer()) { |
- host_impl->BlockNotifyReadyToActivateForTesting(false); |
- return; |
- } |
- |
- LayerImpl* scroll_layer_impl = |
- host_impl->active_tree()->root_layer()->children()[0]; |
- Animation* animation = |
- scroll_layer_impl->layer_animation_controller()->GetAnimation( |
- Animation::SCROLL_OFFSET); |
- |
- if (!animation || animation->run_state() != Animation::RUNNING) { |
- host_impl->BlockNotifyReadyToActivateForTesting(false); |
- return; |
- } |
- |
- // Block activation until the running animation has a chance to produce a |
- // scroll delta. |
- gfx::Vector2dF scroll_delta = scroll_layer_impl->ScrollDelta(); |
- if (scroll_delta.x() < 1.f || scroll_delta.y() < 1.f) |
- return; |
- |
- host_impl->BlockNotifyReadyToActivateForTesting(false); |
- } |
- |
- void WillActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { |
- if (!host_impl->settings().impl_side_painting) |
- return; |
- if (host_impl->pending_tree()->source_frame_number() != 1) |
- return; |
- LayerImpl* scroll_layer_impl = |
- host_impl->pending_tree()->root_layer()->children()[0]; |
- EXPECT_EQ(final_postion_, scroll_layer_impl->CurrentScrollOffset()); |
- } |
- |
- void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { |
- if (host_impl->active_tree()->source_frame_number() != 1) |
- return; |
- LayerImpl* scroll_layer_impl = |
- host_impl->active_tree()->root_layer()->children()[0]; |
- EXPECT_EQ(final_postion_, scroll_layer_impl->CurrentScrollOffset()); |
- EndTest(); |
- } |
- |
- void AfterTest() override { |
- EXPECT_EQ(final_postion_, scroll_layer_->scroll_offset()); |
- } |
- |
- private: |
- FakeContentLayerClient client_; |
- scoped_refptr<FakeContentLayer> scroll_layer_; |
- const gfx::ScrollOffset final_postion_; |
-}; |
- |
-MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestScrollOffsetAnimationRemoval); |
- |
-// When animations are simultaneously added to an existing layer and to a new |
-// layer, they should start at the same time, even when there's already a |
-// running animation on the existing layer. |
-class LayerTreeHostAnimationTestAnimationsAddedToNewAndExistingLayers |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestAnimationsAddedToNewAndExistingLayers() |
- : frame_count_with_pending_tree_(0) {} |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void DidCommit() override { |
- if (layer_tree_host()->source_frame_number() == 1) { |
- AddAnimatedTransformToLayer(layer_tree_host()->root_layer(), 4, 1, 1); |
- } else if (layer_tree_host()->source_frame_number() == 2) { |
- AddOpacityTransitionToLayer( |
- layer_tree_host()->root_layer(), 1, 0.f, 0.5f, true); |
- |
- scoped_refptr<Layer> layer = Layer::Create(); |
- layer_tree_host()->root_layer()->AddChild(layer); |
- layer->set_layer_animation_delegate(this); |
- layer->SetBounds(gfx::Size(4, 4)); |
- AddOpacityTransitionToLayer(layer.get(), 1, 0.f, 0.5f, true); |
- } |
- } |
- |
- void BeginCommitOnThread(LayerTreeHostImpl* host_impl) override { |
- if (host_impl->settings().impl_side_painting) |
- host_impl->BlockNotifyReadyToActivateForTesting(true); |
- } |
- |
- void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override { |
- // For the commit that added animations to new and existing layers, keep |
- // blocking activation. We want to verify that even with activation blocked, |
- // the animation on the layer that's already in the active tree won't get a |
- // head start. |
- if (host_impl->settings().impl_side_painting && |
- host_impl->pending_tree()->source_frame_number() != 2) { |
- host_impl->BlockNotifyReadyToActivateForTesting(false); |
- } |
- } |
- |
- void WillBeginImplFrameOnThread(LayerTreeHostImpl* host_impl, |
- const BeginFrameArgs& args) override { |
- if (!host_impl->pending_tree() || |
- host_impl->pending_tree()->source_frame_number() != 2) |
- return; |
- |
- frame_count_with_pending_tree_++; |
- if (frame_count_with_pending_tree_ == 2 && |
- host_impl->settings().impl_side_painting) { |
- host_impl->BlockNotifyReadyToActivateForTesting(false); |
- } |
- } |
- |
- void UpdateAnimationState(LayerTreeHostImpl* host_impl, |
- bool has_unfinished_animation) override { |
- LayerAnimationController* root_controller_impl = |
- host_impl->active_tree()->root_layer()->layer_animation_controller(); |
- Animation* root_animation = |
- root_controller_impl->GetAnimation(Animation::OPACITY); |
- if (!root_animation || root_animation->run_state() != Animation::RUNNING) |
- return; |
- |
- LayerAnimationController* child_controller_impl = |
- host_impl->active_tree()->root_layer()->children() |
- [0]->layer_animation_controller(); |
- Animation* child_animation = |
- child_controller_impl->GetAnimation(Animation::OPACITY); |
- EXPECT_EQ(Animation::RUNNING, child_animation->run_state()); |
- EXPECT_EQ(root_animation->start_time(), child_animation->start_time()); |
- root_controller_impl->AbortAnimations(Animation::OPACITY); |
- root_controller_impl->AbortAnimations(Animation::TRANSFORM); |
- child_controller_impl->AbortAnimations(Animation::OPACITY); |
- EndTest(); |
- } |
- |
- void AfterTest() override {} |
- |
- private: |
- int frame_count_with_pending_tree_; |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_BLOCKNOTIFY_TEST_F( |
- LayerTreeHostAnimationTestAnimationsAddedToNewAndExistingLayers); |
- |
-class LayerTreeHostAnimationTestAddAnimationAfterAnimating |
- : public LayerTreeHostAnimationTest { |
- public: |
- LayerTreeHostAnimationTestAddAnimationAfterAnimating() |
- : num_swap_buffers_(0) {} |
- |
- void SetupTree() override { |
- LayerTreeHostAnimationTest::SetupTree(); |
- content_ = Layer::Create(); |
- content_->SetBounds(gfx::Size(4, 4)); |
- layer_tree_host()->root_layer()->AddChild(content_); |
- } |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void DidCommit() override { |
- switch (layer_tree_host()->source_frame_number()) { |
- case 1: |
- // First frame: add an animation to the root layer. |
- AddAnimatedTransformToLayer(layer_tree_host()->root_layer(), 0.1, 5, 5); |
- break; |
- case 2: |
- // Second frame: add an animation to the content layer. The root layer |
- // animation has caused us to animate already during this frame. |
- AddOpacityTransitionToLayer(content_.get(), 0.1, 5, 5, false); |
- break; |
- } |
- } |
- |
- void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override { |
- // After both animations have started, verify that they have valid |
- // start times. |
- num_swap_buffers_++; |
- AnimationRegistrar::AnimationControllerMap controllers_copy = |
- host_impl->animation_registrar() |
- ->active_animation_controllers_for_testing(); |
- if (controllers_copy.size() == 2u) { |
- EndTest(); |
- EXPECT_GE(num_swap_buffers_, 3); |
- for (auto& it : controllers_copy) { |
- int id = it.first; |
- if (id == host_impl->RootLayer()->id()) { |
- Animation* anim = it.second->GetAnimation(Animation::TRANSFORM); |
- EXPECT_GT((anim->start_time() - base::TimeTicks()).InSecondsF(), 0); |
- } else if (id == host_impl->RootLayer()->children()[0]->id()) { |
- Animation* anim = it.second->GetAnimation(Animation::OPACITY); |
- EXPECT_GT((anim->start_time() - base::TimeTicks()).InSecondsF(), 0); |
- } |
- } |
- } |
- } |
- |
- void AfterTest() override {} |
- |
- private: |
- scoped_refptr<Layer> content_; |
- int num_swap_buffers_; |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_TEST_F( |
- LayerTreeHostAnimationTestAddAnimationAfterAnimating); |
- |
-} // namespace |
-} // namespace cc |