// 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_host.h" #include "cc/animation/animation_id_provider.h" #include "cc/animation/animation_timeline.h" #include "cc/test/animation_test_common.h" #include "cc/test/animation_timelines_test_common.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace cc { namespace { class AnimationHostTest : public AnimationTimelinesTest { public: AnimationHostTest() {} ~AnimationHostTest() override {} }; // See AnimationPlayer tests on layer registration/unregistration in // animation_player_unittest.cc. TEST_F(AnimationHostTest, SyncTimelinesAddRemove) { scoped_ptr host(AnimationHost::Create(ThreadInstance::MAIN)); scoped_ptr host_impl( AnimationHost::Create(ThreadInstance::IMPL)); const int timeline_id = AnimationIdProvider::NextTimelineId(); scoped_refptr timeline( AnimationTimeline::Create(timeline_id)); host->AddAnimationTimeline(timeline.get()); EXPECT_TRUE(timeline->animation_host()); EXPECT_FALSE(host_impl->GetTimelineById(timeline_id)); host->PushPropertiesTo(host_impl.get()); scoped_refptr timeline_impl = host_impl->GetTimelineById(timeline_id); EXPECT_TRUE(timeline_impl); EXPECT_EQ(timeline_impl->id(), timeline_id); host->PushPropertiesTo(host_impl.get()); EXPECT_EQ(timeline_impl, host_impl->GetTimelineById(timeline_id)); host->RemoveAnimationTimeline(timeline.get()); EXPECT_FALSE(timeline->animation_host()); host->PushPropertiesTo(host_impl.get()); EXPECT_FALSE(host_impl->GetTimelineById(timeline_id)); EXPECT_FALSE(timeline_impl->animation_host()); } TEST_F(AnimationHostTest, ImplOnlyTimeline) { scoped_ptr host(AnimationHost::Create(ThreadInstance::MAIN)); scoped_ptr host_impl( AnimationHost::Create(ThreadInstance::IMPL)); const int timeline_id1 = AnimationIdProvider::NextTimelineId(); const int timeline_id2 = AnimationIdProvider::NextTimelineId(); scoped_refptr timeline( AnimationTimeline::Create(timeline_id1)); scoped_refptr timeline_impl( AnimationTimeline::Create(timeline_id2)); timeline_impl->set_is_impl_only(true); host->AddAnimationTimeline(timeline.get()); host_impl->AddAnimationTimeline(timeline_impl.get()); host->PushPropertiesTo(host_impl.get()); EXPECT_TRUE(host->GetTimelineById(timeline_id1)); EXPECT_TRUE(host_impl->GetTimelineById(timeline_id2)); } TEST_F(AnimationHostTest, ImplOnlyScrollAnimationUpdateTargetIfDetached) { client_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE); client_impl_.RegisterLayer(layer_id_, LayerTreeType::PENDING); gfx::ScrollOffset target_offset(0., 2.); gfx::ScrollOffset current_offset(0., 1.); host_impl_->ImplOnlyScrollAnimationCreate(layer_id_, target_offset, current_offset); gfx::Vector2dF scroll_delta(0, 0.5); gfx::ScrollOffset max_scroll_offset(0., 3.); base::TimeTicks time; time += base::TimeDelta::FromSecondsD(0.1); EXPECT_TRUE(host_impl_->ImplOnlyScrollAnimationUpdateTarget( layer_id_, scroll_delta, max_scroll_offset, time)); // Detach all players from layers and timelines. host_impl_->ClearTimelines(); time += base::TimeDelta::FromSecondsD(0.1); EXPECT_FALSE(host_impl_->ImplOnlyScrollAnimationUpdateTarget( layer_id_, scroll_delta, max_scroll_offset, time)); } } // namespace } // namespace cc