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" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_context_provider.h" 2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/tiled_layer_test_common.h" 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/trees/layer_tree_host_client.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/trees/layer_tree_host_single_thread_client.h" 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/trees/thread_proxy.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/frame_time.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TestHooks::TestHooks() {} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TestHooks::~TestHooks() {} 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DrawResult TestHooks::PrepareToDrawOnThread( 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) { 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)base::TimeDelta TestHooks::LowFrequencyAnimationInterval() const { 47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return base::TimeDelta::FromMilliseconds(16); 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Adapts ThreadProxy for test. Injects test hooks for testing. 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ThreadProxyForTest : public ThreadProxy { 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static scoped_ptr<Proxy> Create( 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestHooks* test_hooks, 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LayerTreeHost* host, 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) { 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return make_scoped_ptr( 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new ThreadProxyForTest( 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) test_hooks, host, main_task_runner, impl_task_runner)) 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) .PassAs<Proxy>(); 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~ThreadProxyForTest() {} 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void test() { 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_hooks_->Layout(); 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestHooks* test_hooks_; 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void ScheduledActionSendBeginMainFrame() OVERRIDE { 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) test_hooks_->ScheduledActionWillSendBeginMainFrame(); 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ThreadProxy::ScheduledActionSendBeginMainFrame(); 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_hooks_->ScheduledActionSendBeginMainFrame(); 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual DrawResult ScheduledActionDrawAndSwapIfPossible() OVERRIDE { 806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DrawResult result = ThreadProxy::ScheduledActionDrawAndSwapIfPossible(); 816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) test_hooks_->ScheduledActionDrawAndSwapIfPossible(); 826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return result; 836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void ScheduledActionAnimate() OVERRIDE { 866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ThreadProxy::ScheduledActionAnimate(); 876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) test_hooks_->ScheduledActionAnimate(); 886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void ScheduledActionCommit() OVERRIDE { 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ThreadProxy::ScheduledActionCommit(); 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_hooks_->ScheduledActionCommit(); 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void ScheduledActionBeginOutputSurfaceCreation() OVERRIDE { 966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ThreadProxy::ScheduledActionBeginOutputSurfaceCreation(); 976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) test_hooks_->ScheduledActionBeginOutputSurfaceCreation(); 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ThreadProxyForTest( 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestHooks* test_hooks, 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LayerTreeHost* host, 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : ThreadProxy(host, main_task_runner, impl_task_runner), 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) test_hooks_(test_hooks) {} 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Adapts LayerTreeHostImpl for test. Runs real code, then invokes test hooks. 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostImplForTesting : public LayerTreeHostImpl { 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<LayerTreeHostImplForTesting> Create( 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks, 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerTreeSettings& settings, 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImplClient* host_impl_client, 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Proxy* proxy, 11723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SharedBitmapManager* manager, 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderingStatsInstrumentation* stats_instrumentation) { 11923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return make_scoped_ptr( 12023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) new LayerTreeHostImplForTesting(test_hooks, 12123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) settings, 12223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) host_impl_client, 12323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) proxy, 12423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) manager, 12523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) stats_instrumentation)); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImplForTesting( 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerTreeSettings& settings, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImplClient* host_impl_client, 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Proxy* proxy, 13423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SharedBitmapManager* manager, 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderingStatsInstrumentation* stats_instrumentation) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostImpl(settings, 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl_client, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy, 1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) stats_instrumentation, 14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) manager, 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0), 142424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) test_hooks_(test_hooks), 143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) block_notify_ready_to_activate_for_testing_(false), 144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) notify_ready_to_activate_was_blocked_(false) {} 145424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void WillBeginImplFrame(const BeginFrameArgs& args) OVERRIDE { 147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch LayerTreeHostImpl::WillBeginImplFrame(args); 148424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) test_hooks_->WillBeginImplFrameOnThread(this, args); 149424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginMainFrameAborted(bool did_handle) OVERRIDE { 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::BeginMainFrameAborted(did_handle); 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_hooks_->BeginMainFrameAbortedOnThread(this, did_handle); 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginCommit() OVERRIDE { 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::BeginCommit(); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->BeginCommitOnThread(this); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitComplete() OVERRIDE { 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::CommitComplete(); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->CommitCompleteOnThread(this); 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDraw(FrameData* frame) OVERRIDE { 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result = LayerTreeHostImpl::PrepareToDraw(frame); 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return test_hooks_->PrepareToDrawOnThread(this, frame, draw_result); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void DrawLayers(FrameData* frame, 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::TimeTicks frame_begin_time) OVERRIDE { 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LayerTreeHostImpl::DrawLayers(frame, frame_begin_time); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->DrawLayersOnThread(this); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool SwapBuffers(const LayerTreeHostImpl::FrameData& frame) OVERRIDE { 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool result = LayerTreeHostImpl::SwapBuffers(frame); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->SwapBuffersOnThread(this, result); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void DidSwapBuffersComplete() OVERRIDE { 1840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LayerTreeHostImpl::DidSwapBuffersComplete(); 185b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) test_hooks_->SwapBuffersCompleteOnThread(this); 186b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 187b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void ReclaimResources(const CompositorFrameAck* ack) OVERRIDE { 189d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LayerTreeHostImpl::ReclaimResources(ack); 190d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 191d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void UpdateVisibleTiles() OVERRIDE { 19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostImpl::UpdateVisibleTiles(); 19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) test_hooks_->UpdateVisibleTilesOnThread(this); 19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 197424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void NotifyReadyToActivate() OVERRIDE { 198424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (block_notify_ready_to_activate_for_testing_) 199424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) notify_ready_to_activate_was_blocked_ = true; 200424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) else 201424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) client_->NotifyReadyToActivate(); 202424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void BlockNotifyReadyToActivateForTesting(bool block) OVERRIDE { 205424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) block_notify_ready_to_activate_for_testing_ = block; 206424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!block && notify_ready_to_activate_was_blocked_) { 207424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) NotifyReadyToActivate(); 208424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) notify_ready_to_activate_was_blocked_ = false; 209424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void ActivateSyncTree() OVERRIDE { 2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test_hooks_->WillActivateTreeOnThread(this); 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LayerTreeHostImpl::ActivateSyncTree(); 2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(!pending_tree()); 2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test_hooks_->DidActivateTreeOnThread(this); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool InitializeRenderer(scoped_ptr<OutputSurface> output_surface) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERRIDE { 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool success = LayerTreeHostImpl::InitializeRenderer(output_surface.Pass()); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->InitializedRendererOnThread(this, success); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return success; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetVisible(bool visible) OVERRIDE { 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::SetVisible(visible); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->DidSetVisibleOnImplTree(this, visible); 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void AnimateLayers(base::TimeTicks monotonic_time) OVERRIDE { 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->WillAnimateLayers(this, monotonic_time); 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostImpl::AnimateLayers(monotonic_time); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->AnimateLayers(this, monotonic_time); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void UpdateAnimationState(bool start_ready_animations) OVERRIDE { 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::UpdateAnimationState(start_ready_animations); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_unfinished_animation = false; 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimationRegistrar::AnimationControllerMap::const_iterator iter = 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_animation_controllers().begin(); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; iter != active_animation_controllers().end(); ++iter) { 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter->second->HasActiveAnimation()) { 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_unfinished_animation = true; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->UpdateAnimationState(this, has_unfinished_animation); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual base::TimeDelta LowFrequencyAnimationInterval() const OVERRIDE { 252424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return test_hooks_->LowFrequencyAnimationInterval(); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks_; 257424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool block_notify_ready_to_activate_for_testing_; 258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool notify_ready_to_activate_was_blocked_; 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Implementation of LayerTreeHost callback interface. 262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class LayerTreeHostClientForTesting : public LayerTreeHostClient, 263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public LayerTreeHostSingleThreadClient { 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<LayerTreeHostClientForTesting> Create( 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks) { 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_ptr(new LayerTreeHostClientForTesting(test_hooks)); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~LayerTreeHostClientForTesting() {} 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void WillBeginMainFrame(int frame_id) OVERRIDE { 2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test_hooks_->WillBeginMainFrame(); 2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void DidBeginMainFrame() OVERRIDE { 2761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test_hooks_->DidBeginMainFrame(); 2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void BeginMainFrame(const BeginFrameArgs& args) OVERRIDE { 28003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) test_hooks_->BeginMainFrame(args); 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Layout() OVERRIDE { test_hooks_->Layout(); } 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta, 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci float scale, 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci float top_controls_delta) OVERRIDE { 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_hooks_->ApplyViewportDeltas(scroll_delta, 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scale, 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci top_controls_delta); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void RequestNewOutputSurface(bool fallback) OVERRIDE { 2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_hooks_->RequestNewOutputSurface(fallback); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidInitializeOutputSurface() OVERRIDE { 2985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu test_hooks_->DidInitializeOutputSurface(); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidFailToInitializeOutputSurface() OVERRIDE { 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_hooks_->DidFailToInitializeOutputSurface(); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 305558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void WillCommit() OVERRIDE { test_hooks_->WillCommit(); } 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidCommit() OVERRIDE { test_hooks_->DidCommit(); } 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->DidCommitAndDrawFrame(); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 313b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidCompleteSwapBuffers() OVERRIDE { 314b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) test_hooks_->DidCompleteSwapBuffers(); 315b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidPostSwapBuffers() OVERRIDE {} 318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidAbortSwapBuffers() OVERRIDE {} 319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit LayerTreeHostClientForTesting(TestHooks* test_hooks) 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : test_hooks_(test_hooks) {} 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks_; 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Adapts LayerTreeHost for test. Injects LayerTreeHostImplForTesting. 328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class LayerTreeHostForTesting : public LayerTreeHost { 329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static scoped_ptr<LayerTreeHostForTesting> Create( 331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestHooks* test_hooks, 332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerTreeHostClientForTesting* client, 333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const LayerTreeSettings& settings, 3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) { 336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<LayerTreeHostForTesting> layer_tree_host( 337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new LayerTreeHostForTesting(test_hooks, client, settings)); 338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (impl_task_runner.get()) { 339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layer_tree_host->InitializeForTesting( 340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ThreadProxyForTest::Create(test_hooks, 341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layer_tree_host.get(), 3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) main_task_runner, 343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) impl_task_runner)); 344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layer_tree_host->InitializeForTesting(SingleThreadProxy::Create( 3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layer_tree_host.get(), client, main_task_runner)); 347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return layer_tree_host.Pass(); 349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual scoped_ptr<LayerTreeHostImpl> CreateLayerTreeHostImpl( 352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerTreeHostImplClient* host_impl_client) OVERRIDE { 353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return LayerTreeHostImplForTesting::Create( 35423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) test_hooks_, 35523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) settings(), 35623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) host_impl_client, 35723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) proxy(), 35823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) shared_bitmap_manager_.get(), 35923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) rendering_stats_instrumentation()).PassAs<LayerTreeHostImpl>(); 360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void SetNeedsCommit() OVERRIDE { 363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!test_started_) 364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerTreeHost::SetNeedsCommit(); 366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void set_test_started(bool started) { test_started_ = started; } 369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidDeferCommit() OVERRIDE { test_hooks_->DidDeferCommit(); } 371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerTreeHostForTesting(TestHooks* test_hooks, 374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerTreeHostClient* client, 375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const LayerTreeSettings& settings) 376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : LayerTreeHost(client, NULL, settings), 37723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) shared_bitmap_manager_(new TestSharedBitmapManager()), 378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_hooks_(test_hooks), 379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_started_(false) {} 380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 38123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestHooks* test_hooks_; 383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool test_started_; 384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeTest::LayerTreeTest() 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : beginning_(false), 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end_when_begin_returns_(false), 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) timed_out_(false), 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduled_(false), 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) started_(false), 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ended_(false), 393a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) delegating_renderer_(false), 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timeout_seconds_(0), 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_factory_(this) { 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_thread_weak_ptr_ = weak_factory_.GetWeakPtr(); 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tests should timeout quickly unless --cc-layer-tree-test-no-timeout was 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // specified (for running in a debugger). 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!command_line->HasSwitch(switches::kCCLayerTreeTestNoTimeout)) 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timeout_seconds_ = 5; 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeTest::~LayerTreeTest() {} 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::EndTest() { 4080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (ended_) 4090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return; 4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ended_ = true; 4117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // For the case where we EndTest during BeginTest(), set a flag to indicate 4130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // that the test should end the second BeginTest regains control. 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (beginning_) { 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end_when_begin_returns_ = true; 4160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } else { 4170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_)); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::EndTestAfterDelay(int delay_milliseconds) { 424c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch main_task_runner_->PostDelayedTask( 425c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FROM_HERE, 426c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Bind(&LayerTreeTest::EndTest, main_thread_weak_ptr_), 427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::TimeDelta::FromMilliseconds(delay_milliseconds)); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostAddAnimationToMainThread( 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layer* layer_to_receive_animation) { 4320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchAddAnimation, 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_thread_weak_ptr_, 436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Unretained(layer_to_receive_animation), 437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 0.000001)); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeTest::PostAddInstantAnimationToMainThread( 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* layer_to_receive_animation) { 4420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchAddAnimation, 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_thread_weak_ptr_, 446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Unretained(layer_to_receive_animation), 447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 0.0)); 448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeTest::PostAddLongAnimationToMainThread( 451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Layer* layer_to_receive_animation) { 452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) main_task_runner_->PostTask( 453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FROM_HERE, 454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchAddAnimation, 455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) main_thread_weak_ptr_, 456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Unretained(layer_to_receive_animation), 457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1.0)); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostSetNeedsCommitToMainThread() { 4610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask(FROM_HERE, 4620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind(&LayerTreeTest::DispatchSetNeedsCommit, 4630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_thread_weak_ptr_)); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeTest::PostSetNeedsUpdateLayersToMainThread() { 467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) main_task_runner_->PostTask( 468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FROM_HERE, 469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchSetNeedsUpdateLayers, 470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) main_thread_weak_ptr_)); 471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostSetNeedsRedrawToMainThread() { 4740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask(FROM_HERE, 4750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind(&LayerTreeTest::DispatchSetNeedsRedraw, 4760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_thread_weak_ptr_)); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeTest::PostSetNeedsRedrawRectToMainThread( 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& damage_rect) { 4810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchSetNeedsRedrawRect, 4840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_thread_weak_ptr_, 4850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) damage_rect)); 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostSetVisibleToMainThread(bool visible) { 4890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 490eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 4910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind( 4920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) &LayerTreeTest::DispatchSetVisible, main_thread_weak_ptr_, visible)); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void LayerTreeTest::PostSetNextCommitForcesRedrawToMainThread() { 4960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchSetNextCommitForcesRedraw, 4994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) main_thread_weak_ptr_)); 5004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeTest::WillBeginTest() { 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host_->SetLayerTreeHostClientReady(); 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DoBeginTest() { 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_ = LayerTreeHostClientForTesting::Create(this); 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 509eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!impl_thread_ || impl_thread_->message_loop_proxy().get()); 510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer_tree_host_ = LayerTreeHostForTesting::Create( 511eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this, 512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch client_.get(), 513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch settings_, 5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoopProxy::current(), 515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch impl_thread_ ? impl_thread_->message_loop_proxy() : NULL); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(layer_tree_host_); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) started_ = true; 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) beginning_ = true; 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupTree(); 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WillBeginTest(); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BeginTest(); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) beginning_ = false; 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (end_when_begin_returns_) 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RealEndTest(); 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow commits to happen once BeginTest() has had a chance to post tasks 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // so that those tasks will happen before the first commit. 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_) { 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<LayerTreeHostForTesting*>(layer_tree_host_.get()) 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->set_test_started(true); 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::SetupTree() { 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_tree_host_->root_layer()) { 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root_layer = Layer::Create(); 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer->SetBounds(gfx::Size(1, 1)); 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetIsDrawable(true); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_->SetRootLayer(root_layer); 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size root_bounds = layer_tree_host_->root_layer()->bounds(); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size device_root_bounds = gfx::ToCeiledSize( 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScaleSize(root_bounds, layer_tree_host_->device_scale_factor())); 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_->SetViewportSize(device_root_bounds); 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::Timeout() { 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) timed_out_ = true; 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::RealEndTest() { 5556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (layer_tree_host_ && !timed_out_ && 5566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) proxy()->MainFrameWillHappenForTesting()) { 5570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_)); 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->Quit(); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeTest::DispatchAddAnimation(Layer* layer_to_receive_animation, 567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) double animation_duration) { 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (layer_to_receive_animation) { 5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddOpacityTransitionToLayer( 5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_to_receive_animation, animation_duration, 0, 0.5, true); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeTest::DispatchSetNeedsCommit() { 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (layer_tree_host_) 580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_tree_host_->SetNeedsCommit(); 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeTest::DispatchSetNeedsUpdateLayers() { 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_) 587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_tree_host_->SetNeedsUpdateLayers(); 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchSetNeedsRedraw() { 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_) 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_->SetNeedsRedraw(); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeTest::DispatchSetNeedsRedrawRect(const gfx::Rect& damage_rect) { 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (layer_tree_host_) 601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_->SetNeedsRedrawRect(damage_rect); 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchSetVisible(bool visible) { 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 60603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (layer_tree_host_) 60703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) layer_tree_host_->SetVisible(visible); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void LayerTreeTest::DispatchSetNextCommitForcesRedraw() { 6114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 6124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (layer_tree_host_) 6144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host_->SetNextCommitForcesRedraw(); 6154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 6164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 617a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void LayerTreeTest::RunTest(bool threaded, 618a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool delegating_renderer, 619a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool impl_side_painting) { 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (threaded) { 621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_thread_.reset(new base::Thread("Compositor")); 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(impl_thread_->Start()); 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 62568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) main_task_runner_ = base::MessageLoopProxy::current(); 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 627a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) delegating_renderer_ = delegating_renderer; 628a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 629a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Spend less time waiting for BeginFrame because the output is 63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // mocked out. 631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings_.refresh_rate = 200.0; 632a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (impl_side_painting) { 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(threaded) 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "Don't run single thread + impl side painting, it doesn't exist."; 635a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) settings_.impl_side_painting = true; 636a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeSettings(&settings_); 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch main_task_runner_->PostTask( 640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::DoBeginTest, base::Unretained(this))); 642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (timeout_seconds_) { 644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timeout_.Reset(base::Bind(&LayerTreeTest::Timeout, base::Unretained(this))); 645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch main_task_runner_->PostDelayedTask( 646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timeout_.callback(), 648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(timeout_seconds_)); 649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->Run(); 6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DestroyLayerTreeHost(); 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) timeout_.Cancel(); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(layer_tree_host_.get()); 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_.reset(); 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (timed_out_) { 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAIL() << "Test timed out"; 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AfterTest(); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void LayerTreeTest::RunTestWithImplSidePainting() { 6664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunTest(true, false, true); 6674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 6684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid LayerTreeTest::RequestNewOutputSurface(bool fallback) { 6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_tree_host_->SetOutputSurface(CreateOutputSurface(fallback)); 6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 673a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)scoped_ptr<OutputSurface> LayerTreeTest::CreateOutputSurface(bool fallback) { 6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<FakeOutputSurface> output_surface = 6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateFakeOutputSurface(fallback); 676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (output_surface) { 677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_EQ(delegating_renderer_, 678010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) output_surface->capabilities().delegated_rendering); 679010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 6807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) output_surface_ = output_surface.get(); 6817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return output_surface.PassAs<OutputSurface>(); 682a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 683a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<FakeOutputSurface> LayerTreeTest::CreateFakeOutputSurface( 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool fallback) { 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegating_renderer_) 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return FakeOutputSurface::CreateDelegating3d(); 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return FakeOutputSurface::Create3d(); 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TestWebGraphicsContext3D* LayerTreeTest::TestContext() { 6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return static_cast<TestContextProvider*>(output_surface_->context_provider()) 6941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->TestContext3d(); 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int LayerTreeTest::LastCommittedSourceFrameNumber(LayerTreeHostImpl* impl) 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const { 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (impl->pending_tree()) 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return impl->pending_tree()->source_frame_number(); 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (impl->active_tree()) 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return impl->active_tree()->source_frame_number(); 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Source frames start at 0, so this is invalid. 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return -1; 7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeTest::DestroyLayerTreeHost() { 7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (layer_tree_host_ && layer_tree_host_->root_layer()) 7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host_->root_layer()->SetLayerTreeHost(NULL); 7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host_.reset(); 7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 714