layer_tree_host_unittest.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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/trees/layer_tree_host.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <algorithm>
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/auto_reset.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/lock.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/timing_function.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/debug/frame_rate_counter.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer_client.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/io_surface_layer.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/scrollbar_layer.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/begin_frame_args.h"
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/output/copy_output_request.h"
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/copy_output_result.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/output_surface.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_queue.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/frame_rate_controller.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h"
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/test/fake_picture_layer.h"
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/test/fake_picture_layer_impl.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_proxy.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_scrollbar_layer.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/occlusion_tracker_test_common.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/thread_proxy.h"
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/refptr.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkPicture.h"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/point_conversions.h"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h"
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::_;
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AnyNumber;
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AtLeast;
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::Mock;
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTest : public LayerTreeTest {
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Two setNeedsCommits in a row should lead to at least 1 commit and at least 1
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// draw with frame 0.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit1 : public LayerTreeHostTest {
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetNeedsCommit1() : num_commits_(0), num_draws_(0) {}
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draws_++;
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!impl->active_tree()->source_frame_number())
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_GE(1, num_commits_);
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_GE(1, num_draws_);
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit1);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
96a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// A SetNeedsCommit should lead to 1 commit. Issuing a second commit after that
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// first committed frame draws should lead to another commit.
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit2 : public LayerTreeHostTest {
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetNeedsCommit2() : num_commits_(0), num_draws_(0) {}
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_draws_;
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_commits_;
110a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    switch (num_commits_) {
111a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 1:
112a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
113a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
114a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 2:
115a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EndTest();
116a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
117a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      default:
118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        NOTREACHED();
119a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(2, num_commits_);
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_LE(1, num_draws_);
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit2);
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that we pass property values in PushPropertiesTo.
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass LayerTreeHostTestPushPropertiesTo : public LayerTreeHostTest {
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void SetupTree() OVERRIDE {
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_refptr<Layer> root = Layer::Create();
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    root->SetBounds(gfx::Size(10, 10));
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    layer_tree_host()->SetRootLayer(root);
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    LayerTreeHostTest::SetupTree();
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  enum Properties {
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    STARTUP,
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    BOUNDS,
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HIDE_LAYER_AND_SUBTREE,
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DRAWS_CONTENT,
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DONE,
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void BeginTest() OVERRIDE {
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    index_ = STARTUP;
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PostSetNeedsCommitToMainThread();
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    VerifyAfterValues(impl->active_tree()->root_layer());
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SetBeforeValues(layer_tree_host()->root_layer());
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    VerifyBeforeValues(layer_tree_host()->root_layer());
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ++index_;
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (index_ == DONE) {
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EndTest();
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return;
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SetAfterValues(layer_tree_host()->root_layer());
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void AfterTest() OVERRIDE {}
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void VerifyBeforeValues(Layer* layer) {
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(gfx::Size(10, 10).ToString(), layer->bounds().ToString());
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(layer->hide_layer_and_subtree());
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(layer->DrawsContent());
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetBeforeValues(Layer* layer) {
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    layer->SetBounds(gfx::Size(10, 10));
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    layer->SetHideLayerAndSubtree(false);
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    layer->SetIsDrawable(false);
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void VerifyAfterValues(LayerImpl* layer) {
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    switch (static_cast<Properties>(index_)) {
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case STARTUP:
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case DONE:
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case BOUNDS:
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        EXPECT_EQ(gfx::Size(20, 20).ToString(), layer->bounds().ToString());
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case HIDE_LAYER_AND_SUBTREE:
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        EXPECT_TRUE(layer->hide_layer_and_subtree());
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case DRAWS_CONTENT:
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        EXPECT_TRUE(layer->DrawsContent());
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetAfterValues(Layer* layer) {
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    switch (static_cast<Properties>(index_)) {
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case STARTUP:
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case DONE:
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case BOUNDS:
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        layer->SetBounds(gfx::Size(20, 20));
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case HIDE_LAYER_AND_SUBTREE:
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        layer->SetHideLayerAndSubtree(true);
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case DRAWS_CONTENT:
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        layer->SetIsDrawable(true);
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int index_;
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesTo);
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1 setNeedsRedraw after the first commit has completed should lead to 1
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// additional draw.
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedraw : public LayerTreeHostTest {
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetNeedsRedraw() : num_commits_(0), num_draws_(0) {}
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, impl->active_tree()->source_frame_number());
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!num_draws_) {
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Redraw again to verify that the second redraw doesn't commit.
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PostSetNeedsRedrawToMainThread();
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draws_++;
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, num_draws_);
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_GE(2, num_draws_);
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, num_commits_);
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedraw);
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// After setNeedsRedrawRect(invalid_rect) the final damage_rect
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// must contain invalid_rect.
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedrawRect : public LayerTreeHostTest {
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetNeedsRedrawRect()
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : num_draws_(0),
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        bounds_(50, 50),
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        invalid_rect_(10, 10, 20, 20),
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        root_layer_(ContentLayer::Create(&client_)) {
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetIsDrawable(true);
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(bounds_);
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(bounds_);
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     LayerTreeHostImpl::FrameData* frame_data,
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     bool result) OVERRIDE {
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(result);
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::RectF root_damage_rect;
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!frame_data->render_passes.empty())
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_damage_rect = frame_data->render_passes.back()->damage_rect;
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!num_draws_) {
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // If this is the first frame, expect full frame damage.
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_RECT_EQ(root_damage_rect, gfx::Rect(bounds_));
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Check that invalid_rect_ is indeed repainted.
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(root_damage_rect.Contains(invalid_rect_));
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return result;
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!num_draws_) {
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PostSetNeedsRedrawRectToMainThread(invalid_rect_);
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draws_++;
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(2, num_draws_);
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Size bounds_;
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect invalid_rect_;
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<ContentLayer> root_layer_;
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedrawRect);
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromInvalidate : public LayerTreeHostTest {
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
327b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
328b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    settings->layer_transforms_should_scale_layer_contents = true;
329b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
330b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
331b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
332b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    root_layer_ = Layer::Create();
333b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(10, 20));
334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
335b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    scaled_layer_ = FakeContentLayer::Create(&client_);
336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    scaled_layer_->SetBounds(gfx::Size(1, 1));
337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    root_layer_->AddChild(scaled_layer_);
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
340b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
342b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
343b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() == 1)
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (layer_tree_host()->commit_number()) {
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
355b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Changing the device scale factor causes a commit. It also changes
356b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // the content bounds of |scaled_layer_|, which should not generate
357b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // a second commit as a result.
358b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetDeviceScaleFactor(4.f);
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No extra commits.
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2, layer_tree_host()->commit_number());
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
366b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
367b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    EXPECT_EQ(gfx::Size(4, 4).ToString(),
368b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)              scaled_layer_->content_bounds().ToString());
369b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
373b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_refptr<Layer> root_layer_;
374b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_refptr<FakeContentLayer> scaled_layer_;
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoExtraCommitFromInvalidate);
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromScrollbarInvalidate
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
382b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
383b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    settings->layer_transforms_should_scale_layer_contents = true;
384b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
387b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    root_layer_ = Layer::Create();
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(10, 20));
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool paint_scrollbar = true;
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool has_thumb = false;
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_ = FakeScrollbarLayer::Create(paint_scrollbar,
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                            has_thumb,
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                            root_layer_->id());
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetPosition(gfx::Point(0, 10));
396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetBounds(gfx::Size(10, 10));
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->AddChild(scrollbar_);
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() == 1)
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (layer_tree_host()->commit_number()) {
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
416b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Changing the device scale factor causes a commit. It also changes
417b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // the content bounds of |scrollbar_|, which should not generate
418b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // a second commit as a result.
419b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetDeviceScaleFactor(4.f);
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No extra commits.
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2, layer_tree_host()->commit_number());
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
427b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
428b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    EXPECT_EQ(gfx::Size(40, 40).ToString(),
429b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)              scrollbar_->content_bounds().ToString());
430b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
434b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_refptr<Layer> root_layer_;
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeScrollbarLayer> scrollbar_;
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestNoExtraCommitFromScrollbarInvalidate);
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadback : public LayerTreeHostTest {
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestCompositeAndReadback() : num_commits_(0) {}
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_commits_ == 1) {
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      char pixels[4];
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1));
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (num_commits_ == 2) {
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // This is inside the readback. We should get another commit after it.
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (num_commits_ == 3) {
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTREACHED();
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadback);
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws()
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : num_commits_(0) {}
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_commits_ == 1) {
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (num_commits_ == 2) {
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      char pixels[4];
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1));
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (num_commits_ == 3) {
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // This is inside the readback. We should get another commit after it.
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (num_commits_ == 4) {
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTREACHED();
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws);
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// If the layerTreeHost says it can't draw, Then we should not try to draw.
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCanDrawBlocksDrawing : public LayerTreeHostTest {
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestCanDrawBlocksDrawing() : num_commits_(0), done_(false) {}
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (done_)
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Only the initial draw should bring us here.
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(impl->CanDraw());
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, impl->active_tree()->source_frame_number());
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (done_)
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_commits_ >= 1) {
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // After the first commit, we should not be able to draw.
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_FALSE(impl->CanDraw());
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_commits_ == 1) {
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Make the viewport empty so the host says it can't draw.
530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->SetViewportSize(gfx::Size(0, 0));
531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (num_commits_ == 2) {
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      char pixels[4];
533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1));
534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (num_commits_ == 3) {
535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Let it draw so we go idle and end the test.
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->SetViewportSize(gfx::Size(1, 1));
537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      done_ = true;
538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool done_;
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestCanDrawBlocksDrawing);
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// beginLayerWrite should prevent draws from executing until a commit occurs
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestWriteLayersRedraw : public LayerTreeHostTest {
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestWriteLayersRedraw() : num_commits_(0), num_draws_(0) {}
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostAcquireLayerTextures();
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsRedrawToMainThread();  // should be inhibited without blocking
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draws_++;
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(num_draws_, num_commits_);
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_commits_); }
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestWriteLayersRedraw);
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify that when resuming visibility, Requesting layer write permission
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// will not deadlock the main thread even though there are not yet any
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// scheduled redraws. This behavior is critical for reliably surviving tab
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// switching. There are no failure conditions to this test, it just passes
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// by not timing out.
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestWriteLayersAfterVisible : public LayerTreeHostTest {
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestWriteLayersAfterVisible() : num_commits_(0) {}
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_commits_ == 2)
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    else if (num_commits_ < 2) {
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PostSetVisibleToMainThread(false);
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PostSetVisibleToMainThread(true);
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PostAcquireLayerTextures();
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PostSetNeedsCommitToMainThread();
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestWriteLayersAfterVisible);
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A compositeAndReadback while invisible should force a normal commit without
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// assertion.
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackWhileInvisible
615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestCompositeAndReadbackWhileInvisible() : num_commits_(0) {}
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_commits_ == 1) {
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->SetVisible(false);
625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      char pixels[4];
628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1));
629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackWhileInvisible);
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestAbortFrameWhenInvisible : public LayerTreeHostTest {
643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestAbortFrameWhenInvisible() {}
645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Request a commit (from the main thread), Which will trigger the commit
648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // flow from the impl side.
649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetNeedsCommit();
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Then mark ourselves as not visible before processing any more messages
651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // on the main thread.
652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetVisible(false);
653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If we make it without kicking a frame, we pass!
654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTestAfterDelay(1);
655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Layout() OVERRIDE {
658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_FALSE(true);
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAbortFrameWhenInvisible);
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test verifies that properties on the layer tree host are commited
670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to the impl side.
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCommit : public LayerTreeHostTest {
672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestCommit() {}
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(20, 20));
677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->set_background_color(SK_ColorGRAY);
678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetPageScaleFactorAndLimits(5.f, 5.f, 5.f);
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(gfx::Size(20, 20), impl->device_viewport_size());
685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(SK_ColorGRAY, impl->active_tree()->background_color());
686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(5.f, impl->active_tree()->page_scale_factor());
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCommit);
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This test verifies that LayerTreeHostImpl's current frame time gets
69790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// updated in consecutive frames when it doesn't draw due to tree
69890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// activation failure.
69990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestFrameTimeUpdatesAfterActivationFails
70090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : public LayerTreeHostTest {
70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
70290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LayerTreeHostTestFrameTimeUpdatesAfterActivationFails() : frame_(0) {}
70390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
70490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
70590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(20, 20));
70690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    layer_tree_host()->set_background_color(SK_ColorGRAY);
70790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
70890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
70990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
71090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
71190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
71290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (frame_ >= 1) {
71390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_NE(first_frame_time_, impl->CurrentFrameTimeTicks());
71490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EndTest();
71590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return;
71690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
71790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
71890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_FALSE(impl->settings().impl_side_painting);
71990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EndTest();
72090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
72190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
72290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool CanActivatePendingTree(LayerTreeHostImpl* impl) OVERRIDE {
723eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (frame_ >= 1)
724eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return true;
725eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
726eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
727eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
728eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
729eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool CanActivatePendingTreeIfNeeded(LayerTreeHostImpl* impl)
730eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      OVERRIDE {
73190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    frame_++;
73290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (frame_ == 1) {
73390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      first_frame_time_ = impl->CurrentFrameTimeTicks();
73490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
73590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // Since base::TimeTicks::Now() uses a low-resolution clock on
73690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // Windows, we need to make sure that the clock has incremented past
73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // first_frame_time_.
73890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      while (first_frame_time_ == base::TimeTicks::Now()) {}
73990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return false;
74190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
74290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
74390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return true;
74490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
74590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
74690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
74790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
74890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
74990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int frame_;
75090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::TimeTicks first_frame_time_;
75190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
75290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
75390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
75490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LayerTreeHostTestFrameTimeUpdatesAfterActivationFails);
75590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
75690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This test verifies that LayerTreeHostImpl's current frame time gets
75790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// updated in consecutive frames when it draws in each frame.
75890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestFrameTimeUpdatesAfterDraw : public LayerTreeHostTest {
75990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
76090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LayerTreeHostTestFrameTimeUpdatesAfterDraw() : frame_(0) {}
76190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(20, 20));
76490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    layer_tree_host()->set_background_color(SK_ColorGRAY);
76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
76690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
76990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
77090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    frame_++;
77190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (frame_ == 1) {
77290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      first_frame_time_ = impl->CurrentFrameTimeTicks();
77390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      impl->SetNeedsRedraw();
77490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // Since base::TimeTicks::Now() uses a low-resolution clock on
77690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // Windows, we need to make sure that the clock has incremented past
77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // first_frame_time_.
77890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      while (first_frame_time_ == base::TimeTicks::Now()) {}
77990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
78090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return;
78190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
78290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
78390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_NE(first_frame_time_, impl->CurrentFrameTimeTicks());
78490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EndTest();
78590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
78690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
78790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
78890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Ensure there isn't a commit between the two draws, to ensure that a
78990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // commit isn't required for updating the current frame time. We can
79090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // only check for this in the multi-threaded case, since in the single-
79190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // threaded case there will always be a commit between consecutive draws.
792eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (HasImplThread())
79390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_EQ(0, frame_);
79490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
79590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
79690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
79790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
79890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
79990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int frame_;
80090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::TimeTicks first_frame_time_;
80190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
80290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
80390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFrameTimeUpdatesAfterDraw);
80490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verifies that StartPageScaleAnimation events propagate correctly
806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from LayerTreeHost to LayerTreeHostImpl in the MT compositor.
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestStartPageScaleAnimation : public LayerTreeHostTest {
808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestStartPageScaleAnimation() {}
810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
811a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
812a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
813a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
814a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    scroll_layer_ = FakeContentLayer::Create(&client_);
815a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    scroll_layer_->SetScrollable(true);
816a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    scroll_layer_->SetScrollOffset(gfx::Vector2d());
817a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(scroll_layer_);
818a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
819a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, float scale)
825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OVERRIDE {
826a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    gfx::Vector2d offset = scroll_layer_->scroll_offset();
827a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    scroll_layer_->SetScrollOffset(offset + scroll_delta);
828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetPageScaleFactorAndLimits(scale, 0.5f, 2.f);
829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    impl->ProcessScrollDeltas();
833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // We get one commit before the first draw, and the animation doesn't happen
834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // until the second draw.
835a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
836a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 0:
837a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EXPECT_EQ(1.f, impl->active_tree()->page_scale_factor());
838a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        // We'll start an animation when we get back to the main thread.
839a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
840a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 1:
841a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EXPECT_EQ(1.f, impl->active_tree()->page_scale_factor());
842a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        PostSetNeedsRedrawToMainThread();
843a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
844a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 2:
845a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EXPECT_EQ(1.25f, impl->active_tree()->page_scale_factor());
846a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EndTest();
847a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
848a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      default:
849a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        NOTREACHED();
850a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
851a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
852a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
853a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
854a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    switch (layer_tree_host()->commit_number()) {
855a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 1:
856a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.5f, 2.f);
857a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        layer_tree_host()->StartPageScaleAnimation(
858a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            gfx::Vector2d(), false, 1.25f, base::TimeDelta());
859a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
864a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
865a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  FakeContentLayerClient client_;
866a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_refptr<FakeContentLayer> scroll_layer_;
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestStartPageScaleAnimation);
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetVisible : public LayerTreeHostTest {
872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetVisible() : num_draws_(0) {}
874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetVisibleToMainThread(false);
878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This is suppressed while we're invisible.
879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsRedrawToMainThread();
880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Triggers the redraw.
881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetVisibleToMainThread(true);
882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(impl->visible());
886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_draws_;
887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_draws_); }
891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetVisible);
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestOpacityChangeLayerDelegate : public ContentLayerClient {
899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestOpacityChangeLayerDelegate() : test_layer_(0) {}
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetTestLayer(Layer* test_layer) { test_layer_ = test_layer; }
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void PaintContents(SkCanvas*, gfx::Rect, gfx::RectF*) OVERRIDE {
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Set layer opacity to 0.
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (test_layer_)
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      test_layer_->SetOpacity(0.f);
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidChangeLayerCanUseLCDText() OVERRIDE {}
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Layer* test_layer_;
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContentLayerWithUpdateTracking : public ContentLayer {
916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_refptr<ContentLayerWithUpdateTracking> Create(
918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ContentLayerClient* client) {
919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return make_scoped_refptr(new ContentLayerWithUpdateTracking(client));
920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int PaintContentsCount() { return paint_contents_count_; }
923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ResetPaintContentsCount() { paint_contents_count_ = 0; }
924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual bool Update(ResourceUpdateQueue* queue,
926eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      const OcclusionTracker* occlusion) OVERRIDE {
9277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool updated = ContentLayer::Update(queue, occlusion);
928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    paint_contents_count_++;
9297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return updated;
930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit ContentLayerWithUpdateTracking(ContentLayerClient* client)
934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : ContentLayer(client), paint_contents_count_(0) {
935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetAnchorPoint(gfx::PointF(0.f, 0.f));
936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetBounds(gfx::Size(10, 10));
937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetIsDrawable(true);
938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~ContentLayerWithUpdateTracking() {}
940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int paint_contents_count_;
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Layer opacity change during paint should not prevent compositor resources
945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from being updated during commit.
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestOpacityChange : public LayerTreeHostTest {
947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestOpacityChange()
949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : test_opacity_change_delegate_(),
950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        update_check_layer_(ContentLayerWithUpdateTracking::Create(
951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            &test_opacity_change_delegate_)) {
952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_opacity_change_delegate_.SetTestLayer(update_check_layer_.get());
953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(10, 10));
957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(update_check_layer_);
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Update() should have been called once.
968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, update_check_layer_->PaintContentsCount());
969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestOpacityChangeLayerDelegate test_opacity_change_delegate_;
973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<ContentLayerWithUpdateTracking> update_check_layer_;
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestOpacityChange);
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NoScaleContentLayer : public ContentLayer {
979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_refptr<NoScaleContentLayer> Create(ContentLayerClient* client) {
981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return make_scoped_refptr(new NoScaleContentLayer(client));
982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CalculateContentsScale(float ideal_contents_scale,
985b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                      float device_scale_factor,
986b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                      float page_scale_factor,
987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      bool animating_transform_to_screen,
988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      float* contents_scale_x,
989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      float* contents_scale_y,
990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      gfx::Size* contentBounds) OVERRIDE {
991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Skip over the ContentLayer's method to the base Layer class.
992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer::CalculateContentsScale(ideal_contents_scale,
993b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                  device_scale_factor,
994b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                  page_scale_factor,
995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  animating_transform_to_screen,
996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  contents_scale_x,
997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  contents_scale_y,
998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  contentBounds);
999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit NoScaleContentLayer(ContentLayerClient* client)
1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : ContentLayer(client) {}
1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~NoScaleContentLayer() {}
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers
1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers()
1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : root_layer_(NoScaleContentLayer::Create(&client_)),
1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        child_layer_(ContentLayer::Create(&client_)) {}
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(60, 60));
1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetDeviceScaleFactor(1.5);
1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(gfx::Size(60, 60), layer_tree_host()->device_viewport_size());
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->AddChild(child_layer_);
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetIsDrawable(true);
1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(30, 30));
1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f));
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer_->SetIsDrawable(true);
1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer_->SetPosition(gfx::Point(2, 2));
1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer_->SetBounds(gfx::Size(10, 10));
1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f));
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Should only do one commit.
1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, impl->active_tree()->source_frame_number());
1038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Device scale factor should come over to impl.
1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_NEAR(impl->device_scale_factor(), 1.5f, 0.00001f);
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Both layers are on impl.
1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(1u, impl->active_tree()->root_layer()->children().size());
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Device viewport is scaled.
1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(gfx::Size(60, 60), impl->device_viewport_size());
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerImpl* root = impl->active_tree()->root_layer();
1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerImpl* child = impl->active_tree()->root_layer()->children()[0];
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Positions remain in layout pixels.
1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(gfx::Point(0, 0), root->position());
1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(gfx::Point(2, 2), child->position());
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Compute all the layer transforms for the frame.
1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostImpl::FrameData frame_data;
1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    impl->PrepareToDraw(&frame_data, gfx::Rect());
1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    impl->DidDrawAllLayers(frame_data);
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const LayerImplList& render_surface_layer_list =
1060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        *frame_data.render_surface_layer_list;
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Both layers should be drawing into the root render surface.
1063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(1u, render_surface_layer_list.size());
1064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(root->render_surface(),
1065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              render_surface_layer_list[0]->render_surface());
1066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(2u, root->render_surface()->layer_list().size());
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The root render surface is the size of the viewport.
1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_RECT_EQ(gfx::Rect(0, 0, 60, 60),
1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   root->render_surface()->content_rect());
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The content bounds of the child should be scaled.
1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Size child_bounds_scaled =
1074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        gfx::ToCeiledSize(gfx::ScaleSize(child->bounds(), 1.5));
1075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(child_bounds_scaled, child->content_bounds());
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform scale_transform;
1078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scale_transform.Scale(impl->device_scale_factor(),
1079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          impl->device_scale_factor());
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The root layer is scaled by 2x.
1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform root_screen_space_transform = scale_transform;
1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform root_draw_transform = scale_transform;
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(root_draw_transform, root->draw_transform());
1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(root_screen_space_transform, root->screen_space_transform());
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The child is at position 2,2, which is transformed to 3,3 after the scale
1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform child_screen_space_transform;
1090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_screen_space_transform.Translate(3.f, 3.f);
1091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform child_draw_transform = child_screen_space_transform;
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRANSFORMATION_MATRIX_EQ(child_draw_transform,
1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    child->draw_transform());
1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRANSFORMATION_MATRIX_EQ(child_screen_space_transform,
1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    child->screen_space_transform());
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<NoScaleContentLayer> root_layer_;
1106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<ContentLayer> child_layer_;
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers);
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify atomicity of commits and reuse of textures.
1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAtomicCommit : public LayerTreeHostTest {
1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
1115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Make sure partial texture updates are turned off.
1116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings->max_partial_texture_updates = 0;
1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Linear fade animator prevents scrollbars from drawing immediately.
1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings->use_linear_fade_scrollbar_animator = false;
1119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_ = FakeContentLayer::Create(&client_);
1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_->SetBounds(gfx::Size(10, 20));
1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool paint_scrollbar = true;
1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool has_thumb = false;
1127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_ =
1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FakeScrollbarLayer::Create(paint_scrollbar, has_thumb, layer_->id());
1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetPosition(gfx::Point(0, 10));
1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetBounds(gfx::Size(10, 10));
1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_->AddChild(scrollbar_);
1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
113990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    drew_frame_ = -1;
114090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
114190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
1142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(0u, layer_tree_host()->settings().max_partial_texture_updates);
1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(
1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        impl->output_surface()->context3d());
1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 0:
1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures should be one for each layer
1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ASSERT_EQ(2u, context->NumTextures());
1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures used for commit should be one for each layer.
1154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Verify that used texture is correct.
1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
1157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
1161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
1163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures should be doubled as the first textures
1164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // are used by impl thread and cannot by used for update.
1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ASSERT_EQ(4u, context->NumTextures());
1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures used for commit should still be
1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // one for each layer.
1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // First textures should not have been used.
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(context->UsedTexture(context->TextureAt(0)));
1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(context->UsedTexture(context->TextureAt(1)));
1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // New textures should have been used.
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EndTest();
1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(
1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        impl->output_surface()->context3d());
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
119290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (drew_frame_ == impl->active_tree()->source_frame_number()) {
119390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_EQ(0u, context->NumUsedTextures()) << "For frame " << drew_frame_;
119490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return;
119590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
119690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    drew_frame_ = impl->active_tree()->source_frame_number();
119790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1198a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // We draw/ship one texture each frame for each layer.
1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(2u, context->NumUsedTextures());
1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    context->ResetUsedTextures();
1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Layout() OVERRIDE {
1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_->SetNeedsDisplay();
1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetNeedsDisplay();
1206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> layer_;
1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeScrollbarLayer> scrollbar_;
121490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int drew_frame_;
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAtomicCommit);
1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void SetLayerPropertiesForTesting(Layer* layer,
1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         Layer* parent,
1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         const gfx::Transform& transform,
1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         gfx::PointF anchor,
1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         gfx::PointF position,
1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         gfx::Size bounds,
1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         bool opaque) {
1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->RemoveAllChildren();
1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (parent)
1228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    parent->AddChild(layer);
1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetTransform(transform);
1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetAnchorPoint(anchor);
1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetPosition(position);
1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetBounds(bounds);
1233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetContentsOpaque(opaque);
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAtomicCommitWithPartialUpdate
1237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Allow one partial texture update.
1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings->max_partial_texture_updates = 1;
1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Linear fade animator prevents scrollbars from drawing immediately.
1243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings->use_linear_fade_scrollbar_animator = false;
1244a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // No partial updates when impl side painting is enabled.
1245a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    settings->impl_side_painting = false;
1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    parent_ = FakeContentLayer::Create(&client_);
1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    parent_->SetBounds(gfx::Size(10, 20));
1251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_ = FakeContentLayer::Create(&client_);
1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_->SetPosition(gfx::Point(0, 10));
1254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_->SetBounds(gfx::Size(3, 10));
1255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool paint_scrollbar = true;
1257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool has_thumb = false;
1258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_with_paints_ =
1259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FakeScrollbarLayer::Create(paint_scrollbar, has_thumb, parent_->id());
1260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_with_paints_->SetPosition(gfx::Point(3, 10));
1261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_with_paints_->SetBounds(gfx::Size(3, 10));
1262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    paint_scrollbar = false;
1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_without_paints_ =
1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FakeScrollbarLayer::Create(paint_scrollbar, has_thumb, parent_->id());
1266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_without_paints_->SetPosition(gfx::Point(6, 10));
1267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_without_paints_->SetBounds(gfx::Size(3, 10));
1268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    parent_->AddChild(child_);
1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    parent_->AddChild(scrollbar_with_paints_);
1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    parent_->AddChild(scrollbar_without_paints_);
1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(parent_);
1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
1275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
127790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
127890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
127990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
128090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
128190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
128290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    switch (layer_tree_host()->commit_number()) {
128390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 1:
128490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        parent_->SetNeedsDisplay();
128590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        child_->SetNeedsDisplay();
128690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        scrollbar_with_paints_->SetNeedsDisplay();
128790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        scrollbar_without_paints_->SetNeedsDisplay();
128890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
128990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 2:
129090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        // Damage part of layers.
129190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        parent_->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f));
129290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        child_->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f));
129390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        scrollbar_with_paints_->SetNeedsDisplayRect(
129490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            gfx::RectF(0.f, 0.f, 5.f, 5.f));
129590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        scrollbar_without_paints_->SetNeedsDisplayRect(
129690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            gfx::RectF(0.f, 0.f, 5.f, 5.f));
129790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
129890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 3:
129990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        child_->SetNeedsDisplay();
130090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        scrollbar_with_paints_->SetNeedsDisplay();
130190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        scrollbar_without_paints_->SetNeedsDisplay();
130290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(10, 10));
130390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
130490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 4:
130590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(10, 20));
130690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
130790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 5:
130890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        EndTest();
130990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
131090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      default:
131190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        NOTREACHED() << layer_tree_host()->commit_number();
131290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
131390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
131490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(1u, layer_tree_host()->settings().max_partial_texture_updates);
1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(
1320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        impl->output_surface()->context3d());
1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 0:
1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures should be one for each layer.
1325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ASSERT_EQ(4u, context->NumTextures());
1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures used for commit should be one for each layer.
1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(4u, context->NumUsedTextures());
1328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Verify that used textures are correct.
1329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures should be two for each content layer and one
1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // for each scrollbar, since they always do a partial update.
1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ASSERT_EQ(6u, context->NumTextures());
1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures used for commit should be one for each content
1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // layer, and one for the scrollbar layer that paints.
1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(3u, context->NumUsedTextures());
1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // First content textures should not have been used.
1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(context->UsedTexture(context->TextureAt(0)));
1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(context->UsedTexture(context->TextureAt(1)));
1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // The non-painting scrollbar's texture wasn't updated.
1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(context->UsedTexture(context->TextureAt(2)));
1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // The painting scrollbar's partial update texture was used.
1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // New textures should have been used.
1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(4)));
1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(5)));
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures should be two for each content layer and one
1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // for each scrollbar, since they always do a partial update.
1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ASSERT_EQ(6u, context->NumTextures());
1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures used for commit should be one for each content
1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // layer, and one for the scrollbar layer that paints.
1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(3u, context->NumUsedTextures());
1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // The non-painting scrollbar's texture wasn't updated.
1366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(context->UsedTexture(context->TextureAt(2)));
1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // The painting scrollbar does a partial update.
1368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // One content layer does a partial update also.
1370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(4)));
1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(context->UsedTexture(context->TextureAt(5)));
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 3:
1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No textures should be used for commit.
1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(0u, context->NumUsedTextures());
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 4:
1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures used for commit should be two. One for the
1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // content layer, and one for the painting scrollbar. The
1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // non-painting scrollbar doesn't update its texture.
1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
139690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_LT(impl->active_tree()->source_frame_number(), 5);
139790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(
1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        impl->output_surface()->context3d());
1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Number of textures used for drawing should one per layer except for
1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // frame 3 where the viewport only contains one layer.
140390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (impl->active_tree()->source_frame_number() == 3) {
1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(1u, context->NumUsedTextures());
140590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
140690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_EQ(4u, context->NumUsedTextures()) <<
140790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          "For frame " << impl->active_tree()->source_frame_number();
140890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    context->ResetUsedTextures();
1411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> parent_;
1418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> child_;
1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeScrollbarLayer> scrollbar_with_paints_;
1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeScrollbarLayer> scrollbar_without_paints_;
1421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1423a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Partial updates are not possible with a delegating renderer.
142490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
1425a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LayerTreeHostTestAtomicCommitWithPartialUpdate);
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestFinishAllRendering : public LayerTreeHostTest {
1428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestFinishAllRendering() : once_(false), draw_count_(0) {}
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetNeedsRedraw();
1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (once_)
1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    once_ = true;
1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetNeedsRedraw();
1441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->AcquireLayerTextures();
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::AutoLock lock(lock_);
1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      draw_count_ = 0;
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->FinishAllRendering();
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::AutoLock lock(lock_);
1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(0, draw_count_);
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::AutoLock lock(lock_);
1456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++draw_count_;
1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool once_;
1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Lock lock_;
1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int draw_count_;
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFinishAllRendering);
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackCleanup : public LayerTreeHostTest {
1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer* root_layer = layer_tree_host()->root_layer();
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    char pixels[4];
1475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->CompositeAndReadback(static_cast<void*>(&pixels),
1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                            gfx::Rect(0, 0, 1, 1));
1477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(root_layer->render_surface());
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackCleanup);
1486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit
1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
14897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings->cache_render_pass_contents = true;
1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
14957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_layer_ = FakeContentLayer::Create(&client_);
1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(100, 100));
14977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
14987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    surface_layer1_ = FakeContentLayer::Create(&client_);
1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer1_->SetBounds(gfx::Size(100, 100));
1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer1_->SetForceRenderSurface(true);
1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer1_->SetOpacity(0.5f);
15027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_layer_->AddChild(surface_layer1_);
15037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    surface_layer2_ = FakeContentLayer::Create(&client_);
1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer2_->SetBounds(gfx::Size(100, 100));
1506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer2_->SetForceRenderSurface(true);
1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer2_->SetOpacity(0.5f);
15087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    surface_layer1_->AddChild(surface_layer2_);
1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    replica_layer1_ = FakeContentLayer::Create(&client_);
1511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer1_->SetReplicaLayer(replica_layer1_.get());
15127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    replica_layer2_ = FakeContentLayer::Create(&client_);
1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer2_->SetReplicaLayer(replica_layer2_.get());
1515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
15177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
15187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void BeginTest() OVERRIDE {
1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Renderer* renderer = host_impl->renderer();
1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderPass::Id surface1_render_pass_id = host_impl->active_tree()
1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ->root_layer()->children()[0]->render_surface()->RenderPassId();
1528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderPass::Id surface2_render_pass_id =
1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        host_impl->active_tree()->root_layer()->children()[0]->children()[0]
1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ->render_surface()->RenderPassId();
1531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
1533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 0:
1534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(renderer->HaveCachedResourcesForRenderPassId(
1535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            surface1_render_pass_id));
1536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(renderer->HaveCachedResourcesForRenderPassId(
1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            surface2_render_pass_id));
1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Reduce the memory limit to only fit the root layer and one render
1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // surface. This prevents any contents drawing into surfaces
1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // from being allocated.
1542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        host_impl->SetMemoryPolicy(
1543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            ManagedMemoryPolicy(100 * 100 * 4 * 2), true);
1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(renderer->HaveCachedResourcesForRenderPassId(
1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            surface1_render_pass_id));
1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(renderer->HaveCachedResourcesForRenderPassId(
1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            surface2_render_pass_id));
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EndTest();
1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
15577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (layer_tree_host()->commit_number() < 2)
1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_layer_->SetNeedsDisplay();
1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
15627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_LE(2u, root_layer_->update_count());
15637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_LE(2u, surface_layer1_->update_count());
15647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_LE(2u, surface_layer2_->update_count());
1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root_layer_;
1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> surface_layer1_;
1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> replica_layer1_;
1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> surface_layer2_;
1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> replica_layer2_;
1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Surfaces don't exist with a delegated renderer.
1576a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit);
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EvictionTestLayer : public Layer {
1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_refptr<EvictionTestLayer> Create() {
1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return make_scoped_refptr(new EvictionTestLayer());
1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual bool Update(ResourceUpdateQueue*,
1586eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      const OcclusionTracker*) OVERRIDE;
1587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool DrawsContent() const OVERRIDE { return true; }
1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl)
1590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OVERRIDE;
1591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void PushPropertiesTo(LayerImpl* impl) OVERRIDE;
1592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetTexturePriorities(const PriorityCalculator&) OVERRIDE;
1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool HaveBackingTexture() const {
1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return texture_.get() ? texture_->have_backing_texture() : false;
1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EvictionTestLayer() : Layer() {}
1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~EvictionTestLayer() {}
1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CreateTextureIfNeeded() {
1603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (texture_)
1604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
1605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    texture_ = PrioritizedResource::Create(
1606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->contents_texture_manager());
1607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    texture_->SetDimensions(gfx::Size(10, 10), GL_RGBA);
1608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bitmap_.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
1609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<PrioritizedResource> texture_;
1612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkBitmap bitmap_;
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EvictionTestLayerImpl : public LayerImpl {
1616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_ptr<EvictionTestLayerImpl> Create(LayerTreeImpl* tree_impl,
1618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                  int id) {
1619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return make_scoped_ptr(new EvictionTestLayerImpl(tree_impl, id));
1620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~EvictionTestLayerImpl() {}
1622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AppendQuads(QuadSink* quad_sink,
1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           AppendQuadsData* append_quads_data) OVERRIDE {
1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(has_texture_);
1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_NE(0u, layer_tree_impl()->resource_provider()->num_resources());
1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetHasTexture(bool has_texture) { has_texture_ = has_texture; }
1630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EvictionTestLayerImpl(LayerTreeImpl* tree_impl, int id)
1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : LayerImpl(tree_impl, id), has_texture_(false) {}
1634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool has_texture_;
1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::SetTexturePriorities(const PriorityCalculator&) {
1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateTextureIfNeeded();
1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!texture_)
1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  texture_->set_request_priority(PriorityCalculator::UIPriority(true));
1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool EvictionTestLayer::Update(ResourceUpdateQueue* queue,
1646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               const OcclusionTracker*) {
1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateTextureIfNeeded();
1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!texture_)
16497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect full_rect(0, 0, 10, 10);
1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResourceUpdate upload = ResourceUpdate::Create(
1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      texture_.get(), &bitmap_, full_rect, full_rect, gfx::Vector2d());
1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  queue->AppendFullUpload(upload);
16557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return true;
1656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<LayerImpl> EvictionTestLayer::CreateLayerImpl(
1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeImpl* tree_impl) {
1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return EvictionTestLayerImpl::Create(tree_impl, layer_id_)
1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .PassAs<LayerImpl>();
1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::PushPropertiesTo(LayerImpl* layer_impl) {
1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Layer::PushPropertiesTo(layer_impl);
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EvictionTestLayerImpl* test_layer_impl =
1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      static_cast<EvictionTestLayerImpl*>(layer_impl);
1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_layer_impl->SetHasTexture(texture_->have_backing_texture());
1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestEvictTextures : public LayerTreeHostTest {
1673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestEvictTextures()
1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : layer_(EvictionTestLayer::Create()),
1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        impl_for_evict_textures_(0),
1677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_commits_(0) {}
1678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(10, 20));
1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform identity_matrix;
1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetLayerPropertiesForTesting(layer_.get(),
1685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 0,
1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 identity_matrix,
1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 gfx::PointF(0.f, 0.f),
1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 gfx::PointF(0.f, 0.f),
1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 gfx::Size(10, 20),
1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 true);
1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void PostEvictTextures() {
1696eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK(HasImplThread());
1697eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ImplThreadTaskRunner()->PostTask(
1698eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        FROM_HERE,
1699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&LayerTreeHostTestEvictTextures::EvictTexturesOnImplThread,
1700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   base::Unretained(this)));
1701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void EvictTexturesOnImplThread() {
1704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(impl_for_evict_textures_);
1705eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    impl_for_evict_textures_->EvictTexturesForTesting();
1706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 1: Just commit and draw normally, then post an eviction at the end
1709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // that will trigger a commit.
1710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 2: Triggered by the eviction, let it go through and then set
1711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // needsCommit.
1712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 3: Triggered by the setNeedsCommit. In Layout(), post an eviction
1713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // task, which will be handled before the commit. Don't set needsCommit, it
1714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // should have been posted. A frame should not be drawn (note,
1715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // didCommitAndDrawFrame may be called anyway).
1716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 4: Triggered by the eviction, let it go through and then set
1717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // needsCommit.
1718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 5: Triggered by the setNeedsCommit, post an eviction task in
1719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Layout(), a frame should not be drawn but a commit will be posted.
1720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 6: Triggered by the eviction, post an eviction task in
1721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Layout(), which will be a noop, letting the commit (which recreates the
1722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // textures) go through and draw a frame, then end the test.
1723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
1724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commits 1+2 test the eviction recovery path where eviction happens outside
1725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // of the beginFrame/commit pair.
1726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commits 3+4 test the eviction recovery path where eviction happens inside
1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the beginFrame/commit pair.
1728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commits 5+6 test the path where an eviction happens during the eviction
1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // recovery path.
1730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
1731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_commits_) {
1732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
1733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_->HaveBackingTexture());
1734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostEvictTextures();
1735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
1737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_->HaveBackingTexture());
1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
1739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 3:
1741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 4:
1743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_->HaveBackingTexture());
1744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
1745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 5:
1747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 6:
1749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_->HaveBackingTexture());
1750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EndTest();
1751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
1753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
1754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    impl_for_evict_textures_ = impl;
1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Layout() OVERRIDE {
1763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_commits_;
1764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_commits_) {
1765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 3:
1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostEvictTextures();
1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 4:
1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // We couldn't check in didCommitAndDrawFrame on commit 3,
1773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // so check here.
1774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(layer_->HaveBackingTexture());
1775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 5:
1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostEvictTextures();
1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 6:
1780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // We couldn't check in didCommitAndDrawFrame on commit 5,
1781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // so check here.
1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(layer_->HaveBackingTexture());
1783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostEvictTextures();
1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
1786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
1787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<EvictionTestLayer> layer_;
1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostImpl* impl_for_evict_textures_;
1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
1798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestEvictTextures);
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestContinuousCommit : public LayerTreeHostTest {
1803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestContinuousCommit()
1805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : num_commit_complete_(0), num_draw_layers_(0) {}
1806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(10, 10));
1809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10));
1810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
1815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 2)
1816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
1817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->SetNeedsDisplay();
1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 1)
1822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      num_commit_complete_++;
1823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draw_layers_++;
1827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 2)
1828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
1829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
1832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check that we didn't commit twice between first and second draw.
1833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, num_commit_complete_);
1834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commit_complete_;
1838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draw_layers_;
1839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousCommit);
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestContinuousInvalidate : public LayerTreeHostTest {
1844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestContinuousInvalidate()
1846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : num_commit_complete_(0), num_draw_layers_(0) {}
1847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(10, 10));
1850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10));
1851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_ = ContentLayer::Create(&client_);
1853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_->SetBounds(gfx::Size(10, 10));
1854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_->SetPosition(gfx::PointF(0.f, 0.f));
1855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f));
1856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_->SetIsDrawable(true);
1857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(content_layer_);
1858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
186290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 2)
1864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
1865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_->SetNeedsDisplay();
1866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 1)
1870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      num_commit_complete_++;
1871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draw_layers_++;
1875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 2)
1876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
1877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
1880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check that we didn't commit twice between first and second draw.
1881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, num_commit_complete_);
1882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Layer> content_layer_;
1887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commit_complete_;
1888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draw_layers_;
18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousInvalidate);
18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestDeferCommits : public LayerTreeHostTest {
1894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestDeferCommits()
1896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : num_commits_deferred_(0), num_complete_commits_(0) {}
1897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
1899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidDeferCommit() OVERRIDE {
1901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_deferred_++;
1902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetDeferCommits(false);
1903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
1906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_complete_commits_++;
1907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_complete_commits_) {
1908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
1909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(0, num_commits_deferred_);
1910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->SetDeferCommits(true);
19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
1912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
1914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EndTest();
1915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
1917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
1918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
1923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, num_commits_deferred_);
1924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(2, num_complete_commits_);
1925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_deferred_;
1929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_complete_commits_;
19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits);
19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostWithProxy : public LayerTreeHost {
1935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostWithProxy(FakeLayerTreeHostClient* client,
1937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         const LayerTreeSettings& settings,
1938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         scoped_ptr<FakeProxy> proxy)
1939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : LayerTreeHost(client, settings) {
1940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        proxy->SetLayerTreeHost(this);
1941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(InitializeForTesting(proxy.PassAs<Proxy>()));
1942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, LimitPartialUpdates) {
1946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When partial updates are not allowed, max updates should be 0.
1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
1948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<FakeProxy> proxy(new FakeProxy);
1951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->GetRendererCapabilities().allow_partial_texture_updates = false;
1952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->SetMaxPartialTextureUpdates(5);
19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeSettings settings;
1955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings.max_partial_texture_updates = 10;
19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostWithProxy host(&client, settings, proxy.Pass());
1958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded());
19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0u, host.settings().max_partial_texture_updates);
1961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When partial updates are allowed,
1964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // max updates should be limited by the proxy.
1965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
1966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1968eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<FakeProxy> proxy(new FakeProxy);
1969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->GetRendererCapabilities().allow_partial_texture_updates = true;
1970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->SetMaxPartialTextureUpdates(5);
19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeSettings settings;
1973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings.max_partial_texture_updates = 10;
19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostWithProxy host(&client, settings, proxy.Pass());
1976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded());
19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(5u, host.settings().max_partial_texture_updates);
1979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When partial updates are allowed,
1982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // max updates should also be limited by the settings.
1983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
1984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1986eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<FakeProxy> proxy(new FakeProxy);
1987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->GetRendererCapabilities().allow_partial_texture_updates = true;
1988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->SetMaxPartialTextureUpdates(20);
19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeSettings settings;
1991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings.max_partial_texture_updates = 10;
19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostWithProxy host(&client, settings, proxy.Pass());
1994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded());
19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(10u, host.settings().max_partial_texture_updates);
1997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithGLRenderer) {
2001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeSettings settings;
2004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings.max_partial_texture_updates = 4;
20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<LayerTreeHost> host =
2007eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      LayerTreeHost::Create(&client, settings, NULL);
2008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded());
2009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(4u, host->settings().max_partial_texture_updates);
20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithSoftwareRenderer) {
2013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_SOFTWARE);
20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeSettings settings;
2016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings.max_partial_texture_updates = 4;
20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<LayerTreeHost> host =
2019eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      LayerTreeHost::Create(&client, settings, NULL);
2020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded());
2021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(4u, host->settings().max_partial_texture_updates);
20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithDelegatingRendererAndGLContent) {
2025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_3D);
20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeSettings settings;
2028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings.max_partial_texture_updates = 4;
20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<LayerTreeHost> host =
2031eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      LayerTreeHost::Create(&client, settings, NULL);
2032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded());
2033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, host->settings().max_partial_texture_updates);
20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest,
2037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     PartialUpdatesWithDelegatingRendererAndSoftwareContent) {
2038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_SOFTWARE);
20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeSettings settings;
2041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings.max_partial_texture_updates = 4;
20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<LayerTreeHost> host =
2044eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      LayerTreeHost::Create(&client, settings, NULL);
2045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded());
2046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, host->settings().max_partial_texture_updates);
20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted
2050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
2051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted()
2053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : root_layer_(FakeContentLayer::Create(&client_)),
2054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        child_layer1_(FakeContentLayer::Create(&client_)),
2055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        child_layer2_(FakeContentLayer::Create(&client_)),
2056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_commits_(0) {}
2057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(100, 100));
2060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(100, 100));
2061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer1_->SetBounds(gfx::Size(100, 100));
2062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer2_->SetBounds(gfx::Size(100, 100));
2063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->AddChild(child_layer1_);
2064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->AddChild(child_layer2_);
2065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
2066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* host_impl,
2070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       bool visible) OVERRIDE {
2071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // One backing should remain unevicted.
2072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(100u * 100u * 4u * 1u,
2073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              layer_tree_host()->contents_texture_manager()->MemoryUseBytes());
2074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Make sure that contents textures are marked as having been
2075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // purged.
2076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(host_impl->active_tree()->ContentsTexturesPurged());
2077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // End the test in this state.
2078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
2079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_commits_;
2083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_commits_) {
2084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
2085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // All three backings should have memory.
2086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(
2087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            100u * 100u * 4u * 3u,
2088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            layer_tree_host()->contents_texture_manager()->MemoryUseBytes());
2089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Set a new policy that will kick out 1 of the 3 resources.
2090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Because a resource was evicted, a commit will be kicked off.
2091eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        host_impl->SetMemoryPolicy(
2092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            ManagedMemoryPolicy(100 * 100 * 4 * 2,
2093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING,
2094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                100 * 100 * 4 * 1,
2095eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING),
2096eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            true);
2097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
2099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Only two backings should have memory.
2100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(
2101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            100u * 100u * 4u * 2u,
2102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            layer_tree_host()->contents_texture_manager()->MemoryUseBytes());
2103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Become backgrounded, which will cause 1 more resource to be
2104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // evicted.
2105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostSetVisibleToMainThread(false);
2106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
2108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No further commits should happen because this is not visible
2109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // anymore.
2110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
2111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
2119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root_layer_;
2120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> child_layer1_;
2121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> child_layer2_;
2122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
2126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted);
21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestLCDNotification : public LayerTreeHostTest {
2129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class NotificationClient : public ContentLayerClient {
2131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   public:
2132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NotificationClient()
2133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        : layer_(0), paint_count_(0), lcd_notification_count_(0) {}
2134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    void set_layer(Layer* layer) { layer_ = layer; }
2136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int paint_count() const { return paint_count_; }
2137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int lcd_notification_count() const { return lcd_notification_count_; }
2138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void PaintContents(SkCanvas* canvas,
2140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               gfx::Rect clip,
2141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               gfx::RectF* opaque) OVERRIDE {
2142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ++paint_count_;
2143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void DidChangeLayerCanUseLCDText() OVERRIDE {
2145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ++lcd_notification_count_;
2146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_->SetNeedsDisplay();
2147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   private:
2150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer* layer_;
2151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int paint_count_;
2152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int lcd_notification_count_;
2153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
2154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<ContentLayer> root_layer = ContentLayer::Create(&client_);
2157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetIsDrawable(true);
2158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetBounds(gfx::Size(1, 1));
2159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer);
2161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    client_.set_layer(root_layer.get());
2162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The expecations are based on the assumption that the default
2164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // LCD settings are:
2165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->settings().can_use_lcd_text);
2166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(root_layer->can_use_lcd_text());
2167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
2169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
2175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (layer_tree_host()->commit_number()) {
2176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
2177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // The first update consists one LCD notification and one paint.
2178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, client_.lcd_notification_count());
2179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, client_.paint_count());
2180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // LCD text must have been enabled on the layer.
2181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text());
21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
2183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
2185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Since nothing changed on layer, there should be no notification
2186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // or paint on the second update.
2187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, client_.lcd_notification_count());
2188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, client_.paint_count());
2189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // LCD text must not have changed.
2190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text());
2191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Change layer opacity that should trigger lcd notification.
2192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->root_layer()->SetOpacity(.5f);
2193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No need to request a commit - setting opacity will do it.
2194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
2196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Verify that there is not extra commit due to layer invalidation.
2197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(3, layer_tree_host()->commit_number());
2198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // LCD notification count should have incremented due to
2199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // change in layer opacity.
2200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2, client_.lcd_notification_count());
2201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Paint count should be incremented due to invalidation.
2202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2, client_.paint_count());
2203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // LCD text must have been disabled on the layer due to opacity.
2204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(layer_tree_host()->root_layer()->can_use_lcd_text());
22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
2206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
22092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NotificationClient client_;
2212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_THREAD_TEST_F(LayerTreeHostTestLCDNotification);
2215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
221690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Verify that the BeginFrame notification is used to initiate rendering.
221790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestBeginFrameNotification : public LayerTreeHostTest {
2218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
2220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    settings->begin_frame_scheduling_enabled = true;
2221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
22247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // This will trigger a SetNeedsBeginFrame which will trigger a BeginFrame.
2225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(
2229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerTreeHostImpl* host_impl,
2230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerTreeHostImpl::FrameData* frame,
2231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bool result) OVERRIDE {
2232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
2233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
2234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks frame_time_;
2240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
22412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
224290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestBeginFrameNotification);
2243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
224490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestBeginFrameNotificationShutdownWhileEnabled
2245a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    : public LayerTreeHostTest {
2246a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) public:
2247a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
2248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    settings->begin_frame_scheduling_enabled = true;
224990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    settings->using_synchronous_renderer_compositor = true;
2250a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
2251a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2252a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2253a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2254a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
225590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // The BeginFrame notification is turned off now but will get enabled
225690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // once we return. End test while it's enabled.
2257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ImplThreadTaskRunner()->PostTask(
2258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        FROM_HERE,
2259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::Bind(&LayerTreeHostTestBeginFrameNotification::EndTest,
2260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   base::Unretained(this)));
2261a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
2262a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2263a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2264a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)};
2265a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
226690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MULTI_THREAD_TEST_F(
226790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LayerTreeHostTestBeginFrameNotificationShutdownWhileEnabled);
2268a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestUninvertibleTransformDoesNotBlockActivation
2270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
2271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
2272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
2273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings->impl_side_painting = true;
2274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
22752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<Layer> layer = PictureLayer::Create(&client_);
2280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer->SetTransform(gfx::Transform(0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
2281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer->SetBounds(gfx::Size(10, 10));
2282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(layer);
2283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
2291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
2294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(
2300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestUninvertibleTransformDoesNotBlockActivation);
23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestChangeLayerPropertiesInPaintContents
2303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
2304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class SetBoundsClient : public ContentLayerClient {
2306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   public:
2307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetBoundsClient() : layer_(0) {}
23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    void set_layer(Layer* layer) { layer_ = layer; }
23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void PaintContents(SkCanvas* canvas,
2312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               gfx::Rect clip,
2313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               gfx::RectF* opaque) OVERRIDE {
2314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_->SetBounds(gfx::Size(2, 2));
23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void DidChangeLayerCanUseLCDText() OVERRIDE {}
23182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   private:
2320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer* layer_;
2321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestChangeLayerPropertiesInPaintContents() : num_commits_(0) {}
23242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<ContentLayer> root_layer = ContentLayer::Create(&client_);
2327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetIsDrawable(true);
2328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetBounds(gfx::Size(1, 1));
23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer);
2331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    client_.set_layer(root_layer.get());
23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
2334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
2341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_commits_ == 1) {
2342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerImpl* root_layer = host_impl->active_tree()->root_layer();
2343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_SIZE_EQ(gfx::Size(1, 1), root_layer->bounds());
2344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
2345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerImpl* root_layer = host_impl->active_tree()->root_layer();
2346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_SIZE_EQ(gfx::Size(2, 2), root_layer->bounds());
2347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
23482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetBoundsClient client_;
2353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
23552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_THREAD_TEST_F(LayerTreeHostTestChangeLayerPropertiesInPaintContents);
2357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MockIOSurfaceWebGraphicsContext3D : public FakeWebGraphicsContext3D {
2359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockIOSurfaceWebGraphicsContext3D()
2361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : FakeWebGraphicsContext3D() {}
2362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual WebKit::WebGLId createTexture() OVERRIDE {
2364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return 1;
2365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual WebKit::WebString getString(WebKit::WGC3Denum name) OVERRIDE {
2368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (name == GL_EXTENSIONS) {
2369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return WebKit::WebString(
2370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "GL_CHROMIUM_iosurface GL_ARB_texture_rectangle");
2371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return WebKit::WebString();
2373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MOCK_METHOD1(activeTexture, void(WebKit::WGC3Denum texture));
2376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MOCK_METHOD2(bindTexture, void(WebKit::WGC3Denum target,
2377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                WebKit::WebGLId texture_id));
2378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MOCK_METHOD3(texParameteri, void(WebKit::WGC3Denum target,
2379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   WebKit::WGC3Denum pname,
2380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   WebKit::WGC3Dint param));
2381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MOCK_METHOD5(texImageIOSurface2DCHROMIUM, void(WebKit::WGC3Denum target,
2382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                 WebKit::WGC3Dint width,
2383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                 WebKit::WGC3Dint height,
2384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                 WebKit::WGC3Duint ioSurfaceId,
2385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                 WebKit::WGC3Duint plane));
2386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MOCK_METHOD4(drawElements, void(WebKit::WGC3Denum mode,
2387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  WebKit::WGC3Dsizei count,
2388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  WebKit::WGC3Denum type,
2389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  WebKit::WGC3Dintptr offset));
2390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
23912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestIOSurfaceDrawing : public LayerTreeHostTest {
2394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
2395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE {
2396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<MockIOSurfaceWebGraphicsContext3D> context(
2397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new MockIOSurfaceWebGraphicsContext3D);
2398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mock_context_ = context.get();
2399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<OutputSurface> output_surface = FakeOutputSurface::Create3d(
2400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context.PassAs<WebKit::WebGraphicsContext3D>()).PassAs<OutputSurface>();
2401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return output_surface.Pass();
2402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
2406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->SetIsDrawable(false);
2408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_id_ = 9;
2410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_size_ = gfx::Size(6, 7);
2411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<IOSurfaceLayer> io_surface_layer = IOSurfaceLayer::Create();
2413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_layer->SetBounds(gfx::Size(10, 10));
2414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_layer->SetAnchorPoint(gfx::PointF());
2415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_layer->SetIsDrawable(true);
2416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_layer->SetIOSurfaceProperties(io_surface_id_, io_surface_size_);
2417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(io_surface_layer);
2418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // In WillDraw, the IOSurfaceLayer sets up the io surface texture.
2426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, activeTexture(_))
2428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(0);
2429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1))
2430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(AtLeast(1));
2431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, texParameteri(GL_TEXTURE_RECTANGLE_ARB,
2432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              GL_TEXTURE_MIN_FILTER,
2433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              GL_LINEAR))
2434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(1);
2435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, texParameteri(GL_TEXTURE_RECTANGLE_ARB,
2436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              GL_TEXTURE_MAG_FILTER,
2437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              GL_LINEAR))
2438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(1);
2439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, texParameteri(GL_TEXTURE_RECTANGLE_ARB,
2440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              GL_TEXTURE_WRAP_S,
2441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              GL_CLAMP_TO_EDGE))
2442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(1);
2443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, texParameteri(GL_TEXTURE_RECTANGLE_ARB,
2444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              GL_TEXTURE_WRAP_T,
2445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              GL_CLAMP_TO_EDGE))
2446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(1);
2447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, texImageIOSurface2DCHROMIUM(
2449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        GL_TEXTURE_RECTANGLE_ARB,
2450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        io_surface_size_.width(),
2451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        io_surface_size_.height(),
2452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        io_surface_id_,
2453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0))
2454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(1);
2455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, bindTexture(_, 0))
2457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(AnyNumber());
2458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(
2461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerTreeHostImpl* host_impl,
2462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerTreeHostImpl::FrameData* frame,
2463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bool result) OVERRIDE {
2464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Mock::VerifyAndClearExpectations(&mock_context_);
2465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The io surface layer's texture is drawn.
2467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, activeTexture(GL_TEXTURE0))
2468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(AtLeast(1));
2469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1))
2470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(1);
2471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, drawElements(GL_TRIANGLES, 6, _, _))
2472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(AtLeast(1));
2473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return result;
2475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Mock::VerifyAndClearExpectations(&mock_context_);
2479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
2480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int io_surface_id_;
2485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockIOSurfaceWebGraphicsContext3D* mock_context_;
2486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size io_surface_size_;
2487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
24882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2489a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// TODO(danakj): IOSurface layer can not be transported. crbug.com/239335
2490a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
2491a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LayerTreeHostTestIOSurfaceDrawing);
2492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAsyncReadback : public LayerTreeHostTest {
2494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
2495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root = FakeContentLayer::Create(&client_);
2497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root->SetBounds(gfx::Size(20, 20));
2498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child = FakeContentLayer::Create(&client_);
2500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child->SetBounds(gfx::Size(10, 10));
2501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root->AddChild(child);
2502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root);
2504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
2505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
2512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WaitForCallback();
2513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void WaitForCallback() {
2516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
2517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FROM_HERE,
2518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(
2519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            &LayerTreeHostTestAsyncReadback::NextStep,
2520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            base::Unretained(this)));
2521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void NextStep() {
2524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int frame = layer_tree_host()->commit_number();
2525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (frame) {
2526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
252790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        child->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest(
25287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            base::Bind(&LayerTreeHostTestAsyncReadback::CopyOutputCallback,
252990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       base::Unretained(this))));
2530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(0u, callbacks_.size());
2531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
2533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (callbacks_.size() < 1u) {
2534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          WaitForCallback();
2535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          return;
25362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
2537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1u, callbacks_.size());
2538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[0].ToString());
2539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
254090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        child->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest(
25417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            base::Bind(&LayerTreeHostTestAsyncReadback::CopyOutputCallback,
254290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       base::Unretained(this))));
254390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        root->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest(
25447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            base::Bind(&LayerTreeHostTestAsyncReadback::CopyOutputCallback,
254590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       base::Unretained(this))));
254690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        child->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest(
25477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            base::Bind(&LayerTreeHostTestAsyncReadback::CopyOutputCallback,
254890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       base::Unretained(this))));
2549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1u, callbacks_.size());
2550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 3:
2552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (callbacks_.size() < 4u) {
2553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          WaitForCallback();
2554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          return;
25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
2556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(4u, callbacks_.size());
2557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // The child was copied to a bitmap and passed back twice.
2558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[1].ToString());
2559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[2].ToString());
2560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // The root was copied to a bitmap and passed back also.
2561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(gfx::Size(20, 20).ToString(), callbacks_[3].ToString());
2562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EndTest();
2563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
2568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
25697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_TRUE(result->HasBitmap());
25707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<SkBitmap> bitmap = result->TakeBitmap().Pass();
25717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ(result->size().ToString(),
25727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)              gfx::Size(bitmap->width(), bitmap->height()).ToString());
25737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    callbacks_.push_back(result->size());
2574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
2577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(4u, callbacks_.size());
2578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE {
2581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (use_gl_renderer_)
2582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return FakeOutputSurface::Create3d().PassAs<OutputSurface>();
2583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return FakeOutputSurface::CreateSoftware(
2584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        make_scoped_ptr(new SoftwareOutputDevice)).PassAs<OutputSurface>();
2585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool use_gl_renderer_;
2588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<gfx::Size> callbacks_;
2589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
2590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root;
2591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> child;
2592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
25932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2594a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Readback can't be done with a delegating renderer.
2595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback, GLRenderer_RunSingleThread) {
2596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  use_gl_renderer_ = true;
2597a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
2598a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
2599a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2600a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback,
2601a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       GLRenderer_RunMultiThread_MainThreadPainting) {
2602a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  use_gl_renderer_ = true;
2603a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
2604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
26052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2606a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback,
2607a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       GLRenderer_RunMultiThread_ImplSidePainting) {
2608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  use_gl_renderer_ = true;
2609a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
2610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
26112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback, SoftwareRenderer_RunSingleThread) {
2613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  use_gl_renderer_ = false;
2614a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
2615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
26162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2617a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback,
2618a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       SoftwareRenderer_RunMultiThread_MainThreadPainting) {
2619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  use_gl_renderer_ = false;
2620a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
2621a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
2622a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2623a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback,
2624a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       SoftwareRenderer_RunMultiThread_ImplSidePainting) {
2625a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  use_gl_renderer_ = false;
2626a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
2627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
26282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAsyncReadbackLayerDestroyed : public LayerTreeHostTest {
2630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
2631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_ = FakeContentLayer::Create(&client_);
2633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_->SetBounds(gfx::Size(20, 20));
2634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    main_destroyed_ = FakeContentLayer::Create(&client_);
2636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    main_destroyed_->SetBounds(gfx::Size(15, 15));
2637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_->AddChild(main_destroyed_);
2638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    impl_destroyed_ = FakeContentLayer::Create(&client_);
2640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    impl_destroyed_->SetBounds(gfx::Size(10, 10));
2641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_->AddChild(impl_destroyed_);
2642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
2644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
2645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    callback_count_ = 0;
2649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
2653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int frame = layer_tree_host()->commit_number();
2654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (frame) {
2655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
265690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        main_destroyed_->RequestCopyOfOutput(
265790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            CopyOutputRequest::CreateBitmapRequest(base::Bind(
26587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                &LayerTreeHostTestAsyncReadbackLayerDestroyed::
26597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    CopyOutputCallback,
266090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                base::Unretained(this))));
266190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        impl_destroyed_->RequestCopyOfOutput(
266290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            CopyOutputRequest::CreateBitmapRequest(base::Bind(
26637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                &LayerTreeHostTestAsyncReadbackLayerDestroyed::
26647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    CopyOutputCallback,
266590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                base::Unretained(this))));
2666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(0, callback_count_);
2667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Destroy the main thread layer right away.
2669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        main_destroyed_->RemoveFromParent();
2670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        main_destroyed_ = NULL;
2671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Should callback with a NULL bitmap.
2673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, callback_count_);
2674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Prevent drawing so we can't make a copy of the impl_destroyed layer.
2676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size());
2677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
2679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Flush the message loops and make sure the callbacks run.
2680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
2681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 3:
2683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No drawing means no readback yet.
2684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, callback_count_);
2685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Destroy the impl thread layer.
2687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        impl_destroyed_->RemoveFromParent();
2688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        impl_destroyed_ = NULL;
2689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No callback yet because it's on the impl side.
2691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, callback_count_);
2692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 4:
2694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Flush the message loops and make sure the callbacks run.
2695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
2696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 5:
2698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // We should get another callback with a NULL bitmap.
2699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2, callback_count_);
2700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EndTest();
2701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
27022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
27042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
2706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
27077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_TRUE(result->IsEmpty());
2708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++callback_count_;
2709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
27102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
27122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int callback_count_;
2714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
2715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root_;
2716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> main_destroyed_;
2717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> impl_destroyed_;
27182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
27192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestAsyncReadbackLayerDestroyed);
27212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestAsyncReadbackInHiddenSubtree : public LayerTreeHostTest {
27237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
27247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
27257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_ = FakeContentLayer::Create(&client_);
27267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->SetBounds(gfx::Size(20, 20));
27277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
27287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grand_parent_layer_ = FakeContentLayer::Create(&client_);
27297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grand_parent_layer_->SetBounds(gfx::Size(15, 15));
27307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(grand_parent_layer_);
27317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
27327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // parent_layer_ owns a render surface.
27337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    parent_layer_ = FakeContentLayer::Create(&client_);
27347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    parent_layer_->SetBounds(gfx::Size(15, 15));
27357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    parent_layer_->SetForceRenderSurface(true);
27367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grand_parent_layer_->AddChild(parent_layer_);
27377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
27387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    copy_layer_ = FakeContentLayer::Create(&client_);
27397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    copy_layer_->SetBounds(gfx::Size(10, 10));
27407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    parent_layer_->AddChild(copy_layer_);
27417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
27427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    layer_tree_host()->SetRootLayer(root_);
27437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
27447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
27457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
27467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void AddCopyRequest(Layer* layer) {
27477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    layer->RequestCopyOfOutput(
27487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        CopyOutputRequest::CreateBitmapRequest(base::Bind(
27497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            &LayerTreeHostTestAsyncReadbackInHiddenSubtree::CopyOutputCallback,
27507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            base::Unretained(this))));
27517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
27527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
27537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void BeginTest() OVERRIDE {
27547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    callback_count_ = 0;
27557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PostSetNeedsCommitToMainThread();
27567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
27577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    AddCopyRequest(copy_layer_.get());
27587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
27597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
27607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
27617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
27627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(copy_layer_->bounds().ToString(), result->size().ToString());
27637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ++callback_count_;
27647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
27657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (callback_count_) {
27667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
27677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Hide the copy request layer.
27687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grand_parent_layer_->SetHideLayerAndSubtree(false);
27697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        parent_layer_->SetHideLayerAndSubtree(false);
27707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        copy_layer_->SetHideLayerAndSubtree(true);
27717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        AddCopyRequest(copy_layer_.get());
27727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
27737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 2:
27747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Hide the copy request layer's parent only.
27757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grand_parent_layer_->SetHideLayerAndSubtree(false);
27767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        parent_layer_->SetHideLayerAndSubtree(true);
27777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        copy_layer_->SetHideLayerAndSubtree(false);
27787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        AddCopyRequest(copy_layer_.get());
27797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
27807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 3:
27817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Hide the copy request layer's grand parent only.
27827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grand_parent_layer_->SetHideLayerAndSubtree(true);
27837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        parent_layer_->SetHideLayerAndSubtree(false);
27847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        copy_layer_->SetHideLayerAndSubtree(false);
27857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        AddCopyRequest(copy_layer_.get());
27867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
27877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 4:
27887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Hide the copy request layer's parent and grandparent.
27897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grand_parent_layer_->SetHideLayerAndSubtree(true);
27907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        parent_layer_->SetHideLayerAndSubtree(true);
27917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        copy_layer_->SetHideLayerAndSubtree(false);
27927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        AddCopyRequest(copy_layer_.get());
27937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
27947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 5:
27957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Hide the copy request layer as well as its parent and grandparent.
27967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grand_parent_layer_->SetHideLayerAndSubtree(true);
27977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        parent_layer_->SetHideLayerAndSubtree(true);
27987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        copy_layer_->SetHideLayerAndSubtree(true);
27997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        AddCopyRequest(copy_layer_.get());
28007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
28017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 6:
28027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
28037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
28047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
28057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
28067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AfterTest() OVERRIDE {}
28087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int callback_count_;
28107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FakeContentLayerClient client_;
28117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<FakeContentLayer> root_;
28127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<FakeContentLayer> grand_parent_layer_;
28137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<FakeContentLayer> parent_layer_;
28147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<FakeContentLayer> copy_layer_;
28157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
28167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// No output to copy for delegated renderers.
28187dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
28197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTestAsyncReadbackInHiddenSubtree);
28207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest
28227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTest {
28237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
28247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
28257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    settings->cache_render_pass_contents = true;
28267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
28277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
28297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_ = FakeContentLayer::Create(&client_);
28307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->SetBounds(gfx::Size(20, 20));
28317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grand_parent_layer_ = FakeContentLayer::Create(&client_);
28337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grand_parent_layer_->SetBounds(gfx::Size(15, 15));
28347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grand_parent_layer_->SetHideLayerAndSubtree(true);
28357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(grand_parent_layer_);
28367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // parent_layer_ owns a render surface.
28387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    parent_layer_ = FakeContentLayer::Create(&client_);
28397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    parent_layer_->SetBounds(gfx::Size(15, 15));
28407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    parent_layer_->SetForceRenderSurface(true);
28417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grand_parent_layer_->AddChild(parent_layer_);
28427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    copy_layer_ = FakeContentLayer::Create(&client_);
28447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    copy_layer_->SetBounds(gfx::Size(10, 10));
28457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    parent_layer_->AddChild(copy_layer_);
28467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    layer_tree_host()->SetRootLayer(root_);
28487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
28497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
28507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void BeginTest() OVERRIDE {
28527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    did_draw_ = false;
28537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PostSetNeedsCommitToMainThread();
28547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    copy_layer_->RequestCopyOfOutput(
28567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        CopyOutputRequest::CreateBitmapRequest(base::Bind(
28577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            &LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest::
28587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                CopyOutputCallback,
28597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            base::Unretained(this))));
28607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
28617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
28637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
28647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(copy_layer_->bounds().ToString(), result->size().ToString());
28657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EndTest();
28667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
28677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
28697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Renderer* renderer = host_impl->renderer();
28707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerImpl* root = host_impl->active_tree()->root_layer();
28727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerImpl* grand_parent = root->children()[0];
28737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerImpl* parent = grand_parent->children()[0];
28747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerImpl* copy_layer = parent->children()[0];
28757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // |parent| owns a surface, but it was hidden and not part of the copy
28777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // request so it should not allocate any resource.
28787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(renderer->HaveCachedResourcesForRenderPassId(
28797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        parent->render_surface()->RenderPassId()));
28807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // |copy_layer| should have been rendered to a texture since it was needed
28827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // for a copy request.
28837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(renderer->HaveCachedResourcesForRenderPassId(
28847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        copy_layer->render_surface()->RenderPassId()));
28857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    did_draw_ = true;
28877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
28887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AfterTest() OVERRIDE { EXPECT_TRUE(did_draw_); }
28907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FakeContentLayerClient client_;
28927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool did_draw_;
28937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<FakeContentLayer> root_;
28947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<FakeContentLayer> grand_parent_layer_;
28957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<FakeContentLayer> parent_layer_;
28967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<FakeContentLayer> copy_layer_;
28977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
28987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
28997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// No output to copy for delegated renderers.
29007dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
29017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest);
29027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestAsyncReadbackClippedOut : public LayerTreeHostTest {
29047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
29057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
29067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_ = FakeContentLayer::Create(&client_);
29077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->SetBounds(gfx::Size(20, 20));
29087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    parent_layer_ = FakeContentLayer::Create(&client_);
29107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    parent_layer_->SetBounds(gfx::Size(15, 15));
29117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    parent_layer_->SetMasksToBounds(true);
29127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(parent_layer_);
29137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    copy_layer_ = FakeContentLayer::Create(&client_);
29157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    copy_layer_->SetPosition(gfx::Point(15, 15));
29167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    copy_layer_->SetBounds(gfx::Size(10, 10));
29177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    parent_layer_->AddChild(copy_layer_);
29187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    layer_tree_host()->SetRootLayer(root_);
29207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
29217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
29227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void BeginTest() OVERRIDE {
29247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PostSetNeedsCommitToMainThread();
29257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    copy_layer_->RequestCopyOfOutput(
29277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        CopyOutputRequest::CreateBitmapRequest(base::Bind(
29287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            &LayerTreeHostTestAsyncReadbackClippedOut::CopyOutputCallback,
29297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            base::Unretained(this))));
29307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
29317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
29337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // We should still get a callback with no output if the copy requested layer
29347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // was completely clipped away.
29357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
29367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(gfx::Size().ToString(), result->size().ToString());
29377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EndTest();
29387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
29397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AfterTest() OVERRIDE {}
29417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FakeContentLayerClient client_;
29437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<FakeContentLayer> root_;
29447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<FakeContentLayer> parent_layer_;
29457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<FakeContentLayer> copy_layer_;
29467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
29477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// No output to copy for delegated renderers.
29497dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
29507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTestAsyncReadbackClippedOut);
29517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2952b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class LayerTreeHostTestNumFramesPending : public LayerTreeHostTest {
2953b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public:
2954a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2955a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    frame_ = 0;
2956a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2957b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
2958b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2959b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Round 1: commit + draw
2960b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Round 2: commit only (no draw/swap)
2961b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Round 3: draw only (no commit)
2962b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Round 4: composite & readback (2 commits, no draw/swap)
2963b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Round 5: commit + draw
2964b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2965b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
2966b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    int commit = layer_tree_host()->commit_number();
2967b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    switch (commit) {
2968b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 2:
2969b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Round 2 done.
2970b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(1, frame_);
2971b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetNeedsRedraw();
2972b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
2973b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 3:
2974b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // CompositeAndReadback in Round 4, first commit.
2975b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(2, frame_);
2976b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
2977b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 4:
2978b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Round 4 done.
2979b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(2, frame_);
2980b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
2981b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetNeedsRedraw();
2982b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
2983b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
2984b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
2985b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2986b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidCompleteSwapBuffers() OVERRIDE {
2987b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    int commit = layer_tree_host()->commit_number();
2988b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    ++frame_;
2989b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    char pixels[4] = {0};
2990b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    switch (frame_) {
2991b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 1:
2992b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Round 1 done.
2993b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(1, commit);
2994b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
2995b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
2996b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 2:
2997b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Round 3 done.
2998b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(2, commit);
2999b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->CompositeAndReadback(pixels, gfx::Rect(0, 0, 1, 1));
3000b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
3001b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 3:
3002b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Round 5 done.
3003b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(5, commit);
3004b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EndTest();
3005b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
3006b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
3007b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
3008b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3009b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
3010b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3011b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) protected:
3012b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int frame_;
3013b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)};
3014b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3015b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(LayerTreeHostTestNumFramesPending, DelegatingRenderer) {
3016a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
3017b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
3018b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3019b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(LayerTreeHostTestNumFramesPending, GLRenderer) {
3020a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
3021b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
3022b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3023868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class LayerTreeHostTestDeferredInitialize : public LayerTreeHostTest {
3024868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
3025868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
3026868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // PictureLayer can only be used with impl side painting enabled.
3027868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    settings->impl_side_painting = true;
3028eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    settings->solid_color_scrollbars = true;
3029868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3030868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3031868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
3032868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    layer_ = FakePictureLayer::Create(&client_);
3033868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
3034868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
3035868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3036868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3037868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void BeginTest() OVERRIDE {
30387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    did_initialize_gl_ = false;
30397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    did_release_gl_ = false;
3040868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
3041868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3043868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE {
3044868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<TestWebGraphicsContext3D> context3d(
3045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        TestWebGraphicsContext3D::Create());
3046868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    context3d->set_support_swapbuffers_complete_callback(false);
3047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return FakeOutputSurface::CreateDeferredGL(
3049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        scoped_ptr<SoftwareOutputDevice>(new SoftwareOutputDevice))
3050868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        .PassAs<OutputSurface>();
3051868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3052868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3053868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
3054868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_TRUE(host_impl->RootLayer());
3055868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    FakePictureLayerImpl* layer_impl =
3056868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        static_cast<FakePictureLayerImpl*>(host_impl->RootLayer());
30577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (!did_initialize_gl_) {
3058868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      EXPECT_EQ(1u, layer_impl->append_quads_count());
30597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ImplThreadTaskRunner()->PostTask(
30607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          FROM_HERE,
30617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          base::Bind(
30627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              &LayerTreeHostTestDeferredInitialize::DeferredInitializeAndRedraw,
30637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              base::Unretained(this),
30647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              base::Unretained(host_impl)));
30657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    } else if (did_initialize_gl_ && !did_release_gl_) {
30667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_EQ(2u, layer_impl->append_quads_count());
30677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ImplThreadTaskRunner()->PostTask(
30687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          FROM_HERE,
30697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          base::Bind(
30707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              &LayerTreeHostTestDeferredInitialize::ReleaseGLAndRedraw,
30717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              base::Unretained(this),
30727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              base::Unretained(host_impl)));
30737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    } else if (did_initialize_gl_ && did_release_gl_) {
30747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_EQ(3u, layer_impl->append_quads_count());
30757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EndTest();
3076868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
3077868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3078868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3079868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void DeferredInitializeAndRedraw(LayerTreeHostImpl* host_impl) {
30807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(did_initialize_gl_);
30817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // SetAndInitializeContext3D calls SetNeedsCommit.
3082eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(static_cast<FakeOutputSurface*>(host_impl->output_surface())
3083eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    ->SetAndInitializeContext3D(
3084eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          scoped_ptr<WebKit::WebGraphicsContext3D>(
3085eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              TestWebGraphicsContext3D::Create())));
30867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    did_initialize_gl_ = true;
30877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
30887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
30897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void ReleaseGLAndRedraw(LayerTreeHostImpl* host_impl) {
30907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(did_initialize_gl_);
30917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(did_release_gl_);
30927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // ReleaseGL calls SetNeedsCommit.
30937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    static_cast<FakeOutputSurface*>(host_impl->output_surface())->ReleaseGL();
30947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    did_release_gl_ = true;
3095868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3096868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3097868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {
30987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(did_initialize_gl_);
30997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(did_release_gl_);
3100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
3103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FakeContentLayerClient client_;
3104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<FakePictureLayer> layer_;
31057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool did_initialize_gl_;
31067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool did_release_gl_;
3107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
3108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferredInitialize);
3110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
31117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass PushPropertiesCountingLayer : public Layer {
31127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
31137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static scoped_refptr<PushPropertiesCountingLayer> Create() {
31147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return new PushPropertiesCountingLayer();
31157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
31167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void PushPropertiesTo(LayerImpl* layer) OVERRIDE {
31187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Layer::PushPropertiesTo(layer);
31197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    push_properties_count_++;
31207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (persist_needs_push_properties_)
31217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      needs_push_properties_ = true;
31227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
31237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t push_properties_count() const { return push_properties_count_; }
31257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void reset_push_properties_count() { push_properties_count_ = 0; }
31267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void set_persist_needs_push_properties(bool persist) {
31287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    persist_needs_push_properties_ = persist;
31297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
31307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private:
31327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PushPropertiesCountingLayer()
31337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      : push_properties_count_(0),
31347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        persist_needs_push_properties_(false) {
31357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SetAnchorPoint(gfx::PointF());
31367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SetBounds(gfx::Size(1, 1));
31377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SetIsDrawable(true);
31387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
31397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual ~PushPropertiesCountingLayer() {}
31407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t push_properties_count_;
31427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool persist_needs_push_properties_;
31437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
31447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestLayersPushProperties : public LayerTreeHostTest {
31467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
31477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void BeginTest() OVERRIDE {
31487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    num_commits_ = 0;
31497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_root_ = 0;
31507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_child_ = 0;
31517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_grandchild_ = 0;
31527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_child2_ = 0;
31537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_other_root_ = 0;
31547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_leaf_layer_ = 0;
31557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PostSetNeedsCommitToMainThread();
31567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
31577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
31597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_ = PushPropertiesCountingLayer::Create();
31607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_ = PushPropertiesCountingLayer::Create();
31617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child2_ = PushPropertiesCountingLayer::Create();
31627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grandchild_ = PushPropertiesCountingLayer::Create();
31637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (layer_tree_host()->settings().impl_side_painting)
31657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      leaf_picture_layer_ = FakePictureLayer::Create(&client_);
31667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    else
31677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      leaf_content_layer_ = FakeContentLayer::Create(&client_);
31687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(child_);
31707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(child2_);
31717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_->AddChild(grandchild_);
31727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (leaf_picture_layer_)
31737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      child2_->AddChild(leaf_picture_layer_);
31747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (leaf_content_layer_)
31757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      child2_->AddChild(leaf_content_layer_);
31767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    other_root_ = PushPropertiesCountingLayer::Create();
31787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Don't set the root layer here.
31807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
31817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
31827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
31847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ++num_commits_;
31857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_root_, root_->push_properties_count());
31877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_child_, child_->push_properties_count());
31887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_grandchild_,
31897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              grandchild_->push_properties_count());
31907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_child2_,
31917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              child2_->push_properties_count());
31927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_other_root_,
31937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              other_root_->push_properties_count());
31947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (leaf_content_layer_) {
31957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_EQ(expected_push_properties_leaf_layer_,
31967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                leaf_content_layer_->push_properties_count());
31977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
31987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (leaf_picture_layer_) {
31997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_EQ(expected_push_properties_leaf_layer_,
32007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                leaf_picture_layer_->push_properties_count());
32017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
32027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
32037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // The content/picture layer always needs to be pushed.
32047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (root_->layer_tree_host()) {
32057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_TRUE(root_->descendant_needs_push_properties());
32067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(root_->needs_push_properties());
32077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
32087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (child2_->layer_tree_host()) {
32097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_TRUE(child2_->descendant_needs_push_properties());
32107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(child2_->needs_push_properties());
32117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
32127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (leaf_content_layer_.get() && leaf_content_layer_->layer_tree_host()) {
32137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(leaf_content_layer_->descendant_needs_push_properties());
32147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_TRUE(leaf_content_layer_->needs_push_properties());
32157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
32167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (leaf_picture_layer_.get() && leaf_picture_layer_->layer_tree_host()) {
32177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(leaf_picture_layer_->descendant_needs_push_properties());
32187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_TRUE(leaf_picture_layer_->needs_push_properties());
32197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
32207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
32217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // child_ and grandchild_ don't persist their need to push properties.
32227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (child_->layer_tree_host()) {
32237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(child_->descendant_needs_push_properties());
32247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(child_->needs_push_properties());
32257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
32267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (grandchild_->layer_tree_host()) {
32277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(grandchild_->descendant_needs_push_properties());
32287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(grandchild_->needs_push_properties());
32297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
32307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
32317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (other_root_->layer_tree_host()) {
32327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(other_root_->descendant_needs_push_properties());
32337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(other_root_->needs_push_properties());
32347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
32357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
32367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (num_commits_) {
32377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
32387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
32397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
32407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_root_;
32417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
32427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
32437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child2_;
32447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
32457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 2:
32467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetNeedsCommit();
32477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
32487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
32497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 3:
32507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(other_root_);
32517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
32527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_other_root_;
32537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
32547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 4:
32557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
32567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
32577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_root_;
32587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
32597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
32607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child2_;
32617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
32627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 5:
32637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetNeedsCommit();
32647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
32657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
32667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 6:
32677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
32687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
32697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
32707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 7:
32717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        root_->AddChild(child_);
32727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
32737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
32747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
32757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
32767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 8:
32777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild_->RemoveFromParent();
32787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
32797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
32807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 9:
32817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->AddChild(grandchild_);
32827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
32837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
32847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
32857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 10:
32867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetViewportSize(gfx::Size(20, 20));
32877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
32887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
32897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 11:
32907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.8f, 1.1f);
32917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
32927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
32937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 12:
32947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->SetPosition(gfx::Point(1, 1));
32957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // The modified layer needs commit
32967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
32977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
32987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 13:
32997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child2_->SetPosition(gfx::Point(1, 1));
33007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // The modified layer needs commit
33017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child2_;
33027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 14:
33047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
33057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        root_->AddChild(child_);
33067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
33077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
33087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
33097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 15:
33117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild_->SetPosition(gfx::Point(1, 1));
33127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // The modified layer needs commit
33137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
33147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 16:
33167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->SetNeedsDisplay();
33177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // The modified layer needs commit
33187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
33197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 17:
33217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
33227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
33247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Content/Picture layers require PushProperties every commit that they are
33267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // in the tree.
33277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if ((leaf_content_layer_.get() && leaf_content_layer_->layer_tree_host()) ||
33287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        (leaf_picture_layer_.get() && leaf_picture_layer_->layer_tree_host()))
33297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ++expected_push_properties_leaf_layer_;
33307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
33317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AfterTest() OVERRIDE {}
33337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int num_commits_;
33357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FakeContentLayerClient client_;
33367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> root_;
33377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> child_;
33387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> child2_;
33397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> grandchild_;
33407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> other_root_;
33417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<FakeContentLayer> leaf_content_layer_;
33427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<FakePictureLayer> leaf_picture_layer_;
33437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_root_;
33447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_child_;
33457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_child2_;
33467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_grandchild_;
33477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_other_root_;
33487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_leaf_layer_;
33497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
33507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33517dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestLayersPushProperties);
33527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPropertyChangesDuringUpdateArePushed
33547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTest {
33557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
33567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void BeginTest() OVERRIDE {
33577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PostSetNeedsCommitToMainThread();
33587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
33597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
33617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_ = Layer::Create();
33627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->SetBounds(gfx::Size(1, 1));
33637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool paint_scrollbar = true;
33657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool has_thumb = false;
33667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    scrollbar_layer_ =
33677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        FakeScrollbarLayer::Create(paint_scrollbar, has_thumb, root_->id());
33687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(scrollbar_layer_);
33707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    layer_tree_host()->SetRootLayer(root_);
33727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
33737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
33747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
33767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (layer_tree_host()->commit_number()) {
33777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
33787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1: {
33807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // During update, the ignore_set_needs_commit_ bit is set to true to
33817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // avoid causing a second commit to be scheduled. If a property change
33827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // is made during this, however, it needs to be pushed in the upcoming
33837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // commit.
33847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        scoped_ptr<base::AutoReset<bool> > ignore =
33857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            scrollbar_layer_->IgnoreSetNeedsCommit();
33867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        scrollbar_layer_->SetBounds(gfx::Size(30, 30));
33887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(scrollbar_layer_->needs_push_properties());
33907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
33917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetNeedsCommit();
33927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        scrollbar_layer_->reset_push_properties_count();
33947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_EQ(0u, scrollbar_layer_->push_properties_count());
33957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
33977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 2:
33987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_EQ(1u, scrollbar_layer_->push_properties_count());
33997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
34007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
34027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
34037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AfterTest() OVERRIDE {}
34057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<Layer> root_;
34077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<FakeScrollbarLayer> scrollbar_layer_;
34087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
34097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34107dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPropertyChangesDuringUpdateArePushed);
34117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestCasePushPropertiesThreeGrandChildren
34137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTest {
34147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
34157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void BeginTest() OVERRIDE {
34167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_root_ = 0;
34177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_child_ = 0;
34187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_grandchild1_ = 0;
34197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_grandchild2_ = 0;
34207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_grandchild3_ = 0;
34217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PostSetNeedsCommitToMainThread();
34227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
34237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
34257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_ = PushPropertiesCountingLayer::Create();
34267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_ = PushPropertiesCountingLayer::Create();
34277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grandchild1_ = PushPropertiesCountingLayer::Create();
34287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grandchild2_ = PushPropertiesCountingLayer::Create();
34297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grandchild3_ = PushPropertiesCountingLayer::Create();
34307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(child_);
34327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_->AddChild(grandchild1_);
34337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_->AddChild(grandchild2_);
34347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_->AddChild(grandchild3_);
34357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Don't set the root layer here.
34377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
34387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
34397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AfterTest() OVERRIDE {}
34417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FakeContentLayerClient client_;
34437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> root_;
34447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> child_;
34457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> grandchild1_;
34467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> grandchild2_;
34477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> grandchild3_;
34487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_root_;
34497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_child_;
34507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_grandchild1_;
34517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_grandchild2_;
34527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_grandchild3_;
34537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
34547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesAddingToTreeRequiresPush
34567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
34577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
34587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
34597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int last_source_frame_number = layer_tree_host()->commit_number() - 1;
34607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
34617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
34627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
34637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
34647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
34657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
34667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
34677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
34687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
34697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
34707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
34717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
34727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
34747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->needs_push_properties());
34767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
34777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
34787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
34797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
34807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
34817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
34827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
34837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild3_->needs_push_properties());
34847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
34857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
34877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
34887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
34907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
34917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
34927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34937dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesAddingToTreeRequiresPush);
34947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesRemovingChildStopsRecursion
34967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
34977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
34987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
34997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int last_source_frame_number = layer_tree_host()->commit_number() - 1;
35007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
35017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
35027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
35037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
35047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
35057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
35067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
35077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
35087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
35097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
35107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
35117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
35127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
35137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
35147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
35157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
35177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->SetPosition(gfx::Point(1, 1));
35187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
35207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
35217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
35227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
35237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
35247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
35257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
35267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
35277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->AddChild(grandchild1_);
35297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
35317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
35327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
35337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
35347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
35357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
35367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
35377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
35387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
35397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
35407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->SetPosition(gfx::Point(1, 1));
35427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
35447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
35457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
35467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
35477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
35487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
35497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
35507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
35517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
35527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
35537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // grandchild2_ will still need a push properties.
35557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
35567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
35587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
35597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
35607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
35617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // grandchild3_ does not need a push properties, so recursing should
35637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // no longer be needed.
35647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
35657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
35677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
35687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
35697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
35707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
35717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
35727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
35737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
35747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
35757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35767dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesRemovingChildStopsRecursion);
35777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesRemovingChildStopsRecursionWithPersistence
35797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
35807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
35817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
35827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int last_source_frame_number = layer_tree_host()->commit_number() - 1;
35837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
35847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
35857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
35867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->set_persist_needs_push_properties(true);
35877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->set_persist_needs_push_properties(true);
35887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
35897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
35907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
35917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
35927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
35937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
35947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
35957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
35967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
35977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
35987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
35997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
36007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // grandchild2_ will still need a push properties.
36027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
36037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
36057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
36067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
36077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
36087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // grandchild3_ does not need a push properties, so recursing should
36107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // no longer be needed.
36117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
36127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
36147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
36157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
36167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
36177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
36187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
36197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
36207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
36217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
36227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36237dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(
36247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTestPushPropertiesRemovingChildStopsRecursionWithPersistence);
36257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertiesWhileOutsideTree
36277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
36287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
36297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
36307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int last_source_frame_number = layer_tree_host()->commit_number() - 1;
36317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
36327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
36337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
36347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
36357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
36367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
36377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
36387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
36397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
36407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
36417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
36427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
36437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
36447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
36457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
36467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Change grandchildren while their parent is not in the tree.
36487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
36497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->SetPosition(gfx::Point(1, 1));
36507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->SetPosition(gfx::Point(1, 1));
36517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        root_->AddChild(child_);
36527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
36547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
36557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
36567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
36577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
36587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
36597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
36607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
36617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild3_->needs_push_properties());
36627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
36637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
36657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
36677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
36687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
36697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
36707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
36727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
36747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
36757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
36767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
36777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild3_->RemoveFromParent();
36797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
36817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
36827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
36837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
36847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
36867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
36877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
36887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
36897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
36907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36917dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(
36927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTestPushPropertiesSetPropertiesWhileOutsideTree);
36937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertyInParentThenChild
36957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
36967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
36977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
36987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int last_source_frame_number = layer_tree_host()->commit_number() - 1;
36997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
37007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
37017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
37027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
37037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
37047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
37067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
37077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
37087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
37097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
37107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
37117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
37127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
37137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
37147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->SetPosition(gfx::Point(1, 1));
37167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->SetPosition(gfx::Point(1, 1));
37177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->SetPosition(gfx::Point(1, 1));
37187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
37217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
37227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
37237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
37247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
37257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
37267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
37277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
37287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
37297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
37317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
37347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
37357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
37367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
37387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
37417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
37427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
37437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
37457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
37487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
37507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
37517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
37527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
37537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
37547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37557dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(
37567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTestPushPropertiesSetPropertyInParentThenChild);
37577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertyInChildThenParent
37597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
37607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
37617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
37627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int last_source_frame_number = layer_tree_host()->commit_number() - 1;
37637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
37647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
37657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
37667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
37677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
37687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
37707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
37717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
37727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
37737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
37747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
37757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
37767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
37777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
37787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->SetPosition(gfx::Point(1, 1));
37807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->SetPosition(gfx::Point(1, 1));
37817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->SetPosition(gfx::Point(1, 1));
37827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
37857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
37867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
37877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
37887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
37897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
37907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
37917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
37927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
37937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
37957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
37987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
37997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
38007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
38027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
38047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
38057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
38067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
38077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
38097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
38117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
38127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
38147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
38157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
38167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
38177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
38187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38197dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(
38207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTestPushPropertiesSetPropertyInChildThenParent);
38217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
38232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
3824