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

Unified Diff: cc/trees/layer_tree_host_unittest_animation_timelines.cc

Issue 1766483002: CC Animation: Erase old animation tests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 9 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 | « cc/trees/layer_tree_host_unittest_animation.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/layer_tree_host_unittest_animation_timelines.cc
diff --git a/cc/trees/layer_tree_host_unittest_animation_timelines.cc b/cc/trees/layer_tree_host_unittest_animation_timelines.cc
deleted file mode 100644
index 1bd2696a34535e57f708a201cbc73c1347fd67d6..0000000000000000000000000000000000000000
--- a/cc/trees/layer_tree_host_unittest_animation_timelines.cc
+++ /dev/null
@@ -1,1453 +0,0 @@
-// Copyright 2015 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/animation_host.h"
-#include "cc/animation/animation_id_provider.h"
-#include "cc/animation/animation_player.h"
-#include "cc/animation/animation_timeline.h"
-#include "cc/animation/element_animations.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/completion_event.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_client.h"
-#include "cc/test/fake_picture_layer.h"
-#include "cc/test/layer_tree_test.h"
-#include "cc/trees/layer_tree_impl.h"
-
-namespace cc {
-namespace {
-
-class LayerTreeHostTimelinesTest : public LayerTreeTest {
- public:
- LayerTreeHostTimelinesTest()
- : timeline_id_(AnimationIdProvider::NextTimelineId()),
- player_id_(AnimationIdProvider::NextPlayerId()),
- player_child_id_(AnimationIdProvider::NextPlayerId()) {
- timeline_ = AnimationTimeline::Create(timeline_id_);
- player_ = AnimationPlayer::Create(player_id_);
- player_child_ = AnimationPlayer::Create(player_child_id_);
-
- player_->set_layer_animation_delegate(this);
- }
-
- void InitializeSettings(LayerTreeSettings* settings) override {
- settings->use_compositor_animation_timelines = true;
- }
-
- void InitializeLayerSettings(LayerSettings* layer_settings) override {
- layer_settings->use_compositor_animation_timelines = true;
- }
-
- void SetupTree() override { LayerTreeTest::SetupTree(); }
-
- void AttachPlayersToTimeline() {
- layer_tree_host()->animation_host()->AddAnimationTimeline(timeline_.get());
- timeline_->AttachPlayer(player_.get());
- timeline_->AttachPlayer(player_child_.get());
- }
-
- protected:
- scoped_refptr<AnimationTimeline> timeline_;
- scoped_refptr<AnimationPlayer> player_;
- scoped_refptr<AnimationPlayer> player_child_;
-
- const int timeline_id_;
- const int player_id_;
- const int player_child_id_;
-};
-
-// Add a layer animation and confirm that
-// LayerTreeHostImpl::UpdateAnimationState does get called.
-// Evolved from LayerTreeHostAnimationTestAddAnimation
-class LayerTreeHostTimelinesTestAddAnimation
- : public LayerTreeHostTimelinesTest {
- public:
- LayerTreeHostTimelinesTestAddAnimation()
- : update_animation_state_was_called_(false) {}
-
- void BeginTest() override {
- AttachPlayersToTimeline();
- player_->AttachLayer(layer_tree_host()->root_layer()->id());
- PostAddInstantAnimationToMainThreadPlayer(player_.get());
- }
-
- 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,
- TargetProperty::Type target_property,
- int group) override {
- EXPECT_LT(base::TimeTicks(), monotonic_time);
-
- LayerAnimationController* controller =
- player_->element_animations()->layer_animation_controller();
- Animation* animation = controller->GetAnimation(TargetProperty::OPACITY);
- if (animation)
- player_->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(LayerTreeHostTimelinesTestAddAnimation);
-
-// Add a layer animation to a layer, but continually fail to draw. Confirm that
-// after a while, we do eventually force a draw.
-// Evolved from LayerTreeHostAnimationTestCheckerboardDoesNotStarveDraws.
-class LayerTreeHostTimelinesTestCheckerboardDoesNotStarveDraws
- : public LayerTreeHostTimelinesTest {
- public:
- LayerTreeHostTimelinesTestCheckerboardDoesNotStarveDraws()
- : started_animating_(false) {}
-
- void BeginTest() override {
- AttachPlayersToTimeline();
- player_->AttachLayer(layer_tree_host()->root_layer()->id());
- PostAddAnimationToMainThreadPlayer(player_.get());
- }
-
- 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(LayerTreeHostTimelinesTestCheckerboardDoesNotStarveDraws);
-
-// Ensures that animations eventually get deleted.
-// Evolved from LayerTreeHostAnimationTestAnimationsGetDeleted.
-class LayerTreeHostTimelinesTestAnimationsGetDeleted
- : public LayerTreeHostTimelinesTest {
- public:
- LayerTreeHostTimelinesTestAnimationsGetDeleted()
- : started_animating_(false) {}
-
- void BeginTest() override {
- AttachPlayersToTimeline();
- player_->AttachLayer(layer_tree_host()->root_layer()->id());
- PostAddAnimationToMainThreadPlayer(player_.get());
- }
-
- void AnimateLayers(LayerTreeHostImpl* host_impl,
- base::TimeTicks monotonic_time) override {
- bool have_animations = !host_impl->animation_host()
- ->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,
- TargetProperty::Type 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(LayerTreeHostTimelinesTestAnimationsGetDeleted);
-
-// Ensure that an animation's timing function is respected.
-// Evolved from LayerTreeHostAnimationTestAddAnimationWithTimingFunction.
-class LayerTreeHostTimelinesTestAddAnimationWithTimingFunction
- : public LayerTreeHostTimelinesTest {
- public:
- LayerTreeHostTimelinesTestAddAnimationWithTimingFunction() {}
-
- void SetupTree() override {
- LayerTreeHostTimelinesTest::SetupTree();
- picture_ = FakePictureLayer::Create(layer_settings(), &client_);
- picture_->SetBounds(gfx::Size(4, 4));
- client_.set_bounds(picture_->bounds());
- layer_tree_host()->root_layer()->AddChild(picture_);
-
- AttachPlayersToTimeline();
- player_child_->AttachLayer(picture_->id());
- }
-
- void BeginTest() override {
- PostAddAnimationToMainThreadPlayer(player_child_.get());
- }
-
- void AnimateLayers(LayerTreeHostImpl* host_impl,
- base::TimeTicks monotonic_time) override {
- // Wait for the commit with the animation to happen.
- if (host_impl->sync_tree()->source_frame_number() != 0)
- return;
-
- scoped_refptr<AnimationTimeline> timeline_impl =
- host_impl->animation_host()->GetTimelineById(timeline_id_);
- scoped_refptr<AnimationPlayer> player_child_impl =
- timeline_impl->GetPlayerById(player_child_id_);
-
- LayerAnimationController* controller_impl =
- player_child_impl->element_animations()->layer_animation_controller();
- Animation* animation =
- controller_impl->GetAnimation(TargetProperty::OPACITY);
-
- 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<FakePictureLayer> picture_;
-};
-
-SINGLE_AND_MULTI_THREAD_TEST_F(
- LayerTreeHostTimelinesTestAddAnimationWithTimingFunction);
-
-// Ensures that main thread animations have their start times synchronized with
-// impl thread animations.
-// Evolved from LayerTreeHostAnimationTestSynchronizeAnimationStartTimes.
-class LayerTreeHostTimelinesTestSynchronizeAnimationStartTimes
- : public LayerTreeHostTimelinesTest {
- public:
- LayerTreeHostTimelinesTestSynchronizeAnimationStartTimes() {}
-
- void SetupTree() override {
- LayerTreeHostTimelinesTest::SetupTree();
- picture_ = FakePictureLayer::Create(layer_settings(), &client_);
- picture_->SetBounds(gfx::Size(4, 4));
- client_.set_bounds(picture_->bounds());
-
- layer_tree_host()->root_layer()->AddChild(picture_);
-
- AttachPlayersToTimeline();
- player_child_->set_layer_animation_delegate(this);
- player_child_->AttachLayer(picture_->id());
- }
-
- void BeginTest() override {
- PostAddAnimationToMainThreadPlayer(player_child_.get());
- }
-
- void NotifyAnimationStarted(base::TimeTicks monotonic_time,
- TargetProperty::Type target_property,
- int group) override {
- LayerAnimationController* controller =
- player_child_->element_animations()->layer_animation_controller();
- Animation* animation = controller->GetAnimation(TargetProperty::OPACITY);
- main_start_time_ = animation->start_time();
- controller->RemoveAnimation(animation->id());
- EndTest();
- }
-
- void UpdateAnimationState(LayerTreeHostImpl* impl_host,
- bool has_unfinished_animation) override {
- scoped_refptr<AnimationTimeline> timeline_impl =
- impl_host->animation_host()->GetTimelineById(timeline_id_);
- scoped_refptr<AnimationPlayer> player_child_impl =
- timeline_impl->GetPlayerById(player_child_id_);
-
- LayerAnimationController* controller =
- player_child_impl->element_animations()->layer_animation_controller();
- Animation* animation = controller->GetAnimation(TargetProperty::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<FakePictureLayer> picture_;
-};
-
-SINGLE_AND_MULTI_THREAD_TEST_F(
- LayerTreeHostTimelinesTestSynchronizeAnimationStartTimes);
-
-// Ensures that notify animation finished is called.
-// Evolved from LayerTreeHostAnimationTestAnimationFinishedEvents.
-class LayerTreeHostTimelinesTestAnimationFinishedEvents
- : public LayerTreeHostTimelinesTest {
- public:
- LayerTreeHostTimelinesTestAnimationFinishedEvents() {}
-
- void BeginTest() override {
- AttachPlayersToTimeline();
- player_->AttachLayer(layer_tree_host()->root_layer()->id());
- PostAddInstantAnimationToMainThreadPlayer(player_.get());
- }
-
- void NotifyAnimationFinished(base::TimeTicks monotonic_time,
- TargetProperty::Type target_property,
- int group) override {
- LayerAnimationController* controller =
- player_->element_animations()->layer_animation_controller();
- Animation* animation = controller->GetAnimation(TargetProperty::OPACITY);
- if (animation)
- controller->RemoveAnimation(animation->id());
- EndTest();
- }
-
- void AfterTest() override {}
-};
-
-SINGLE_AND_MULTI_THREAD_TEST_F(
- LayerTreeHostTimelinesTestAnimationFinishedEvents);
-
-// Ensures that when opacity is being animated, this value does not cause the
-// subtree to be skipped.
-// Evolved from LayerTreeHostAnimationTestDoNotSkipLayersWithAnimatedOpacity.
-class LayerTreeHostTimelinesTestDoNotSkipLayersWithAnimatedOpacity
- : public LayerTreeHostTimelinesTest {
- public:
- LayerTreeHostTimelinesTestDoNotSkipLayersWithAnimatedOpacity()
- : update_check_layer_(
- FakePictureLayer::Create(layer_settings(), &client_)) {}
-
- void SetupTree() override {
- update_check_layer_->SetOpacity(0.f);
- layer_tree_host()->SetRootLayer(update_check_layer_);
- client_.set_bounds(update_check_layer_->bounds());
- LayerTreeHostTimelinesTest::SetupTree();
-
- AttachPlayersToTimeline();
- player_->AttachLayer(update_check_layer_->id());
- }
-
- void BeginTest() override {
- PostAddAnimationToMainThreadPlayer(player_.get());
- }
-
- void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
- scoped_refptr<AnimationTimeline> timeline_impl =
- host_impl->animation_host()->GetTimelineById(timeline_id_);
- scoped_refptr<AnimationPlayer> player_impl =
- timeline_impl->GetPlayerById(player_id_);
-
- LayerAnimationController* controller_impl =
- player_impl->element_animations()->layer_animation_controller();
- Animation* animation_impl =
- controller_impl->GetAnimation(TargetProperty::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(1, update_check_layer_->update_count());
-
- // clear update_check_layer_ so LayerTreeHost dies.
- update_check_layer_ = NULL;
- }
-
- private:
- FakeContentLayerClient client_;
- scoped_refptr<FakePictureLayer> update_check_layer_;
-};
-
-SINGLE_AND_MULTI_THREAD_TEST_F(
- LayerTreeHostTimelinesTestDoNotSkipLayersWithAnimatedOpacity);
-
-// Layers added to tree with existing active animations should have the
-// animation correctly recognized.
-// Evolved from LayerTreeHostAnimationTestLayerAddedWithAnimation.
-class LayerTreeHostTimelinesTestLayerAddedWithAnimation
- : public LayerTreeHostTimelinesTest {
- public:
- LayerTreeHostTimelinesTestLayerAddedWithAnimation() {}
-
- void BeginTest() override { PostSetNeedsCommitToMainThread(); }
-
- void DidCommit() override {
- if (layer_tree_host()->source_frame_number() == 1) {
- AttachPlayersToTimeline();
-
- scoped_refptr<Layer> layer = Layer::Create(layer_settings());
- player_->AttachLayer(layer->id());
- player_->set_layer_animation_delegate(this);
-
- // Any valid AnimationCurve will do here.
- scoped_ptr<AnimationCurve> curve(new FakeFloatAnimationCurve());
- scoped_ptr<Animation> animation(
- Animation::Create(std::move(curve), 1, 1, TargetProperty::OPACITY));
- player_->AddAnimation(std::move(animation));
-
- // 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(
- LayerTreeHostTimelinesTestLayerAddedWithAnimation);
-
-// Animations should not be started when frames are being skipped due to
-// checkerboard.
-// Evolved from LayerTreeHostAnimationTestCheckerboardDoesntStartAnimations.
-class LayerTreeHostTimelinesTestCheckerboardDoesntStartAnimations
- : public LayerTreeHostTimelinesTest {
- void SetupTree() override {
- LayerTreeHostTimelinesTest::SetupTree();
- picture_ = FakePictureLayer::Create(layer_settings(), &client_);
- picture_->SetBounds(gfx::Size(4, 4));
- client_.set_bounds(picture_->bounds());
- layer_tree_host()->root_layer()->AddChild(picture_);
-
- AttachPlayersToTimeline();
- player_child_->AttachLayer(picture_->id());
- player_child_->set_layer_animation_delegate(this);
- }
-
- 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;
- LayerTreeHostTimelinesTest::InitializeSettings(settings);
- }
-
- void BeginTest() override {
- prevented_draw_ = 0;
- started_times_ = 0;
-
- PostSetNeedsCommitToMainThread();
- }
-
- DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
- LayerTreeHostImpl::FrameData* frame_data,
- DrawResult draw_result) override {
- // Don't checkerboard when the first animation wants to start.
- if (host_impl->active_tree()->source_frame_number() < 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.
- AddOpacityTransitionToPlayer(player_child_.get(), 0.1, 0.2f, 0.8f,
- false);
- break;
- case 2:
- // This second animation will not be drawn so it should not start.
- AddAnimatedTransformToPlayer(player_child_.get(), 0.1, 5, 5);
- break;
- }
- }
-
- void NotifyAnimationStarted(base::TimeTicks monotonic_time,
- TargetProperty::Type 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 started_times_;
- FakeContentLayerClient client_;
- scoped_refptr<FakePictureLayer> picture_;
-};
-
-MULTI_THREAD_TEST_F(
- LayerTreeHostTimelinesTestCheckerboardDoesntStartAnimations);
-
-// 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.
-// Evolved from LayerTreeHostAnimationTestScrollOffsetChangesArePropagated
-class LayerTreeHostTimelinesTestScrollOffsetChangesArePropagated
- : public LayerTreeHostTimelinesTest {
- public:
- LayerTreeHostTimelinesTestScrollOffsetChangesArePropagated() {}
-
- void SetupTree() override {
- LayerTreeHostTimelinesTest::SetupTree();
-
- scroll_layer_ = FakePictureLayer::Create(layer_settings(), &client_);
- scroll_layer_->SetScrollClipLayerId(layer_tree_host()->root_layer()->id());
- scroll_layer_->SetBounds(gfx::Size(1000, 1000));
- client_.set_bounds(scroll_layer_->bounds());
- scroll_layer_->SetScrollOffset(gfx::ScrollOffset(10, 20));
- layer_tree_host()->root_layer()->AddChild(scroll_layer_);
-
- AttachPlayersToTimeline();
- player_child_->AttachLayer(scroll_layer_->id());
- }
-
- 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(
- std::move(curve), 1, 0, TargetProperty::SCROLL_OFFSET));
- animation->set_needs_synchronized_start_time(true);
- bool impl_scrolling_supported =
- layer_tree_host()->proxy()->SupportsImplScrolling();
- if (impl_scrolling_supported)
- player_child_->AddAnimation(std::move(animation));
- else
- 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<FakePictureLayer> scroll_layer_;
-};
-
-SINGLE_AND_MULTI_THREAD_TEST_F(
- LayerTreeHostTimelinesTestScrollOffsetChangesArePropagated);
-
-// 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.
-// Evolved from LayerTreeHostAnimationTestScrollOffsetAnimationRemoval
-class LayerTreeHostTimelinesTestScrollOffsetAnimationRemoval
- : public LayerTreeHostTimelinesTest {
- public:
- LayerTreeHostTimelinesTestScrollOffsetAnimationRemoval()
- : final_postion_(50.0, 100.0) {}
-
- void SetupTree() override {
- LayerTreeHostTimelinesTest::SetupTree();
-
- scroll_layer_ = FakePictureLayer::Create(layer_settings(), &client_);
- scroll_layer_->SetScrollClipLayerId(layer_tree_host()->root_layer()->id());
- scroll_layer_->SetBounds(gfx::Size(10000, 10000));
- client_.set_bounds(scroll_layer_->bounds());
- 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(
- std::move(curve), 1, 0, TargetProperty::SCROLL_OFFSET));
- animation->set_needs_synchronized_start_time(true);
-
- AttachPlayersToTimeline();
- player_child_->AttachLayer(scroll_layer_->id());
- player_child_->AddAnimation(std::move(animation));
- }
-
- void BeginTest() override { PostSetNeedsCommitToMainThread(); }
-
- void BeginMainFrame(const BeginFrameArgs& args) override {
- switch (layer_tree_host()->source_frame_number()) {
- case 0:
- break;
- case 1: {
- Animation* animation =
- player_child_->element_animations()
- ->layer_animation_controller()
- ->GetAnimation(TargetProperty::SCROLL_OFFSET);
- player_child_->RemoveAnimation(animation->id());
- scroll_layer_->SetScrollOffset(final_postion_);
- break;
- }
- default:
- EXPECT_EQ(final_postion_, scroll_layer_->scroll_offset());
- }
- }
-
- void BeginCommitOnThread(LayerTreeHostImpl* host_impl) override {
- 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;
- }
-
- scoped_refptr<AnimationTimeline> timeline_impl =
- host_impl->animation_host()->GetTimelineById(timeline_id_);
- scoped_refptr<AnimationPlayer> player_impl =
- timeline_impl->GetPlayerById(player_child_id_);
-
- LayerImpl* scroll_layer_impl =
- host_impl->active_tree()->root_layer()->children()[0].get();
- Animation* animation = player_impl->element_animations()
- ->layer_animation_controller()
- ->GetAnimation(TargetProperty::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 = ScrollDelta(scroll_layer_impl);
- 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->pending_tree()->source_frame_number() != 1)
- return;
- LayerImpl* scroll_layer_impl =
- host_impl->pending_tree()->root_layer()->children()[0].get();
- 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].get();
- 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<FakePictureLayer> scroll_layer_;
- const gfx::ScrollOffset final_postion_;
-};
-
-MULTI_THREAD_TEST_F(LayerTreeHostTimelinesTestScrollOffsetAnimationRemoval);
-
-// 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.
-// Evolved from LayerTreeHostAnimationTestAnimationsAddedToNewAndExistingLayers.
-class LayerTreeHostTimelinesTestAnimationsAddedToNewAndExistingLayers
- : public LayerTreeHostTimelinesTest {
- public:
- LayerTreeHostTimelinesTestAnimationsAddedToNewAndExistingLayers()
- : frame_count_with_pending_tree_(0) {}
-
- void BeginTest() override {
- AttachPlayersToTimeline();
- PostSetNeedsCommitToMainThread();
- }
-
- void DidCommit() override {
- if (layer_tree_host()->source_frame_number() == 1) {
- player_->AttachLayer(layer_tree_host()->root_layer()->id());
- AddAnimatedTransformToPlayer(player_.get(), 4, 1, 1);
- } else if (layer_tree_host()->source_frame_number() == 2) {
- AddOpacityTransitionToPlayer(player_.get(), 1, 0.f, 0.5f, true);
-
- scoped_refptr<Layer> layer = Layer::Create(layer_settings());
- layer_tree_host()->root_layer()->AddChild(layer);
- layer->SetBounds(gfx::Size(4, 4));
-
- player_child_->AttachLayer(layer->id());
- player_child_->set_layer_animation_delegate(this);
- AddOpacityTransitionToPlayer(player_child_.get(), 1, 0.f, 0.5f, true);
- }
- }
-
- void BeginCommitOnThread(LayerTreeHostImpl* host_impl) override {
- 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->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->BlockNotifyReadyToActivateForTesting(false);
- }
- }
-
- void UpdateAnimationState(LayerTreeHostImpl* host_impl,
- bool has_unfinished_animation) override {
- scoped_refptr<AnimationTimeline> timeline_impl =
- host_impl->animation_host()->GetTimelineById(timeline_id_);
- scoped_refptr<AnimationPlayer> player_impl =
- timeline_impl->GetPlayerById(player_id_);
- scoped_refptr<AnimationPlayer> player_child_impl =
- timeline_impl->GetPlayerById(player_child_id_);
-
- // wait for tree activation.
- if (!player_impl->element_animations())
- return;
-
- LayerAnimationController* root_controller_impl =
- player_impl->element_animations()->layer_animation_controller();
- Animation* root_animation =
- root_controller_impl->GetAnimation(TargetProperty::OPACITY);
- if (!root_animation || root_animation->run_state() != Animation::RUNNING)
- return;
-
- LayerAnimationController* child_controller_impl =
- player_child_impl->element_animations()->layer_animation_controller();
- Animation* child_animation =
- child_controller_impl->GetAnimation(TargetProperty::OPACITY);
- EXPECT_EQ(Animation::RUNNING, child_animation->run_state());
- EXPECT_EQ(root_animation->start_time(), child_animation->start_time());
- root_controller_impl->AbortAnimations(TargetProperty::OPACITY);
- root_controller_impl->AbortAnimations(TargetProperty::TRANSFORM);
- child_controller_impl->AbortAnimations(TargetProperty::OPACITY);
- EndTest();
- }
-
- void AfterTest() override {}
-
- private:
- int frame_count_with_pending_tree_;
-};
-
-// This test blocks activation which is not supported for single thread mode.
-MULTI_THREAD_BLOCKNOTIFY_TEST_F(
- LayerTreeHostTimelinesTestAnimationsAddedToNewAndExistingLayers);
-
-// Evolved from LayerTreeHostAnimationTestAddAnimationAfterAnimating.
-class LayerTreeHostTimelinesTestAddAnimationAfterAnimating
- : public LayerTreeHostTimelinesTest {
- public:
- void SetupTree() override {
- LayerTreeHostTimelinesTest::SetupTree();
- content_ = Layer::Create(layer_settings());
- content_->SetBounds(gfx::Size(4, 4));
- layer_tree_host()->root_layer()->AddChild(content_);
-
- AttachPlayersToTimeline();
-
- player_->AttachLayer(layer_tree_host()->root_layer()->id());
- player_child_->AttachLayer(content_->id());
- }
-
- 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.
- AddAnimatedTransformToPlayer(player_.get(), 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.
- AddOpacityTransitionToPlayer(player_child_.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.
- if (host_impl->active_tree()->source_frame_number() < 2)
- return;
- AnimationRegistrar::AnimationControllerMap controllers_copy =
- host_impl->animation_host()
- ->animation_registrar()
- ->active_animation_controllers_for_testing();
- EXPECT_EQ(2u, controllers_copy.size());
- for (auto& it : controllers_copy) {
- int id = it.first;
- if (id == host_impl->RootLayer()->id()) {
- Animation* anim = it.second->GetAnimation(TargetProperty::TRANSFORM);
- EXPECT_GT((anim->start_time() - base::TimeTicks()).InSecondsF(), 0);
- } else if (id == host_impl->RootLayer()->children()[0]->id()) {
- Animation* anim = it.second->GetAnimation(TargetProperty::OPACITY);
- EXPECT_GT((anim->start_time() - base::TimeTicks()).InSecondsF(), 0);
- }
- EndTest();
- }
- }
-
- void AfterTest() override {}
-
- private:
- scoped_refptr<Layer> content_;
-};
-
-SINGLE_AND_MULTI_THREAD_TEST_F(
- LayerTreeHostTimelinesTestAddAnimationAfterAnimating);
-
-class LayerTreeHostTimelinesTestRemoveAnimation
- : public LayerTreeHostTimelinesTest {
- public:
- void SetupTree() override {
- LayerTreeHostTimelinesTest::SetupTree();
- layer_ = FakePictureLayer::Create(layer_settings(), &client_);
- layer_->SetBounds(gfx::Size(4, 4));
- client_.set_bounds(layer_->bounds());
- layer_tree_host()->root_layer()->AddChild(layer_);
-
- AttachPlayersToTimeline();
-
- player_->AttachLayer(layer_tree_host()->root_layer()->id());
- player_child_->AttachLayer(layer_->id());
- }
-
- void BeginTest() override { PostSetNeedsCommitToMainThread(); }
-
- void DidCommit() override {
- switch (layer_tree_host()->source_frame_number()) {
- case 1:
- AddAnimatedTransformToPlayer(player_child_.get(), 1.0, 5, 5);
- break;
- case 2:
- LayerAnimationController* controller =
- player_child_->element_animations()->layer_animation_controller();
- Animation* animation =
- controller->GetAnimation(TargetProperty::TRANSFORM);
- player_child_->RemoveAnimation(animation->id());
- gfx::Transform transform;
- transform.Translate(10.f, 10.f);
- layer_->SetTransform(transform);
-
- // Do something that causes property trees to get rebuilt.
- layer_->AddChild(Layer::Create(layer_settings()));
- break;
- }
- }
-
- void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override {
- if (host_impl->active_tree()->source_frame_number() < 2)
- return;
- gfx::Transform expected_transform;
- expected_transform.Translate(10.f, 10.f);
- EXPECT_EQ(
- expected_transform,
- host_impl->active_tree()->root_layer()->children()[0]->DrawTransform());
- EndTest();
- }
-
- void AfterTest() override {}
-
- private:
- scoped_refptr<Layer> layer_;
- FakeContentLayerClient client_;
-};
-
-SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTimelinesTestRemoveAnimation);
-
-class LayerTreeHostTimelinesTestAnimationFinishesDuringCommit
- : public LayerTreeHostTimelinesTest {
- public:
- void SetupTree() override {
- LayerTreeHostTimelinesTest::SetupTree();
- layer_ = FakePictureLayer::Create(layer_settings(), &client_);
- layer_->SetBounds(gfx::Size(4, 4));
- client_.set_bounds(layer_->bounds());
- layer_tree_host()->root_layer()->AddChild(layer_);
-
- AttachPlayersToTimeline();
-
- player_->AttachLayer(layer_tree_host()->root_layer()->id());
- player_child_->AttachLayer(layer_->id());
- }
-
- void BeginTest() override { PostSetNeedsCommitToMainThread(); }
-
- void DidCommit() override {
- if (layer_tree_host()->source_frame_number() == 1)
- AddAnimatedTransformToPlayer(player_child_.get(), 0.04, 5, 5);
- }
-
- void WillCommit() override {
- if (layer_tree_host()->source_frame_number() == 2) {
- // Block until the animation finishes on the compositor thread. Since
- // animations have already been ticked on the main thread, when the commit
- // happens the state on the main thread will be consistent with having a
- // running animation but the state on the compositor thread will be
- // consistent with having only a finished animation.
- completion_.Wait();
- }
- }
-
- void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override {
- switch (host_impl->sync_tree()->source_frame_number()) {
- case 1:
- PostSetNeedsCommitToMainThread();
- break;
- case 2:
- gfx::Transform expected_transform;
- expected_transform.Translate(5.f, 5.f);
- LayerImpl* layer_impl =
- host_impl->sync_tree()->root_layer()->children()[0].get();
- EXPECT_EQ(expected_transform, layer_impl->DrawTransform());
- EndTest();
- break;
- }
- }
-
- void UpdateAnimationState(LayerTreeHostImpl* host_impl,
- bool has_unfinished_animation) override {
- if (host_impl->active_tree()->source_frame_number() == 1 &&
- !has_unfinished_animation) {
- // The animation has finished, so allow the main thread to commit.
- completion_.Signal();
- }
- }
-
- void AfterTest() override {}
-
- private:
- scoped_refptr<Layer> layer_;
- FakeContentLayerClient client_;
- CompletionEvent completion_;
-};
-
-// An animation finishing during commit can only happen when we have a separate
-// compositor thread.
-MULTI_THREAD_TEST_F(LayerTreeHostTimelinesTestAnimationFinishesDuringCommit);
-
-// Check that SetTransformIsPotentiallyAnimatingChanged is called
-// if we destroy LayerAnimationController and ElementAnimations.
-class LayerTreeHostTimelinesTestSetPotentiallyAnimatingOnLacDestruction
- : public LayerTreeHostTimelinesTest {
- public:
- void SetupTree() override {
- prev_screen_space_transform_is_animating_ = true;
- screen_space_transform_animation_stopped_ = false;
-
- LayerTreeHostTimelinesTest::SetupTree();
- AttachPlayersToTimeline();
- player_->AttachLayer(layer_tree_host()->root_layer()->id());
- AddAnimatedTransformToPlayer(player_.get(), 1.0, 5, 5);
- }
-
- void BeginTest() override { PostSetNeedsCommitToMainThread(); }
-
- void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override {
- if (host_impl->pending_tree()->source_frame_number() <= 1) {
- EXPECT_TRUE(host_impl->pending_tree()
- ->root_layer()
- ->screen_space_transform_is_animating());
- } else {
- EXPECT_FALSE(host_impl->pending_tree()
- ->root_layer()
- ->screen_space_transform_is_animating());
- }
- }
-
- void DidCommit() override { PostSetNeedsCommitToMainThread(); }
-
- void UpdateLayerTreeHost() override {
- if (layer_tree_host()->source_frame_number() == 2) {
- // Destroy player.
- timeline_->DetachPlayer(player_.get());
- player_ = nullptr;
- }
- }
-
- DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
- LayerTreeHostImpl::FrameData* frame_data,
- DrawResult draw_result) override {
- const bool screen_space_transform_is_animating =
- host_impl->active_tree()
- ->root_layer()
- ->screen_space_transform_is_animating();
-
- // Check that screen_space_transform_is_animating changes only once.
- if (screen_space_transform_is_animating &&
- prev_screen_space_transform_is_animating_)
- EXPECT_FALSE(screen_space_transform_animation_stopped_);
- if (!screen_space_transform_is_animating &&
- prev_screen_space_transform_is_animating_) {
- EXPECT_FALSE(screen_space_transform_animation_stopped_);
- screen_space_transform_animation_stopped_ = true;
- }
- if (!screen_space_transform_is_animating &&
- !prev_screen_space_transform_is_animating_)
- EXPECT_TRUE(screen_space_transform_animation_stopped_);
-
- prev_screen_space_transform_is_animating_ =
- screen_space_transform_is_animating;
-
- return draw_result;
- }
-
- void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override {
- if (host_impl->active_tree()->source_frame_number() >= 2)
- EndTest();
- }
-
- void AfterTest() override {
- EXPECT_TRUE(screen_space_transform_animation_stopped_);
- }
-
- bool prev_screen_space_transform_is_animating_;
- bool screen_space_transform_animation_stopped_;
-};
-
-MULTI_THREAD_TEST_F(
- LayerTreeHostTimelinesTestSetPotentiallyAnimatingOnLacDestruction);
-
-// Check that we invalidate property trees on AnimationPlayer::SetNeedsCommit.
-class LayerTreeHostTimelinesTestRebuildPropertyTreesOnAnimationSetNeedsCommit
- : public LayerTreeHostTimelinesTest {
- public:
- void SetupTree() override {
- LayerTreeHostTimelinesTest::SetupTree();
- layer_ = FakePictureLayer::Create(layer_settings(), &client_);
- layer_->SetBounds(gfx::Size(4, 4));
- client_.set_bounds(layer_->bounds());
- layer_tree_host()->root_layer()->AddChild(layer_);
-
- AttachPlayersToTimeline();
-
- player_->AttachLayer(layer_tree_host()->root_layer()->id());
- player_child_->AttachLayer(layer_->id());
- }
-
- void BeginTest() override { PostSetNeedsCommitToMainThread(); }
-
- void DidCommit() override {
- if (layer_tree_host()->source_frame_number() == 1 ||
- layer_tree_host()->source_frame_number() == 2)
- PostSetNeedsCommitToMainThread();
- }
-
- void UpdateLayerTreeHost() override {
- if (layer_tree_host()->source_frame_number() == 1) {
- EXPECT_FALSE(layer_tree_host()->property_trees()->needs_rebuild);
- AddAnimatedTransformToPlayer(player_child_.get(), 1.0, 5, 5);
- }
-
- EXPECT_TRUE(layer_tree_host()->property_trees()->needs_rebuild);
- }
-
- void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override {
- if (host_impl->active_tree()->source_frame_number() >= 2)
- EndTest();
- }
-
- void AfterTest() override {}
-
- private:
- scoped_refptr<Layer> layer_;
- FakeContentLayerClient client_;
-};
-
-MULTI_THREAD_TEST_F(
- LayerTreeHostTimelinesTestRebuildPropertyTreesOnAnimationSetNeedsCommit);
-
-class LayerTreeHostTimelinesTestPendingTreeAnimatesFirstCommit
- : public LayerTreeHostTimelinesTest {
- public:
- void SetupTree() override {
- LayerTreeHostTimelinesTest::SetupTree();
-
- layer_ = FakePictureLayer::Create(layer_settings(), &client_);
- layer_->SetBounds(gfx::Size(2, 2));
- client_.set_bounds(layer_->bounds());
- // Transform the layer to 4,4 to start.
- gfx::Transform start_transform;
- start_transform.Translate(4.0, 4.0);
- layer_->SetTransform(start_transform);
-
- layer_tree_host()->root_layer()->AddChild(layer_);
- player_->AttachLayer(layer_->id());
-
- AttachPlayersToTimeline();
- }
-
- void BeginTest() override {
- // Add a translate from 6,7 to 8,9.
- TransformOperations start;
- start.AppendTranslate(6.f, 7.f, 0.f);
- TransformOperations end;
- end.AppendTranslate(8.f, 9.f, 0.f);
- AddAnimatedTransformToPlayer(player_.get(), 4.0, start, end);
-
- PostSetNeedsCommitToMainThread();
- }
-
- void WillPrepareTiles(LayerTreeHostImpl* host_impl) override {
- if (host_impl->sync_tree()->source_frame_number() != 0)
- return;
-
- // After checking this on the sync tree, we will activate, which will cause
- // PrepareTiles to happen again (which races with the test exiting).
- if (TestEnded())
- return;
-
- scoped_refptr<AnimationTimeline> timeline_impl =
- host_impl->animation_host()->GetTimelineById(timeline_id_);
- scoped_refptr<AnimationPlayer> player_impl =
- timeline_impl->GetPlayerById(player_id_);
-
- LayerAnimationController* controller_impl =
- player_impl->element_animations()->layer_animation_controller();
-
- LayerImpl* root = host_impl->sync_tree()->root_layer();
- LayerImpl* child = root->children()[0].get();
- Animation* animation =
- controller_impl->GetAnimation(TargetProperty::TRANSFORM);
-
- // The animation should be starting for the first frame.
- EXPECT_EQ(Animation::STARTING, animation->run_state());
-
- // And the transform should be propogated to the sync tree layer, at its
- // starting state which is 6,7.
- gfx::Transform expected_transform;
- expected_transform.Translate(6.0, 7.0);
- EXPECT_EQ(expected_transform, child->DrawTransform());
- // And the sync tree layer should know it is animating.
- EXPECT_TRUE(child->screen_space_transform_is_animating());
-
- controller_impl->AbortAnimations(TargetProperty::TRANSFORM);
- EndTest();
- }
-
- void AfterTest() override {}
-
- FakeContentLayerClient client_;
- scoped_refptr<Layer> layer_;
-};
-
-SINGLE_AND_MULTI_THREAD_TEST_F(
- LayerTreeHostTimelinesTestPendingTreeAnimatesFirstCommit);
-
-// When a layer with an animation is removed from the tree and later re-added,
-// the animation should resume.
-class LayerTreeHostTimelinesTestAnimatedLayerRemovedAndAdded
- : public LayerTreeHostTimelinesTest {
- public:
- void SetupTree() override {
- LayerTreeHostTimelinesTest::SetupTree();
- layer_ = Layer::Create(layer_settings());
- layer_->SetBounds(gfx::Size(4, 4));
- layer_tree_host()->root_layer()->AddChild(layer_);
-
- layer_tree_host()->animation_host()->AddAnimationTimeline(timeline_.get());
- timeline_->AttachPlayer(player_.get());
- player_->AttachLayer(layer_->id());
- DCHECK(player_->element_animations());
-
- AddOpacityTransitionToPlayer(player_.get(), 10000.0, 0.1f, 0.9f, true);
- }
-
- void BeginTest() override { PostSetNeedsCommitToMainThread(); }
-
- void DidCommit() override {
- switch (layer_tree_host()->source_frame_number()) {
- case 0:
- EXPECT_TRUE(player_->element_animations()
- ->has_active_value_observer_for_testing());
- EXPECT_FALSE(player_->element_animations()
- ->has_pending_value_observer_for_testing());
- EXPECT_TRUE(layer_tree_host()
- ->animation_host()
- ->animation_registrar()
- ->needs_animate_layers());
- break;
- case 1:
- layer_->RemoveFromParent();
- EXPECT_FALSE(player_->element_animations()
- ->has_active_value_observer_for_testing());
- EXPECT_FALSE(player_->element_animations()
- ->has_pending_value_observer_for_testing());
- EXPECT_TRUE(layer_tree_host()
- ->animation_host()
- ->animation_registrar()
- ->needs_animate_layers());
- break;
- case 2:
- layer_tree_host()->root_layer()->AddChild(layer_);
- EXPECT_TRUE(player_->element_animations()
- ->has_active_value_observer_for_testing());
- EXPECT_FALSE(player_->element_animations()
- ->has_pending_value_observer_for_testing());
- EXPECT_TRUE(layer_tree_host()
- ->animation_host()
- ->animation_registrar()
- ->needs_animate_layers());
- break;
- }
- }
-
- void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
- scoped_refptr<AnimationTimeline> timeline_impl =
- host_impl->animation_host()->GetTimelineById(timeline_id_);
- scoped_refptr<AnimationPlayer> player_impl =
- timeline_impl->GetPlayerById(player_id_);
-
- switch (host_impl->active_tree()->source_frame_number()) {
- case 0:
- EXPECT_TRUE(player_impl->element_animations()
- ->has_active_value_observer_for_testing());
- EXPECT_TRUE(host_impl->animation_host()
- ->animation_registrar()
- ->needs_animate_layers());
- break;
- case 1:
- EXPECT_FALSE(player_impl->element_animations()
- ->has_active_value_observer_for_testing());
- EXPECT_TRUE(host_impl->animation_host()
- ->animation_registrar()
- ->needs_animate_layers());
- break;
- case 2:
- EXPECT_TRUE(player_impl->element_animations()
- ->has_active_value_observer_for_testing());
- EXPECT_TRUE(host_impl->animation_host()
- ->animation_registrar()
- ->needs_animate_layers());
- EndTest();
- break;
- }
- }
-
- void AfterTest() override {}
-
- private:
- scoped_refptr<Layer> layer_;
-};
-
-SINGLE_AND_MULTI_THREAD_TEST_F(
- LayerTreeHostTimelinesTestAnimatedLayerRemovedAndAdded);
-
-class LayerTreeHostTimelinesTestIsAnimating
- : public LayerTreeHostTimelinesTest {
- public:
- void SetupTree() override {
- LayerTreeHostTimelinesTest::SetupTree();
- layer_ = FakePictureLayer::Create(layer_settings(), &client_);
- layer_->SetBounds(gfx::Size(4, 4));
- client_.set_bounds(layer_->bounds());
- layer_tree_host()->root_layer()->AddChild(layer_);
-
- AttachPlayersToTimeline();
- player_->AttachLayer(layer_->id());
- }
-
- void BeginTest() override { PostSetNeedsCommitToMainThread(); }
-
- void DidCommit() override {
- switch (layer_tree_host()->source_frame_number()) {
- case 1:
- AddAnimatedTransformToPlayer(player_.get(), 1.0, 5, 5);
- break;
- case 2:
- LayerAnimationController* controller =
- player_->element_animations()->layer_animation_controller();
- Animation* animation =
- controller->GetAnimation(TargetProperty::TRANSFORM);
- player_->RemoveAnimation(animation->id());
- break;
- }
- }
-
- void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override {
- LayerImpl* root = host_impl->sync_tree()->root_layer();
- LayerImpl* child = root->children()[0].get();
- switch (host_impl->sync_tree()->source_frame_number()) {
- case 0:
- // No animation yet.
- break;
- case 1:
- // Animation is started.
- EXPECT_TRUE(child->screen_space_transform_is_animating());
- break;
- case 2:
- // The animation is removed/stopped.
- EXPECT_FALSE(child->screen_space_transform_is_animating());
- EndTest();
- break;
- default:
- NOTREACHED();
- }
- }
-
- void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override {
- LayerImpl* root = host_impl->active_tree()->root_layer();
- LayerImpl* child = root->children()[0].get();
- switch (host_impl->active_tree()->source_frame_number()) {
- case 0:
- // No animation yet.
- break;
- case 1:
- // Animation is started.
- EXPECT_TRUE(child->screen_space_transform_is_animating());
- break;
- case 2:
- // The animation is removed/stopped.
- EXPECT_FALSE(child->screen_space_transform_is_animating());
- EndTest();
- break;
- default:
- NOTREACHED();
- }
- }
-
- void AfterTest() override {}
-
- private:
- scoped_refptr<Layer> layer_;
- FakeContentLayerClient client_;
-};
-
-SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTimelinesTestIsAnimating);
-
-class LayerTreeHostTimelinesTestNotifyAnimationFinished
- : public LayerTreeHostTimelinesTest {
- public:
- LayerTreeHostTimelinesTestNotifyAnimationFinished()
- : called_animation_started_(false), called_animation_finished_(false) {}
-
- void SetupTree() override {
- LayerTreeHostTimelinesTest::SetupTree();
- picture_ = FakePictureLayer::Create(layer_settings(), &client_);
- picture_->SetBounds(gfx::Size(4, 4));
- client_.set_bounds(picture_->bounds());
- layer_tree_host()->root_layer()->AddChild(picture_);
-
- AttachPlayersToTimeline();
- player_->AttachLayer(picture_->id());
- player_->set_layer_animation_delegate(this);
- }
-
- void BeginTest() override {
- PostAddLongAnimationToMainThreadPlayer(player_.get());
- }
-
- void NotifyAnimationStarted(base::TimeTicks monotonic_time,
- TargetProperty::Type target_property,
- int group) override {
- called_animation_started_ = true;
- layer_tree_host()->AnimateLayers(base::TimeTicks::FromInternalValue(
- std::numeric_limits<int64_t>::max()));
- PostSetNeedsCommitToMainThread();
- }
-
- void NotifyAnimationFinished(base::TimeTicks monotonic_time,
- TargetProperty::Type target_property,
- int group) override {
- called_animation_finished_ = true;
- EndTest();
- }
-
- void AfterTest() override {
- EXPECT_TRUE(called_animation_started_);
- EXPECT_TRUE(called_animation_finished_);
- }
-
- private:
- bool called_animation_started_;
- bool called_animation_finished_;
- FakeContentLayerClient client_;
- scoped_refptr<FakePictureLayer> picture_;
-};
-
-SINGLE_AND_MULTI_THREAD_TEST_F(
- LayerTreeHostTimelinesTestNotifyAnimationFinished);
-
-} // namespace
-} // namespace cc
« no previous file with comments | « cc/trees/layer_tree_host_unittest_animation.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698