layer_tree_test.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/frame_time.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TestHooks::TestHooks() {} 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TestHooks::~TestHooks() {} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DrawSwapReadbackResult::DrawResult TestHooks::PrepareToDrawOnThread( 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DrawSwapReadbackResult::DrawResult draw_result) { 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)base::TimeDelta TestHooks::LowFrequencyAnimationInterval() const { 46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return base::TimeDelta::FromMilliseconds(16); 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Adapts LayerTreeHostImpl for test. Runs real code, then invokes test hooks. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostImplForTesting : public LayerTreeHostImpl { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<LayerTreeHostImplForTesting> Create( 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerTreeSettings& settings, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImplClient* host_impl_client, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Proxy* proxy, 5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SharedBitmapManager* manager, 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderingStatsInstrumentation* stats_instrumentation) { 5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return make_scoped_ptr( 6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) new LayerTreeHostImplForTesting(test_hooks, 6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) settings, 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) host_impl_client, 6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) proxy, 6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) manager, 6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) stats_instrumentation)); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImplForTesting( 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerTreeSettings& settings, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImplClient* host_impl_client, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Proxy* proxy, 7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SharedBitmapManager* manager, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderingStatsInstrumentation* stats_instrumentation) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostImpl(settings, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl_client, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy, 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) stats_instrumentation, 8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) manager, 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0), 82424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) test_hooks_(test_hooks), 83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) block_notify_ready_to_activate_for_testing_(false), 84424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) notify_ready_to_activate_was_blocked_(false) {} 85424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void BeginImplFrame(const BeginFrameArgs& args) OVERRIDE { 87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) test_hooks_->WillBeginImplFrameOnThread(this, args); 881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) LayerTreeHostImpl::BeginImplFrame(args); 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) test_hooks_->DidBeginImplFrameOnThread(this, args); 90424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginMainFrameAborted(bool did_handle) OVERRIDE { 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::BeginMainFrameAborted(did_handle); 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_hooks_->BeginMainFrameAbortedOnThread(this, did_handle); 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginCommit() OVERRIDE { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::BeginCommit(); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->BeginCommitOnThread(this); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitComplete() OVERRIDE { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::CommitComplete(); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->CommitCompleteOnThread(this); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!settings().impl_side_painting) { 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test_hooks_->WillActivateTreeOnThread(this); 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test_hooks_->DidActivateTreeOnThread(this); 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual DrawSwapReadbackResult::DrawResult PrepareToDraw( 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameData* frame, 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& damage_rect) OVERRIDE { 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DrawSwapReadbackResult::DrawResult draw_result = 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::PrepareToDraw(frame, damage_rect); 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return test_hooks_->PrepareToDrawOnThread(this, frame, draw_result); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayers(FrameData* frame, 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks frame_begin_time) OVERRIDE { 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::DrawLayers(frame, frame_begin_time); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->DrawLayersOnThread(this); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool SwapBuffers(const LayerTreeHostImpl::FrameData& frame) OVERRIDE { 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool result = LayerTreeHostImpl::SwapBuffers(frame); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->SwapBuffersOnThread(this, result); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void OnSwapBuffersComplete() OVERRIDE { 133d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LayerTreeHostImpl::OnSwapBuffersComplete(); 134b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) test_hooks_->SwapBuffersCompleteOnThread(this); 135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void ReclaimResources(const CompositorFrameAck* ack) OVERRIDE { 138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LayerTreeHostImpl::ReclaimResources(ack); 139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 140d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void UpdateVisibleTiles() OVERRIDE { 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostImpl::UpdateVisibleTiles(); 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) test_hooks_->UpdateVisibleTilesOnThread(this); 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 146424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void NotifyReadyToActivate() OVERRIDE { 147424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (block_notify_ready_to_activate_for_testing_) 148424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) notify_ready_to_activate_was_blocked_ = true; 149424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) else 150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) client_->NotifyReadyToActivate(); 151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void BlockNotifyReadyToActivateForTesting(bool block) OVERRIDE { 154424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) block_notify_ready_to_activate_for_testing_ = block; 155424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!block && notify_ready_to_activate_was_blocked_) { 156424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) NotifyReadyToActivate(); 157424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) notify_ready_to_activate_was_blocked_ = false; 158424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void ActivatePendingTree() OVERRIDE { 1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test_hooks_->WillActivateTreeOnThread(this); 1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LayerTreeHostImpl::ActivatePendingTree(); 1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(!pending_tree()); 1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test_hooks_->DidActivateTreeOnThread(this); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool InitializeRenderer(scoped_ptr<OutputSurface> output_surface) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERRIDE { 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool success = LayerTreeHostImpl::InitializeRenderer(output_surface.Pass()); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->InitializedRendererOnThread(this, success); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return success; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetVisible(bool visible) OVERRIDE { 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::SetVisible(visible); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->DidSetVisibleOnImplTree(this, visible); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void AnimateLayers(base::TimeTicks monotonic_time) OVERRIDE { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->WillAnimateLayers(this, monotonic_time); 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostImpl::AnimateLayers(monotonic_time); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->AnimateLayers(this, monotonic_time); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void UpdateAnimationState(bool start_ready_animations) OVERRIDE { 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::UpdateAnimationState(start_ready_animations); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_unfinished_animation = false; 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimationRegistrar::AnimationControllerMap::const_iterator iter = 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_animation_controllers().begin(); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; iter != active_animation_controllers().end(); ++iter) { 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter->second->HasActiveAnimation()) { 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_unfinished_animation = true; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->UpdateAnimationState(this, has_unfinished_animation); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual base::TimeDelta LowFrequencyAnimationInterval() const OVERRIDE { 201424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return test_hooks_->LowFrequencyAnimationInterval(); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks_; 206424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool block_notify_ready_to_activate_for_testing_; 207424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool notify_ready_to_activate_was_blocked_; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Implementation of LayerTreeHost callback interface. 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class LayerTreeHostClientForTesting : public LayerTreeHostClient, 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public LayerTreeHostSingleThreadClient { 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<LayerTreeHostClientForTesting> Create( 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks) { 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_ptr(new LayerTreeHostClientForTesting(test_hooks)); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~LayerTreeHostClientForTesting() {} 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void WillBeginMainFrame(int frame_id) OVERRIDE { 2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test_hooks_->WillBeginMainFrame(); 2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void DidBeginMainFrame() OVERRIDE { 2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test_hooks_->DidBeginMainFrame(); 2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Animate(base::TimeTicks monotonic_time) OVERRIDE { 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_hooks_->Animate(monotonic_time); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Layout() OVERRIDE { test_hooks_->Layout(); } 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void ApplyScrollAndScale(const gfx::Vector2d& scroll_delta, 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float scale) OVERRIDE { 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->ApplyScrollAndScale(scroll_delta, scale); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface(bool fallback) 240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OVERRIDE { 241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return test_hooks_->CreateOutputSurface(fallback); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 244b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 245b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) test_hooks_->DidInitializeOutputSurface(succeeded); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidFailToInitializeOutputSurface() OVERRIDE { 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_hooks_->DidFailToInitializeOutputSurface(); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void WillCommit() OVERRIDE { test_hooks_->WillCommit(); } 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidCommit() OVERRIDE { test_hooks_->DidCommit(); } 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->DidCommitAndDrawFrame(); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 260b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidCompleteSwapBuffers() OVERRIDE { 261b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) test_hooks_->DidCompleteSwapBuffers(); 262b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ScheduleComposite() OVERRIDE { 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_hooks_->ScheduleComposite(); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ScheduleAnimation() OVERRIDE { 269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_hooks_->ScheduleAnimation(); 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidPostSwapBuffers() OVERRIDE {} 273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidAbortSwapBuffers() OVERRIDE {} 274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual scoped_refptr<ContextProvider> OffscreenContextProvider() OVERRIDE { 2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return test_hooks_->OffscreenContextProvider(); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit LayerTreeHostClientForTesting(TestHooks* test_hooks) 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : test_hooks_(test_hooks) {} 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestHooks* test_hooks_; 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Adapts LayerTreeHost for test. Injects LayerTreeHostImplForTesting. 287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class LayerTreeHostForTesting : public LayerTreeHost { 288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static scoped_ptr<LayerTreeHostForTesting> Create( 290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestHooks* test_hooks, 291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerTreeHostClientForTesting* client, 292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const LayerTreeSettings& settings, 293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) { 294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<LayerTreeHostForTesting> layer_tree_host( 295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new LayerTreeHostForTesting(test_hooks, client, settings)); 296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (impl_task_runner.get()) 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host->InitializeThreaded(impl_task_runner); 298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) else 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host->InitializeSingleThreaded(client); 300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return layer_tree_host.Pass(); 301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual scoped_ptr<LayerTreeHostImpl> CreateLayerTreeHostImpl( 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerTreeHostImplClient* host_impl_client) OVERRIDE { 305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return LayerTreeHostImplForTesting::Create( 30623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) test_hooks_, 30723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) settings(), 30823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) host_impl_client, 30923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) proxy(), 31023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) shared_bitmap_manager_.get(), 31123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) rendering_stats_instrumentation()).PassAs<LayerTreeHostImpl>(); 312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void SetNeedsCommit() OVERRIDE { 315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!test_started_) 316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerTreeHost::SetNeedsCommit(); 318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void set_test_started(bool started) { test_started_ = started; } 321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidDeferCommit() OVERRIDE { test_hooks_->DidDeferCommit(); } 323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerTreeHostForTesting(TestHooks* test_hooks, 326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerTreeHostClient* client, 327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const LayerTreeSettings& settings) 328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : LayerTreeHost(client, NULL, settings), 32923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) shared_bitmap_manager_(new TestSharedBitmapManager()), 330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_hooks_(test_hooks), 331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_started_(false) {} 332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 33323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestHooks* test_hooks_; 335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool test_started_; 336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeTest::LayerTreeTest() 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : beginning_(false), 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end_when_begin_returns_(false), 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) timed_out_(false), 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduled_(false), 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) schedule_when_set_visible_true_(false), 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) started_(false), 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ended_(false), 346a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) delegating_renderer_(false), 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timeout_seconds_(0), 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_factory_(this) { 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_thread_weak_ptr_ = weak_factory_.GetWeakPtr(); 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tests should timeout quickly unless --cc-layer-tree-test-no-timeout was 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // specified (for running in a debugger). 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!command_line->HasSwitch(switches::kCCLayerTreeTestNoTimeout)) 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timeout_seconds_ = 5; 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeTest::~LayerTreeTest() {} 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::EndTest() { 3610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (ended_) 3620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return; 3637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ended_ = true; 3647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // For the case where we EndTest during BeginTest(), set a flag to indicate 3660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // that the test should end the second BeginTest regains control. 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (beginning_) { 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end_when_begin_returns_ = true; 3690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } else { 3700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_)); 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::EndTestAfterDelay(int delay_milliseconds) { 377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch main_task_runner_->PostDelayedTask( 378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FROM_HERE, 379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Bind(&LayerTreeTest::EndTest, main_thread_weak_ptr_), 380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::TimeDelta::FromMilliseconds(delay_milliseconds)); 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostAddAnimationToMainThread( 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layer* layer_to_receive_animation) { 3850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchAddAnimation, 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_thread_weak_ptr_, 389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Unretained(layer_to_receive_animation), 390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 0.000001)); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeTest::PostAddInstantAnimationToMainThread( 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* layer_to_receive_animation) { 3950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchAddAnimation, 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_thread_weak_ptr_, 399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Unretained(layer_to_receive_animation), 400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 0.0)); 401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeTest::PostAddLongAnimationToMainThread( 404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Layer* layer_to_receive_animation) { 405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) main_task_runner_->PostTask( 406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FROM_HERE, 407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchAddAnimation, 408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) main_thread_weak_ptr_, 409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Unretained(layer_to_receive_animation), 410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1.0)); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostSetNeedsCommitToMainThread() { 4140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask(FROM_HERE, 4150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind(&LayerTreeTest::DispatchSetNeedsCommit, 4160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_thread_weak_ptr_)); 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeTest::PostSetNeedsUpdateLayersToMainThread() { 420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) main_task_runner_->PostTask( 421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FROM_HERE, 422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchSetNeedsUpdateLayers, 423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) main_thread_weak_ptr_)); 424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void LayerTreeTest::PostReadbackToMainThread() { 4270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 42958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchReadback, main_thread_weak_ptr_)); 43058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostSetNeedsRedrawToMainThread() { 4330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask(FROM_HERE, 4340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind(&LayerTreeTest::DispatchSetNeedsRedraw, 4350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_thread_weak_ptr_)); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeTest::PostSetNeedsRedrawRectToMainThread( 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& damage_rect) { 4400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchSetNeedsRedrawRect, 4430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_thread_weak_ptr_, 4440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) damage_rect)); 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostSetVisibleToMainThread(bool visible) { 4480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 4500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind( 4510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) &LayerTreeTest::DispatchSetVisible, main_thread_weak_ptr_, visible)); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void LayerTreeTest::PostSetNextCommitForcesRedrawToMainThread() { 4550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchSetNextCommitForcesRedraw, 4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) main_thread_weak_ptr_)); 4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeTest::WillBeginTest() { 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host_->SetLayerTreeHostClientReady(); 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DoBeginTest() { 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_ = LayerTreeHostClientForTesting::Create(this); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!impl_thread_ || impl_thread_->message_loop_proxy().get()); 469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer_tree_host_ = LayerTreeHostForTesting::Create( 470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this, 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch client_.get(), 472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch settings_, 473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch impl_thread_ ? impl_thread_->message_loop_proxy() : NULL); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(layer_tree_host_); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) started_ = true; 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) beginning_ = true; 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupTree(); 4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WillBeginTest(); 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BeginTest(); 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) beginning_ = false; 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (end_when_begin_returns_) 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RealEndTest(); 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow commits to happen once BeginTest() has had a chance to post tasks 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // so that those tasks will happen before the first commit. 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_) { 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<LayerTreeHostForTesting*>(layer_tree_host_.get()) 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->set_test_started(true); 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::SetupTree() { 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_tree_host_->root_layer()) { 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root_layer = Layer::Create(); 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetAnchorPoint(gfx::PointF()); 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer->SetBounds(gfx::Size(1, 1)); 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetIsDrawable(true); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_->SetRootLayer(root_layer); 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size root_bounds = layer_tree_host_->root_layer()->bounds(); 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size device_root_bounds = gfx::ToCeiledSize( 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScaleSize(root_bounds, layer_tree_host_->device_scale_factor())); 505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_->SetViewportSize(device_root_bounds); 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::Timeout() { 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) timed_out_ = true; 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::ScheduleComposite() { 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!started_ || scheduled_) 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduled_ = true; 5170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::DispatchComposite, main_thread_weak_ptr_)); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::RealEndTest() { 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_ && proxy()->CommitPendingForTesting()) { 5240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) main_task_runner_->PostTask( 525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_)); 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->Quit(); 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeTest::DispatchAddAnimation(Layer* layer_to_receive_animation, 534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) double animation_duration) { 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (layer_to_receive_animation) { 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddOpacityTransitionToLayer( 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_to_receive_animation, animation_duration, 0, 0.5, true); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeTest::DispatchSetNeedsCommit() { 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (layer_tree_host_) 547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_tree_host_->SetNeedsCommit(); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeTest::DispatchSetNeedsUpdateLayers() { 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_) 554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_tree_host_->SetNeedsUpdateLayers(); 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void LayerTreeTest::DispatchReadback() { 55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 55958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (layer_tree_host_) { 56158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) char pixels[4]; 56258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 56358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 56458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 56558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchSetNeedsRedraw() { 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_) 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_->SetNeedsRedraw(); 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeTest::DispatchSetNeedsRedrawRect(const gfx::Rect& damage_rect) { 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (layer_tree_host_) 577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_->SetNeedsRedrawRect(damage_rect); 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchSetVisible(bool visible) { 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_tree_host_) 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_->SetVisible(visible); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the LTH is being made visible and a previous ScheduleComposite() was 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // deferred because the LTH was not visible, re-schedule the composite now. 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_->visible() && schedule_when_set_visible_true_) 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScheduleComposite(); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void LayerTreeTest::DispatchSetNextCommitForcesRedraw() { 5954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsMainThread()); 5964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (layer_tree_host_) 5984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host_->SetNextCommitForcesRedraw(); 5994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 6004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchComposite() { 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduled_ = false; 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_tree_host_) 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the LTH is not visible, defer the composite until the LTH is made 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // visible. 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_tree_host_->visible()) { 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) schedule_when_set_visible_true_ = true; 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) schedule_when_set_visible_true_ = false; 6151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::TimeTicks now = gfx::FrameTime::Now(); 616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_->Composite(now); 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 619a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void LayerTreeTest::RunTest(bool threaded, 620a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool delegating_renderer, 621a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool impl_side_painting) { 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (threaded) { 623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_thread_.reset(new base::Thread("Compositor")); 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(impl_thread_->Start()); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 62768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) main_task_runner_ = base::MessageLoopProxy::current(); 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 629a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) delegating_renderer_ = delegating_renderer; 630a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 6311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Spend less time waiting for BeginImplFrame because the output is 63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // mocked out. 633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings_.refresh_rate = 200.0; 634a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (impl_side_painting) { 6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(threaded) 6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "Don't run single thread + impl side painting, it doesn't exist."; 637a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) settings_.impl_side_painting = true; 638a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeSettings(&settings_); 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch main_task_runner_->PostTask( 642eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeTest::DoBeginTest, base::Unretained(this))); 644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (timeout_seconds_) { 646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timeout_.Reset(base::Bind(&LayerTreeTest::Timeout, base::Unretained(this))); 647eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch main_task_runner_->PostDelayedTask( 648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timeout_.callback(), 650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(timeout_seconds_)); 651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->Run(); 6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DestroyLayerTreeHost(); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) timeout_.Cancel(); 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(layer_tree_host_.get()); 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_.reset(); 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (timed_out_) { 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAIL() << "Test timed out"; 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AfterTest(); 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void LayerTreeTest::RunTestWithImplSidePainting() { 6684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunTest(true, false, true); 6694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 6704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 671a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)scoped_ptr<OutputSurface> LayerTreeTest::CreateOutputSurface(bool fallback) { 6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<FakeOutputSurface> output_surface = 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateFakeOutputSurface(fallback); 6747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) output_surface_ = output_surface.get(); 6757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return output_surface.PassAs<OutputSurface>(); 676a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 677a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<FakeOutputSurface> LayerTreeTest::CreateFakeOutputSurface( 6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool fallback) { 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegating_renderer_) 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return FakeOutputSurface::CreateDelegating3d(); 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return FakeOutputSurface::Create3d(); 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)scoped_refptr<ContextProvider> LayerTreeTest::OffscreenContextProvider() { 6874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!compositor_contexts_.get() || 6884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) compositor_contexts_->DestroyedOnMainThread()) 6894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) compositor_contexts_ = TestContextProvider::Create(); 6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return compositor_contexts_; 691a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 692a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TestWebGraphicsContext3D* LayerTreeTest::TestContext() { 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return static_cast<TestContextProvider*>( 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) output_surface_->context_provider().get())->TestContext3d(); 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int LayerTreeTest::LastCommittedSourceFrameNumber(LayerTreeHostImpl* impl) 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const { 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (impl->pending_tree()) 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return impl->pending_tree()->source_frame_number(); 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (impl->active_tree()) 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return impl->active_tree()->source_frame_number(); 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Source frames start at 0, so this is invalid. 7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return -1; 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeTest::DestroyLayerTreeHost() { 7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (layer_tree_host_ && layer_tree_host_->root_layer()) 7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host_->root_layer()->SetLayerTreeHost(NULL); 7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host_.reset(); 7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 715