layer_tree_test.cc revision 5e3f23d412006dc4db4e659864679f29341e113f
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/base/thread_impl.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/input/input_handler.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/animation_test_common.h"
19a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "cc/test/fake_context_provider.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/occlusion_tracker_test_common.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/tiled_layer_test_common.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TestHooks::TestHooks() {}
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TestHooks::~TestHooks() {}
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TestHooks::PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      LayerTreeHostImpl::FrameData* frame_data,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      bool result) {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool TestHooks::CanActivatePendingTree(LayerTreeHostImpl* host_impl) {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Adapts LayerTreeHostImpl for test. Runs real code, then invokes test hooks.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostImplForTesting : public LayerTreeHostImpl {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<LayerTreeHostImplForTesting> Create(
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestHooks* test_hooks,
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const LayerTreeSettings& settings,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerTreeHostImplClient* host_impl_client,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Proxy* proxy,
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderingStatsInstrumentation* stats_instrumentation) {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return make_scoped_ptr(
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new LayerTreeHostImplForTesting(test_hooks,
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        settings,
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        host_impl_client,
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        proxy,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        stats_instrumentation));
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostImplForTesting(
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestHooks* test_hooks,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const LayerTreeSettings& settings,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerTreeHostImplClient* host_impl_client,
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Proxy* proxy,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderingStatsInstrumentation* stats_instrumentation)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostImpl(settings,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          host_impl_client,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          proxy,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          stats_instrumentation),
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        test_hooks_(test_hooks) {}
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginCommit() OVERRIDE {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostImpl::BeginCommit();
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->BeginCommitOnThread(this);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitComplete() OVERRIDE {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostImpl::CommitComplete();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->CommitCompleteOnThread(this);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!settings().impl_side_painting)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_hooks_->TreeActivatedOnThread(this);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool PrepareToDraw(FrameData* frame, gfx::Rect damage_rect) OVERRIDE {
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool result = LayerTreeHostImpl::PrepareToDraw(frame, damage_rect);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!test_hooks_->PrepareToDrawOnThread(this, frame, result))
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result = false;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return result;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DrawLayers(FrameData* frame,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          base::TimeTicks frame_begin_time) OVERRIDE {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostImpl::DrawLayers(frame, frame_begin_time);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->DrawLayersOnThread(this);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool SwapBuffers(const LayerTreeHostImpl::FrameData& frame) OVERRIDE {
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool result = LayerTreeHostImpl::SwapBuffers(frame);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->SwapBuffersOnThread(this, result);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return result;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1075e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  virtual void OnSwapBuffersComplete(const CompositorFrameAck* ack) OVERRIDE {
1085e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    LayerTreeHostImpl::OnSwapBuffersComplete(ack);
109b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    test_hooks_->SwapBuffersCompleteOnThread(this);
110b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
111b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool ActivatePendingTreeIfNeeded() OVERRIDE {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!pending_tree())
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (!test_hooks_->CanActivatePendingTree(this))
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool activated = LayerTreeHostImpl::ActivatePendingTreeIfNeeded();
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (activated)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_hooks_->TreeActivatedOnThread(this);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return activated;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool InitializeRenderer(scoped_ptr<OutputSurface> output_surface)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OVERRIDE {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool success = LayerTreeHostImpl::InitializeRenderer(output_surface.Pass());
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->InitializedRendererOnThread(this, success);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return success;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetVisible(bool visible) OVERRIDE {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostImpl::SetVisible(visible);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->DidSetVisibleOnImplTree(this, visible);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AnimateLayers(base::TimeTicks monotonic_time,
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             base::Time wall_clock_time) OVERRIDE {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->WillAnimateLayers(this, monotonic_time);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostImpl::AnimateLayers(monotonic_time, wall_clock_time);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->AnimateLayers(this, monotonic_time);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void UpdateAnimationState(bool start_ready_animations) OVERRIDE {
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostImpl::UpdateAnimationState(start_ready_animations);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool has_unfinished_animation = false;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AnimationRegistrar::AnimationControllerMap::const_iterator iter =
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        active_animation_controllers().begin();
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (; iter != active_animation_controllers().end(); ++iter) {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (iter->second->HasActiveAnimation()) {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        has_unfinished_animation = true;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->UpdateAnimationState(this, has_unfinished_animation);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual base::TimeDelta LowFrequencyAnimationInterval() const OVERRIDE {
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return base::TimeDelta::FromMilliseconds(16);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestHooks* test_hooks_;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Adapts LayerTreeHost for test. Injects LayerTreeHostImplForTesting.
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostForTesting : public cc::LayerTreeHost {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<LayerTreeHostForTesting> Create(
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestHooks* test_hooks,
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cc::LayerTreeHostClient* host_client,
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const cc::LayerTreeSettings& settings,
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<cc::Thread> impl_thread) {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<LayerTreeHostForTesting> layer_tree_host(
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new LayerTreeHostForTesting(test_hooks, host_client, settings));
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool success = layer_tree_host->Initialize(impl_thread.Pass());
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(success);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return layer_tree_host.Pass();
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_ptr<cc::LayerTreeHostImpl> CreateLayerTreeHostImpl(
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cc::LayerTreeHostImplClient* host_impl_client) OVERRIDE {
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return LayerTreeHostImplForTesting::Create(
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        test_hooks_,
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings(),
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl_client,
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        proxy(),
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        rendering_stats_instrumentation()).PassAs<cc::LayerTreeHostImpl>();
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetNeedsCommit() OVERRIDE {
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!test_started_)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHost::SetNeedsCommit();
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_test_started(bool started) { test_started_ = started; }
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidDeferCommit() OVERRIDE {
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->DidDeferCommit();
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostForTesting(TestHooks* test_hooks,
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          cc::LayerTreeHostClient* client,
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const cc::LayerTreeSettings& settings)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHost(client, settings),
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        test_hooks_(test_hooks),
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        test_started_(false) {}
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestHooks* test_hooks_;
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool test_started_;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Implementation of LayerTreeHost callback interface.
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostClientForTesting : public LayerTreeHostClient {
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<LayerTreeHostClientForTesting> Create(
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestHooks* test_hooks) {
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return make_scoped_ptr(new LayerTreeHostClientForTesting(test_hooks));
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~LayerTreeHostClientForTesting() {}
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void WillBeginFrame() OVERRIDE {}
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidBeginFrame() OVERRIDE {}
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Animate(double monotonic_time) OVERRIDE {
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->Animate(base::TimeTicks::FromInternalValue(
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        monotonic_time * base::Time::kMicrosecondsPerSecond));
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE {
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->Layout();
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta,
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   float scale) OVERRIDE {
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->ApplyScrollAndScale(scroll_delta, scale);
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE {
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return test_hooks_->CreateOutputSurface();
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
246b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
247b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    test_hooks_->DidInitializeOutputSurface(succeeded);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidFailToInitializeOutputSurface() OVERRIDE {
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_hooks_->DidFailToInitializeOutputSurface();
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void WillCommit() OVERRIDE {}
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->DidCommit();
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->DidCommitAndDrawFrame();
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
264b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidCompleteSwapBuffers() OVERRIDE {
265b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    test_hooks_->DidCompleteSwapBuffers();
266b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ScheduleComposite() OVERRIDE {
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_hooks_->ScheduleComposite();
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_refptr<cc::ContextProvider>
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OffscreenContextProviderForMainThread() OVERRIDE {
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return test_hooks_->OffscreenContextProviderForMainThread();
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_refptr<cc::ContextProvider>
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OffscreenContextProviderForCompositorThread() OVERRIDE {
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return test_hooks_->OffscreenContextProviderForCompositorThread();
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit LayerTreeHostClientForTesting(TestHooks* test_hooks)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : test_hooks_(test_hooks) {}
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestHooks* test_hooks_;
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeTest::LayerTreeTest()
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : beginning_(false),
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      end_when_begin_returns_(false),
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      timed_out_(false),
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scheduled_(false),
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      schedule_when_set_visible_true_(false),
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      started_(false),
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ended_(false),
297a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      delegating_renderer_(false),
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      timeout_seconds_(0),
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      impl_thread_(NULL),
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_factory_(this) {
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_thread_weak_ptr_ = weak_factory_.GetWeakPtr();
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Tests should timeout quickly unless --cc-layer-tree-test-no-timeout was
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // specified (for running in a debugger).
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!command_line->HasSwitch(switches::kCCLayerTreeTestNoTimeout))
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    timeout_seconds_ = 5;
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeTest::~LayerTreeTest() {}
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::EndTest() {
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For the case where we EndTest during BeginTest(), set a flag to indicate
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the test should end the second BeginTest regains control.
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (beginning_) {
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    end_when_begin_returns_ = true;
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (proxy()) {
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Racy timeouts and explicit EndTest calls might have cleaned up
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the tree host. Should check proxy first.
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    proxy()->MainThread()->PostTask(
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_));
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::EndTestAfterDelay(int delay_milliseconds) {
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  proxy()->MainThread()->PostTask(
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&LayerTreeTest::EndTest, main_thread_weak_ptr_));
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostAddAnimationToMainThread(
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Layer* layer_to_receive_animation) {
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  proxy()->MainThread()->PostTask(
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&LayerTreeTest::DispatchAddAnimation,
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 main_thread_weak_ptr_,
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(layer_to_receive_animation)));
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeTest::PostAddInstantAnimationToMainThread(
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer* layer_to_receive_animation) {
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  proxy()->MainThread()->PostTask(
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&LayerTreeTest::DispatchAddInstantAnimation,
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 main_thread_weak_ptr_,
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 base::Unretained(layer_to_receive_animation)));
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostSetNeedsCommitToMainThread() {
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  proxy()->MainThread()->PostTask(
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&LayerTreeTest::DispatchSetNeedsCommit,
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 main_thread_weak_ptr_));
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostAcquireLayerTextures() {
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  proxy()->MainThread()->PostTask(
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&LayerTreeTest::DispatchAcquireLayerTextures,
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 main_thread_weak_ptr_));
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostSetNeedsRedrawToMainThread() {
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  proxy()->MainThread()->PostTask(
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&LayerTreeTest::DispatchSetNeedsRedraw,
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 main_thread_weak_ptr_));
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeTest::PostSetNeedsRedrawRectToMainThread(gfx::Rect damage_rect) {
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy()->MainThread()->PostTask(
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&LayerTreeTest::DispatchSetNeedsRedrawRect,
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 main_thread_weak_ptr_, damage_rect));
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::PostSetVisibleToMainThread(bool visible) {
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  proxy()->MainThread()->PostTask(
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&LayerTreeTest::DispatchSetVisible,
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 main_thread_weak_ptr_,
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 visible));
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DoBeginTest() {
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_ = LayerTreeHostClientForTesting::Create(this);
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<cc::Thread> impl_ccthread(NULL);
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (impl_thread_) {
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    impl_ccthread = cc::ThreadImpl::CreateForDifferentThread(
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        impl_thread_->message_loop_proxy());
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_ = LayerTreeHostForTesting::Create(this,
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                     client_.get(),
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                     settings_,
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                     impl_ccthread.Pass());
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(layer_tree_host_);
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  started_ = true;
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  beginning_ = true;
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetupTree();
394b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layer_tree_host_->SetLayerTreeHostClientReady();
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BeginTest();
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  beginning_ = false;
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (end_when_begin_returns_)
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RealEndTest();
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allow commits to happen once BeginTest() has had a chance to post tasks
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // so that those tasks will happen before the first commit.
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_tree_host_) {
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static_cast<LayerTreeHostForTesting*>(layer_tree_host_.get())->
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        set_test_started(true);
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::SetupTree() {
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer_tree_host_->root_layer()) {
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<Layer> root_layer = Layer::Create();
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetAnchorPoint(gfx::PointF());
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_layer->SetBounds(gfx::Size(1, 1));
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetIsDrawable(true);
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Need at least one scrollable layer for tests with non-unit page-scales.
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetScrollable(true);
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_->SetRootLayer(root_layer);
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size root_bounds = layer_tree_host_->root_layer()->bounds();
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size device_root_bounds = gfx::ToCeiledSize(
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::ScaleSize(root_bounds, layer_tree_host_->device_scale_factor()));
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_tree_host_->SetViewportSize(device_root_bounds);
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::Timeout() {
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  timed_out_ = true;
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EndTest();
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::ScheduleComposite() {
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!started_ || scheduled_)
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scheduled_ = true;
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  proxy()->MainThread()->PostTask(
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&LayerTreeTest::DispatchComposite, main_thread_weak_ptr_));
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::RealEndTest() {
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ended_ = true;
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_tree_host_ && proxy()->CommitPendingForTesting()) {
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    proxy()->MainThread()->PostTask(
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_));
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->Quit();
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeTest::DispatchAddInstantAnimation(
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer* layer_to_receive_animation) {
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!proxy() || proxy()->IsMainThread());
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (layer_to_receive_animation) {
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AddOpacityTransitionToLayer(layer_to_receive_animation,
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                0,
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                0,
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                0.5,
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                false);
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchAddAnimation(Layer* layer_to_receive_animation) {
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!proxy() || proxy()->IsMainThread());
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (layer_to_receive_animation) {
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AddOpacityTransitionToLayer(layer_to_receive_animation,
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                0.000001,
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                0,
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                0.5,
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                true);
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchSetNeedsCommit() {
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!proxy() || proxy()->IsMainThread());
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_tree_host_)
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_->SetNeedsCommit();
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchAcquireLayerTextures() {
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!proxy() || proxy()->IsMainThread());
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_tree_host_)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_->AcquireLayerTextures();
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchSetNeedsRedraw() {
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!proxy() || proxy()->IsMainThread());
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_tree_host_)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_->SetNeedsRedraw();
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeTest::DispatchSetNeedsRedrawRect(gfx::Rect damage_rect) {
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!proxy() || proxy()->IsMainThread());
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (layer_tree_host_)
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host_->SetNeedsRedrawRect(damage_rect);
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchSetVisible(bool visible) {
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!proxy() || proxy()->IsMainThread());
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer_tree_host_)
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetVisible(visible);
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the LTH is being made visible and a previous ScheduleComposite() was
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // deferred because the LTH was not visible, re-schedule the composite now.
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_tree_host_->visible() && schedule_when_set_visible_true_)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScheduleComposite();
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeTest::DispatchComposite() {
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scheduled_ = false;
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer_tree_host_)
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the LTH is not visible, defer the composite until the LTH is made
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // visible.
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer_tree_host_->visible()) {
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    schedule_when_set_visible_true_ = true;
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  schedule_when_set_visible_true_ = false;
531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks now = base::TimeTicks::Now();
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_tree_host_->Composite(now);
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
535a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void LayerTreeTest::RunTest(bool threaded,
536a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                            bool delegating_renderer,
537a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                            bool impl_side_painting) {
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (threaded) {
539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    impl_thread_.reset(new base::Thread("Compositor"));
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(impl_thread_->Start());
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_ccthread_ = cc::ThreadImpl::CreateForCurrentThread();
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
545a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  delegating_renderer_ = delegating_renderer;
546a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
54790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Spend less time waiting for BeginFrame because the output is
54890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // mocked out.
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings_.refresh_rate = 200.0;
550a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (impl_side_painting) {
551a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    DCHECK(threaded) <<
552a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        "Don't run single thread + impl side painting, it doesn't exist.";
553a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    settings_.impl_side_painting = true;
554a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitializeSettings(&settings_);
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_ccthread_->PostTask(
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&LayerTreeTest::DoBeginTest, base::Unretained(this)));
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (timeout_seconds_) {
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    timeout_.Reset(base::Bind(&LayerTreeTest::Timeout, base::Unretained(this)));
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    main_ccthread_->PostDelayedTask(
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        timeout_.callback(),
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::TimeDelta::FromSeconds(timeout_seconds_));
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->Run();
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_tree_host_ && layer_tree_host_->root_layer())
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_->root_layer()->SetLayerTreeHost(NULL);
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_.reset();
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  timeout_.Cancel();
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(layer_tree_host_.get());
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_.reset();
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (timed_out_) {
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FAIL() << "Test timed out";
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AfterTest();
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
583a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<OutputSurface> LayerTreeTest::CreateOutputSurface() {
584a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (delegating_renderer_)
585a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return FakeOutputSurface::CreateDelegating3d().PassAs<OutputSurface>();
586a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return FakeOutputSurface::Create3d().PassAs<OutputSurface>();
587a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
588a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
589a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_refptr<cc::ContextProvider> LayerTreeTest::
590a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    OffscreenContextProviderForMainThread() {
591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!main_thread_contexts_.get() ||
592a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      main_thread_contexts_->DestroyedOnMainThread()) {
593a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    main_thread_contexts_ = FakeContextProvider::Create();
594a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (!main_thread_contexts_->BindToCurrentThread())
595a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      main_thread_contexts_ = NULL;
596a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
597a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return main_thread_contexts_;
598a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
599a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
600a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_refptr<cc::ContextProvider> LayerTreeTest::
601a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    OffscreenContextProviderForCompositorThread() {
602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!compositor_thread_contexts_.get() ||
603a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      compositor_thread_contexts_->DestroyedOnMainThread())
604a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    compositor_thread_contexts_ = FakeContextProvider::Create();
605a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return compositor_thread_contexts_;
606a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
607a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
609