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