layer_tree_test.cc revision 558790d6acca3451cf3a6b497803a5f07d0bec58
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 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/test/layer_tree_test.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation_registrar.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/layer_animation_controller.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/timing_function.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/base/switches.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/input/input_handler.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/animation_test_common.h" 18a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "cc/test/fake_context_provider.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/occlusion_tracker_test_common.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/tiled_layer_test_common.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TestHooks::TestHooks() {} 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TestHooks::~TestHooks() {} 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TestHooks::PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result) { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool TestHooks::CanActivatePendingTree(LayerTreeHostImpl* host_impl) { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool TestHooks::CanActivatePendingTreeIfNeeded(LayerTreeHostImpl* host_impl) { 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Adapts LayerTreeHostImpl for test. Runs real code, then invokes test hooks. 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostImplForTesting : public LayerTreeHostImpl { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<LayerTreeHostImplForTesting> Create( 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks, 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerTreeSettings& settings, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImplClient* host_impl_client, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Proxy* proxy, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderingStatsInstrumentation* stats_instrumentation) { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_ptr( 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new LayerTreeHostImplForTesting(test_hooks, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl_client, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stats_instrumentation)); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImplForTesting( 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerTreeSettings& settings, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImplClient* host_impl_client, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Proxy* proxy, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderingStatsInstrumentation* stats_instrumentation) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostImpl(settings, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl_client, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stats_instrumentation), 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_(test_hooks) {} 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginCommit() OVERRIDE { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::BeginCommit(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->BeginCommitOnThread(this); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitComplete() OVERRIDE { 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::CommitComplete(); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->CommitCompleteOnThread(this); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!settings().impl_side_painting) { 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test_hooks_->WillActivateTreeOnThread(this); 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test_hooks_->DidActivateTreeOnThread(this); 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool PrepareToDraw(FrameData* frame, gfx::Rect damage_rect) OVERRIDE { 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool result = LayerTreeHostImpl::PrepareToDraw(frame, damage_rect); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!test_hooks_->PrepareToDrawOnThread(this, frame, result)) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = false; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayers(FrameData* frame, 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks frame_begin_time) OVERRIDE { 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::DrawLayers(frame, frame_begin_time); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->DrawLayersOnThread(this); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool SwapBuffers(const LayerTreeHostImpl::FrameData& frame) OVERRIDE { 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool result = LayerTreeHostImpl::SwapBuffers(frame); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->SwapBuffersOnThread(this, result); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1125e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) virtual void OnSwapBuffersComplete(const CompositorFrameAck* ack) OVERRIDE { 1135e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) LayerTreeHostImpl::OnSwapBuffersComplete(ack); 114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) test_hooks_->SwapBuffersCompleteOnThread(this); 115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void ActivatePendingTreeIfNeeded() OVERRIDE { 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pending_tree()) 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!test_hooks_->CanActivatePendingTreeIfNeeded(this)) 1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LayerTreeHostImpl::ActivatePendingTreeIfNeeded(); 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void ActivatePendingTree() OVERRIDE { 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!test_hooks_->CanActivatePendingTree(this)) 1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test_hooks_->WillActivateTreeOnThread(this); 1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LayerTreeHostImpl::ActivatePendingTree(); 1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(!pending_tree()); 1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test_hooks_->DidActivateTreeOnThread(this); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool InitializeRenderer(scoped_ptr<OutputSurface> output_surface) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERRIDE { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool success = LayerTreeHostImpl::InitializeRenderer(output_surface.Pass()); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->InitializedRendererOnThread(this, success); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return success; 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetVisible(bool visible) OVERRIDE { 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::SetVisible(visible); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->DidSetVisibleOnImplTree(this, visible); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AnimateLayers(base::TimeTicks monotonic_time, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time wall_clock_time) OVERRIDE { 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->WillAnimateLayers(this, monotonic_time); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::AnimateLayers(monotonic_time, wall_clock_time); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->AnimateLayers(this, monotonic_time); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void UpdateAnimationState(bool start_ready_animations) OVERRIDE { 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::UpdateAnimationState(start_ready_animations); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_unfinished_animation = false; 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimationRegistrar::AnimationControllerMap::const_iterator iter = 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_animation_controllers().begin(); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; iter != active_animation_controllers().end(); ++iter) { 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter->second->HasActiveAnimation()) { 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_unfinished_animation = true; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->UpdateAnimationState(this, has_unfinished_animation); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual base::TimeDelta LowFrequencyAnimationInterval() const OVERRIDE { 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::TimeDelta::FromMilliseconds(16); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks_; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Adapts LayerTreeHost for test. Injects LayerTreeHostImplForTesting. 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostForTesting : public cc::LayerTreeHost { 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<LayerTreeHostForTesting> Create( 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::LayerTreeHostClient* host_client, 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const cc::LayerTreeSettings& settings, 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) { 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<LayerTreeHostForTesting> layer_tree_host( 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new LayerTreeHostForTesting(test_hooks, host_client, settings)); 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool success = layer_tree_host->Initialize(impl_task_runner); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(success); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host.Pass(); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<cc::LayerTreeHostImpl> CreateLayerTreeHostImpl( 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::LayerTreeHostImplClient* host_impl_client) OVERRIDE { 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return LayerTreeHostImplForTesting::Create( 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_, 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings(), 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl_client, 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy(), 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation()).PassAs<cc::LayerTreeHostImpl>(); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetNeedsCommit() OVERRIDE { 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!test_started_) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHost::SetNeedsCommit(); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_test_started(bool started) { test_started_ = started; } 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidDeferCommit() OVERRIDE { 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->DidDeferCommit(); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostForTesting(TestHooks* test_hooks, 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::LayerTreeHostClient* client, 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const cc::LayerTreeSettings& settings) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHost(client, settings), 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_(test_hooks), 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_started_(false) {} 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks_; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool test_started_; 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Implementation of LayerTreeHost callback interface. 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostClientForTesting : public LayerTreeHostClient { 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<LayerTreeHostClientForTesting> Create( 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks) { 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_ptr(new LayerTreeHostClientForTesting(test_hooks)); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~LayerTreeHostClientForTesting() {} 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 236558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void WillBeginFrame() OVERRIDE { test_hooks_->WillBeginFrame(); } 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 238558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void DidBeginFrame() OVERRIDE { test_hooks_->DidBeginFrame(); } 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Animate(double monotonic_time) OVERRIDE { 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->Animate(base::TimeTicks::FromInternalValue( 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) monotonic_time * base::Time::kMicrosecondsPerSecond)); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE { 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->Layout(); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float scale) OVERRIDE { 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->ApplyScrollAndScale(scroll_delta, scale); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE { 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return test_hooks_->CreateOutputSurface(); 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 258b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 259b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) test_hooks_->DidInitializeOutputSurface(succeeded); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidFailToInitializeOutputSurface() OVERRIDE { 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_hooks_->DidFailToInitializeOutputSurface(); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 266558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void WillCommit() OVERRIDE { test_hooks_->WillCommit(); } 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->DidCommit(); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->DidCommitAndDrawFrame(); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 276b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidCompleteSwapBuffers() OVERRIDE { 277b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) test_hooks_->DidCompleteSwapBuffers(); 278b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ScheduleComposite() OVERRIDE { 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->ScheduleComposite(); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OffscreenContextProviderForMainThread() OVERRIDE { 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return test_hooks_->OffscreenContextProviderForMainThread(); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OffscreenContextProviderForCompositorThread() OVERRIDE { 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return test_hooks_->OffscreenContextProviderForCompositorThread(); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit LayerTreeHostClientForTesting(TestHooks* test_hooks) 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : test_hooks_(test_hooks) {} 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks_; 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeTest::LayerTreeTest() 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : beginning_(false), 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end_when_begin_returns_(false), 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) timed_out_(false), 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduled_(false), 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) schedule_when_set_visible_true_(false), 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) started_(false), 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ended_(false), 309a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) delegating_renderer_(false), 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timeout_seconds_(0), 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_factory_(this) { 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_thread_weak_ptr_ = weak_factory_.GetWeakPtr(); 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tests should timeout quickly unless --cc-layer-tree-test-no-timeout was 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // specified (for running in a debugger). 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!command_line->HasSwitch(switches::kCCLayerTreeTestNoTimeout)) 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timeout_seconds_ = 5; 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeTest::~LayerTreeTest() {} 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::EndTest() { 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For the case where we EndTest during BeginTest(), set a flag to indicate 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that the test should end the second BeginTest regains control. 3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ended_ = true; 3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (beginning_) { 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end_when_begin_returns_ = true; 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (proxy()) { 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Racy timeouts and explicit EndTest calls might have cleaned up 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the tree host. Should check proxy first. 333eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch proxy()->MainThreadTaskRunner()->PostTask( 334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_)); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::EndTestAfterDelay(int delay_milliseconds) { 340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch proxy()->MainThreadTaskRunner()->PostTask( 341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::EndTest, main_thread_weak_ptr_)); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostAddAnimationToMainThread( 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layer* layer_to_receive_animation) { 347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch proxy()->MainThreadTaskRunner()->PostTask( 348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchAddAnimation, 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_thread_weak_ptr_, 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(layer_to_receive_animation))); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeTest::PostAddInstantAnimationToMainThread( 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* layer_to_receive_animation) { 356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch proxy()->MainThreadTaskRunner()->PostTask( 357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchAddInstantAnimation, 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_thread_weak_ptr_, 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(layer_to_receive_animation))); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostSetNeedsCommitToMainThread() { 364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch proxy()->MainThreadTaskRunner()->PostTask( 365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchSetNeedsCommit, 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_thread_weak_ptr_)); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostAcquireLayerTextures() { 371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch proxy()->MainThreadTaskRunner()->PostTask( 372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchAcquireLayerTextures, 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_thread_weak_ptr_)); 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostSetNeedsRedrawToMainThread() { 378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch proxy()->MainThreadTaskRunner()->PostTask( 379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchSetNeedsRedraw, 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_thread_weak_ptr_)); 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeTest::PostSetNeedsRedrawRectToMainThread(gfx::Rect damage_rect) { 385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch proxy()->MainThreadTaskRunner()->PostTask( 386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchSetNeedsRedrawRect, 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_thread_weak_ptr_, damage_rect)); 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostSetVisibleToMainThread(bool visible) { 392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch proxy()->MainThreadTaskRunner()->PostTask( 393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchSetVisible, 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_thread_weak_ptr_, 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visible)); 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DoBeginTest() { 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_ = LayerTreeHostClientForTesting::Create(this); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!impl_thread_ || impl_thread_->message_loop_proxy().get()); 403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer_tree_host_ = LayerTreeHostForTesting::Create( 404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this, 405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch client_.get(), 406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch settings_, 407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch impl_thread_ ? impl_thread_->message_loop_proxy() : NULL); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(layer_tree_host_); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) started_ = true; 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) beginning_ = true; 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupTree(); 413b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host_->SetLayerTreeHostClientReady(); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BeginTest(); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) beginning_ = false; 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (end_when_begin_returns_) 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RealEndTest(); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow commits to happen once BeginTest() has had a chance to post tasks 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // so that those tasks will happen before the first commit. 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_) { 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<LayerTreeHostForTesting*>(layer_tree_host_.get())-> 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_test_started(true); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::SetupTree() { 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_tree_host_->root_layer()) { 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root_layer = Layer::Create(); 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetAnchorPoint(gfx::PointF()); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer->SetBounds(gfx::Size(1, 1)); 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetIsDrawable(true); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_->SetRootLayer(root_layer); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size root_bounds = layer_tree_host_->root_layer()->bounds(); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size device_root_bounds = gfx::ToCeiledSize( 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScaleSize(root_bounds, layer_tree_host_->device_scale_factor())); 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_->SetViewportSize(device_root_bounds); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::Timeout() { 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) timed_out_ = true; 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::ScheduleComposite() { 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!started_ || scheduled_) 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduled_ = true; 451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch proxy()->MainThreadTaskRunner()->PostTask( 452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchComposite, main_thread_weak_ptr_)); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::RealEndTest() { 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_ && proxy()->CommitPendingForTesting()) { 458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch proxy()->MainThreadTaskRunner()->PostTask( 459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_)); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->Quit(); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeTest::DispatchAddInstantAnimation( 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* layer_to_receive_animation) { 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (layer_to_receive_animation) { 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddOpacityTransitionToLayer(layer_to_receive_animation, 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0.5, 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchAddAnimation(Layer* layer_to_receive_animation) { 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (layer_to_receive_animation) { 484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddOpacityTransitionToLayer(layer_to_receive_animation, 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0.000001, 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0.5, 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) true); 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchSetNeedsCommit() { 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_) 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_->SetNeedsCommit(); 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchAcquireLayerTextures() { 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_) 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_->AcquireLayerTextures(); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchSetNeedsRedraw() { 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_) 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_->SetNeedsRedraw(); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeTest::DispatchSetNeedsRedrawRect(gfx::Rect damage_rect) { 514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (layer_tree_host_) 517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_->SetNeedsRedrawRect(damage_rect); 518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchSetVisible(bool visible) { 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_tree_host_) 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_->SetVisible(visible); 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the LTH is being made visible and a previous ScheduleComposite() was 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // deferred because the LTH was not visible, re-schedule the composite now. 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_->visible() && schedule_when_set_visible_true_) 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScheduleComposite(); 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchComposite() { 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduled_ = false; 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_tree_host_) 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the LTH is not visible, defer the composite until the LTH is made 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // visible. 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_tree_host_->visible()) { 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) schedule_when_set_visible_true_ = true; 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) schedule_when_set_visible_true_ = false; 548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_->Composite(now); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void LayerTreeTest::RunTest(bool threaded, 553a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool delegating_renderer, 554a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool impl_side_painting) { 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (threaded) { 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_thread_.reset(new base::Thread("Compositor")); 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(impl_thread_->Start()); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_ = 561eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::MessageLoopProxy::current(); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 563a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) delegating_renderer_ = delegating_renderer; 564a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 56590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Spend less time waiting for BeginFrame because the output is 56690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // mocked out. 567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings_.refresh_rate = 200.0; 568a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (impl_side_painting) { 569a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(threaded) << 570a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) "Don't run single thread + impl side painting, it doesn't exist."; 571a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) settings_.impl_side_painting = true; 572a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeSettings(&settings_); 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 575eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch main_task_runner_->PostTask( 576eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::DoBeginTest, base::Unretained(this))); 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (timeout_seconds_) { 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timeout_.Reset(base::Bind(&LayerTreeTest::Timeout, base::Unretained(this))); 581eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch main_task_runner_->PostDelayedTask( 582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timeout_.callback(), 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(timeout_seconds_)); 585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->Run(); 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_ && layer_tree_host_->root_layer()) 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_->root_layer()->SetLayerTreeHost(NULL); 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_.reset(); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) timeout_.Cancel(); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(layer_tree_host_.get()); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_.reset(); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (timed_out_) { 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAIL() << "Test timed out"; 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AfterTest(); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 603a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<OutputSurface> LayerTreeTest::CreateOutputSurface() { 6047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<FakeOutputSurface> output_surface; 605a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (delegating_renderer_) 6067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) output_surface = FakeOutputSurface::CreateDelegating3d(); 6077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else 6087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) output_surface = FakeOutputSurface::Create3d(); 6097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) output_surface_ = output_surface.get(); 6107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return output_surface.PassAs<OutputSurface>(); 611a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 612a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 613a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_refptr<cc::ContextProvider> LayerTreeTest:: 614a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) OffscreenContextProviderForMainThread() { 615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!main_thread_contexts_.get() || 616a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) main_thread_contexts_->DestroyedOnMainThread()) { 617a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) main_thread_contexts_ = FakeContextProvider::Create(); 618a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!main_thread_contexts_->BindToCurrentThread()) 619a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) main_thread_contexts_ = NULL; 620a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 621a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return main_thread_contexts_; 622a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 623a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 624a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_refptr<cc::ContextProvider> LayerTreeTest:: 625a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) OffscreenContextProviderForCompositorThread() { 626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!compositor_thread_contexts_.get() || 627a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) compositor_thread_contexts_->DestroyedOnMainThread()) 628a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) compositor_thread_contexts_ = FakeContextProvider::Create(); 629a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return compositor_thread_contexts_; 630a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 631a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 633