| Index: cc/animation/element_animations_unittest.cc
|
| diff --git a/cc/animation/element_animations_unittest.cc b/cc/animation/element_animations_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b676906c3c8b8166149e15b2d6d1aec531f58c74
|
| --- /dev/null
|
| +++ b/cc/animation/element_animations_unittest.cc
|
| @@ -0,0 +1,218 @@
|
| +// 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/element_animations.h"
|
| +
|
| +#include "cc/animation/animation_delegate.h"
|
| +#include "cc/animation/animation_host.h"
|
| +#include "cc/animation/animation_id_provider.h"
|
| +#include "cc/animation/animation_player.h"
|
| +#include "cc/animation/animation_registrar.h"
|
| +#include "cc/animation/animation_timeline.h"
|
| +#include "cc/test/animation_test_common.h"
|
| +#include "cc/test/animation_timelines_test_common.h"
|
| +
|
| +namespace cc {
|
| +namespace {
|
| +
|
| +class ElementAnimationsTest : public AnimationTimelinesTest {
|
| + public:
|
| + ElementAnimationsTest() {}
|
| + ~ElementAnimationsTest() override {}
|
| +};
|
| +
|
| +// See animation_player_unittest.cc for integration with AnimationPlayer.
|
| +
|
| +TEST_F(ElementAnimationsTest, AttachToLayerInActiveTree) {
|
| + // Set up the layer which is in active tree for main thread and not
|
| + // yet passed onto the impl thread.
|
| + client_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE);
|
| + client_impl_.RegisterLayer(layer_id_, LayerTreeType::PENDING);
|
| +
|
| + EXPECT_TRUE(client_.IsLayerInTree(layer_id_, LayerTreeType::ACTIVE));
|
| + EXPECT_FALSE(client_.IsLayerInTree(layer_id_, LayerTreeType::PENDING));
|
| +
|
| + host_->AddAnimationTimeline(timeline_);
|
| +
|
| + timeline_->AttachPlayer(player_);
|
| + player_->AttachLayer(layer_id_);
|
| +
|
| + ElementAnimations* element_animations = player_->element_animations();
|
| + EXPECT_TRUE(element_animations);
|
| +
|
| + EXPECT_TRUE(element_animations->has_active_value_observer_for_testing());
|
| + EXPECT_FALSE(element_animations->has_pending_value_observer_for_testing());
|
| +
|
| + host_->PushPropertiesTo(host_impl_);
|
| +
|
| + GetImplTimelineAndPlayerByID();
|
| +
|
| + ElementAnimations* element_animations_impl =
|
| + player_impl_->element_animations();
|
| + EXPECT_TRUE(element_animations_impl);
|
| +
|
| + EXPECT_FALSE(
|
| + element_animations_impl->has_active_value_observer_for_testing());
|
| + EXPECT_TRUE(
|
| + element_animations_impl->has_pending_value_observer_for_testing());
|
| +
|
| + // Create the layer in the impl active tree.
|
| + client_impl_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE);
|
| + EXPECT_TRUE(element_animations_impl->has_active_value_observer_for_testing());
|
| + EXPECT_TRUE(
|
| + element_animations_impl->has_pending_value_observer_for_testing());
|
| +
|
| + EXPECT_TRUE(client_impl_.IsLayerInTree(layer_id_, LayerTreeType::ACTIVE));
|
| + EXPECT_TRUE(client_impl_.IsLayerInTree(layer_id_, LayerTreeType::PENDING));
|
| +
|
| + // kill layer on main thread.
|
| + client_.UnregisterLayer(layer_id_, LayerTreeType::ACTIVE);
|
| + EXPECT_EQ(element_animations, player_->element_animations());
|
| + EXPECT_FALSE(element_animations->has_active_value_observer_for_testing());
|
| + EXPECT_FALSE(element_animations->has_pending_value_observer_for_testing());
|
| +
|
| + // Sync doesn't detach LayerImpl.
|
| + host_->PushPropertiesTo(host_impl_);
|
| + EXPECT_EQ(element_animations_impl, player_impl_->element_animations());
|
| + EXPECT_TRUE(element_animations_impl->has_active_value_observer_for_testing());
|
| + EXPECT_TRUE(
|
| + element_animations_impl->has_pending_value_observer_for_testing());
|
| +
|
| + // Kill layer on impl thread in pending tree.
|
| + client_impl_.UnregisterLayer(layer_id_, LayerTreeType::PENDING);
|
| + EXPECT_EQ(element_animations_impl, player_impl_->element_animations());
|
| + EXPECT_TRUE(element_animations_impl->has_active_value_observer_for_testing());
|
| + EXPECT_FALSE(
|
| + element_animations_impl->has_pending_value_observer_for_testing());
|
| +
|
| + // Kill layer on impl thread in active tree.
|
| + client_impl_.UnregisterLayer(layer_id_, LayerTreeType::ACTIVE);
|
| + EXPECT_EQ(element_animations_impl, player_impl_->element_animations());
|
| + EXPECT_FALSE(
|
| + element_animations_impl->has_active_value_observer_for_testing());
|
| + EXPECT_FALSE(
|
| + element_animations_impl->has_pending_value_observer_for_testing());
|
| +
|
| + // Sync doesn't change anything.
|
| + host_->PushPropertiesTo(host_impl_);
|
| + EXPECT_EQ(element_animations_impl, player_impl_->element_animations());
|
| + EXPECT_FALSE(
|
| + element_animations_impl->has_active_value_observer_for_testing());
|
| + EXPECT_FALSE(
|
| + element_animations_impl->has_pending_value_observer_for_testing());
|
| +
|
| + player_->DetachLayer();
|
| + EXPECT_FALSE(player_->element_animations());
|
| +
|
| + // Release ptrs now to test the order of destruction.
|
| + ReleaseRefPtrs();
|
| +}
|
| +
|
| +TEST_F(ElementAnimationsTest, AttachToNotYetCreatedLayer) {
|
| + host_->AddAnimationTimeline(timeline_);
|
| + timeline_->AttachPlayer(player_);
|
| +
|
| + host_->PushPropertiesTo(host_impl_);
|
| +
|
| + GetImplTimelineAndPlayerByID();
|
| +
|
| + player_->AttachLayer(layer_id_);
|
| +
|
| + ElementAnimations* element_animations = player_->element_animations();
|
| + EXPECT_TRUE(element_animations);
|
| +
|
| + EXPECT_FALSE(element_animations->has_active_value_observer_for_testing());
|
| + EXPECT_FALSE(element_animations->has_pending_value_observer_for_testing());
|
| +
|
| + host_->PushPropertiesTo(host_impl_);
|
| +
|
| + ElementAnimations* element_animations_impl =
|
| + player_impl_->element_animations();
|
| + EXPECT_TRUE(element_animations_impl);
|
| +
|
| + EXPECT_FALSE(
|
| + element_animations_impl->has_active_value_observer_for_testing());
|
| + EXPECT_FALSE(
|
| + element_animations_impl->has_pending_value_observer_for_testing());
|
| +
|
| + // Create layer.
|
| + client_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE);
|
| + EXPECT_TRUE(element_animations->has_active_value_observer_for_testing());
|
| + EXPECT_FALSE(element_animations->has_pending_value_observer_for_testing());
|
| +
|
| + client_impl_.RegisterLayer(layer_id_, LayerTreeType::PENDING);
|
| + EXPECT_FALSE(
|
| + element_animations_impl->has_active_value_observer_for_testing());
|
| + EXPECT_TRUE(
|
| + element_animations_impl->has_pending_value_observer_for_testing());
|
| +
|
| + client_impl_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE);
|
| + EXPECT_TRUE(element_animations_impl->has_active_value_observer_for_testing());
|
| + EXPECT_TRUE(
|
| + element_animations_impl->has_pending_value_observer_for_testing());
|
| +}
|
| +
|
| +TEST_F(ElementAnimationsTest, AddRemovePlayers) {
|
| + host_->AddAnimationTimeline(timeline_);
|
| + timeline_->AttachPlayer(player_);
|
| + player_->AttachLayer(layer_id_);
|
| +
|
| + ElementAnimations* element_animations = player_->element_animations();
|
| + EXPECT_TRUE(element_animations);
|
| +
|
| + scoped_refptr<AnimationPlayer> player1 =
|
| + AnimationPlayer::Create(AnimationIdProvider::NextPlayerId());
|
| + scoped_refptr<AnimationPlayer> player2 =
|
| + AnimationPlayer::Create(AnimationIdProvider::NextPlayerId());
|
| +
|
| + timeline_->AttachPlayer(player1);
|
| + timeline_->AttachPlayer(player2);
|
| +
|
| + // Attach players to the same layer.
|
| + player1->AttachLayer(layer_id_);
|
| + player2->AttachLayer(layer_id_);
|
| +
|
| + EXPECT_EQ(element_animations, player1->element_animations());
|
| + EXPECT_EQ(element_animations, player2->element_animations());
|
| +
|
| + host_->PushPropertiesTo(host_impl_);
|
| + GetImplTimelineAndPlayerByID();
|
| +
|
| + ElementAnimations* element_animations_impl =
|
| + player_impl_->element_animations();
|
| + EXPECT_TRUE(element_animations_impl);
|
| +
|
| + int list_size_before = 0;
|
| + for (const ElementAnimations::PlayersListNode* node =
|
| + element_animations_impl->players_list().head();
|
| + node != element_animations_impl->players_list().end();
|
| + node = node->next()) {
|
| + const AnimationPlayer* player_impl = node->value();
|
| + EXPECT_TRUE(timeline_->GetPlayerById(player_impl->id()));
|
| + ++list_size_before;
|
| + }
|
| + EXPECT_EQ(3, list_size_before);
|
| +
|
| + player2->DetachLayer();
|
| + EXPECT_FALSE(player2->element_animations());
|
| + EXPECT_EQ(element_animations, player_->element_animations());
|
| + EXPECT_EQ(element_animations, player1->element_animations());
|
| +
|
| + host_->PushPropertiesTo(host_impl_);
|
| + EXPECT_EQ(element_animations_impl, player_impl_->element_animations());
|
| +
|
| + int list_size_after = 0;
|
| + for (const ElementAnimations::PlayersListNode* node =
|
| + element_animations_impl->players_list().head();
|
| + node != element_animations_impl->players_list().end();
|
| + node = node->next()) {
|
| + const AnimationPlayer* player_impl = node->value();
|
| + EXPECT_TRUE(timeline_->GetPlayerById(player_impl->id()));
|
| + ++list_size_after;
|
| + }
|
| + EXPECT_EQ(2, list_size_after);
|
| +}
|
| +
|
| +} // namespace
|
| +} // namespace cc
|
|
|