Index: cc/animation/animation_player_unittest.cc |
diff --git a/cc/animation/animation_player_unittest.cc b/cc/animation/animation_player_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..466964f6d7741bf898e8133b07254e6a1373d495 |
--- /dev/null |
+++ b/cc/animation/animation_player_unittest.cc |
@@ -0,0 +1,336 @@ |
+// 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/animation/animation_player.h" |
+ |
+#include "cc/animation/animation_delegate.h" |
+#include "cc/animation/animation_host.h" |
+#include "cc/animation/animation_id_provider.h" |
+#include "cc/animation/animation_registrar.h" |
+#include "cc/animation/animation_timeline.h" |
+#include "cc/animation/element_animations.h" |
+#include "cc/test/animation_test_common.h" |
+#include "cc/test/animation_timelines_test_common.h" |
+ |
+namespace cc { |
+namespace { |
+ |
+class AnimationPlayerTest : public AnimationTimelinesTest { |
+ public: |
+ AnimationPlayerTest() {} |
+ ~AnimationPlayerTest() override {} |
+}; |
+ |
+// See element_animations_unittest.cc for active/pending observers tests. |
+ |
+TEST_F(AnimationPlayerTest, AttachDetachLayerIfTimelineAttached) { |
+ host_->AddAnimationTimeline(timeline_); |
+ timeline_->AttachPlayer(player_); |
+ EXPECT_FALSE(player_->element_animations()); |
+ EXPECT_FALSE(player_->layer_id()); |
+ |
+ host_->PushPropertiesTo(host_impl_); |
+ |
+ EXPECT_FALSE(GetImplPlayerForLayerId(layer_id_)); |
+ |
+ GetImplTimelineAndPlayerByID(); |
+ |
+ EXPECT_FALSE(player_impl_->element_animations()); |
+ EXPECT_FALSE(player_impl_->layer_id()); |
+ |
+ player_->AttachLayer(layer_id_); |
+ EXPECT_EQ(player_, GetPlayerForLayerId(layer_id_)); |
+ EXPECT_TRUE(player_->element_animations()); |
+ EXPECT_EQ(player_->layer_id(), layer_id_); |
+ |
+ host_->PushPropertiesTo(host_impl_); |
+ |
+ EXPECT_EQ(player_impl_, GetImplPlayerForLayerId(layer_id_)); |
+ EXPECT_TRUE(player_impl_->element_animations()); |
+ EXPECT_EQ(player_impl_->layer_id(), layer_id_); |
+ |
+ player_->DetachLayer(); |
+ EXPECT_FALSE(GetPlayerForLayerId(layer_id_)); |
+ EXPECT_FALSE(player_->element_animations()); |
+ EXPECT_FALSE(player_->layer_id()); |
+ |
+ host_->PushPropertiesTo(host_impl_); |
+ |
+ EXPECT_FALSE(GetImplPlayerForLayerId(layer_id_)); |
+ EXPECT_FALSE(player_impl_->element_animations()); |
+ EXPECT_FALSE(player_impl_->layer_id()); |
+ |
+ timeline_->DetachPlayer(player_); |
+ EXPECT_FALSE(player_->animation_timeline()); |
+ EXPECT_FALSE(player_->element_animations()); |
+ EXPECT_FALSE(player_->layer_id()); |
+} |
+ |
+TEST_F(AnimationPlayerTest, AttachDetachTimelineIfLayerAttached) { |
+ host_->AddAnimationTimeline(timeline_); |
+ |
+ EXPECT_FALSE(player_->element_animations()); |
+ EXPECT_FALSE(player_->layer_id()); |
+ |
+ player_->AttachLayer(layer_id_); |
+ EXPECT_FALSE(player_->animation_timeline()); |
+ EXPECT_FALSE(GetPlayerForLayerId(layer_id_)); |
+ EXPECT_FALSE(player_->element_animations()); |
+ EXPECT_EQ(player_->layer_id(), layer_id_); |
+ |
+ timeline_->AttachPlayer(player_); |
+ EXPECT_EQ(timeline_, player_->animation_timeline()); |
+ EXPECT_EQ(player_, GetPlayerForLayerId(layer_id_)); |
+ EXPECT_TRUE(player_->element_animations()); |
+ EXPECT_EQ(player_->layer_id(), layer_id_); |
+ |
+ // Removing player from timeline detaches layer. |
+ timeline_->DetachPlayer(player_); |
+ EXPECT_FALSE(player_->animation_timeline()); |
+ EXPECT_FALSE(GetPlayerForLayerId(layer_id_)); |
+ EXPECT_FALSE(player_->element_animations()); |
+ EXPECT_FALSE(player_->layer_id()); |
+} |
+ |
+TEST_F(AnimationPlayerTest, PropertiesMutate) { |
+ client_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE); |
+ client_impl_.RegisterLayer(layer_id_, LayerTreeType::PENDING); |
+ client_impl_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE); |
+ |
+ host_->AddAnimationTimeline(timeline_); |
+ timeline_->AttachPlayer(player_); |
+ player_->AttachLayer(layer_id_); |
+ |
+ const float start_opacity = .7f; |
+ const float end_opacity = .3f; |
+ |
+ const float start_brightness = .6f; |
+ const float end_brightness = .4f; |
+ |
+ const int transform_x = 10; |
+ const int transform_y = 20; |
+ |
+ const double duration = 1.; |
+ |
+ AddOpacityTransitionToPlayer(player_.get(), duration, start_opacity, |
+ end_opacity, false); |
+ AddAnimatedTransformToPlayer(player_.get(), duration, transform_x, |
+ transform_y); |
+ AddAnimatedFilterToPlayer(player_.get(), duration, start_brightness, |
+ end_brightness); |
+ |
+ host_->PushPropertiesTo(host_impl_); |
+ |
+ EXPECT_FALSE(client_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ Animation::OPACITY)); |
+ EXPECT_FALSE(client_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ Animation::TRANSFORM)); |
+ EXPECT_FALSE(client_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ Animation::FILTER)); |
+ |
+ EXPECT_FALSE(client_impl_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ Animation::OPACITY)); |
+ EXPECT_FALSE(client_impl_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ Animation::TRANSFORM)); |
+ EXPECT_FALSE(client_impl_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ Animation::FILTER)); |
+ |
+ host_impl_->animation_registrar()->ActivateAnimations(); |
+ |
+ base::TimeTicks time; |
+ time += base::TimeDelta::FromSecondsD(0.1); |
+ AnimateLayersTransferEvents(time, 3u); |
+ |
+ time += base::TimeDelta::FromSecondsD(duration); |
+ AnimateLayersTransferEvents(time, 3u); |
+ |
+ client_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ end_opacity); |
+ client_.ExpectTransformPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ transform_x, transform_y); |
+ client_.ExpectFilterPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ end_brightness); |
+ |
+ client_impl_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ end_opacity); |
+ client_impl_.ExpectTransformPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ transform_x, transform_y); |
+ client_impl_.ExpectFilterPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ end_brightness); |
+ |
+ client_impl_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::PENDING, |
+ end_opacity); |
+ client_impl_.ExpectTransformPropertyMutated(layer_id_, LayerTreeType::PENDING, |
+ transform_x, transform_y); |
+ client_impl_.ExpectFilterPropertyMutated(layer_id_, LayerTreeType::PENDING, |
+ end_brightness); |
+} |
+ |
+TEST_F(AnimationPlayerTest, AttachTwoPlayersToOneLayer) { |
+ TestAnimationDelegate delegate1; |
+ TestAnimationDelegate delegate2; |
+ |
+ client_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE); |
+ client_impl_.RegisterLayer(layer_id_, LayerTreeType::PENDING); |
+ client_impl_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE); |
+ |
+ scoped_refptr<AnimationPlayer> player1 = |
+ AnimationPlayer::Create(AnimationIdProvider::NextPlayerId()); |
+ scoped_refptr<AnimationPlayer> player2 = |
+ AnimationPlayer::Create(AnimationIdProvider::NextPlayerId()); |
+ |
+ host_->AddAnimationTimeline(timeline_); |
+ timeline_->AttachPlayer(player1); |
+ timeline_->AttachPlayer(player2); |
+ |
+ player1->set_layer_animation_delegate(&delegate1); |
+ player2->set_layer_animation_delegate(&delegate2); |
+ |
+ // Attach players to the same layer. |
+ player1->AttachLayer(layer_id_); |
+ player2->AttachLayer(layer_id_); |
+ |
+ const float start_opacity = .7f; |
+ const float end_opacity = .3f; |
+ |
+ const int transform_x = 10; |
+ const int transform_y = 20; |
+ |
+ const double duration = 1.; |
+ |
+ AddOpacityTransitionToPlayer(player1.get(), duration, start_opacity, |
+ end_opacity, false); |
+ AddAnimatedTransformToPlayer(player2.get(), duration, transform_x, |
+ transform_y); |
+ |
+ host_->PushPropertiesTo(host_impl_); |
+ host_impl_->animation_registrar()->ActivateAnimations(); |
+ |
+ EXPECT_FALSE(delegate1.started_); |
+ EXPECT_FALSE(delegate1.finished_); |
+ |
+ EXPECT_FALSE(delegate2.started_); |
+ EXPECT_FALSE(delegate2.finished_); |
+ |
+ base::TimeTicks time; |
+ time += base::TimeDelta::FromSecondsD(0.1); |
+ AnimateLayersTransferEvents(time, 2u); |
+ |
+ EXPECT_TRUE(delegate1.started_); |
+ EXPECT_FALSE(delegate1.finished_); |
+ |
+ EXPECT_TRUE(delegate2.started_); |
+ EXPECT_FALSE(delegate2.finished_); |
+ |
+ time += base::TimeDelta::FromSecondsD(duration); |
+ AnimateLayersTransferEvents(time, 2u); |
+ |
+ EXPECT_TRUE(delegate1.finished_); |
+ EXPECT_TRUE(delegate2.finished_); |
+ |
+ client_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ end_opacity); |
+ client_.ExpectTransformPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ transform_x, transform_y); |
+ |
+ client_impl_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ end_opacity); |
+ client_impl_.ExpectTransformPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ transform_x, transform_y); |
+ |
+ client_impl_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::PENDING, |
+ end_opacity); |
+ client_impl_.ExpectTransformPropertyMutated(layer_id_, LayerTreeType::PENDING, |
+ transform_x, transform_y); |
+} |
+ |
+TEST_F(AnimationPlayerTest, AddRemoveAnimationToNonAttachedPlayer) { |
+ client_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE); |
+ client_impl_.RegisterLayer(layer_id_, LayerTreeType::PENDING); |
+ client_impl_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE); |
+ |
+ const double duration = 1.; |
+ const float start_opacity = .7f; |
+ const float end_opacity = .3f; |
+ |
+ const int filter_id = |
+ AddAnimatedFilterToPlayer(player_.get(), duration, 0.1f, 0.9f); |
+ const int opacity_id = AddOpacityTransitionToPlayer( |
+ player_.get(), duration, start_opacity, end_opacity, false); |
+ |
+ host_->AddAnimationTimeline(timeline_); |
+ timeline_->AttachPlayer(player_); |
+ |
+ EXPECT_FALSE(player_->element_animations()); |
+ player_->RemoveAnimation(filter_id); |
+ |
+ player_->AttachLayer(layer_id_); |
+ |
+ EXPECT_TRUE(player_->element_animations()); |
+ EXPECT_FALSE(player_->element_animations() |
+ ->layer_animation_controller() |
+ ->GetAnimationById(filter_id)); |
+ EXPECT_TRUE(player_->element_animations() |
+ ->layer_animation_controller() |
+ ->GetAnimationById(opacity_id)); |
+ |
+ host_->PushPropertiesTo(host_impl_); |
+ |
+ EXPECT_FALSE(client_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ Animation::OPACITY)); |
+ EXPECT_FALSE(client_impl_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ Animation::OPACITY)); |
+ |
+ EXPECT_FALSE(client_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ Animation::FILTER)); |
+ EXPECT_FALSE(client_impl_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ Animation::FILTER)); |
+ |
+ host_impl_->animation_registrar()->ActivateAnimations(); |
+ |
+ base::TimeTicks time; |
+ time += base::TimeDelta::FromSecondsD(0.1); |
+ AnimateLayersTransferEvents(time, 1u); |
+ |
+ time += base::TimeDelta::FromSecondsD(duration); |
+ AnimateLayersTransferEvents(time, 1u); |
+ |
+ client_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ end_opacity); |
+ client_impl_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ end_opacity); |
+ client_impl_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::PENDING, |
+ end_opacity); |
+ |
+ EXPECT_FALSE(client_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ Animation::FILTER)); |
+ EXPECT_FALSE(client_impl_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE, |
+ Animation::FILTER)); |
+} |
+ |
+TEST_F(AnimationPlayerTest, AddRemoveAnimationCausesSetNeedsCommit) { |
+ client_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE); |
+ host_->AddAnimationTimeline(timeline_); |
+ timeline_->AttachPlayer(player_); |
+ player_->AttachLayer(layer_id_); |
+ |
+ EXPECT_FALSE(client_.mutators_need_commit()); |
+ |
+ const int animation_id = |
+ AddOpacityTransitionToPlayer(player_.get(), 1., .7f, .3f, false); |
+ |
+ EXPECT_TRUE(client_.mutators_need_commit()); |
+ client_.set_mutators_need_commit(false); |
+ |
+ player_->PauseAnimation(animation_id, 1.); |
+ EXPECT_TRUE(client_.mutators_need_commit()); |
+ client_.set_mutators_need_commit(false); |
+ |
+ player_->RemoveAnimation(animation_id); |
+ EXPECT_TRUE(client_.mutators_need_commit()); |
+ client_.set_mutators_need_commit(false); |
+} |
+ |
+} // namespace |
+} // namespace cc |