12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation_curve.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/layer_animation_controller.h" 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/animation/scroll_offset_animation_curve.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/timing_function.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/animation_test_common.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostAnimationTest : public LayerTreeTest { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeTest::SetupTree(); 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->set_layer_animation_delegate(this); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Makes sure that SetNeedsAnimate does not cause the CommitRequested() state to 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// be set. 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostAnimationTestSetNeedsAnimateShouldNotSetCommitRequested 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostAnimationTest { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostAnimationTestSetNeedsAnimateShouldNotSetCommitRequested() 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : num_commits_(0) {} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void BeginMainFrame(const BeginFrameArgs& args) OVERRIDE { 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // We skip the first commit because its the commit that populates the 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // impl thread with a tree. After the second commit, the test is done. 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (num_commits_ != 1) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsAnimate(); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Right now, CommitRequested is going to be true, because during 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BeginFrame, we force CommitRequested to true to prevent requests from 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // hitting the impl thread. But, when the next DidCommit happens, we should 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // verify that CommitRequested has gone back to false. 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!num_commits_) { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->CommitRequested()); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsAnimate(); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->CommitRequested()); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verifies that the SetNeedsAnimate we made in ::Animate did not 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // trigger CommitRequested. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->CommitRequested()); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) num_commits_++; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_commits_; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F( 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTestSetNeedsAnimateShouldNotSetCommitRequested); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Trigger a frame with SetNeedsCommit. Then, inside the resulting animate 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// callback, request another frame using SetNeedsAnimate. End the test when 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// animate gets called yet-again, indicating that the proxy is correctly 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// handling the case where SetNeedsAnimate() is called inside the BeginFrame 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// flow. 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostAnimationTestSetNeedsAnimateInsideAnimationCallback 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostAnimationTest { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostAnimationTestSetNeedsAnimateInsideAnimationCallback() 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : num_begin_frames_(0) {} 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void BeginMainFrame(const BeginFrameArgs& args) OVERRIDE { 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!num_begin_frames_) { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsAnimate(); 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) num_begin_frames_++; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int num_begin_frames_; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F( 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTestSetNeedsAnimateInsideAnimationCallback); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Add a layer animation and confirm that 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// LayerTreeHostImpl::updateAnimationState does get called and continues to 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// get called. 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostAnimationTestAddAnimation 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostAnimationTest { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostAnimationTestAddAnimation() 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : num_begin_frames_(0), received_animation_started_notification_(false) {} 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostAddInstantAnimationToMainThread(layer_tree_host()->root_layer()); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UpdateAnimationState( 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl* host_impl, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_unfinished_animation) OVERRIDE { 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!num_begin_frames_) { 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The animation had zero duration so LayerTreeHostImpl should no 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // longer need to animate its layers. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(has_unfinished_animation); 13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) num_begin_frames_++; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (received_animation_started_notification_) { 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_LT(base::TimeTicks(), start_time_); 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerAnimationController* controller_impl = 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_impl->active_tree()->root_layer()->layer_animation_controller(); 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Animation* animation_impl = 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_impl->GetAnimation(Animation::Opacity); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (animation_impl) 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_impl->RemoveAnimation(animation_impl->id()); 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void NotifyAnimationStarted( 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks monotonic_time, 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Animation::TargetProperty target_property) OVERRIDE { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) received_animation_started_notification_ = true; 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) start_time_ = monotonic_time; 15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (num_begin_frames_) { 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_LT(base::TimeTicks(), start_time_); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerAnimationController* controller = 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->layer_animation_controller(); 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Animation* animation = 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller->GetAnimation(Animation::Opacity); 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (animation) 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller->RemoveAnimation(animation->id()); 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int num_begin_frames_; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool received_animation_started_notification_; 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks start_time_; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestAddAnimation); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Add a layer animation to a layer, but continually fail to draw. Confirm that 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after a while, we do eventually force a draw. 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostAnimationTestCheckerboardDoesNotStarveDraws 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostAnimationTest { 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostAnimationTestCheckerboardDoesNotStarveDraws() 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : started_animating_(false) {} 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostAddAnimationToMainThread(layer_tree_host()->root_layer()); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AnimateLayers( 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* host_impl, 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks monotonic_time) OVERRIDE { 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) started_animating_ = true; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (started_animating_) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* host_impl, 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void AfterTest() OVERRIDE { } 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool started_animating_; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Starvation can only be an issue with the MT compositor. 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestCheckerboardDoesNotStarveDraws); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 217b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Ensures that animations eventually get deleted. 218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class LayerTreeHostAnimationTestAnimationsGetDeleted 219b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) : public LayerTreeHostAnimationTest { 220b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public: 221b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LayerTreeHostAnimationTestAnimationsGetDeleted() 222b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) : started_animating_(false) {} 223b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 224b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 225b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) PostAddAnimationToMainThread(layer_tree_host()->root_layer()); 226b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 227b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 228b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void AnimateLayers( 229b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LayerTreeHostImpl* host_impl, 230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::TimeTicks monotonic_time) OVERRIDE { 231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool have_animations = !host_impl->animation_registrar()-> 232b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) active_animation_controllers().empty(); 233b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!started_animating_ && have_animations) { 234b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) started_animating_ = true; 235b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return; 236b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (started_animating_ && !have_animations) 239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EndTest(); 240b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 241b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void NotifyAnimationFinished( 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks monotonic_time, 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Animation::TargetProperty target_property) OVERRIDE { 245b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Animations on the impl-side controller only get deleted during a commit, 246b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // so we need to schedule a commit. 247b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 248b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 249b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 250b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 251b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 252b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) private: 253b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool started_animating_; 254b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}; 255b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 256b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestAnimationsGetDeleted); 257b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Ensures that animations continue to be ticked when we are backgrounded. 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostAnimationTestTickAnimationWhileBackgrounded 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostAnimationTest { 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostAnimationTestTickAnimationWhileBackgrounded() 26303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : num_begin_frames_(0) {} 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PostAddLongAnimationToMainThread(layer_tree_host()->root_layer()); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use WillAnimateLayers to set visible false before the animation runs and 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // causes a commit, so we block the second visible animate in single-thread 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // mode. 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void WillAnimateLayers( 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* host_impl, 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks monotonic_time) OVERRIDE { 2753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Verify that the host can draw, it's just not visible. 2763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_TRUE(host_impl->CanDraw()); 27703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (num_begin_frames_ < 2) { 27803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!num_begin_frames_) { 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We have a long animation running. It should continue to tick even 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if we are not visible. 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetVisibleToMainThread(false); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 28303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) num_begin_frames_++; 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int num_begin_frames_; 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTestTickAnimationWhileBackgrounded); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Ensures that animation time remains monotonic when we switch from foreground 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// to background ticking and back, even if we're skipping draws due to 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// checkerboarding when in the foreground. 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostAnimationTestAnimationTickTimeIsMonotonic 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostAnimationTest { 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostAnimationTestAnimationTickTimeIsMonotonic() 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : has_background_ticked_(false), num_foreground_animates_(0) {} 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make sure that drawing many times doesn't cause a checkerboarded 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // animation to start so we avoid flake in this test. 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) settings->timeout_and_draw_when_animation_checkerboards = false; 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PostAddLongAnimationToMainThread(layer_tree_host()->root_layer()); 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AnimateLayers(LayerTreeHostImpl* host_impl, 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks monotonic_time) OVERRIDE { 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_GE(monotonic_time, last_tick_time_); 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_tick_time_ = monotonic_time; 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (host_impl->visible()) { 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_foreground_animates_++; 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (num_foreground_animates_ > 1 && !has_background_ticked_) 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PostSetVisibleToMainThread(false); 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (has_background_ticked_) 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EndTest(); 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) has_background_ticked_ = true; 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PostSetVisibleToMainThread(true); 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (TestEnded()) 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool has_background_ticked_; 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int num_foreground_animates_; 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks last_tick_time_; 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostAnimationTestAnimationTickTimeIsMonotonic); 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 353424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Ensures that animations do not tick when we are backgrounded and 354424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// and we have an empty active tree. 355424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree 356424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : public LayerTreeHostAnimationTest { 357424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) protected: 358424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree() 359424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : active_tree_was_animated_(false) {} 360424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 361424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual base::TimeDelta LowFrequencyAnimationInterval() const OVERRIDE { 362424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return base::TimeDelta::FromMilliseconds(4); 363424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 364424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 365424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 366424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PostAddAnimationToMainThread(layer_tree_host()->root_layer()); 367424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 368424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void NotifyAnimationFinished( 370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks monotonic_time, 371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Animation::TargetProperty target_property) OVERRIDE { 372424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Replace animated commits with an empty tree. 373424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) layer_tree_host()->SetRootLayer(make_scoped_refptr<Layer>(NULL)); 374424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 375424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 376424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 377424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // This alternates setting an empty tree and a non-empty tree with an 378424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // animation. 379424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) switch (layer_tree_host()->source_frame_number()) { 380424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case 1: 381424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Wait for NotifyAnimationFinished to commit an empty tree. 382424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) break; 383424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case 2: 384424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SetupTree(); 385424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) AddOpacityTransitionToLayer( 386424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) layer_tree_host()->root_layer(), 0.000001, 0, 0.5, true); 387424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) break; 388424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case 3: 389424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Wait for NotifyAnimationFinished to commit an empty tree. 390424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) break; 391424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case 4: 392424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EndTest(); 393424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) break; 394424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 395424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 396424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 397424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void BeginCommitOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 398424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // At the start of every commit, block activations and make sure 399424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // we are backgrounded. 400424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) host_impl->BlockNotifyReadyToActivateForTesting(true); 401424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PostSetVisibleToMainThread(false); 402424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 403424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 404424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 405424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!host_impl->settings().impl_side_painting) { 406424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // There are no activations to block if we're not impl-side-painting, 407424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // so just advance the test immediately. 408424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (host_impl->active_tree()->source_frame_number() < 3) 409424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) UnblockActivations(host_impl); 410424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return; 411424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 412424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 413424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // We block activation for several ticks to make sure that, even though 414424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // there is a pending tree with animations, we still do not background 415424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // tick if the active tree is empty. 416424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (host_impl->pending_tree()->source_frame_number() < 3) { 417424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::MessageLoopProxy::current()->PostDelayedTask( 418424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) FROM_HERE, 419424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Bind( 420424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree:: 421424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) UnblockActivations, 422424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Unretained(this), 423424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) host_impl), 424424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 4 * LowFrequencyAnimationInterval()); 425424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 426424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 427424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 428424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void UnblockActivations(LayerTreeHostImpl* host_impl) { 429424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) host_impl->BlockNotifyReadyToActivateForTesting(false); 430424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 431424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 432424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 433424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) active_tree_was_animated_ = false; 434424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 435424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Verify that commits are actually alternating with empty / non-empty 436424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // trees. 4371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int frame_number = host_impl->active_tree()->source_frame_number(); 4381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) switch (frame_number) { 439424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case 0: 440424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case 2: 4411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_TRUE(host_impl->active_tree()->root_layer()) 4421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) << "frame: " << frame_number; 443424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) break; 444424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case 1: 445424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case 3: 4461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FALSE(host_impl->active_tree()->root_layer()) 4471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) << "frame: " << frame_number; 448424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) break; 449424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 450424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 451424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (host_impl->active_tree()->source_frame_number() < 3) { 452424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Initiate the next commit after a delay to give us a chance to 453424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // background tick if the active tree isn't empty. 454424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::MessageLoopProxy::current()->PostDelayedTask( 455424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) FROM_HERE, 456424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Bind( 457424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree:: 458424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) InitiateNextCommit, 459424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Unretained(this), 460424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) host_impl), 461424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 4 * LowFrequencyAnimationInterval()); 462424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 463424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 464424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 465424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void WillAnimateLayers(LayerTreeHostImpl* host_impl, 466424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::TimeTicks monotonic_time) OVERRIDE { 467424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_TRUE(host_impl->active_tree()->root_layer()); 468424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) active_tree_was_animated_ = true; 469424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 470424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 471424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void InitiateNextCommit(LayerTreeHostImpl* host_impl) { 472424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Verify that we actually animated when we should have. 473424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool has_active_tree = host_impl->active_tree()->root_layer(); 474424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(has_active_tree, active_tree_was_animated_); 475424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 476424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The next commit is blocked until we become visible again. 477424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PostSetVisibleToMainThread(true); 478424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 479424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 480424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 481424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 482424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool active_tree_was_animated_; 483424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}; 484424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 485424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 486424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree); 487424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 488eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Ensure that an animation's timing function is respected. 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostAnimationTestAddAnimationWithTimingFunction 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostAnimationTest { 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostAnimationTestAddAnimationWithTimingFunction() {} 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTest::SetupTree(); 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_ = FakeContentLayer::Create(&client_); 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_->SetBounds(gfx::Size(4, 4)); 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(content_); 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PostAddAnimationToMainThread(content_.get()); 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AnimateLayers( 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* host_impl, 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks monotonic_time) OVERRIDE { 508eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerAnimationController* controller_impl = 509eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_impl->active_tree()->root_layer()->children()[0]-> 510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_animation_controller(); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Animation* animation = 512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller_impl->GetAnimation(Animation::Opacity); 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!animation) 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FloatAnimationCurve* curve = 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation->curve()->ToFloatAnimationCurve(); 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float start_opacity = curve->GetValue(0.0); 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float end_opacity = curve->GetValue(curve->Duration()); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float linearly_interpolated_opacity = 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0.25f * end_opacity + 0.75f * start_opacity; 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double time = curve->Duration() * 0.25; 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the linear timing function associated with this animation was not 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // picked up, then the linearly interpolated opacity would be different 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // because of the default ease timing function. 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FLOAT_EQ(linearly_interpolated_opacity, curve->GetValue(time)); 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> content_; 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTestAddAnimationWithTimingFunction); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Ensures that main thread animations have their start times synchronized with 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// impl thread animations. 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostAnimationTestSynchronizeAnimationStartTimes 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostAnimationTest { 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostAnimationTestSynchronizeAnimationStartTimes() 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : main_start_time_(-1.0), 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl_start_time_(-1.0) {} 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTest::SetupTree(); 551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_ = FakeContentLayer::Create(&client_); 552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_->SetBounds(gfx::Size(4, 4)); 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_->set_layer_animation_delegate(this); 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(content_); 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PostAddAnimationToMainThread(content_.get()); 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void NotifyAnimationStarted( 562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks monotonic_time, 563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Animation::TargetProperty target_property) OVERRIDE { 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationController* controller = 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->children()[0]-> 566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_animation_controller(); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Animation* animation = 568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller->GetAnimation(Animation::Opacity); 569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) main_start_time_ = 570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (animation->start_time() - base::TimeTicks()).InSecondsF(); 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller->RemoveAnimation(animation->id()); 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (impl_start_time_ > 0.0) 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UpdateAnimationState( 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* impl_host, 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_unfinished_animation) OVERRIDE { 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationController* controller = 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_host->active_tree()->root_layer()->children()[0]-> 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_animation_controller(); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Animation* animation = 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller->GetAnimation(Animation::Opacity); 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!animation) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) impl_start_time_ = 589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (animation->start_time() - base::TimeTicks()).InSecondsF(); 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller->RemoveAnimation(animation->id()); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (main_start_time_ > 0.0) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FLOAT_EQ(impl_start_time_, main_start_time_); 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double main_start_time_; 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double impl_start_time_; 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> content_; 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTestSynchronizeAnimationStartTimes); 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Ensures that notify animation finished is called. 611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostAnimationTestAnimationFinishedEvents 612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostAnimationTest { 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostAnimationTestAnimationFinishedEvents() {} 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostAddInstantAnimationToMainThread(layer_tree_host()->root_layer()); 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void NotifyAnimationFinished( 621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks monotonic_time, 622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Animation::TargetProperty target_property) OVERRIDE { 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationController* controller = 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->layer_animation_controller(); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Animation* animation = 626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller->GetAnimation(Animation::Opacity); 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (animation) 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller->RemoveAnimation(animation->id()); 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTestAnimationFinishedEvents); 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Ensures that when opacity is being animated, this value does not cause the 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// subtree to be skipped. 640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostAnimationTestDoNotSkipLayersWithAnimatedOpacity 641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostAnimationTest { 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostAnimationTestDoNotSkipLayersWithAnimatedOpacity() 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : update_check_layer_(FakeContentLayer::Create(&client_)) { 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) update_check_layer_->SetOpacity(0.f); 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(update_check_layer_); 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostAnimationTest::SetupTree(); 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostAddAnimationToMainThread(update_check_layer_.get()); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerAnimationController* controller_impl = 659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_impl->active_tree()->root_layer()->layer_animation_controller(); 660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Animation* animation_impl = 661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_impl->GetAnimation(Animation::Opacity); 662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_impl->RemoveAnimation(animation_impl->id()); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Update() should have been called once, proving that the layer was not 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // skipped. 669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, update_check_layer_->update_count()); 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // clear update_check_layer_ so LayerTreeHost dies. 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) update_check_layer_ = NULL; 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> update_check_layer_; 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTestDoNotSkipLayersWithAnimatedOpacity); 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Layers added to tree with existing active animations should have the 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// animation correctly recognized. 685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostAnimationTestLayerAddedWithAnimation 686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostAnimationTest { 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostAnimationTestLayerAddedWithAnimation() {} 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 695bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (layer_tree_host()->source_frame_number() == 1) { 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> layer = Layer::Create(); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->set_layer_animation_delegate(this); 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Any valid AnimationCurve will do here. 7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<AnimationCurve> curve(new FakeFloatAnimationCurve()); 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Animation> animation( 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Animation::Create(curve.Pass(), 1, 1, 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Animation::Opacity)); 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->layer_animation_controller()->AddAnimation(animation.Pass()); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We add the animation *before* attaching the layer to the tree. 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(layer); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AnimateLayers( 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* impl_host, 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks monotonic_time) OVERRIDE { 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTestLayerAddedWithAnimation); 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 723a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostAnimationTestCancelAnimateCommit 724a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : public LayerTreeHostAnimationTest { 725a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostAnimationTestCancelAnimateCommit() 72703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : num_begin_frames_(0), num_commit_calls_(0), num_draw_calls_(0) {} 728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 730a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 73103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void BeginMainFrame(const BeginFrameArgs& args) OVERRIDE { 73203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) num_begin_frames_++; 733a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // No-op animate will cancel the commit. 734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (layer_tree_host()->source_frame_number() == 1) { 735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EndTest(); 736a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 737a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layer_tree_host()->SetNeedsAnimate(); 739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 740a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 741a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 742a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) num_commit_calls_++; 743a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (impl->active_tree()->source_frame_number() > 1) 744a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FAIL() << "Commit should have been canceled."; 745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 746a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) num_draw_calls_++; 749a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (impl->active_tree()->source_frame_number() > 1) 750a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FAIL() << "Draw should have been canceled."; 751a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 752a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 753a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void AfterTest() OVERRIDE { 75403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(2, num_begin_frames_); 755a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1, num_commit_calls_); 756a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1, num_draw_calls_); 757a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 76003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int num_begin_frames_; 761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int num_commit_calls_; 762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int num_draw_calls_; 763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FakeContentLayerClient client_; 764a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<FakeContentLayer> content_; 765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 766a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 767a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestCancelAnimateCommit); 768a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 769a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostAnimationTestForceRedraw 770a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : public LayerTreeHostAnimationTest { 771a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 772a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostAnimationTestForceRedraw() 773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : num_animate_(0), num_draw_layers_(0) {} 774a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 775a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 776a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 77703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void BeginMainFrame(const BeginFrameArgs& args) OVERRIDE { 778a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (++num_animate_ < 2) 779a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layer_tree_host()->SetNeedsAnimate(); 780a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 781a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 782a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void Layout() OVERRIDE { 783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layer_tree_host()->SetNextCommitForcesRedraw(); 784a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 785a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 786a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 787a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (++num_draw_layers_ == 2) 788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EndTest(); 789a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 790a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void AfterTest() OVERRIDE { 792a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The first commit will always draw; make sure the second draw triggered 793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // by the animation was not cancelled. 794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(2, num_draw_layers_); 795a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(2, num_animate_); 796a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 799a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int num_animate_; 800a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int num_draw_layers_; 801a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 802a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 803a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestForceRedraw); 804a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 805a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostAnimationTestAnimateAfterSetNeedsCommit 806a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : public LayerTreeHostAnimationTest { 807a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 808a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostAnimationTestAnimateAfterSetNeedsCommit() 809a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : num_animate_(0), num_draw_layers_(0) {} 810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 812a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 81303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void BeginMainFrame(const BeginFrameArgs& args) OVERRIDE { 814a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (++num_animate_ <= 2) { 815a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 816a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layer_tree_host()->SetNeedsAnimate(); 817a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 818a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 819a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 820a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 821a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (++num_draw_layers_ == 2) 822a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EndTest(); 823a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 824a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 825a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void AfterTest() OVERRIDE { 826a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The first commit will always draw; make sure the second draw triggered 827a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // by the SetNeedsCommit was not cancelled. 828a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(2, num_draw_layers_); 829a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_GE(num_animate_, 2); 830a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 831a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 832a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 833a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int num_animate_; 834a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int num_draw_layers_; 835a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 836a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 837a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestAnimateAfterSetNeedsCommit); 838a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Make sure the main thread can still execute animations when CanDraw() is not 840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// true. 841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostAnimationTestRunAnimationWhenNotCanDraw 842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostAnimationTest { 843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTestRunAnimationWhenNotCanDraw() : started_times_(0) {} 845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTest::SetupTree(); 848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_ = FakeContentLayer::Create(&client_); 849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_->SetBounds(gfx::Size(4, 4)); 850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_->set_layer_animation_delegate(this); 851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(content_); 852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size()); 856868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PostAddAnimationToMainThread(content_.get()); 857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 859a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void NotifyAnimationStarted( 860a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks monotonic_time, 861a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Animation::TargetProperty target_property) OVERRIDE { 862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) started_times_++; 863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 865a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void NotifyAnimationFinished( 866a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks monotonic_time, 867a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Animation::TargetProperty target_property) OVERRIDE { 868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, started_times_); 873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int started_times_; 877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> content_; 879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTestRunAnimationWhenNotCanDraw); 883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Make sure the main thread can still execute animations when the renderer is 885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// backgrounded. 886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostAnimationTestRunAnimationWhenNotVisible 887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostAnimationTest { 888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTestRunAnimationWhenNotVisible() : started_times_(0) {} 890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTest::SetupTree(); 893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_ = FakeContentLayer::Create(&client_); 894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_->SetBounds(gfx::Size(4, 4)); 895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_->set_layer_animation_delegate(this); 896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(content_); 897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) visible_ = true; 901868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PostAddAnimationToMainThread(content_.get()); 902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) visible_ = false; 906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetVisible(false); 907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 909a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void NotifyAnimationStarted( 910a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks monotonic_time, 911a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Animation::TargetProperty target_property) OVERRIDE { 912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(visible_); 913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) started_times_++; 914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 916a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void NotifyAnimationFinished( 917a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks monotonic_time, 918a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Animation::TargetProperty target_property) OVERRIDE { 919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(visible_); 920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, started_times_); 921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool visible_; 928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int started_times_; 929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> content_; 931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTestRunAnimationWhenNotVisible); 935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Animations should not be started when frames are being skipped due to 937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// checkerboard. 938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostAnimationTestCheckerboardDoesntStartAnimations 939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostAnimationTest { 940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTest::SetupTree(); 942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_ = FakeContentLayer::Create(&client_); 943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_->SetBounds(gfx::Size(4, 4)); 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_->set_layer_animation_delegate(this); 945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(content_); 946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure that drawing many times doesn't cause a checkerboarded 950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // animation to start so we avoid flake in this test. 951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->timeout_and_draw_when_animation_checkerboards = false; 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 955a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) prevented_draw_ = 0; 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) added_animations_ = 0; 957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) started_times_ = 0; 958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 962cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 965cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (added_animations_ < 2) 9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 968a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (TestEnded()) 9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Act like there is checkerboard when the second animation wants to draw. 971a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ++prevented_draw_; 9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (prevented_draw_ > 2) 9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EndTest(); 974cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; 975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 978bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switch (layer_tree_host()->source_frame_number()) { 979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 98090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The animation is longer than 1 BeginFrame interval. 981868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddOpacityTransitionToLayer(content_.get(), 0.1, 0.2f, 0.8f, false); 982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) added_animations_++; 983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This second animation will not be drawn so it should not start. 986868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddAnimatedTransformToLayer(content_.get(), 0.1, 5, 5); 987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) added_animations_++; 988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 992a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void NotifyAnimationStarted( 993a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks monotonic_time, 994a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Animation::TargetProperty target_property) OVERRIDE { 995a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (TestEnded()) 996a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return; 997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) started_times_++; 998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 1001a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Make sure we tried to draw the second animation but failed. 1002a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_LT(0, prevented_draw_); 1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The first animation should be started, but the second should not because 1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // of checkerboard. 1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, started_times_); 1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1008a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) int prevented_draw_; 1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int added_animations_; 1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int started_times_; 1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> content_; 1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F( 1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostAnimationTestCheckerboardDoesntStartAnimations); 1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1018116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Verifies that scroll offset animations are only accepted when impl-scrolling 1019116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// is supported, and that when scroll offset animations are accepted, 1020116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// scroll offset updates are sent back to the main thread. 1021a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class LayerTreeHostAnimationTestScrollOffsetChangesArePropagated 1022a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : public LayerTreeHostAnimationTest { 1023a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 1024a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LayerTreeHostAnimationTestScrollOffsetChangesArePropagated() {} 1025a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1026a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 1027a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LayerTreeHostAnimationTest::SetupTree(); 1028a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1029a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scroll_layer_ = FakeContentLayer::Create(&client_); 10305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scroll_layer_->SetScrollClipLayerId(layer_tree_host()->root_layer()->id()); 1031a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scroll_layer_->SetBounds(gfx::Size(1000, 1000)); 1032a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scroll_layer_->SetScrollOffset(gfx::Vector2d(10, 20)); 1033a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer_tree_host()->root_layer()->AddChild(scroll_layer_); 1034a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1035a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1036a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 1037a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1038a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1039a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1040a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 1041a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switch (layer_tree_host()->source_frame_number()) { 1042a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case 1: { 1043a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<ScrollOffsetAnimationCurve> curve( 1044a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ScrollOffsetAnimationCurve::Create( 1045a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Vector2dF(500.f, 550.f), 1046a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EaseInOutTimingFunction::Create())); 1047a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<Animation> animation(Animation::Create( 1048a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) curve.PassAs<AnimationCurve>(), 1, 0, Animation::ScrollOffset)); 1049a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) animation->set_needs_synchronized_start_time(true); 1050116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool animation_added = scroll_layer_->AddAnimation(animation.Pass()); 1051116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool impl_scrolling_supported = 1052116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch layer_tree_host()->proxy()->SupportsImplScrolling(); 1053116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(impl_scrolling_supported, animation_added); 1054116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!impl_scrolling_supported) 1055116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EndTest(); 1056a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1057a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1058a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) default: 1059a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (scroll_layer_->scroll_offset().x() > 10 && 1060a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scroll_layer_->scroll_offset().y() > 20) 1061a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EndTest(); 1062a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1063a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1064a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1065a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1066a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1067a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 1068a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FakeContentLayerClient client_; 1069a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_refptr<FakeContentLayer> scroll_layer_; 1070a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1071a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1072116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F( 1073116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LayerTreeHostAnimationTestScrollOffsetChangesArePropagated); 1074a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 10755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Ensure that animation time is correctly updated when animations are frozen 10765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// because of checkerboarding. 10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostAnimationTestFrozenAnimationTickTime 10785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostAnimationTest { 10795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 10805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostAnimationTestFrozenAnimationTickTime() 10815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : started_animating_(false), num_commits_(0), num_draw_attempts_(2) {} 10825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 10845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make sure that drawing many times doesn't cause a checkerboarded 10855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // animation to start so we avoid flake in this test. 10865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) settings->timeout_and_draw_when_animation_checkerboards = false; 10875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 10905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PostAddAnimationToMainThread(layer_tree_host()->root_layer()); 10915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 109303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void BeginMainFrame(const BeginFrameArgs& args) OVERRIDE { 109403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) last_main_thread_tick_time_ = args.frame_time; 10955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AnimateLayers(LayerTreeHostImpl* host_impl, 10985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks monotonic_time) OVERRIDE { 10995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (TestEnded()) 11005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 11015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!started_animating_) { 11025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) started_animating_ = true; 11035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_impl_tick_time_ = monotonic_time; 11045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 11055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_impl_tick_time_, monotonic_time); 11065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (num_commits_ > 2) 11075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EndTest(); 11085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 1112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 1113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (TestEnded()) 11155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 11165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_draw_attempts_++; 11175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (num_draw_attempts_ > 2) { 11185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_draw_attempts_ = 0; 11195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 11205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; 11225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginCommitOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 11255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!started_animating_) 11265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 11275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_impl_tick_time_ = 11285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::max(expected_impl_tick_time_, last_main_thread_tick_time_); 11295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_commits_++; 11305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 11335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 11355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool started_animating_; 11365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int num_commits_; 11375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int num_draw_attempts_; 11385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks last_main_thread_tick_time_; 11395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks expected_impl_tick_time_; 11405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 11415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Only the non-impl-paint multi-threaded compositor freezes animations. 11435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostAnimationTestFrozenAnimationTickTime); 11445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// When animations are simultaneously added to an existing layer and to a new 11465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// layer, they should start at the same time, even when there's already a 11475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// running animation on the existing layer. 11485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass LayerTreeHostAnimationTestAnimationsAddedToNewAndExistingLayers 11495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : public LayerTreeHostAnimationTest { 11505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 11515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu LayerTreeHostAnimationTestAnimationsAddedToNewAndExistingLayers() 11525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : frame_count_with_pending_tree_(0) {} 11535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 11545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 11555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 11565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidCommit() OVERRIDE { 11575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (layer_tree_host()->source_frame_number() == 1) { 11585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddAnimatedTransformToLayer(layer_tree_host()->root_layer(), 4, 1, 1); 11595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else if (layer_tree_host()->source_frame_number() == 2) { 11605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddOpacityTransitionToLayer( 11615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layer_tree_host()->root_layer(), 1, 0.f, 0.5f, true); 11625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 11635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_refptr<Layer> layer = Layer::Create(); 11645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layer_tree_host()->root_layer()->AddChild(layer); 11655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layer->set_layer_animation_delegate(this); 11665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layer->SetBounds(gfx::Size(4, 4)); 11671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AddOpacityTransitionToLayer(layer.get(), 1, 0.f, 0.5f, true); 11685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 11695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 11705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 11715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void BeginCommitOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 11725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu host_impl->BlockNotifyReadyToActivateForTesting(true); 11735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 11745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 11755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 11765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // For the commit that added animations to new and existing layers, keep 11775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // blocking activation. We want to verify that even with activation blocked, 11785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // the animation on the layer that's already in the active tree won't get a 11795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // head start. 11805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!host_impl->settings().impl_side_painting || 11815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu host_impl->pending_tree()->source_frame_number() != 2) 11825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu host_impl->BlockNotifyReadyToActivateForTesting(false); 11835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 11845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 11855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void WillBeginImplFrameOnThread(LayerTreeHostImpl* host_impl, 11865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const BeginFrameArgs& args) OVERRIDE { 11875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!host_impl->pending_tree() || 11885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu host_impl->pending_tree()->source_frame_number() != 2) 11895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 11905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 11915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu frame_count_with_pending_tree_++; 11925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (frame_count_with_pending_tree_ == 2) 11935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu host_impl->BlockNotifyReadyToActivateForTesting(false); 11945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 11955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 11965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void UpdateAnimationState(LayerTreeHostImpl* host_impl, 11975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool has_unfinished_animation) OVERRIDE { 1198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LayerAnimationController* root_controller_impl = 1199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_impl->active_tree()->root_layer()->layer_animation_controller(); 1200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Animation* root_animation = 1201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch root_controller_impl->GetAnimation(Animation::Opacity); 12025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!root_animation || root_animation->run_state() != Animation::Running) 12035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 12045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LayerAnimationController* child_controller_impl = 1206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_impl->active_tree()->root_layer()->children() 1207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch [0]->layer_animation_controller(); 1208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Animation* child_animation = 1209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch child_controller_impl->GetAnimation(Animation::Opacity); 12105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(Animation::Running, child_animation->run_state()); 12115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(root_animation->start_time(), child_animation->start_time()); 1212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch root_controller_impl->AbortAnimations(Animation::Opacity); 1213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch root_controller_impl->AbortAnimations(Animation::Transform); 1214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch child_controller_impl->AbortAnimations(Animation::Opacity); 12155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EndTest(); 12165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 12175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 12185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void AfterTest() OVERRIDE {} 12195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 12205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 12215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int frame_count_with_pending_tree_; 12225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 12235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 12245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuSINGLE_AND_MULTI_THREAD_TEST_F( 12255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu LayerTreeHostAnimationTestAnimationsAddedToNewAndExistingLayers); 12265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 12275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass LayerTreeHostAnimationTestAddAnimationAfterAnimating 12285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : public LayerTreeHostAnimationTest { 12295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 12305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu LayerTreeHostAnimationTestAddAnimationAfterAnimating() 12315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : num_swap_buffers_(0) {} 12325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 12335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void SetupTree() OVERRIDE { 12345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu LayerTreeHostAnimationTest::SetupTree(); 12355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content_ = Layer::Create(); 12365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content_->SetBounds(gfx::Size(4, 4)); 12375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layer_tree_host()->root_layer()->AddChild(content_); 12385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 12395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 12405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 12415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 12425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidCommit() OVERRIDE { 12435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu switch (layer_tree_host()->source_frame_number()) { 12445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case 1: 12455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // First frame: add an animation to the root layer. 12465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddAnimatedTransformToLayer(layer_tree_host()->root_layer(), 0.1, 5, 5); 12475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu break; 12485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case 2: 12495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Second frame: add an animation to the content layer. The root layer 12505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // animation has caused us to animate already during this frame. 12515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddOpacityTransitionToLayer(content_.get(), 0.1, 5, 5, false); 12525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu break; 12535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 12545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 12555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 12565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 12575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool result) OVERRIDE { 1258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // After both animations have started, verify that they have valid 1259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // start times. 1260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) num_swap_buffers_++; 1261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AnimationRegistrar::AnimationControllerMap copy = 1262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) host_impl->animation_registrar()->active_animation_controllers(); 1263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (copy.size() == 2u) { 12645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EndTest(); 1265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_GE(num_swap_buffers_, 3); 12665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (AnimationRegistrar::AnimationControllerMap::iterator iter = 12675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu copy.begin(); 12685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu iter != copy.end(); 12695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ++iter) { 12705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int id = ((*iter).second->id()); 12715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (id == host_impl->RootLayer()->id()) { 12725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Animation* anim = (*iter).second->GetAnimation(Animation::Transform); 1273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_GT((anim->start_time() - base::TimeTicks()).InSecondsF(), 0); 12745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else if (id == host_impl->RootLayer()->children()[0]->id()) { 12755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Animation* anim = (*iter).second->GetAnimation(Animation::Opacity); 1276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_GT((anim->start_time() - base::TimeTicks()).InSecondsF(), 0); 12775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 12785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 12795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 12805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 12815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 12825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void AfterTest() OVERRIDE {} 12835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 12845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 12855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_refptr<Layer> content_; 12865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int num_swap_buffers_; 12875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 12885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 12895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuSINGLE_AND_MULTI_THREAD_TEST_F( 12905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu LayerTreeHostAnimationTestAddAnimationAfterAnimating); 12915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 1294