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