12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 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/layers/layer_iterator.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector>
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_layer_tree_host.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_common.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Mock;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::_;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::AtLeast;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::AnyNumber;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestLayer : public Layer {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_refptr<TestLayer> Create() {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return make_scoped_refptr(new TestLayer());
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int count_representing_target_surface_;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int count_representing_contributing_surface_;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int count_representing_itself_;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool DrawsContent() const OVERRIDE { return draws_content_; }
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_draws_content(bool draws_content) { draws_content_ = draws_content; }
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestLayer() : Layer(), draws_content_(true) {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetBounds(gfx::Size(100, 100));
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetPosition(gfx::Point());
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestLayer() {}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool draws_content_;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXPECT_COUNT(layer, target, contrib, itself)                           \
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(target, layer->count_representing_target_surface_);                \
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(contrib, layer->count_representing_contributing_surface_);         \
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(itself, layer->count_representing_itself_);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef LayerIterator<Layer> FrontToBack;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid ResetCounts(RenderSurfaceLayerList* render_surface_layer_list) {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (unsigned surface_index = 0;
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       surface_index < render_surface_layer_list->size();
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++surface_index) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestLayer* render_surface_layer = static_cast<TestLayer*>(
59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        render_surface_layer_list->at(surface_index));
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderSurface* render_surface = render_surface_layer->render_surface();
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface_layer->count_representing_target_surface_ = -1;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface_layer->count_representing_contributing_surface_ = -1;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface_layer->count_representing_itself_ = -1;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (unsigned layer_index = 0;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         layer_index < render_surface->layer_list().size();
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ++layer_index) {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestLayer* layer = static_cast<TestLayer*>(
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          render_surface->layer_list().at(layer_index).get());
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->count_representing_target_surface_ = -1;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->count_representing_contributing_surface_ = -1;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->count_representing_itself_ = -1;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IterateFrontToBack(
80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    RenderSurfaceLayerList* render_surface_layer_list) {
81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ResetCounts(render_surface_layer_list);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int count = 0;
83ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (FrontToBack it = FrontToBack::Begin(render_surface_layer_list);
84ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       it != FrontToBack::End(render_surface_layer_list);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++it, ++count) {
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestLayer* layer = static_cast<TestLayer*>(*it);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (it.represents_target_render_surface())
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->count_representing_target_surface_ = count;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (it.represents_contributing_render_surface())
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->count_representing_contributing_surface_ = count;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (it.represents_itself())
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->count_representing_itself_ = count;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerIteratorTest, EmptyTree) {
97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RenderSurfaceLayerList render_surface_layer_list;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  IterateFrontToBack(&render_surface_layer_list);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerIteratorTest, SimpleTree) {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root_layer = TestLayer::Create();
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> first = TestLayer::Create();
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> second = TestLayer::Create();
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> third = TestLayer::Create();
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> fourth = TestLayer::Create();
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_layer->AddChild(first);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_layer->AddChild(second);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_layer->AddChild(third);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_layer->AddChild(fourth);
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(&client);
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  host->SetRootLayer(root_layer);
117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RenderSurfaceLayerList render_surface_layer_list;
119558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
120558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      root_layer.get(), root_layer->bounds(), &render_surface_layer_list);
121558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  IterateFrontToBack(&render_surface_layer_list);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root_layer, 5, -1, 4);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(first, -1, -1, 3);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(second, -1, -1, 2);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(third, -1, -1, 1);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(fourth, -1, -1, 0);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerIteratorTest, ComplexTree) {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root_layer = TestLayer::Create();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root1 = TestLayer::Create();
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root2 = TestLayer::Create();
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root3 = TestLayer::Create();
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root21 = TestLayer::Create();
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root22 = TestLayer::Create();
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root23 = TestLayer::Create();
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root221 = TestLayer::Create();
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root231 = TestLayer::Create();
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_layer->AddChild(root1);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_layer->AddChild(root2);
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_layer->AddChild(root3);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root2->AddChild(root21);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root2->AddChild(root22);
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root2->AddChild(root23);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root22->AddChild(root221);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root23->AddChild(root231);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(&client);
153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  host->SetRootLayer(root_layer);
154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RenderSurfaceLayerList render_surface_layer_list;
156558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
157558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      root_layer.get(), root_layer->bounds(), &render_surface_layer_list);
158558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  IterateFrontToBack(&render_surface_layer_list);
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root_layer, 9, -1, 8);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root1, -1, -1, 7);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root2, -1, -1, 6);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root21, -1, -1, 5);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root22, -1, -1, 4);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root221, -1, -1, 3);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root23, -1, -1, 2);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root231, -1, -1, 1);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root3, -1, -1, 0);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerIteratorTest, ComplexTreeMultiSurface) {
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root_layer = TestLayer::Create();
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root1 = TestLayer::Create();
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root2 = TestLayer::Create();
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root3 = TestLayer::Create();
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root21 = TestLayer::Create();
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root22 = TestLayer::Create();
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root23 = TestLayer::Create();
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root221 = TestLayer::Create();
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestLayer> root231 = TestLayer::Create();
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_layer->AddChild(root1);
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_layer->AddChild(root2);
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_layer->AddChild(root3);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root2->set_draws_content(false);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root2->SetOpacity(0.5f);
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root2->SetForceRenderSurface(true);  // Force the layer to own a new surface.
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root2->AddChild(root21);
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root2->AddChild(root22);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root2->AddChild(root23);
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root22->SetOpacity(0.5f);
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root22->AddChild(root221);
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root23->SetOpacity(0.5f);
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root23->AddChild(root231);
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(&client);
199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  host->SetRootLayer(root_layer);
200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
201ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RenderSurfaceLayerList render_surface_layer_list;
202558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
203558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      root_layer.get(), root_layer->bounds(), &render_surface_layer_list);
204558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  LayerTreeHostCommon::CalculateDrawProperties(&inputs);
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
206ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  IterateFrontToBack(&render_surface_layer_list);
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root_layer, 14, -1, 13);
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root1, -1, -1, 12);
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root2, 10, 11, -1);
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root21, -1, -1, 9);
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root22, 7, 8, 6);
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root221, -1, -1, 5);
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root23, 3, 4, 2);
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root231, -1, -1, 1);
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_COUNT(root3, -1, -1, 0);
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
220