layer_tree_host_unittest.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
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"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/base/swap_promise.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/debug/frame_rate_counter.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer_client.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/io_surface_layer.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h"
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/layers/painted_scrollbar_layer.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h"
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/layers/solid_color_layer.h"
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/layers/video_layer.h"
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/begin_frame_args.h"
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/output/copy_output_request.h"
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/copy_output_result.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/output_surface.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_queue.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/frame_rate_controller.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h"
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_content_layer_impl.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h"
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_painted_scrollbar_layer.h"
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/test/fake_picture_layer.h"
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/test/fake_picture_layer_impl.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_proxy.h"
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_scoped_ui_resource.h"
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_video_frame_provider.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h"
4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h"
440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/thread_proxy.h"
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/refptr.h"
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h"
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h"
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkPicture.h"
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/frame_time.h"
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/point_conversions.h"
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h"
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h"
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::_;
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AnyNumber;
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AtLeast;
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::Mock;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTest : public LayerTreeTest {};
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Two setNeedsCommits in a row should lead to at least 1 commit and at least 1
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// draw with frame 0.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit1 : public LayerTreeHostTest {
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetNeedsCommit1() : num_commits_(0), num_draws_(0) {}
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draws_++;
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!impl->active_tree()->source_frame_number())
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_GE(1, num_commits_);
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_GE(1, num_draws_);
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit1);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
103a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// A SetNeedsCommit should lead to 1 commit. Issuing a second commit after that
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// first committed frame draws should lead to another commit.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit2 : public LayerTreeHostTest {
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetNeedsCommit2() : num_commits_(0), num_draws_(0) {}
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_draws_;
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_commits_;
117a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    switch (num_commits_) {
118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 1:
119a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
120a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 2:
122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EndTest();
123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      default:
125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        NOTREACHED();
126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(2, num_commits_);
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_LE(1, num_draws_);
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit2);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that we pass property values in PushPropertiesTo.
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass LayerTreeHostTestPushPropertiesTo : public LayerTreeHostTest {
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void SetupTree() OVERRIDE {
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_refptr<Layer> root = Layer::Create();
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    root->SetBounds(gfx::Size(10, 10));
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    layer_tree_host()->SetRootLayer(root);
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    LayerTreeHostTest::SetupTree();
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  enum Properties {
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    STARTUP,
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    BOUNDS,
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HIDE_LAYER_AND_SUBTREE,
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DRAWS_CONTENT,
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DONE,
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void BeginTest() OVERRIDE {
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    index_ = STARTUP;
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PostSetNeedsCommitToMainThread();
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    VerifyAfterValues(impl->active_tree()->root_layer());
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SetBeforeValues(layer_tree_host()->root_layer());
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    VerifyBeforeValues(layer_tree_host()->root_layer());
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ++index_;
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (index_ == DONE) {
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EndTest();
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return;
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SetAfterValues(layer_tree_host()->root_layer());
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void AfterTest() OVERRIDE {}
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void VerifyBeforeValues(Layer* layer) {
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(gfx::Size(10, 10).ToString(), layer->bounds().ToString());
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(layer->hide_layer_and_subtree());
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(layer->DrawsContent());
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetBeforeValues(Layer* layer) {
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    layer->SetBounds(gfx::Size(10, 10));
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    layer->SetHideLayerAndSubtree(false);
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    layer->SetIsDrawable(false);
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void VerifyAfterValues(LayerImpl* layer) {
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    switch (static_cast<Properties>(index_)) {
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case STARTUP:
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case DONE:
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case BOUNDS:
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        EXPECT_EQ(gfx::Size(20, 20).ToString(), layer->bounds().ToString());
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case HIDE_LAYER_AND_SUBTREE:
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        EXPECT_TRUE(layer->hide_layer_and_subtree());
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case DRAWS_CONTENT:
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        EXPECT_TRUE(layer->DrawsContent());
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetAfterValues(Layer* layer) {
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    switch (static_cast<Properties>(index_)) {
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case STARTUP:
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case DONE:
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case BOUNDS:
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        layer->SetBounds(gfx::Size(20, 20));
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case HIDE_LAYER_AND_SUBTREE:
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        layer->SetHideLayerAndSubtree(true);
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case DRAWS_CONTENT:
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        layer->SetIsDrawable(true);
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int index_;
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesTo);
233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1 setNeedsRedraw after the first commit has completed should lead to 1
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// additional draw.
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedraw : public LayerTreeHostTest {
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetNeedsRedraw() : num_commits_(0), num_draws_(0) {}
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, impl->active_tree()->source_frame_number());
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!num_draws_) {
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Redraw again to verify that the second redraw doesn't commit.
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PostSetNeedsRedrawToMainThread();
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draws_++;
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, num_draws_);
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_GE(2, num_draws_);
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, num_commits_);
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedraw);
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// After setNeedsRedrawRect(invalid_rect) the final damage_rect
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// must contain invalid_rect.
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedrawRect : public LayerTreeHostTest {
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetNeedsRedrawRect()
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : num_draws_(0),
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        bounds_(50, 50),
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        invalid_rect_(10, 10, 20, 20),
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        root_layer_(ContentLayer::Create(&client_)) {}
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetIsDrawable(true);
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(bounds_);
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(bounds_);
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl* host_impl,
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl::FrameData* frame_data,
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(DrawSwapReadbackResult::DRAW_SUCCESS, draw_result);
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::RectF root_damage_rect;
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!frame_data->render_passes.empty())
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_damage_rect = frame_data->render_passes.back()->damage_rect;
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!num_draws_) {
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // If this is the first frame, expect full frame damage.
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_RECT_EQ(root_damage_rect, gfx::Rect(bounds_));
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Check that invalid_rect_ is indeed repainted.
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(root_damage_rect.Contains(invalid_rect_));
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return draw_result;
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!num_draws_) {
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PostSetNeedsRedrawRectToMainThread(invalid_rect_);
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draws_++;
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE { EXPECT_EQ(2, num_draws_); }
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Size bounds_;
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect invalid_rect_;
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<ContentLayer> root_layer_;
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedrawRect);
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromInvalidate : public LayerTreeHostTest {
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
332b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
333b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    settings->layer_transforms_should_scale_layer_contents = true;
334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
335b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    root_layer_ = Layer::Create();
338b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(10, 20));
339b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
340b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    scaled_layer_ = FakeContentLayer::Create(&client_);
341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    scaled_layer_->SetBounds(gfx::Size(1, 1));
342b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    root_layer_->AddChild(scaled_layer_);
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
345b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
346b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
347b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() == 1)
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
356bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    switch (layer_tree_host()->source_frame_number()) {
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
358b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Changing the device scale factor causes a commit. It also changes
359b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // the content bounds of |scaled_layer_|, which should not generate
360b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // a second commit as a result.
361b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetDeviceScaleFactor(4.f);
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No extra commits.
365bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        EXPECT_EQ(2, layer_tree_host()->source_frame_number());
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
369b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
370b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    EXPECT_EQ(gfx::Size(4, 4).ToString(),
371b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)              scaled_layer_->content_bounds().ToString());
372b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
376b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_refptr<Layer> root_layer_;
377b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_refptr<FakeContentLayer> scaled_layer_;
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoExtraCommitFromInvalidate);
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromScrollbarInvalidate
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
385b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
386b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    settings->layer_transforms_should_scale_layer_contents = true;
387b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
390b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    root_layer_ = Layer::Create();
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(10, 20));
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool paint_scrollbar = true;
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool has_thumb = false;
3953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scrollbar_ = FakePaintedScrollbarLayer::Create(
3963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        paint_scrollbar, has_thumb, root_layer_->id());
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetPosition(gfx::Point(0, 10));
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetBounds(gfx::Size(10, 10));
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->AddChild(scrollbar_);
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
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 {
414bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    switch (layer_tree_host()->source_frame_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.
423bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        EXPECT_EQ(2, layer_tree_host()->source_frame_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_;
4353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<FakePaintedScrollbarLayer> 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)
50258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackDuringForcedDraw
50358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public LayerTreeHostTest {
50458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
50558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kFirstCommitSourceFrameNumber = 0;
50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kReadbackSourceFrameNumber = 1;
50758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kReadbackReplacementAndForcedDrawSourceFrameNumber = 2;
50858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeHostTestCompositeAndReadbackDuringForcedDraw()
51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : did_post_readback_(false) {}
51158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
51358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // This enables forced draws after a single prepare to draw failure.
51458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings->timeout_and_draw_when_animation_checkerboards = true;
51558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings->maximum_number_of_failed_draws_before_draw_is_forced_ = 1;
51658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
51758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
51858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl* host_impl,
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl::FrameData* frame_data,
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
52558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kFirstCommitSourceFrameNumber ||
52658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackSourceFrameNumber ||
52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackReplacementAndForcedDrawSourceFrameNumber)
52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
52958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
53058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Before we react to the failed draw by initiating the forced draw
53158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // sequence, start a readback on the main thread.
53258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (sfn == kFirstCommitSourceFrameNumber && !did_post_readback_) {
53358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      did_post_readback_ = true;
53458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      PostReadbackToMainThread();
53558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
53658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Aborting for checkerboarding animations will result in a forced draw.
5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
53958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
54058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
54158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
54258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only draw for the readback and the forced draw.
54358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
54458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kReadbackSourceFrameNumber ||
54558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackReplacementAndForcedDrawSourceFrameNumber)
54658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
54758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
54858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
54958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
55058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   bool result) OVERRIDE {
55158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only swap for the forced draw.
55258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
55358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kReadbackReplacementAndForcedDrawSourceFrameNumber)
55458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
55558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
55658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
55958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool did_post_readback_;
56158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
56258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
56358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackDuringForcedDraw);
56458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
56558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackAfterForcedDraw
56658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public LayerTreeHostTest {
56758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
56858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kFirstCommitSourceFrameNumber = 0;
56958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kForcedDrawSourceFrameNumber = 1;
57058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kReadbackSourceFrameNumber = 2;
57158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kReadbackReplacementSourceFrameNumber = 3;
57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
57458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // This enables forced draws after a single prepare to draw failure.
57558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings->timeout_and_draw_when_animation_checkerboards = true;
57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings->maximum_number_of_failed_draws_before_draw_is_forced_ = 1;
57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl* host_impl,
5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl::FrameData* frame_data,
5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
58658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kFirstCommitSourceFrameNumber ||
58758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kForcedDrawSourceFrameNumber ||
58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackSourceFrameNumber ||
58958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackReplacementSourceFrameNumber)
59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
59158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Aborting for checkerboarding animations will result in a forced draw.
5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
59458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
59558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
59658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
59758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (layer_tree_host()->source_frame_number() ==
59858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        kForcedDrawSourceFrameNumber) {
59958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Avoid aborting the forced draw commit so source_frame_number
60058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // increments.
60158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
60258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    } else if (layer_tree_host()->source_frame_number() ==
60358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)               kReadbackSourceFrameNumber) {
60458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Perform a readback immediately after the forced draw's commit.
60558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      char pixels[4];
60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1));
60758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
60858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
60958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only draw for the the forced draw, readback, and
61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // replacement commit.
61358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
61458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kForcedDrawSourceFrameNumber ||
61558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackSourceFrameNumber ||
61658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackReplacementSourceFrameNumber)
61758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
61858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
61958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
62058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
62158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   bool result) OVERRIDE {
62258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only swap for the forced draw and replacement commit.
62358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
62458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kForcedDrawSourceFrameNumber ||
62558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackReplacementSourceFrameNumber)
62658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
62758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
62858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (sfn == kReadbackReplacementSourceFrameNumber)
62958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EndTest();
63058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
63158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
63258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
63358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackAfterForcedDraw);
63658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestSetNextCommitForcesRedraw : public LayerTreeHostTest {
6384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
6394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerTreeHostTestSetNextCommitForcesRedraw()
6404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : num_draws_(0),
6414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        bounds_(50, 50),
6424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        invalid_rect_(10, 10, 20, 20),
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        root_layer_(ContentLayer::Create(&client_)) {}
6444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
6464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_layer_->SetIsDrawable(true);
6474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_layer_->SetBounds(bounds_);
6484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
6494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_tree_host()->SetViewportSize(bounds_);
6504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
6514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
6524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
6544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (num_draws_ == 3 && host_impl->settings().impl_side_painting)
6554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      host_impl->SetNeedsRedrawRect(invalid_rect_);
6564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
6574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl* host_impl,
6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl::FrameData* frame_data,
6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(DrawSwapReadbackResult::DRAW_SUCCESS, draw_result);
6634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    gfx::RectF root_damage_rect;
6654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!frame_data->render_passes.empty())
6664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      root_damage_rect = frame_data->render_passes.back()->damage_rect;
6674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (num_draws_) {
6694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 0:
6704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_RECT_EQ(gfx::Rect(bounds_), root_damage_rect);
6714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
6724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
6734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
6744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root_damage_rect);
6754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
6764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
6774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_RECT_EQ(invalid_rect_, root_damage_rect);
6784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
6794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
6804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_RECT_EQ(gfx::Rect(bounds_), root_damage_rect);
6814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
6824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      default:
6834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        NOTREACHED();
6844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
6854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return draw_result;
6874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
6884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (num_draws_) {
6914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 0:
6924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
6934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Cycle through a couple of empty commits to ensure we're observing the
6944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // right behavior
6954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
6964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
6974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
6984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Should force full frame damage on the next commit
6994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        PostSetNextCommitForcesRedrawToMainThread();
7004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
7014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        if (host_impl->settings().impl_side_painting)
7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          host_impl->BlockNotifyReadyToActivateForTesting(true);
7034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        else
7044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          num_draws_++;
7054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
7064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
7074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        host_impl->BlockNotifyReadyToActivateForTesting(false);
7084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
7094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      default:
7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
7114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
7124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
7134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    num_draws_++;
7144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
7154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE { EXPECT_EQ(5, num_draws_); }
7174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
7194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int num_draws_;
7204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const gfx::Size bounds_;
7214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const gfx::Rect invalid_rect_;
7224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeContentLayerClient client_;
7234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<ContentLayer> root_layer_;
7244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
7254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNextCommitForcesRedraw);
7274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Tests that if a layer is not drawn because of some reason in the parent then
7291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// its damage is preserved until the next time it is drawn.
7301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class LayerTreeHostTestUndrawnLayersDamageLater : public LayerTreeHostTest {
7311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
7321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  LayerTreeHostTestUndrawnLayersDamageLater()
7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : root_layer_(ContentLayer::Create(&client_)) {}
7341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
7361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    root_layer_->SetIsDrawable(true);
7371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    root_layer_->SetBounds(gfx::Size(50, 50));
7381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
7391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // The initially transparent layer has a larger child layer, which is
7411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // not initially drawn because of the this (parent) layer.
7421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    parent_layer_ = FakeContentLayer::Create(&client_);
7431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    parent_layer_->SetBounds(gfx::Size(15, 15));
7441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    parent_layer_->SetOpacity(0.0f);
7451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    root_layer_->AddChild(parent_layer_);
7461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    child_layer_ = FakeContentLayer::Create(&client_);
7481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    child_layer_->SetBounds(gfx::Size(25, 25));
7491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    parent_layer_->AddChild(child_layer_);
7501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
7521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
7531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
7551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl* host_impl,
7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl::FrameData* frame_data,
7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(DrawSwapReadbackResult::DRAW_SUCCESS, draw_result);
7611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    gfx::RectF root_damage_rect;
7631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!frame_data->render_passes.empty())
7641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      root_damage_rect = frame_data->render_passes.back()->damage_rect;
7651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // The first time, the whole view needs be drawn.
7671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Afterwards, just the opacity of surface_layer1 is changed a few times,
7681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // and each damage should be the bounding box of it and its child. If this
7691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // was working improperly, the damage might not include its childs bounding
7701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // box.
7711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    switch (layer_tree_host()->source_frame_number()) {
7721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 1:
7731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        EXPECT_RECT_EQ(gfx::Rect(root_layer_->bounds()), root_damage_rect);
7741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
7751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 2:
7761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 3:
7771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 4:
7781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        EXPECT_RECT_EQ(gfx::Rect(child_layer_->bounds()), root_damage_rect);
7791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
7801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      default:
7811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        NOTREACHED();
7821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
7831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return draw_result;
7851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
7861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
7881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    switch (layer_tree_host()->source_frame_number()) {
7891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 1:
7901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        // Test not owning the surface.
7911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        parent_layer_->SetOpacity(1.0f);
7921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
7931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 2:
7941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        parent_layer_->SetOpacity(0.0f);
7951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
7961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 3:
7971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        // Test owning the surface.
7981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        parent_layer_->SetOpacity(0.5f);
7991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        parent_layer_->SetForceRenderSurface(true);
8001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
8011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 4:
8021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        EndTest();
8031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
8041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      default:
8051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        NOTREACHED();
8061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
8071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
8081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
8091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
8101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
8111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
8121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  FakeContentLayerClient client_;
8131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<ContentLayer> root_layer_;
8141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<FakeContentLayer> parent_layer_;
8151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<FakeContentLayer> child_layer_;
8161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
8171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
8181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestUndrawnLayersDamageLater);
8191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
820a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Tests that if a layer is not drawn because of some reason in the parent,
821a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// causing its content bounds to not be computed, then when it is later drawn,
822a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// its content bounds get pushed.
823a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostTestUndrawnLayersPushContentBoundsLater
824a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public LayerTreeHostTest {
825a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
826a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LayerTreeHostTestUndrawnLayersPushContentBoundsLater()
827a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      : root_layer_(Layer::Create()) {}
828a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
829a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
830a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    root_layer_->SetIsDrawable(true);
831a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    root_layer_->SetBounds(gfx::Size(20, 20));
832a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
833a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
834a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent_layer_ = Layer::Create();
835a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent_layer_->SetBounds(gfx::Size(20, 20));
836a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent_layer_->SetOpacity(0.0f);
837a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    root_layer_->AddChild(parent_layer_);
838a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
839a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    child_layer_ = Layer::Create();
840a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    child_layer_->SetBounds(gfx::Size(15, 15));
841a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent_layer_->AddChild(child_layer_);
842a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
843a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
844a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
845a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
846a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
847a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
848a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
849a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerImpl* root = host_impl->active_tree()->root_layer();
850a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerImpl* parent = root->children()[0];
851a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerImpl* child = parent->children()[0];
852a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
853a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
854a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      case 0:
855a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        EXPECT_EQ(0.f, parent->opacity());
856a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        EXPECT_EQ(gfx::SizeF(), child->content_bounds());
857a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
858a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      case 1:
859a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        EXPECT_EQ(1.f, parent->opacity());
860a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        EXPECT_EQ(gfx::SizeF(15.f, 15.f), child->content_bounds());
861a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        EndTest();
862a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
863a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      default:
864a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        NOTREACHED();
865a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
866a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
867a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
868a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
869a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    switch (layer_tree_host()->source_frame_number()) {
870a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      case 1:
871a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        parent_layer_->SetOpacity(1.0f);
872a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
873a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      case 2:
874a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
875a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      default:
876a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        NOTREACHED();
877a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
878a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
879a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
880a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
881a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
882a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
883a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_refptr<Layer> root_layer_;
884a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_refptr<Layer> parent_layer_;
885a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_refptr<Layer> child_layer_;
886a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
887a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
888a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
889a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerTreeHostTestUndrawnLayersPushContentBoundsLater);
890a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// If the layerTreeHost says it can't draw, Then we should not try to draw.
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCanDrawBlocksDrawing : public LayerTreeHostTest {
893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerTreeHostTestCanDrawBlocksDrawing() : done_(false) {}
895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (done_)
900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Only the initial draw should bring us here.
902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(impl->CanDraw());
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, impl->active_tree()->source_frame_number());
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (done_)
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
9095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (LastCommittedSourceFrameNumber(impl) >= 1) {
910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // After the first commit, we should not be able to draw.
911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_FALSE(impl->CanDraw());
912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (layer_tree_host()->source_frame_number()) {
9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 1:
9185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Make the viewport empty so the host says it can't draw.
9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(0, 0));
9205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
9215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 2: {
9225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        char pixels[4];
9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1));
9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 3:
9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Let it draw so we go idle and end the test.
9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(1, 1));
9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        done_ = true;
9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EndTest();
9315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool done_;
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestCanDrawBlocksDrawing);
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A compositeAndReadback while invisible should force a normal commit without
944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// assertion.
945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackWhileInvisible
946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestCompositeAndReadbackWhileInvisible() : num_commits_(0) {}
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_commits_ == 1) {
955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->SetVisible(false);
956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      char pixels[4];
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1));
960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackWhileInvisible);
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestAbortFrameWhenInvisible : public LayerTreeHostTest {
974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestAbortFrameWhenInvisible() {}
976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Request a commit (from the main thread), Which will trigger the commit
979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // flow from the impl side.
980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetNeedsCommit();
981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Then mark ourselves as not visible before processing any more messages
982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // on the main thread.
983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetVisible(false);
984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If we make it without kicking a frame, we pass!
985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTestAfterDelay(1);
986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Layout() OVERRIDE {
989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_FALSE(true);
990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAbortFrameWhenInvisible);
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test verifies that properties on the layer tree host are commited
999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to the impl side.
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCommit : public LayerTreeHostTest {
1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestCommit() {}
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(20, 20));
1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->set_background_color(SK_ColorGRAY);
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
101258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(gfx::Size(20, 20), impl->DrawViewportSize());
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(SK_ColorGRAY, impl->active_tree()->background_color());
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCommit);
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This test verifies that LayerTreeHostImpl's current frame time gets
102490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// updated in consecutive frames when it doesn't draw due to tree
102590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// activation failure.
102690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestFrameTimeUpdatesAfterActivationFails
102790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : public LayerTreeHostTest {
102890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
1029424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LayerTreeHostTestFrameTimeUpdatesAfterActivationFails()
1030424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      : frame_count_with_pending_tree_(0) {}
103190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
103290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
103390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(20, 20));
103490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    layer_tree_host()->set_background_color(SK_ColorGRAY);
103590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
103690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
103790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
103890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginCommitOnThread(LayerTreeHostImpl* impl) OVERRIDE {
10404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(frame_count_with_pending_tree_, 0);
10414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    impl->BlockNotifyReadyToActivateForTesting(true);
10424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
10434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void WillBeginImplFrameOnThread(LayerTreeHostImpl* impl,
1045424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                          const BeginFrameArgs& args) OVERRIDE {
10464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (impl->pending_tree())
1047424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      frame_count_with_pending_tree_++;
10484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (frame_count_with_pending_tree_ == 1) {
10504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_EQ(first_frame_time_.ToInternalValue(), 0);
10514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      first_frame_time_ = impl->CurrentFrameTimeTicks();
1052a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    } else if (frame_count_with_pending_tree_ == 2) {
1053a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      impl->BlockNotifyReadyToActivateForTesting(false);
10544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1055424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1056424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
105790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1058424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (frame_count_with_pending_tree_ > 1) {
10594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_NE(first_frame_time_.ToInternalValue(), 0);
1060424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      EXPECT_NE(first_frame_time_.ToInternalValue(),
1061424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                impl->CurrentFrameTimeTicks().ToInternalValue());
106290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EndTest();
106390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return;
106490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
106590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
106690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_FALSE(impl->settings().impl_side_painting);
106790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EndTest();
106890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
1069424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1070424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (impl->settings().impl_side_painting)
1071424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      EXPECT_NE(frame_count_with_pending_tree_, 1);
107290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
107390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
107490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
107590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
107690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
1077424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int frame_count_with_pending_tree_;
107890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::TimeTicks first_frame_time_;
107990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
108090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
108190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
108290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LayerTreeHostTestFrameTimeUpdatesAfterActivationFails);
108390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
108490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This test verifies that LayerTreeHostImpl's current frame time gets
108590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// updated in consecutive frames when it draws in each frame.
108690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestFrameTimeUpdatesAfterDraw : public LayerTreeHostTest {
108790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
108890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LayerTreeHostTestFrameTimeUpdatesAfterDraw() : frame_(0) {}
108990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
109090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
109190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(20, 20));
109290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    layer_tree_host()->set_background_color(SK_ColorGRAY);
109390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
109490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
109690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
109790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
109890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    frame_++;
109990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (frame_ == 1) {
110090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      first_frame_time_ = impl->CurrentFrameTimeTicks();
110190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      impl->SetNeedsRedraw();
110290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // Since we might use a low-resolution clock on Windows, we need to
11041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // make sure that the clock has incremented past first_frame_time_.
11055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      while (first_frame_time_ == gfx::FrameTime::Now()) {
11065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
110790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
110890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return;
110990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
111090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
111190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_NE(first_frame_time_, impl->CurrentFrameTimeTicks());
111290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EndTest();
111390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
111490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
111590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
111690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Ensure there isn't a commit between the two draws, to ensure that a
111790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // commit isn't required for updating the current frame time. We can
111890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // only check for this in the multi-threaded case, since in the single-
111990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // threaded case there will always be a commit between consecutive draws.
1120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (HasImplThread())
112190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_EQ(0, frame_);
112290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
112390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
112490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
112590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
112690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
112790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int frame_;
112890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::TimeTicks first_frame_time_;
112990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
113090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
113190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFrameTimeUpdatesAfterDraw);
113290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verifies that StartPageScaleAnimation events propagate correctly
1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from LayerTreeHost to LayerTreeHostImpl in the MT compositor.
11355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestStartPageScaleAnimation : public LayerTreeHostTest {
1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
11370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  LayerTreeHostTestStartPageScaleAnimation() {}
1138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
1140a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
1141a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
11420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (layer_tree_host()->settings().impl_side_painting) {
11430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      scoped_refptr<FakePictureLayer> layer =
11440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          FakePictureLayer::Create(&client_);
11450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      layer->set_always_update_resources(true);
11460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      scroll_layer_ = layer;
11470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    } else {
11480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      scroll_layer_ = FakeContentLayer::Create(&client_);
11490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
11500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
11515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Layer* root_layer = layer_tree_host()->root_layer();
11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scroll_layer_->SetScrollClipLayerId(root_layer->id());
11535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scroll_layer_->SetIsContainerForFixedPositionLayers(true);
11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scroll_layer_->SetBounds(gfx::Size(2 * root_layer->bounds().width(),
11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       2 * root_layer->bounds().height()));
1156a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    scroll_layer_->SetScrollOffset(gfx::Vector2d());
1157a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(scroll_layer_);
11585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // This test requires the page_scale and inner viewport layers to be
11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // identified.
11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    layer_tree_host()->RegisterViewportLayers(
11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        root_layer, scroll_layer_.get(), NULL);
11620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.5f, 2.f);
1163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
1164a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
11655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void ApplyScrollAndScale(const gfx::Vector2d& scroll_delta,
11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   float scale) OVERRIDE {
1169a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    gfx::Vector2d offset = scroll_layer_->scroll_offset();
1170a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    scroll_layer_->SetScrollOffset(offset + scroll_delta);
1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetPageScaleFactorAndLimits(scale, 0.5f, 2.f);
1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // We get one commit before the first draw, and the animation doesn't happen
1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // until the second draw.
1177a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
1178a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 0:
1179a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EXPECT_EQ(1.f, impl->active_tree()->page_scale_factor());
1180a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        // We'll start an animation when we get back to the main thread.
1181a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
1182a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 1:
1183a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EXPECT_EQ(1.f, impl->active_tree()->page_scale_factor());
1184a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
1185a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 2:
1186a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EXPECT_EQ(1.25f, impl->active_tree()->page_scale_factor());
1187a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EndTest();
1188a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
1189a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      default:
1190a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        NOTREACHED();
1191a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
1192a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
1193a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1194a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1195bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    switch (layer_tree_host()->source_frame_number()) {
1196a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 1:
1197a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        layer_tree_host()->StartPageScaleAnimation(
1198a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            gfx::Vector2d(), false, 1.25f, base::TimeDelta());
1199a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1204a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1205a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  FakeContentLayerClient client_;
12060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_refptr<Layer> scroll_layer_;
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestStartPageScaleAnimation);
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetVisible : public LayerTreeHostTest {
1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetVisible() : num_draws_(0) {}
1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetVisibleToMainThread(false);
1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This is suppressed while we're invisible.
1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsRedrawToMainThread();
1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Triggers the redraw.
1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetVisibleToMainThread(true);
1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(impl->visible());
1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_draws_;
1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_draws_); }
1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetVisible);
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestOpacityChangeLayerDelegate : public ContentLayerClient {
1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestOpacityChangeLayerDelegate() : test_layer_(0) {}
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetTestLayer(Layer* test_layer) { test_layer_ = test_layer; }
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void PaintContents(SkCanvas*, const gfx::Rect&,
12455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             gfx::RectF*) OVERRIDE {
1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Set layer opacity to 0.
1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (test_layer_)
1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      test_layer_->SetOpacity(0.f);
1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidChangeLayerCanUseLCDText() OVERRIDE {}
1251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual bool FillsBoundsCompletely() const OVERRIDE { return false; }
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Layer* test_layer_;
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContentLayerWithUpdateTracking : public ContentLayer {
1258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_refptr<ContentLayerWithUpdateTracking> Create(
1260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ContentLayerClient* client) {
1261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return make_scoped_refptr(new ContentLayerWithUpdateTracking(client));
1262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int PaintContentsCount() { return paint_contents_count_; }
1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ResetPaintContentsCount() { paint_contents_count_ = 0; }
1266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual bool Update(ResourceUpdateQueue* queue,
1268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      const OcclusionTracker<Layer>* occlusion) OVERRIDE {
12697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool updated = ContentLayer::Update(queue, occlusion);
1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    paint_contents_count_++;
12717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return updated;
1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit ContentLayerWithUpdateTracking(ContentLayerClient* client)
1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : ContentLayer(client), paint_contents_count_(0) {
1277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetAnchorPoint(gfx::PointF(0.f, 0.f));
1278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetBounds(gfx::Size(10, 10));
1279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetIsDrawable(true);
1280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~ContentLayerWithUpdateTracking() {}
1282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int paint_contents_count_;
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Layer opacity change during paint should not prevent compositor resources
1287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from being updated during commit.
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestOpacityChange : public LayerTreeHostTest {
1289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestOpacityChange()
1291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : test_opacity_change_delegate_(),
1292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        update_check_layer_(ContentLayerWithUpdateTracking::Create(
1293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            &test_opacity_change_delegate_)) {
1294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_opacity_change_delegate_.SetTestLayer(update_check_layer_.get());
1295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(10, 10));
1299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(update_check_layer_);
1300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
1309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Update() should have been called once.
1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, update_check_layer_->PaintContentsCount());
1311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestOpacityChangeLayerDelegate test_opacity_change_delegate_;
1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<ContentLayerWithUpdateTracking> update_check_layer_;
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestOpacityChange);
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NoScaleContentLayer : public ContentLayer {
1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_refptr<NoScaleContentLayer> Create(ContentLayerClient* client) {
1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return make_scoped_refptr(new NoScaleContentLayer(client));
1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CalculateContentsScale(float ideal_contents_scale,
1327b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                      float device_scale_factor,
1328b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                      float page_scale_factor,
1329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                      float maximum_animation_contents_scale,
1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      bool animating_transform_to_screen,
1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      float* contents_scale_x,
1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      float* contents_scale_y,
1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      gfx::Size* contentBounds) OVERRIDE {
1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Skip over the ContentLayer's method to the base Layer class.
1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer::CalculateContentsScale(ideal_contents_scale,
1336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                  device_scale_factor,
1337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                  page_scale_factor,
1338c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  maximum_animation_contents_scale,
1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  animating_transform_to_screen,
1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  contents_scale_x,
1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  contents_scale_y,
1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  contentBounds);
1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit NoScaleContentLayer(ContentLayerClient* client)
1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : ContentLayer(client) {}
1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~NoScaleContentLayer() {}
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers
1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers()
1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : root_layer_(NoScaleContentLayer::Create(&client_)),
1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        child_layer_(ContentLayer::Create(&client_)) {}
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(60, 60));
1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetDeviceScaleFactor(1.5);
1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(gfx::Size(60, 60), layer_tree_host()->device_viewport_size());
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->AddChild(child_layer_);
13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetIsDrawable(true);
1366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(30, 30));
1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f));
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer_->SetIsDrawable(true);
1370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer_->SetPosition(gfx::Point(2, 2));
1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer_->SetBounds(gfx::Size(10, 10));
1372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f));
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Should only do one commit.
1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, impl->active_tree()->source_frame_number());
1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Device scale factor should come over to impl.
1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_NEAR(impl->device_scale_factor(), 1.5f, 0.00001f);
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Both layers are on impl.
1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(1u, impl->active_tree()->root_layer()->children().size());
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Device viewport is scaled.
138958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(gfx::Size(60, 60), impl->DrawViewportSize());
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerImpl* root = impl->active_tree()->root_layer();
1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerImpl* child = impl->active_tree()->root_layer()->children()[0];
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Positions remain in layout pixels.
1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(gfx::Point(0, 0), root->position());
1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(gfx::Point(2, 2), child->position());
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Compute all the layer transforms for the frame.
1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostImpl::FrameData frame_data;
1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    impl->PrepareToDraw(&frame_data, gfx::Rect());
1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    impl->DidDrawAllLayers(frame_data);
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const LayerImplList& render_surface_layer_list =
1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        *frame_data.render_surface_layer_list;
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Both layers should be drawing into the root render surface.
1407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(1u, render_surface_layer_list.size());
1408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(root->render_surface(),
1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              render_surface_layer_list[0]->render_surface());
1410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(2u, root->render_surface()->layer_list().size());
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The root render surface is the size of the viewport.
1413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_RECT_EQ(gfx::Rect(0, 0, 60, 60),
1414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   root->render_surface()->content_rect());
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The content bounds of the child should be scaled.
1417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Size child_bounds_scaled =
1418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        gfx::ToCeiledSize(gfx::ScaleSize(child->bounds(), 1.5));
1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(child_bounds_scaled, child->content_bounds());
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform scale_transform;
1422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scale_transform.Scale(impl->device_scale_factor(),
1423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          impl->device_scale_factor());
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The root layer is scaled by 2x.
1426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform root_screen_space_transform = scale_transform;
1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform root_draw_transform = scale_transform;
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(root_draw_transform, root->draw_transform());
1430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(root_screen_space_transform, root->screen_space_transform());
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The child is at position 2,2, which is transformed to 3,3 after the scale
1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform child_screen_space_transform;
1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_screen_space_transform.Translate(3.f, 3.f);
1435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform child_draw_transform = child_screen_space_transform;
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRANSFORMATION_MATRIX_EQ(child_draw_transform,
1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    child->draw_transform());
1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRANSFORMATION_MATRIX_EQ(child_screen_space_transform,
1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    child->screen_space_transform());
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<NoScaleContentLayer> root_layer_;
1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<ContentLayer> child_layer_;
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers);
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify atomicity of commits and reuse of textures.
14563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class LayerTreeHostTestDirectRendererAtomicCommit : public LayerTreeHostTest {
1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
14590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    settings->texture_id_allocation_chunk_size = 1;
1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Make sure partial texture updates are turned off.
1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings->max_partial_texture_updates = 0;
1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Linear fade animator prevents scrollbars from drawing immediately.
1463424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    settings->scrollbar_animator = LayerTreeSettings::NoAnimator;
1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_ = FakeContentLayer::Create(&client_);
1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_->SetBounds(gfx::Size(10, 20));
1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool paint_scrollbar = true;
1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool has_thumb = false;
14723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scrollbar_ = FakePaintedScrollbarLayer::Create(
14733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        paint_scrollbar, has_thumb, layer_->id());
1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetPosition(gfx::Point(0, 10));
1475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetBounds(gfx::Size(10, 10));
1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_->AddChild(scrollbar_);
1478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
148390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
148490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    drew_frame_ = -1;
148590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
148690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(0u, layer_tree_host()->settings().max_partial_texture_updates);
1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 0:
1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures should be one for each layer
1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ASSERT_EQ(2u, context->NumTextures());
1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures used for commit should be one for each layer.
1498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Verify that used texture is correct.
1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
15063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Number of textures should be one for scrollbar layer since it was
15073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // requested and deleted on the impl-thread, and double for the content
15083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // layer since its first texture is used by impl thread and cannot by
15093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // used for update.
15103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ASSERT_EQ(3u, context->NumTextures());
15113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Number of textures used for commit should be one for each layer.
1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
1513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // First textures should not have been used.
1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(context->UsedTexture(context->TextureAt(0)));
15153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // New textures should have been used.
1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EndTest();
1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
15305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
153290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (drew_frame_ == impl->active_tree()->source_frame_number()) {
153390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_EQ(0u, context->NumUsedTextures()) << "For frame " << drew_frame_;
153490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return;
153590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
153690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    drew_frame_ = impl->active_tree()->source_frame_number();
153790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1538a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // We draw/ship one texture each frame for each layer.
1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(2u, context->NumUsedTextures());
1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    context->ResetUsedTextures();
154123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
154223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    if (!TestEnded())
154323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      PostSetNeedsCommitToMainThread();
1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Layout() OVERRIDE {
1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_->SetNeedsDisplay();
1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetNeedsDisplay();
1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) protected:
1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> layer_;
15563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<FakePaintedScrollbarLayer> scrollbar_;
155790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int drew_frame_;
1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F(
15613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    LayerTreeHostTestDirectRendererAtomicCommit);
15623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
15633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class LayerTreeHostTestDelegatingRendererAtomicCommit
15643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : public LayerTreeHostTestDirectRendererAtomicCommit {
15653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
15663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
15673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_EQ(0u, layer_tree_host()->settings().max_partial_texture_updates);
15683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
15695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
15703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
15713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
15723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case 0:
15733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Number of textures should be one for each layer
15743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ASSERT_EQ(2u, context->NumTextures());
15753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Number of textures used for commit should be one for each layer.
15763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
15773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Verify that used texture is correct.
15783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
15793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
15803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        context->ResetUsedTextures();
15813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        break;
15823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case 1:
15833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Number of textures should be doubled as the first context layer
15843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // texture is being used by the impl-thread and cannot be used for
15853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // update.  The scrollbar behavior is different direct renderer because
15863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // UI resource deletion with delegating renderer occurs after tree
15873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // activation.
15883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ASSERT_EQ(4u, context->NumTextures());
15893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Number of textures used for commit should still be
15903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // one for each layer.
15913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
15923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // First textures should not have been used.
15933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_FALSE(context->UsedTexture(context->TextureAt(0)));
15943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_FALSE(context->UsedTexture(context->TextureAt(1)));
15953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // New textures should have been used.
15963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
15973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
15983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        context->ResetUsedTextures();
15993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        break;
16003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case 2:
16013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EndTest();
16023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        break;
16033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      default:
16043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        NOTREACHED();
16053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        break;
16063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
16073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
16083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
16093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
161023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)MULTI_THREAD_DELEGATING_RENDERER_NOIMPL_TEST_F(
161123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    LayerTreeHostTestDelegatingRendererAtomicCommit);
1612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void SetLayerPropertiesForTesting(Layer* layer,
1614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         Layer* parent,
1615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         const gfx::Transform& transform,
16165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         const gfx::PointF& anchor,
16175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         const gfx::PointF& position,
16185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         const gfx::Size& bounds,
1619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         bool opaque) {
1620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->RemoveAllChildren();
1621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (parent)
1622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    parent->AddChild(layer);
1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetTransform(transform);
1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetAnchorPoint(anchor);
1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetPosition(position);
1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetBounds(bounds);
1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetContentsOpaque(opaque);
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAtomicCommitWithPartialUpdate
1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
16340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    settings->texture_id_allocation_chunk_size = 1;
1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Allow one partial texture update.
1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings->max_partial_texture_updates = 1;
1637a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // No partial updates when impl side painting is enabled.
1638a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    settings->impl_side_painting = false;
1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    parent_ = FakeContentLayer::Create(&client_);
1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    parent_->SetBounds(gfx::Size(10, 20));
1644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_ = FakeContentLayer::Create(&client_);
1646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_->SetPosition(gfx::Point(0, 10));
1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_->SetBounds(gfx::Size(3, 10));
1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    parent_->AddChild(child_);
1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(parent_);
1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
165690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
165790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1658bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    switch (layer_tree_host()->source_frame_number()) {
165990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 1:
166090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        parent_->SetNeedsDisplay();
166190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        child_->SetNeedsDisplay();
166290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
166390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 2:
166490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        // Damage part of layers.
166590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        parent_->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f));
166690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        child_->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f));
166790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
166890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 3:
166990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        child_->SetNeedsDisplay();
167090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(10, 10));
167190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
167290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 4:
167390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(10, 20));
167490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
167590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 5:
167690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        EndTest();
167790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
167890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      default:
1679bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        NOTREACHED() << layer_tree_host()->source_frame_number();
168090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
168190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
168290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(1u, layer_tree_host()->settings().max_partial_texture_updates);
1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 0:
1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures should be one for each layer.
1692a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ASSERT_EQ(2u, context->NumTextures());
1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures used for commit should be one for each layer.
1694a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Verify that used textures are correct.
1696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
1697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
17014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        if (HasImplThread()) {
17024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // Number of textures should be two for each content layer.
17034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ASSERT_EQ(4u, context->NumTextures());
17044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        } else {
17054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // In single thread we can always do partial updates, so the limit has
17064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // no effect.
17074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ASSERT_EQ(2u, context->NumTextures());
17084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
1709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures used for commit should be one for each content
1710a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // layer.
1711a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
1712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        if (HasImplThread()) {
17144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // First content textures should not have been used.
17154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_FALSE(context->UsedTexture(context->TextureAt(0)));
17164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_FALSE(context->UsedTexture(context->TextureAt(1)));
17174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // New textures should have been used.
17184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
17194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
17204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        } else {
17214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // In single thread we can always do partial updates, so the limit has
17224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // no effect.
17234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
17244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
17254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
17304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        if (HasImplThread()) {
17314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // Number of textures should be two for each content layer.
17324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ASSERT_EQ(4u, context->NumTextures());
17334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        } else {
17344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // In single thread we can always do partial updates, so the limit has
17354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // no effect.
17364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ASSERT_EQ(2u, context->NumTextures());
17374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures used for commit should be one for each content
1739a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // layer.
1740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
1741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        if (HasImplThread()) {
17434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // One content layer does a partial update also.
17444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
17454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_FALSE(context->UsedTexture(context->TextureAt(3)));
17464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        } else {
17474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // In single thread we can always do partial updates, so the limit has
17484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // no effect.
17494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
17504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
17514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 3:
1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No textures should be used for commit.
1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(0u, context->NumUsedTextures());
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 4:
1762a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Number of textures used for commit should be one, for the
1763a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // content layer.
1764a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(1u, context->NumUsedTextures());
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
177590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_LT(impl->active_tree()->source_frame_number(), 5);
177690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Number of textures used for drawing should one per layer except for
1780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // frame 3 where the viewport only contains one layer.
178190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (impl->active_tree()->source_frame_number() == 3) {
1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(1u, context->NumUsedTextures());
178390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
17845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(2u, context->NumUsedTextures())
17855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          << "For frame " << impl->active_tree()->source_frame_number();
178690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
1787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    context->ResetUsedTextures();
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<FakeContentLayer> parent_;
1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> child_;
1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1799a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Partial updates are not possible with a delegating renderer.
180090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
1801a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LayerTreeHostTestAtomicCommitWithPartialUpdate);
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestFinishAllRendering : public LayerTreeHostTest {
1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestFinishAllRendering() : once_(false), draw_count_(0) {}
18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetNeedsRedraw();
1809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (once_)
1814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
1815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    once_ = true;
1816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetNeedsRedraw();
18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::AutoLock lock(lock_);
1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      draw_count_ = 0;
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->FinishAllRendering();
18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::AutoLock lock(lock_);
1824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(0, draw_count_);
18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::AutoLock lock(lock_);
1831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++draw_count_;
1832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool once_;
1838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Lock lock_;
1839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int draw_count_;
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFinishAllRendering);
18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackCleanup : public LayerTreeHostTest {
1845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer* root_layer = layer_tree_host()->root_layer();
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    char pixels[4];
1850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->CompositeAndReadback(static_cast<void*>(&pixels),
1851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                            gfx::Rect(0, 0, 1, 1));
1852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(root_layer->render_surface());
18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackCleanup);
1861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit
1863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
18647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
18657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
18667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_layer_ = FakeContentLayer::Create(&client_);
1867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(100, 100));
18687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
18697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    surface_layer1_ = FakeContentLayer::Create(&client_);
1870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer1_->SetBounds(gfx::Size(100, 100));
1871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer1_->SetForceRenderSurface(true);
1872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer1_->SetOpacity(0.5f);
18737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_layer_->AddChild(surface_layer1_);
18747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
18757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    surface_layer2_ = FakeContentLayer::Create(&client_);
1876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer2_->SetBounds(gfx::Size(100, 100));
1877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer2_->SetForceRenderSurface(true);
1878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer2_->SetOpacity(0.5f);
18797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    surface_layer1_->AddChild(surface_layer2_);
1880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    replica_layer1_ = FakeContentLayer::Create(&client_);
1882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer1_->SetReplicaLayer(replica_layer1_.get());
18837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
18847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    replica_layer2_ = FakeContentLayer::Create(&client_);
1885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer2_->SetReplicaLayer(replica_layer2_.get());
1886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
18887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
18897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
1892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
1894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Renderer* renderer = host_impl->renderer();
1895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderPass::Id surface1_render_pass_id = host_impl->active_tree()
18965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 ->root_layer()
18975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 ->children()[0]
18985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 ->render_surface()
18995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 ->RenderPassId();
19005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RenderPass::Id surface2_render_pass_id = host_impl->active_tree()
19015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 ->root_layer()
19025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 ->children()[0]
19035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 ->children()[0]
19045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 ->render_surface()
19055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 ->RenderPassId();
1906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
1908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 0:
19095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_TRUE(
19105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            renderer->HasAllocatedResourcesForTesting(surface1_render_pass_id));
19115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_TRUE(
19125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            renderer->HasAllocatedResourcesForTesting(surface2_render_pass_id));
1913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Reduce the memory limit to only fit the root layer and one render
1915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // surface. This prevents any contents drawing into surfaces
1916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // from being allocated.
1917a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        host_impl->SetMemoryPolicy(ManagedMemoryPolicy(100 * 100 * 4 * 2));
1918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
19205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_FALSE(
19215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            renderer->HasAllocatedResourcesForTesting(surface1_render_pass_id));
19225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_FALSE(
19235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            renderer->HasAllocatedResourcesForTesting(surface2_render_pass_id));
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EndTest();
1926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1931bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    if (layer_tree_host()->source_frame_number() < 2)
1932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_layer_->SetNeedsDisplay();
1933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
19367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_LE(2u, root_layer_->update_count());
19377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_LE(2u, surface_layer1_->update_count());
19387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_LE(2u, surface_layer2_->update_count());
1939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root_layer_;
1943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> surface_layer1_;
1944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> replica_layer1_;
1945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> surface_layer2_;
1946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> replica_layer2_;
1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Surfaces don't exist with a delegated renderer.
19508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F(
1951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit);
19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EvictionTestLayer : public Layer {
1954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_refptr<EvictionTestLayer> Create() {
1956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return make_scoped_refptr(new EvictionTestLayer());
1957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1959a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool Update(ResourceUpdateQueue*,
1960a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      const OcclusionTracker<Layer>*) OVERRIDE;
1961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool DrawsContent() const OVERRIDE { return true; }
1962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl)
1964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OVERRIDE;
1965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void PushPropertiesTo(LayerImpl* impl) OVERRIDE;
1966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetTexturePriorities(const PriorityCalculator&) OVERRIDE;
1967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool HaveBackingTexture() const {
1969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return texture_.get() ? texture_->have_backing_texture() : false;
1970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EvictionTestLayer() : Layer() {}
1974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~EvictionTestLayer() {}
1975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CreateTextureIfNeeded() {
1977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (texture_)
1978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
1979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    texture_ = PrioritizedResource::Create(
1980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->contents_texture_manager());
1981d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    texture_->SetDimensions(gfx::Size(10, 10), RGBA_8888);
1982effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bitmap_.allocN32Pixels(10, 10);
1983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<PrioritizedResource> texture_;
1986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkBitmap bitmap_;
19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EvictionTestLayerImpl : public LayerImpl {
1990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_ptr<EvictionTestLayerImpl> Create(LayerTreeImpl* tree_impl,
1992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                  int id) {
1993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return make_scoped_ptr(new EvictionTestLayerImpl(tree_impl, id));
1994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~EvictionTestLayerImpl() {}
1996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AppendQuads(QuadSink* quad_sink,
1998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           AppendQuadsData* append_quads_data) OVERRIDE {
1999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(has_texture_);
2000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_NE(0u, layer_tree_impl()->resource_provider()->num_resources());
2001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetHasTexture(bool has_texture) { has_texture_ = has_texture; }
2004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EvictionTestLayerImpl(LayerTreeImpl* tree_impl, int id)
2007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : LayerImpl(tree_impl, id), has_texture_(false) {}
2008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool has_texture_;
2010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::SetTexturePriorities(const PriorityCalculator&) {
2013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateTextureIfNeeded();
2014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!texture_)
2015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  texture_->set_request_priority(PriorityCalculator::UIPriority(true));
2017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool EvictionTestLayer::Update(ResourceUpdateQueue* queue,
2020a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               const OcclusionTracker<Layer>* occlusion) {
2021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateTextureIfNeeded();
2022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!texture_)
20237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
2024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect full_rect(0, 0, 10, 10);
2026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResourceUpdate upload = ResourceUpdate::Create(
2027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      texture_.get(), &bitmap_, full_rect, full_rect, gfx::Vector2d());
2028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  queue->AppendFullUpload(upload);
20297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return true;
2030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<LayerImpl> EvictionTestLayer::CreateLayerImpl(
2033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeImpl* tree_impl) {
2034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return EvictionTestLayerImpl::Create(tree_impl, layer_id_)
2035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .PassAs<LayerImpl>();
2036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::PushPropertiesTo(LayerImpl* layer_impl) {
2039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Layer::PushPropertiesTo(layer_impl);
20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EvictionTestLayerImpl* test_layer_impl =
2042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      static_cast<EvictionTestLayerImpl*>(layer_impl);
2043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_layer_impl->SetHasTexture(texture_->have_backing_texture());
2044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestEvictTextures : public LayerTreeHostTest {
2047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestEvictTextures()
2049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : layer_(EvictionTestLayer::Create()),
2050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        impl_for_evict_textures_(0),
2051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_commits_(0) {}
2052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
2055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(10, 20));
2056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform identity_matrix;
2058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetLayerPropertiesForTesting(layer_.get(),
2059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 0,
2060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 identity_matrix,
2061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 gfx::PointF(0.f, 0.f),
2062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 gfx::PointF(0.f, 0.f),
2063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 gfx::Size(10, 20),
2064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 true);
2065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void PostEvictTextures() {
2070eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ImplThreadTaskRunner()->PostTask(
2071eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        FROM_HERE,
2072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&LayerTreeHostTestEvictTextures::EvictTexturesOnImplThread,
2073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   base::Unretained(this)));
2074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void EvictTexturesOnImplThread() {
2077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(impl_for_evict_textures_);
2078eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    impl_for_evict_textures_->EvictTexturesForTesting();
2079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 1: Just commit and draw normally, then post an eviction at the end
2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // that will trigger a commit.
2083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 2: Triggered by the eviction, let it go through and then set
2084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // needsCommit.
2085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 3: Triggered by the setNeedsCommit. In Layout(), post an eviction
2086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // task, which will be handled before the commit. Don't set needsCommit, it
2087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // should have been posted. A frame should not be drawn (note,
2088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // didCommitAndDrawFrame may be called anyway).
2089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 4: Triggered by the eviction, let it go through and then set
2090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // needsCommit.
2091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 5: Triggered by the setNeedsCommit, post an eviction task in
2092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Layout(), a frame should not be drawn but a commit will be posted.
2093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 6: Triggered by the eviction, post an eviction task in
2094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Layout(), which will be a noop, letting the commit (which recreates the
2095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // textures) go through and draw a frame, then end the test.
2096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
2097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commits 1+2 test the eviction recovery path where eviction happens outside
2098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // of the beginFrame/commit pair.
2099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commits 3+4 test the eviction recovery path where eviction happens inside
2100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the beginFrame/commit pair.
2101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commits 5+6 test the path where an eviction happens during the eviction
2102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // recovery path.
2103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
2104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_commits_) {
2105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
2106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_->HaveBackingTexture());
2107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostEvictTextures();
2108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
2110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_->HaveBackingTexture());
2111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
2112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 3:
2114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 4:
2116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_->HaveBackingTexture());
2117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
2118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 5:
2120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 6:
2122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_->HaveBackingTexture());
2123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EndTest();
2124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
2126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
2127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
2132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    impl_for_evict_textures_ = impl;
2133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Layout() OVERRIDE {
2136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_commits_;
2137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_commits_) {
2138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
2139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
2140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 3:
2142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostEvictTextures();
2143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 4:
2145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // We couldn't check in didCommitAndDrawFrame on commit 3,
2146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // so check here.
2147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(layer_->HaveBackingTexture());
2148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 5:
2150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostEvictTextures();
2151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 6:
2153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // We couldn't check in didCommitAndDrawFrame on commit 5,
2154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // so check here.
2155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(layer_->HaveBackingTexture());
2156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostEvictTextures();
2157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
2159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
2160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
2168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<EvictionTestLayer> layer_;
2169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostImpl* impl_for_evict_textures_;
2170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
2171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostTestEvictTextures);
21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestContinuousCommit : public LayerTreeHostTest {
2176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestContinuousCommit()
2178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : num_commit_complete_(0), num_draw_layers_(0) {}
2179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(10, 10));
2182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10));
2183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
2188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 2)
2189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
2190558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    layer_tree_host()->SetNeedsCommit();
2191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
2194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 1)
2195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      num_commit_complete_++;
2196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
2199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draw_layers_++;
2200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 2)
2201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
2202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
2205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check that we didn't commit twice between first and second draw.
2206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, num_commit_complete_);
2207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commit_complete_;
2211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draw_layers_;
2212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousCommit);
22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestContinuousInvalidate : public LayerTreeHostTest {
2217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestContinuousInvalidate()
2219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : num_commit_complete_(0), num_draw_layers_(0) {}
2220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(10, 10));
2223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10));
2224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_ = ContentLayer::Create(&client_);
2226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_->SetBounds(gfx::Size(10, 10));
2227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_->SetPosition(gfx::PointF(0.f, 0.f));
2228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f));
2229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_->SetIsDrawable(true);
2230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(content_layer_);
2231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
223590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
2236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 2)
2237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
2238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_->SetNeedsDisplay();
2239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
2242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 1)
2243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      num_commit_complete_++;
2244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
2247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draw_layers_++;
2248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 2)
2249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
2250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
2253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check that we didn't commit twice between first and second draw.
2254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, num_commit_complete_);
2255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
2259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Layer> content_layer_;
2260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commit_complete_;
2261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draw_layers_;
22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostTestContinuousInvalidate);
22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestDeferCommits : public LayerTreeHostTest {
2267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestDeferCommits()
2269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : num_commits_deferred_(0), num_complete_commits_(0) {}
2270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidDeferCommit() OVERRIDE {
2274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_deferred_++;
2275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetDeferCommits(false);
2276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
2279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_complete_commits_++;
2280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_complete_commits_) {
2281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
2282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(0, num_commits_deferred_);
2283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->SetDeferCommits(true);
22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
2285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
2287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EndTest();
2288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
2290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
2291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
2296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, num_commits_deferred_);
2297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(2, num_complete_commits_);
2298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_deferred_;
2302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_complete_commits_;
23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits);
23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostWithProxy : public LayerTreeHost {
2308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostWithProxy(FakeLayerTreeHostClient* client,
2310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         const LayerTreeSettings& settings,
2311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         scoped_ptr<FakeProxy> proxy)
23121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      : LayerTreeHost(client, NULL, settings) {
2313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    proxy->SetLayerTreeHost(this);
23145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InitializeForTesting(proxy.PassAs<Proxy>());
2315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, LimitPartialUpdates) {
2319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When partial updates are not allowed, max updates should be 0.
2320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
2321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<FakeProxy> proxy(new FakeProxy);
2324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->GetRendererCapabilities().allow_partial_texture_updates = false;
2325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->SetMaxPartialTextureUpdates(5);
23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeSettings settings;
2328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings.max_partial_texture_updates = 10;
23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostWithProxy host(&client, settings, proxy.Pass());
2331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded());
23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(0u, host.MaxPartialTextureUpdates());
2334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When partial updates are allowed,
2337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // max updates should be limited by the proxy.
2338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
2339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
23402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<FakeProxy> proxy(new FakeProxy);
2342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->GetRendererCapabilities().allow_partial_texture_updates = true;
2343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->SetMaxPartialTextureUpdates(5);
23442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeSettings settings;
2346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings.max_partial_texture_updates = 10;
23472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostWithProxy host(&client, settings, proxy.Pass());
2349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded());
23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(5u, host.MaxPartialTextureUpdates());
2352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
23532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When partial updates are allowed,
2355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // max updates should also be limited by the settings.
2356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
2357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<FakeProxy> proxy(new FakeProxy);
2360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->GetRendererCapabilities().allow_partial_texture_updates = true;
2361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->SetMaxPartialTextureUpdates(20);
23622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeSettings settings;
2364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings.max_partial_texture_updates = 10;
23652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostWithProxy host(&client, settings, proxy.Pass());
2367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded());
23682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(10u, host.MaxPartialTextureUpdates());
2370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
23712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithGLRenderer) {
2374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeSettings settings;
2377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings.max_partial_texture_updates = 4;
23782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
237923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
238023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
238123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<LayerTreeHost> host = LayerTreeHost::CreateSingleThreaded(
238223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      &client, &client, shared_bitmap_manager.get(), settings);
2383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded());
2384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(4u, host->settings().max_partial_texture_updates);
23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithSoftwareRenderer) {
2388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_SOFTWARE);
23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeSettings settings;
2391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings.max_partial_texture_updates = 4;
23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
239323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
239423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
239523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<LayerTreeHost> host = LayerTreeHost::CreateSingleThreaded(
239623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      &client, &client, shared_bitmap_manager.get(), settings);
2397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded());
2398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(4u, host->settings().max_partial_texture_updates);
23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithDelegatingRendererAndGLContent) {
2402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_3D);
24032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeSettings settings;
2405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings.max_partial_texture_updates = 4;
24062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
240723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
240823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
240923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<LayerTreeHost> host = LayerTreeHost::CreateSingleThreaded(
241023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      &client, &client, shared_bitmap_manager.get(), settings);
2411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded());
24124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, host->MaxPartialTextureUpdates());
24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest,
2416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     PartialUpdatesWithDelegatingRendererAndSoftwareContent) {
2417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_SOFTWARE);
24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeSettings settings;
2420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings.max_partial_texture_updates = 4;
24212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
242323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
242423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<LayerTreeHost> host = LayerTreeHost::CreateSingleThreaded(
242523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      &client, &client, shared_bitmap_manager.get(), settings);
2426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded());
24274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, host->MaxPartialTextureUpdates());
24282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted
2431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
2432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted()
2434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : root_layer_(FakeContentLayer::Create(&client_)),
2435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        child_layer1_(FakeContentLayer::Create(&client_)),
2436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        child_layer2_(FakeContentLayer::Create(&client_)),
2437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_commits_(0) {}
2438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(100, 100));
2441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(100, 100));
2442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer1_->SetBounds(gfx::Size(100, 100));
2443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer2_->SetBounds(gfx::Size(100, 100));
2444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->AddChild(child_layer1_);
2445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->AddChild(child_layer2_);
2446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
2447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* host_impl,
2451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       bool visible) OVERRIDE {
24520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (visible) {
24530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      // One backing should remain unevicted.
24540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      EXPECT_EQ(
24550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          100u * 100u * 4u * 1u,
24560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          layer_tree_host()->contents_texture_manager()->MemoryUseBytes());
24570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    } else {
24580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      EXPECT_EQ(
24595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          0u, layer_tree_host()->contents_texture_manager()->MemoryUseBytes());
24600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
24610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Make sure that contents textures are marked as having been
2463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // purged.
2464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(host_impl->active_tree()->ContentsTexturesPurged());
2465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // End the test in this state.
2466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
2467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_commits_;
2471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_commits_) {
2472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
2473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // All three backings should have memory.
2474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(
2475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            100u * 100u * 4u * 3u,
2476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            layer_tree_host()->contents_texture_manager()->MemoryUseBytes());
2477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Set a new policy that will kick out 1 of the 3 resources.
2478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Because a resource was evicted, a commit will be kicked off.
2479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        host_impl->SetMemoryPolicy(
2480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            ManagedMemoryPolicy(100 * 100 * 4 * 2,
24811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING,
2482a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                1000));
2483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
2485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Only two backings should have memory.
2486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(
2487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            100u * 100u * 4u * 2u,
2488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            layer_tree_host()->contents_texture_manager()->MemoryUseBytes());
2489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Become backgrounded, which will cause 1 more resource to be
2490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // evicted.
2491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostSetVisibleToMainThread(false);
2492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
2494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No further commits should happen because this is not visible
2495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // anymore.
2496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
2497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
2505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root_layer_;
2506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> child_layer1_;
2507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> child_layer2_;
2508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
25092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
25102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F(
2512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted);
25132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestLCDNotification : public LayerTreeHostTest {
2515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class NotificationClient : public ContentLayerClient {
2517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   public:
2518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NotificationClient()
2519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        : layer_(0), paint_count_(0), lcd_notification_count_(0) {}
2520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    void set_layer(Layer* layer) { layer_ = layer; }
2522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int paint_count() const { return paint_count_; }
2523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int lcd_notification_count() const { return lcd_notification_count_; }
2524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void PaintContents(SkCanvas* canvas,
25265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               const gfx::Rect& clip,
2527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               gfx::RectF* opaque) OVERRIDE {
2528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ++paint_count_;
2529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void DidChangeLayerCanUseLCDText() OVERRIDE {
2531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ++lcd_notification_count_;
2532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_->SetNeedsDisplay();
2533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2534effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual bool FillsBoundsCompletely() const OVERRIDE { return false; }
2535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   private:
2537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer* layer_;
2538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int paint_count_;
2539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int lcd_notification_count_;
2540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
2541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<ContentLayer> root_layer = ContentLayer::Create(&client_);
2544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetIsDrawable(true);
2545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetBounds(gfx::Size(1, 1));
2546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer);
2548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    client_.set_layer(root_layer.get());
2549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The expecations are based on the assumption that the default
2551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // LCD settings are:
2552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->settings().can_use_lcd_text);
2553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(root_layer->can_use_lcd_text());
2554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
2556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
2562bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    switch (layer_tree_host()->source_frame_number()) {
2563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
2564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // The first update consists one LCD notification and one paint.
2565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, client_.lcd_notification_count());
2566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, client_.paint_count());
2567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // LCD text must have been enabled on the layer.
2568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text());
25692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
2570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
2572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Since nothing changed on layer, there should be no notification
2573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // or paint on the second update.
2574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, client_.lcd_notification_count());
2575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, client_.paint_count());
2576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // LCD text must not have changed.
2577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text());
2578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Change layer opacity that should trigger lcd notification.
2579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->root_layer()->SetOpacity(.5f);
2580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No need to request a commit - setting opacity will do it.
2581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
2583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Verify that there is not extra commit due to layer invalidation.
2584bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        EXPECT_EQ(3, layer_tree_host()->source_frame_number());
2585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // LCD notification count should have incremented due to
2586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // change in layer opacity.
2587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2, client_.lcd_notification_count());
2588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Paint count should be incremented due to invalidation.
2589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2, client_.paint_count());
2590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // LCD text must have been disabled on the layer due to opacity.
2591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(layer_tree_host()->root_layer()->can_use_lcd_text());
25922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
2593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
25942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
25962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NotificationClient client_;
2599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
26002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_THREAD_TEST_F(LayerTreeHostTestLCDNotification);
2602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2603a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Verify that the BeginFrame notification is used to initiate rendering.
2604a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass LayerTreeHostTestBeginFrameNotification : public LayerTreeHostTest {
2605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
26071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    settings->begin_impl_frame_scheduling_enabled = true;
2608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2611a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // This will trigger a SetNeedsBeginFrame which will trigger a
2612a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // BeginFrame.
2613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
2617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerTreeHostImpl* host_impl,
2618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerTreeHostImpl::FrameData* frame,
26195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
2620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
26215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return DrawSwapReadbackResult::DRAW_SUCCESS;
2622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks frame_time_;
2628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
26292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2630a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestBeginFrameNotification);
2631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2632a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass LayerTreeHostTestBeginFrameNotificationShutdownWhileEnabled
2633a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    : public LayerTreeHostTest {
2634a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) public:
2635a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
26361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    settings->begin_impl_frame_scheduling_enabled = true;
263790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    settings->using_synchronous_renderer_compositor = true;
2638a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
2639a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2640a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2641a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2642a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2643a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // The BeginFrame notification is turned off now but will get enabled
264490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // once we return. End test while it's enabled.
2645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ImplThreadTaskRunner()->PostTask(
2646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        FROM_HERE,
2647a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        base::Bind(&LayerTreeHostTestBeginFrameNotification::EndTest,
2648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   base::Unretained(this)));
2649a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
2650a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2651a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2652a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)};
2653a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
265490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MULTI_THREAD_TEST_F(
2655a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    LayerTreeHostTestBeginFrameNotificationShutdownWhileEnabled);
2656a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
26574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestAbortedCommitDoesntStall : public LayerTreeHostTest {
265858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
26594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerTreeHostTestAbortedCommitDoesntStall()
26605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : commit_count_(0), commit_abort_count_(0), commit_complete_count_(0) {}
266158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
266258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
26631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    settings->begin_impl_frame_scheduling_enabled = true;
266458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
266558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
266658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
266758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
266858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
266958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    commit_count_++;
26705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (commit_count_ == 4) {
26715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // After two aborted commits, request a real commit now to make sure a
267258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // real commit following an aborted commit will still complete and
267358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // end the test even when the Impl thread is idle.
267458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
267558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
267658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
267758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
26785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl,
26795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             bool did_handle) OVERRIDE {
26805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    commit_abort_count_++;
26815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Initiate another abortable commit.
26825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    host_impl->SetNeedsCommit();
26835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
26845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
268558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
268658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    commit_complete_count_++;
268758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (commit_complete_count_ == 1) {
26885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Initiate an abortable commit after the first commit.
268958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      host_impl->SetNeedsCommit();
269058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    } else {
269158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EndTest();
269258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
269358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
269458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
269558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
26965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(commit_count_, 5);
26975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(commit_abort_count_, 3);
269858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(commit_complete_count_, 2);
269958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
270058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
270158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int commit_count_;
27025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int commit_abort_count_;
270358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int commit_complete_count_;
270458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
270558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
27064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor
27074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostTestAbortedCommitDoesntStall {
27084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
27094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostTestAbortedCommitDoesntStall::InitializeSettings(settings);
27104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    settings->using_synchronous_renderer_compositor = true;
27114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
27124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
27134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
271458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F(
27154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor);
27164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
27174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestAbortedCommitDoesntStallDisabledVsync
27184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostTestAbortedCommitDoesntStall {
27194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
27204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostTestAbortedCommitDoesntStall::InitializeSettings(settings);
27214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    settings->throttle_frame_production = false;
27224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
27234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
27244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
27254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAbortedCommitDoesntStallDisabledVsync);
272658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestUninvertibleTransformDoesNotBlockActivation
2728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
2729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
2730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
2731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings->impl_side_painting = true;
2732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
27332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
27362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<Layer> layer = PictureLayer::Create(&client_);
2738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer->SetTransform(gfx::Transform(0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
2739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer->SetBounds(gfx::Size(10, 10));
2740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(layer);
2741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
27422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
27442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
2747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
27482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
27502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
27522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
27532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(
2755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestUninvertibleTransformDoesNotBlockActivation);
27562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestChangeLayerPropertiesInPaintContents
2758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
2759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class SetBoundsClient : public ContentLayerClient {
2761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   public:
2762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetBoundsClient() : layer_(0) {}
27632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    void set_layer(Layer* layer) { layer_ = layer; }
27652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void PaintContents(SkCanvas* canvas,
27675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               const gfx::Rect& clip,
2768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               gfx::RectF* opaque) OVERRIDE {
2769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_->SetBounds(gfx::Size(2, 2));
27702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
27712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void DidChangeLayerCanUseLCDText() OVERRIDE {}
27732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2774effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual bool FillsBoundsCompletely() const OVERRIDE { return false; }
2775effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   private:
2777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer* layer_;
2778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestChangeLayerPropertiesInPaintContents() : num_commits_(0) {}
27812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<ContentLayer> root_layer = ContentLayer::Create(&client_);
2784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetIsDrawable(true);
2785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetBounds(gfx::Size(1, 1));
27862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer);
2788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    client_.set_layer(root_layer.get());
27892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
2791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
27922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
27952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
2798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_commits_ == 1) {
2799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerImpl* root_layer = host_impl->active_tree()->root_layer();
2800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_SIZE_EQ(gfx::Size(1, 1), root_layer->bounds());
2801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
2802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerImpl* root_layer = host_impl->active_tree()->root_layer();
2803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_SIZE_EQ(gfx::Size(2, 2), root_layer->bounds());
2804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
28052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
28072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetBoundsClient client_;
2810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
28112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
28122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_THREAD_TEST_F(LayerTreeHostTestChangeLayerPropertiesInPaintContents);
2814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class MockIOSurfaceWebGraphicsContext3D : public TestWebGraphicsContext3D {
2816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2817424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  MockIOSurfaceWebGraphicsContext3D() {
28185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_capabilities_.gpu.iosurface = true;
28195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_capabilities_.gpu.texture_rectangle = true;
2820424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
2821424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
28225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual GLuint createTexture() OVERRIDE {
2823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return 1;
2824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
28255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD1(activeTexture, void(GLenum texture));
28265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD2(bindTexture, void(GLenum target,
28275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 GLuint texture_id));
28285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD3(texParameteri, void(GLenum target,
28295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   GLenum pname,
28305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   GLint param));
28315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD5(texImageIOSurface2DCHROMIUM, void(GLenum target,
28325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 GLint width,
28335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 GLint height,
28345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 GLuint ioSurfaceId,
28355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 GLuint plane));
28365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD4(drawElements, void(GLenum mode,
28375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  GLsizei count,
28385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  GLenum type,
28395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  GLintptr offset));
28405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD1(deleteTexture, void(GLenum texture));
2841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
28422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestIOSurfaceDrawing : public LayerTreeHostTest {
2844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
28455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback)
2846a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      OVERRIDE {
28473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_ptr<MockIOSurfaceWebGraphicsContext3D> mock_context_owned(
2848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new MockIOSurfaceWebGraphicsContext3D);
28493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    mock_context_ = mock_context_owned.get();
28503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
28515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return FakeOutputSurface::Create3d(
28525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        mock_context_owned.PassAs<TestWebGraphicsContext3D>());
2853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
2857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->SetIsDrawable(false);
2859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_id_ = 9;
2861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_size_ = gfx::Size(6, 7);
2862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<IOSurfaceLayer> io_surface_layer = IOSurfaceLayer::Create();
2864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_layer->SetBounds(gfx::Size(10, 10));
2865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_layer->SetAnchorPoint(gfx::PointF());
2866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_layer->SetIsDrawable(true);
2867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_layer->SetIOSurfaceProperties(io_surface_id_, io_surface_size_);
2868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(io_surface_layer);
2869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // In WillDraw, the IOSurfaceLayer sets up the io surface texture.
2875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_, activeTexture(_)).Times(0);
2877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1))
2878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(AtLeast(1));
28795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_,
28805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                texParameteri(
28815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR))
2882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(1);
28835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_,
28845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                texParameteri(
28855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR))
2886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(1);
28875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_,
28885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                texParameteri(GL_TEXTURE_RECTANGLE_ARB,
28895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              GL_TEXTURE_WRAP_S,
28905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              GL_CLAMP_TO_EDGE)).Times(1);
28915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_,
28925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                texParameteri(GL_TEXTURE_RECTANGLE_ARB,
28935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              GL_TEXTURE_WRAP_T,
28945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              GL_CLAMP_TO_EDGE)).Times(1);
28955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
28965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_,
28975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                texImageIOSurface2DCHROMIUM(GL_TEXTURE_RECTANGLE_ARB,
28985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            io_surface_size_.width(),
28995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            io_surface_size_.height(),
29005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            io_surface_id_,
29015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            0)).Times(1);
29025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_, bindTexture(_, 0)).Times(AnyNumber());
29045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
29055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
2907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerTreeHostImpl* host_impl,
2908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerTreeHostImpl::FrameData* frame,
29095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
2910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Mock::VerifyAndClearExpectations(&mock_context_);
2911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The io surface layer's texture is drawn.
29135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_, activeTexture(GL_TEXTURE0)).Times(AtLeast(1));
2914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1))
2915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(1);
2916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, drawElements(GL_TRIANGLES, 6, _, _))
2917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(AtLeast(1));
2918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return draw_result;
2920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Mock::VerifyAndClearExpectations(&mock_context_);
29243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
29253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_CALL(*mock_context_, deleteTexture(1)).Times(1);
2926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
2927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int io_surface_id_;
2932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockIOSurfaceWebGraphicsContext3D* mock_context_;
2933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size io_surface_size_;
2934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
29352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2936a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// TODO(danakj): IOSurface layer can not be transported. crbug.com/239335
2937a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
2938a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LayerTreeHostTestIOSurfaceDrawing);
2939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2940b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class LayerTreeHostTestNumFramesPending : public LayerTreeHostTest {
2941b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public:
2942a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2943a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    frame_ = 0;
2944a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2945b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
2946b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2947b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Round 1: commit + draw
2948b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Round 2: commit only (no draw/swap)
2949b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Round 3: draw only (no commit)
2950b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Round 4: composite & readback (2 commits, no draw/swap)
2951b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Round 5: commit + draw
2952b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2953b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
2954bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int commit = layer_tree_host()->source_frame_number();
2955b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    switch (commit) {
2956b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 2:
2957b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Round 2 done.
2958b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(1, frame_);
2959b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetNeedsRedraw();
2960b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
2961b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 3:
2962b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // CompositeAndReadback in Round 4, first commit.
2963b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(2, frame_);
2964b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
2965b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 4:
2966b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Round 4 done.
2967b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(2, frame_);
2968b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
2969b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetNeedsRedraw();
2970b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
2971b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
2972b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
2973b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2974b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidCompleteSwapBuffers() OVERRIDE {
2975bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int commit = layer_tree_host()->source_frame_number();
2976b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    ++frame_;
2977b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    char pixels[4] = {0};
2978b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    switch (frame_) {
2979b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 1:
2980b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Round 1 done.
2981b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(1, commit);
2982b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
2983b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
2984b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 2:
2985b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Round 3 done.
2986b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(2, commit);
2987b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->CompositeAndReadback(pixels, gfx::Rect(0, 0, 1, 1));
2988b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
2989b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 3:
2990b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Round 5 done.
2991b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(5, commit);
2992b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EndTest();
2993b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
2994b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
2995b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
2996b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2997b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2998b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2999b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) protected:
3000b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int frame_;
3001b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)};
3002b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3003effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Flaky on all platforms: http://crbug.com/327498
3004effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(LayerTreeHostTestNumFramesPending, DISABLED_DelegatingRenderer) {
3005a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
3006b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
3007b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3008effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(LayerTreeHostTestNumFramesPending, DISABLED_GLRenderer) {
3009a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
3010b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
3011b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3012868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class LayerTreeHostTestDeferredInitialize : public LayerTreeHostTest {
3013868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
3014868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
3015868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // PictureLayer can only be used with impl side painting enabled.
3016868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    settings->impl_side_painting = true;
3017868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3018868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3019868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
3020868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    layer_ = FakePictureLayer::Create(&client_);
3021558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    // Force commits to not be aborted so new frames get drawn, otherwise
3022558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    // the renderer gets deferred initialized but nothing new needs drawing.
3023558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    layer_->set_always_update_resources(true);
3024868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
3025868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
3026868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3027868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3028868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void BeginTest() OVERRIDE {
30297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    did_initialize_gl_ = false;
30307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    did_release_gl_ = false;
3031ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    last_source_frame_number_drawn_ = -1;  // Never drawn.
3032868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
3033868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3034868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
30355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback)
3036a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      OVERRIDE {
3037868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<TestWebGraphicsContext3D> context3d(
3038868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        TestWebGraphicsContext3D::Create());
3039868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3040868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return FakeOutputSurface::CreateDeferredGL(
30415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        scoped_ptr<SoftwareOutputDevice>(new SoftwareOutputDevice));
3042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3043868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3044868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
3045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_TRUE(host_impl->RootLayer());
3046868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    FakePictureLayerImpl* layer_impl =
3047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        static_cast<FakePictureLayerImpl*>(host_impl->RootLayer());
3048ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3049ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // The same frame can be draw multiple times if new visible tiles are
3050ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // rasterized. But we want to make sure we only post DeferredInitialize
3051ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // and ReleaseGL once, so early out if the same frame is drawn again.
3052ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (last_source_frame_number_drawn_ ==
3053ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        host_impl->active_tree()->source_frame_number())
3054ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return;
3055ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3056ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    last_source_frame_number_drawn_ =
3057ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        host_impl->active_tree()->source_frame_number();
3058ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
30597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (!did_initialize_gl_) {
3060ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      EXPECT_LE(1u, layer_impl->append_quads_count());
30617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ImplThreadTaskRunner()->PostTask(
30627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          FROM_HERE,
30637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          base::Bind(
30647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              &LayerTreeHostTestDeferredInitialize::DeferredInitializeAndRedraw,
30657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              base::Unretained(this),
30667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              base::Unretained(host_impl)));
30677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    } else if (did_initialize_gl_ && !did_release_gl_) {
3068ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      EXPECT_LE(2u, layer_impl->append_quads_count());
30697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ImplThreadTaskRunner()->PostTask(
30707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          FROM_HERE,
30715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::Bind(&LayerTreeHostTestDeferredInitialize::ReleaseGLAndRedraw,
30725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     base::Unretained(this),
30735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     base::Unretained(host_impl)));
30747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    } else if (did_initialize_gl_ && did_release_gl_) {
3075ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      EXPECT_LE(3u, layer_impl->append_quads_count());
30767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EndTest();
3077868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
3078868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3079868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3080868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void DeferredInitializeAndRedraw(LayerTreeHostImpl* host_impl) {
30817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(did_initialize_gl_);
30827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // SetAndInitializeContext3D calls SetNeedsCommit.
30833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    FakeOutputSurface* fake_output_surface =
30843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        static_cast<FakeOutputSurface*>(host_impl->output_surface());
30853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_refptr<TestContextProvider> context_provider =
30863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        TestContextProvider::Create();  // Not bound to thread.
30875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(
30885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        fake_output_surface->InitializeAndSetContext3d(context_provider, NULL));
30897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    did_initialize_gl_ = true;
30907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
30917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
30927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void ReleaseGLAndRedraw(LayerTreeHostImpl* host_impl) {
30937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(did_initialize_gl_);
30947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(did_release_gl_);
30957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // ReleaseGL calls SetNeedsCommit.
30967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    static_cast<FakeOutputSurface*>(host_impl->output_surface())->ReleaseGL();
30977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    did_release_gl_ = true;
3098868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3099868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {
31017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(did_initialize_gl_);
31027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(did_release_gl_);
3103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
3106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FakeContentLayerClient client_;
3107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<FakePictureLayer> layer_;
31087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool did_initialize_gl_;
31097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool did_release_gl_;
3110ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int last_source_frame_number_drawn_;
3111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
3112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferredInitialize);
3114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Test for UI Resource management.
3116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class LayerTreeHostTestUIResource : public LayerTreeHostTest {
3117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
31185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerTreeHostTestUIResource() : num_ui_resources_(0) {}
3119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
31200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
31210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    settings->texture_id_allocation_chunk_size = 1;
31220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
31230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
3125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
31275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int frame = layer_tree_host()->source_frame_number();
3128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (frame) {
3129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
3130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        CreateResource();
3131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        CreateResource();
3132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
3133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
3134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 2:
3135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Usually ScopedUIResource are deleted from the manager in their
3136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // destructor.  Here we just want to test that a direct call to
3137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // DeleteUIResource works.
3138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        layer_tree_host()->DeleteUIResource(ui_resources_[0]->id());
3139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
3140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
3141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
3142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // DeleteUIResource can be called with an invalid id.
3143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        layer_tree_host()->DeleteUIResource(ui_resources_[0]->id());
3144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
3145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
3146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 4:
3147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        CreateResource();
3148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        CreateResource();
3149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
3150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
3151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 5:
3152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ClearResources();
3153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EndTest();
3154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
3155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
3156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
3157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void PerformTest(LayerTreeHostImpl* impl) {
31595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
3160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
31615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int frame = impl->active_tree()->source_frame_number();
3162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (frame) {
31635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 0:
3164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ASSERT_EQ(0u, context->NumTextures());
3165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
31665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 1:
3167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Created two textures.
3168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ASSERT_EQ(2u, context->NumTextures());
3169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
31705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 2:
3171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // One texture left after one deletion.
3172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ASSERT_EQ(1u, context->NumTextures());
3173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
31745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 3:
3175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Resource manager state should not change when delete is called on an
3176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // invalid id.
3177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ASSERT_EQ(1u, context->NumTextures());
3178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
31795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 4:
3180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Creation after deletion: two more creates should total up to
3181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // three textures.
3182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ASSERT_EQ(3u, context->NumTextures());
3183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
3184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
3185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
3186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
3188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!layer_tree_host()->settings().impl_side_painting)
3189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      PerformTest(impl);
3190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
3191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
3193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (layer_tree_host()->settings().impl_side_painting)
3194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      PerformTest(impl);
3195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
3196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
3198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
3200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Must clear all resources before exiting.
3201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void ClearResources() {
3202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    for (int i = 0; i < num_ui_resources_; i++)
3203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      ui_resources_[i].reset();
3204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
3205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void CreateResource() {
3207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ui_resources_[num_ui_resources_++] =
3208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        FakeScopedUIResource::Create(layer_tree_host());
3209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
3210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<FakeScopedUIResource> ui_resources_[5];
3212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int num_ui_resources_;
3213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
3214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestUIResource);
3216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
32175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PushPropertiesCountingLayerImpl : public LayerImpl {
32185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
32195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static scoped_ptr<PushPropertiesCountingLayerImpl> Create(
32205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeImpl* tree_impl, int id) {
32215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return make_scoped_ptr(new PushPropertiesCountingLayerImpl(tree_impl, id));
32225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
32235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~PushPropertiesCountingLayerImpl() {}
32255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void PushPropertiesTo(LayerImpl* layer) OVERRIDE {
32275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LayerImpl::PushPropertiesTo(layer);
32285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    push_properties_count_++;
32295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Push state to the active tree because we can only access it from there.
32305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static_cast<PushPropertiesCountingLayerImpl*>(
32315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        layer)->push_properties_count_ = push_properties_count_;
32325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
32335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl)
32355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OVERRIDE {
32365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return PushPropertiesCountingLayerImpl::Create(tree_impl, id()).
32375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        PassAs<LayerImpl>();
32385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
32395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t push_properties_count() const { return push_properties_count_; }
32415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void reset_push_properties_count() { push_properties_count_ = 0; }
32425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
32445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t push_properties_count_;
32455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PushPropertiesCountingLayerImpl(LayerTreeImpl* tree_impl, int id)
32475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : LayerImpl(tree_impl, id),
32485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        push_properties_count_(0) {
32495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetAnchorPoint(gfx::PointF());
32505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetBounds(gfx::Size(1, 1));
32515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
32525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
32535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass PushPropertiesCountingLayer : public Layer {
32557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
32567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static scoped_refptr<PushPropertiesCountingLayer> Create() {
32577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return new PushPropertiesCountingLayer();
32587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
32597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
32607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void PushPropertiesTo(LayerImpl* layer) OVERRIDE {
32617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Layer::PushPropertiesTo(layer);
32627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    push_properties_count_++;
32637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (persist_needs_push_properties_)
32647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      needs_push_properties_ = true;
32657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
32667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
32675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl)
32685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OVERRIDE {
32695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return PushPropertiesCountingLayerImpl::Create(tree_impl, id()).
32705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        PassAs<LayerImpl>();
32715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
32725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t push_properties_count() const { return push_properties_count_; }
32747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void reset_push_properties_count() { push_properties_count_ = 0; }
32757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
32767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void set_persist_needs_push_properties(bool persist) {
32777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    persist_needs_push_properties_ = persist;
32787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
32797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
32807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private:
32817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PushPropertiesCountingLayer()
32825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : push_properties_count_(0), persist_needs_push_properties_(false) {
32837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SetAnchorPoint(gfx::PointF());
32847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SetBounds(gfx::Size(1, 1));
32857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SetIsDrawable(true);
32867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
32877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual ~PushPropertiesCountingLayer() {}
32887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
32897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t push_properties_count_;
32907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool persist_needs_push_properties_;
32917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
32927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
32937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestLayersPushProperties : public LayerTreeHostTest {
32947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
32957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void BeginTest() OVERRIDE {
32967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    num_commits_ = 0;
32977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_root_ = 0;
32987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_child_ = 0;
32997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_grandchild_ = 0;
33007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_child2_ = 0;
33017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_other_root_ = 0;
33027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_leaf_layer_ = 0;
33037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PostSetNeedsCommitToMainThread();
33047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
33057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
33077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_ = PushPropertiesCountingLayer::Create();
33087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_ = PushPropertiesCountingLayer::Create();
33097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child2_ = PushPropertiesCountingLayer::Create();
33107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grandchild_ = PushPropertiesCountingLayer::Create();
33114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    leaf_always_pushing_layer_ = PushPropertiesCountingLayer::Create();
33124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    leaf_always_pushing_layer_->set_persist_needs_push_properties(true);
33137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(child_);
33157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(child2_);
33167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_->AddChild(grandchild_);
33174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    child2_->AddChild(leaf_always_pushing_layer_);
33187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    other_root_ = PushPropertiesCountingLayer::Create();
33207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Don't set the root layer here.
33227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
33237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
33247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
33267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ++num_commits_;
33277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_root_, root_->push_properties_count());
33297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_child_, child_->push_properties_count());
33307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_grandchild_,
33317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              grandchild_->push_properties_count());
33327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_child2_,
33337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              child2_->push_properties_count());
33347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_other_root_,
33357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              other_root_->push_properties_count());
33363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(expected_push_properties_leaf_layer_,
33374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              leaf_always_pushing_layer_->push_properties_count());
33387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // The scrollbar layer always needs to be pushed.
33407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (root_->layer_tree_host()) {
33417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_TRUE(root_->descendant_needs_push_properties());
33427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(root_->needs_push_properties());
33437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
33447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (child2_->layer_tree_host()) {
33457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_TRUE(child2_->descendant_needs_push_properties());
33467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(child2_->needs_push_properties());
33477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
33484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (leaf_always_pushing_layer_->layer_tree_host()) {
33494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_FALSE(
33504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          leaf_always_pushing_layer_->descendant_needs_push_properties());
33514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_TRUE(leaf_always_pushing_layer_->needs_push_properties());
33527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
33537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // child_ and grandchild_ don't persist their need to push properties.
33557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (child_->layer_tree_host()) {
33567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(child_->descendant_needs_push_properties());
33577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(child_->needs_push_properties());
33587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
33597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (grandchild_->layer_tree_host()) {
33607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(grandchild_->descendant_needs_push_properties());
33617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(grandchild_->needs_push_properties());
33627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
33637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (other_root_->layer_tree_host()) {
33657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(other_root_->descendant_needs_push_properties());
33667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(other_root_->needs_push_properties());
33677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
33687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (num_commits_) {
33707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
33717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
33727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
33737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_root_;
33747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
33757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
33767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child2_;
33777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 2:
33797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetNeedsCommit();
33807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
33817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 3:
33837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(other_root_);
33847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
33857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_other_root_;
33867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 4:
33887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
33897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
33907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_root_;
33917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
33927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
33937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child2_;
33947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 5:
33967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetNeedsCommit();
33977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
33987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 6:
34007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
34017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
34027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 7:
34047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        root_->AddChild(child_);
34057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
34067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
34077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
34087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 8:
34107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild_->RemoveFromParent();
34117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
34127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 9:
34147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->AddChild(grandchild_);
34157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
34167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
34177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 10:
34197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetViewportSize(gfx::Size(20, 20));
34207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
34217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 11:
34237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.8f, 1.1f);
34247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
34257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 12:
34277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->SetPosition(gfx::Point(1, 1));
34287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // The modified layer needs commit
34297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
34307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 13:
34327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child2_->SetPosition(gfx::Point(1, 1));
34337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // The modified layer needs commit
34347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child2_;
34357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 14:
34377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
34387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        root_->AddChild(child_);
34397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
34407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
34417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
34427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 15:
34447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild_->SetPosition(gfx::Point(1, 1));
34457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // The modified layer needs commit
34467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
34477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 16:
3449558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        // SetNeedsDisplay does not always set needs commit (so call it
3450558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        // explicitly), but is a property change.
34517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->SetNeedsDisplay();
34527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
3453558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        layer_tree_host()->SetNeedsCommit();
34547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 17:
34567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
34577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
34587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
34597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // The leaf layer always pushes.
34614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (leaf_always_pushing_layer_->layer_tree_host())
34627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ++expected_push_properties_leaf_layer_;
34637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
34647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AfterTest() OVERRIDE {}
34667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int num_commits_;
34687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FakeContentLayerClient client_;
34697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> root_;
34707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> child_;
34717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> child2_;
34727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> grandchild_;
34737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> other_root_;
34744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<PushPropertiesCountingLayer> leaf_always_pushing_layer_;
34757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_root_;
34767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_child_;
34777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_child2_;
34787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_grandchild_;
34797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_other_root_;
34807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_leaf_layer_;
34817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
34827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34837dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestLayersPushProperties);
34847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestImplLayersPushProperties
34865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public LayerTreeHostTestLayersPushProperties {
34877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
34887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void BeginTest() OVERRIDE {
34895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expected_push_properties_root_impl_ = 0;
34905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expected_push_properties_child_impl_ = 0;
34915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expected_push_properties_grandchild_impl_ = 0;
34925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expected_push_properties_child2_impl_ = 0;
34935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expected_push_properties_grandchild2_impl_ = 0;
34945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LayerTreeHostTestLayersPushProperties::BeginTest();
34957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
34967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
34985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // These commits are in response to the changes made in
34995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // LayerTreeHostTestLayersPushProperties::DidCommitAndDrawFrame()
35005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (num_commits_) {
35015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 0:
35025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Tree hasn't been setup yet don't bother to check anything.
35035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return;
35045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 1:
35055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Root gets set up, Everyone is initialized.
35065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_root_impl_;
35075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child_impl_;
35085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
35095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child2_impl_;
35105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
35115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
35125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 2:
35135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Tree doesn't change but the one leaf that always pushes is pushed.
35145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
35155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
35165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 3:
35175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Root is swapped here.
35185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Clear the expected push properties the tree will be rebuilt.
35195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_root_impl_ = 0;
35205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_child_impl_ = 0;
35215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_grandchild_impl_ = 0;
35225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_child2_impl_ = 0;
35235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_grandchild2_impl_ = 0;
35245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Make sure the new root is pushed.
35265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(1u, static_cast<PushPropertiesCountingLayerImpl*>(
35275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                host_impl->RootLayer())->push_properties_count());
35285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return;
35295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 4:
35305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Root is swapped back all of the layers in the tree get pushed.
35315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_root_impl_;
35325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child_impl_;
35335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
35345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child2_impl_;
35355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
35365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
35375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 5:
35385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Tree doesn't change but the one leaf that always pushes is pushed.
35395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
35405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
35415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 6:
35425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // First child is removed. Structure of the tree changes here so swap
35435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // some of the values. child_impl becomes child2_impl.
35445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_child_impl_ =
35455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            expected_push_properties_child2_impl_;
35465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_child2_impl_ = 0;
35475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // grandchild_impl becomes grandchild2_impl.
35485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_grandchild_impl_ =
35495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            expected_push_properties_grandchild2_impl_;
35505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_grandchild2_impl_ = 0;
35515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // grandchild_impl is now the leaf that always pushes. It is pushed.
35535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
35545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
35555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 7:
35565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
35575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
35585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Child is added back. New layers are initialized.
35605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
35615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child2_impl_;
35625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
35635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 8:
35645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Leaf is removed.
35655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_grandchild2_impl_ = 0;
35665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Always pushing.
35685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
35695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
35705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 9:
35715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Leaf is added back
35725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
35735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
35755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
35765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
35775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 10:
35785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
35795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
35805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
35815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 11:
35825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
35835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
35845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
35855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 12:
35865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
35875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
35885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // This child position was changed.
35905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child2_impl_;
35915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
35925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 13:
35935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The position of this child was changed.
35945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child_impl_;
35955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
35975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
35985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
35995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 14:
36005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Second child is removed from tree. Don't discard counts because
36015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // they are added back before commit.
36025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
36045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
36055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Second child added back.
36075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child2_impl_;
36085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
36095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
36115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 15:
36125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The position of this child was changed.
36135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
36145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
36165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
36175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
36185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 16:
36195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Second child is invalidated with SetNeedsDisplay
36205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child2_impl_;
36215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushed is pushed.
36235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
36245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
36255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
36265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PushPropertiesCountingLayerImpl* root_impl_ = NULL;
36285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PushPropertiesCountingLayerImpl* child_impl_ = NULL;
36295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PushPropertiesCountingLayerImpl* child2_impl_ = NULL;
36305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PushPropertiesCountingLayerImpl* grandchild_impl_ = NULL;
36315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PushPropertiesCountingLayerImpl* leaf_always_pushing_layer_impl_ = NULL;
36325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Pull the layers that we need from the tree assuming the same structure
36345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // as LayerTreeHostTestLayersPushProperties
36355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    root_impl_ = static_cast<PushPropertiesCountingLayerImpl*>(
36365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        host_impl->RootLayer());
36375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (root_impl_ && root_impl_->children().size() > 0) {
36395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      child_impl_ = static_cast<PushPropertiesCountingLayerImpl*>(
36405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          root_impl_->children()[0]);
36415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (child_impl_ && child_impl_->children().size() > 0)
36435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        grandchild_impl_ = static_cast<PushPropertiesCountingLayerImpl*>(
36445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            child_impl_->children()[0]);
36455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
36465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (root_impl_ && root_impl_->children().size() > 1) {
36485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      child2_impl_ = static_cast<PushPropertiesCountingLayerImpl*>(
36495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          root_impl_->children()[1]);
36505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (child2_impl_ && child2_impl_->children().size() > 0)
36525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        leaf_always_pushing_layer_impl_ =
36535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            static_cast<PushPropertiesCountingLayerImpl*>(
36545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                child2_impl_->children()[0]);
36555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
36565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (root_impl_)
36585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(expected_push_properties_root_impl_,
36595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                root_impl_->push_properties_count());
36605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (child_impl_)
36615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(expected_push_properties_child_impl_,
36625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                child_impl_->push_properties_count());
36635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (grandchild_impl_)
36645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(expected_push_properties_grandchild_impl_,
36655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                grandchild_impl_->push_properties_count());
36665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (child2_impl_)
36675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(expected_push_properties_child2_impl_,
36685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                child2_impl_->push_properties_count());
36695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (leaf_always_pushing_layer_impl_)
36705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(expected_push_properties_grandchild2_impl_,
36715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                leaf_always_pushing_layer_impl_->push_properties_count());
36725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
36735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t expected_push_properties_root_impl_;
36755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t expected_push_properties_child_impl_;
36765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t expected_push_properties_child2_impl_;
36775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t expected_push_properties_grandchild_impl_;
36785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t expected_push_properties_grandchild2_impl_;
36795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
36805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(LayerTreeHostTestImplLayersPushProperties, DelegatingRenderer) {
36825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunTestWithImplSidePainting();
36835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
36845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestPropertyChangesDuringUpdateArePushed
36865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public LayerTreeHostTest {
36875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
36885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
36895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
36917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_ = Layer::Create();
36927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->SetBounds(gfx::Size(1, 1));
36937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool paint_scrollbar = true;
36957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool has_thumb = false;
36963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scrollbar_layer_ = FakePaintedScrollbarLayer::Create(
36973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        paint_scrollbar, has_thumb, root_->id());
36987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(scrollbar_layer_);
37007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    layer_tree_host()->SetRootLayer(root_);
37027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
37037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
37047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
3706bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    switch (layer_tree_host()->source_frame_number()) {
37077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
37087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
37097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1: {
37107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // During update, the ignore_set_needs_commit_ bit is set to true to
37117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // avoid causing a second commit to be scheduled. If a property change
37127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // is made during this, however, it needs to be pushed in the upcoming
37137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // commit.
37147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        scoped_ptr<base::AutoReset<bool> > ignore =
37157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            scrollbar_layer_->IgnoreSetNeedsCommit();
37167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        scrollbar_layer_->SetBounds(gfx::Size(30, 30));
37187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(scrollbar_layer_->needs_push_properties());
37207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
37217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetNeedsCommit();
37227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        scrollbar_layer_->reset_push_properties_count();
37247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_EQ(0u, scrollbar_layer_->push_properties_count());
37257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
37267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
37277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 2:
37287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_EQ(1u, scrollbar_layer_->push_properties_count());
37297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
37307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
37317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
37327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
37337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AfterTest() OVERRIDE {}
37357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<Layer> root_;
37373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<FakePaintedScrollbarLayer> scrollbar_layer_;
37387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
37397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37407dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPropertyChangesDuringUpdateArePushed);
37417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestCasePushPropertiesThreeGrandChildren
37437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTest {
37447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
37457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void BeginTest() OVERRIDE {
37467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_root_ = 0;
37477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_child_ = 0;
37487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_grandchild1_ = 0;
37497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_grandchild2_ = 0;
37507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_grandchild3_ = 0;
37517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PostSetNeedsCommitToMainThread();
37527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
37537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
37557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_ = PushPropertiesCountingLayer::Create();
37567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_ = PushPropertiesCountingLayer::Create();
37577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grandchild1_ = PushPropertiesCountingLayer::Create();
37587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grandchild2_ = PushPropertiesCountingLayer::Create();
37597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grandchild3_ = PushPropertiesCountingLayer::Create();
37607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(child_);
37627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_->AddChild(grandchild1_);
37637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_->AddChild(grandchild2_);
37647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_->AddChild(grandchild3_);
37657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Don't set the root layer here.
37677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
37687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
37697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AfterTest() OVERRIDE {}
37717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FakeContentLayerClient client_;
37737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> root_;
37747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> child_;
37757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> grandchild1_;
37767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> grandchild2_;
37777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> grandchild3_;
37787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_root_;
37797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_child_;
37807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_grandchild1_;
37817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_grandchild2_;
37827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_grandchild3_;
37837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
37847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesAddingToTreeRequiresPush
37867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
37877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
37887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
3789bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int last_source_frame_number = layer_tree_host()->source_frame_number() - 1;
37907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
37917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
37927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
37947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
37957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
37967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
37977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
37987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
37997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
38007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
38017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
38027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
38047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->needs_push_properties());
38067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
38077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
38087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
38097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
38107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
38117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
38127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
38137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild3_->needs_push_properties());
38147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
38157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
38167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
38177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
38187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
38197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
38207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
38217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
38227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38237dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesAddingToTreeRequiresPush);
38247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesRemovingChildStopsRecursion
38267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
38277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
38287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
3829bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int last_source_frame_number = layer_tree_host()->source_frame_number() - 1;
38307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
38317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
38327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
38337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
38347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
38357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
38367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
38377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
38387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
38397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
38407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
38417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
38427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
38437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
38447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
38457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
38477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->SetPosition(gfx::Point(1, 1));
38487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
38507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
38517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
38527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
38537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
38547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
38557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
38567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
38577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->AddChild(grandchild1_);
38597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
38617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
38627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
38637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
38647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
38657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
38667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
38677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
38687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
38697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
38707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->SetPosition(gfx::Point(1, 1));
38727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
38747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
38757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
38767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
38777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
38787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
38797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
38807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
38817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
38827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
38837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // grandchild2_ will still need a push properties.
38857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
38867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
38887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
38897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
38907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
38917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // grandchild3_ does not need a push properties, so recursing should
38937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // no longer be needed.
38947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
38957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
38977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
38987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
38997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
39007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
39017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
39027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
39037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
39047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
39057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
39067dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesRemovingChildStopsRecursion);
39077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
39087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesRemovingChildStopsRecursionWithPersistence
39097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
39107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
39117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
3912bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int last_source_frame_number = layer_tree_host()->source_frame_number() - 1;
39137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
39147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
39157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
39167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->set_persist_needs_push_properties(true);
39177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->set_persist_needs_push_properties(true);
39187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
39197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
39207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
39217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
39227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
39237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
39247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
39257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
39267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
39277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
39287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
39297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
39307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
39317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // grandchild2_ will still need a push properties.
39327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
39337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
39347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
39357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
39367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
39377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
39387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
39397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // grandchild3_ does not need a push properties, so recursing should
39407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // no longer be needed.
39417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
39427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
39437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
39447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
39457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
39467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
39477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
39487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
39497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
39507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
39517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
39527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
39537dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(
39547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTestPushPropertiesRemovingChildStopsRecursionWithPersistence);
39557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
39567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertiesWhileOutsideTree
39577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
39587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
39597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
3960bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int last_source_frame_number = layer_tree_host()->source_frame_number() - 1;
39617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
39627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
39637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
39647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
39657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
39667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
39677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
39687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
39697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
39707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
39717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
39727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
39737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
39747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
39757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
39767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
39777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Change grandchildren while their parent is not in the tree.
39787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
39797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->SetPosition(gfx::Point(1, 1));
39807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->SetPosition(gfx::Point(1, 1));
39817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        root_->AddChild(child_);
39827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
39837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
39847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
39857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
39867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
39877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
39887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
39897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
39907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
39917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild3_->needs_push_properties());
39927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
39937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
39947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
39957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
39967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
39977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
39987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
39997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
40007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
40027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
40047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
40057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
40067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
40077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild3_->RemoveFromParent();
40097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
40117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
40127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
40137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
40147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
40167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
40177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
40187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
40197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
40207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40217dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(
40227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTestPushPropertiesSetPropertiesWhileOutsideTree);
40237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertyInParentThenChild
40257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
40267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
40277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
4028bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int last_source_frame_number = layer_tree_host()->source_frame_number() - 1;
40297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
40307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
40317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
40327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
40337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
40347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
40357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
40367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
40377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
40387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
40397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
40407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
40417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
40427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
40437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
40447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->SetPosition(gfx::Point(1, 1));
40467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->SetPosition(gfx::Point(1, 1));
40477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->SetPosition(gfx::Point(1, 1));
40487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
40507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
40517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
40527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
40537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
40547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
40557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
40567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
40577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
40587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
40597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
40617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
40637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
40647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
40657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
40667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
40687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
40707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
40717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
40727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
40737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
40757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
40777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
40787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
40807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
40817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
40827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
40837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
40847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40857dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(
40867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTestPushPropertiesSetPropertyInParentThenChild);
40877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
40887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertyInChildThenParent
40897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
40907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
40917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
4092bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int last_source_frame_number = layer_tree_host()->source_frame_number() - 1;
40937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
40947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
40957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
40967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
40977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
40987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
40997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
41007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
41017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
41027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
41037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
41047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
41057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
41067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
41077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
41087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
41097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->SetPosition(gfx::Point(1, 1));
41107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->SetPosition(gfx::Point(1, 1));
41117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->SetPosition(gfx::Point(1, 1));
41127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
41137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
41147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
41157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
41167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
41177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
41187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
41197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
41207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
41217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
41227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
41237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
41247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
41257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
41267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
41277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
41287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
41297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
41307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
41317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
41327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
41337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
41347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
41357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
41367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
41377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
41387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
41397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
41407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
41417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
41427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
41437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
41447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
41457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
41467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
41477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
41487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
41497dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(
41507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTestPushPropertiesSetPropertyInChildThenParent);
41517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// This test verifies that the tree activation callback is invoked correctly.
4153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass LayerTreeHostTestTreeActivationCallback : public LayerTreeHostTest {
4154ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public:
4155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  LayerTreeHostTestTreeActivationCallback()
4156ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      : num_commits_(0), callback_count_(0) {}
4157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4158ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual void BeginTest() OVERRIDE {
4159ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_TRUE(HasImplThread());
4160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    PostSetNeedsCommitToMainThread();
4161ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
4162ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
41635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
41645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl* host_impl,
41655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl::FrameData* frame_data,
41665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
4167ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ++num_commits_;
4168ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    switch (num_commits_) {
4169ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      case 1:
4170ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        EXPECT_EQ(0, callback_count_);
4171ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        callback_count_ = 0;
4172ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        SetCallback(true);
4173ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        PostSetNeedsCommitToMainThread();
4174ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        break;
4175ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      case 2:
4176ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        EXPECT_EQ(1, callback_count_);
4177ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        callback_count_ = 0;
4178ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        SetCallback(false);
4179ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        PostSetNeedsCommitToMainThread();
4180ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        break;
4181ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      case 3:
4182ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        EXPECT_EQ(0, callback_count_);
4183ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        callback_count_ = 0;
4184ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        EndTest();
4185ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        break;
4186ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      default:
4187ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        ADD_FAILURE() << num_commits_;
4188ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        EndTest();
4189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        break;
4190ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
41915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return LayerTreeHostTest::PrepareToDrawOnThread(
41925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        host_impl, frame_data, draw_result);
4193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
4194ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
41955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE { EXPECT_EQ(3, num_commits_); }
4196ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4197ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void SetCallback(bool enable) {
41985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    output_surface()->SetTreeActivationCallback(
41995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        enable
42005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ? base::Bind(
42015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  &LayerTreeHostTestTreeActivationCallback::ActivationCallback,
42025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  base::Unretained(this))
42035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            : base::Closure());
4204ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
4205ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
42065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ActivationCallback() { ++callback_count_; }
4207ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4208ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int num_commits_;
4209ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int callback_count_;
4210ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
4211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4212ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(LayerTreeHostTestTreeActivationCallback, DirectRenderer) {
4213ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RunTest(true, false, true);
4214ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
4215ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4216ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(LayerTreeHostTestTreeActivationCallback, DelegatingRenderer) {
4217ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RunTest(true, true, true);
4218ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
4219ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
42202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass LayerInvalidateCausesDraw : public LayerTreeHostTest {
4221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
42222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  LayerInvalidateCausesDraw() : num_commits_(0), num_draws_(0) {}
4223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void BeginTest() OVERRIDE {
42252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    ASSERT_TRUE(!!invalidate_layer_)
42262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        << "Derived tests must set this in SetupTree";
42272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // One initial commit.
4229a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
4230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
42332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    // After commit, invalidate the layer.  This should cause a commit.
4234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (layer_tree_host()->source_frame_number() == 1)
42355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      invalidate_layer_->SetNeedsDisplay();
4236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
4239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    num_draws_++;
4240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (impl->active_tree()->source_frame_number() == 1)
4241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      EndTest();
4242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
4245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    num_commits_++;
4246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {
4249a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_GE(2, num_commits_);
4250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_GE(2, num_draws_);
4251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
42532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch protected:
42542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  scoped_refptr<Layer> invalidate_layer_;
42552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
4257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int num_commits_;
4258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int num_draws_;
4259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
4260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
42612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// VideoLayer must support being invalidated and then passing that along
42622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// to the compositor thread, even though no resources are updated in
42632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// response to that invalidation.
42642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass LayerTreeHostTestVideoLayerInvalidate : public LayerInvalidateCausesDraw {
42652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch public:
42662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual void SetupTree() OVERRIDE {
42672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    LayerTreeHostTest::SetupTree();
42682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    scoped_refptr<VideoLayer> video_layer = VideoLayer::Create(&provider_);
42692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    video_layer->SetBounds(gfx::Size(10, 10));
42702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    video_layer->SetIsDrawable(true);
42712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    layer_tree_host()->root_layer()->AddChild(video_layer);
42722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
42732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    invalidate_layer_ = video_layer;
42742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
42752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
42762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch private:
42772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  FakeVideoFrameProvider provider_;
42782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch};
42792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestVideoLayerInvalidate);
4281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
42822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// IOSurfaceLayer must support being invalidated and then passing that along
42832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// to the compositor thread, even though no resources are updated in
42842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// response to that invalidation.
42852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass LayerTreeHostTestIOSurfaceLayerInvalidate
42862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    : public LayerInvalidateCausesDraw {
42872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch public:
42882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual void SetupTree() OVERRIDE {
42892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    LayerTreeHostTest::SetupTree();
42902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    scoped_refptr<IOSurfaceLayer> layer = IOSurfaceLayer::Create();
42912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    layer->SetBounds(gfx::Size(10, 10));
42922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    uint32_t fake_io_surface_id = 7;
42932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    layer->SetIOSurfaceProperties(fake_io_surface_id, layer->bounds());
42942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    layer->SetIsDrawable(true);
42952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    layer_tree_host()->root_layer()->AddChild(layer);
42962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
42972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    invalidate_layer_ = layer;
42982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
42992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch};
43002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
43012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// TODO(danakj): IOSurface layer can not be transported. crbug.com/239335
43022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochSINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
43032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    LayerTreeHostTestIOSurfaceLayerInvalidate);
43042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class LayerTreeHostTestPushHiddenLayer : public LayerTreeHostTest {
4306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected:
4307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
4308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_layer_ = Layer::Create();
4309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_layer_->SetAnchorPoint(gfx::PointF());
4310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_layer_->SetPosition(gfx::Point());
4311a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_layer_->SetBounds(gfx::Size(10, 10));
4312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    parent_layer_ = SolidColorLayer::Create();
4314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    parent_layer_->SetAnchorPoint(gfx::PointF());
4315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    parent_layer_->SetPosition(gfx::Point());
4316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    parent_layer_->SetBounds(gfx::Size(10, 10));
4317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    parent_layer_->SetIsDrawable(true);
4318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_layer_->AddChild(parent_layer_);
4319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    child_layer_ = SolidColorLayer::Create();
4321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    child_layer_->SetAnchorPoint(gfx::PointF());
4322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    child_layer_->SetPosition(gfx::Point());
4323a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    child_layer_->SetBounds(gfx::Size(10, 10));
4324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    child_layer_->SetIsDrawable(true);
4325a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    parent_layer_->AddChild(child_layer_);
4326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
4328a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
4329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4331a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
4332a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
4334a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (layer_tree_host()->source_frame_number()) {
4335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
4336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The layer type used does not need to push properties every frame.
4337a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_FALSE(child_layer_->needs_push_properties());
4338a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4339a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Change the bounds of the child layer, but make it skipped
4340a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // by CalculateDrawProperties.
4341a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        parent_layer_->SetOpacity(0.f);
4342a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        child_layer_->SetBounds(gfx::Size(5, 5));
4343a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
4344a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 2:
4345a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The bounds of the child layer were pushed to the impl side.
4346a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_FALSE(child_layer_->needs_push_properties());
4347a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4348a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EndTest();
4349a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
4350a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
4351a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4352a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4353a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
4354a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LayerImpl* root = impl->active_tree()->root_layer();
4355a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LayerImpl* parent = root->children()[0];
4356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LayerImpl* child = parent->children()[0];
4357a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
4359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
4360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(gfx::Size(5, 5).ToString(), child->bounds().ToString());
4361a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
4362a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
4363a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4364a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4365a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
4366a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4367a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<Layer> root_layer_;
4368a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<SolidColorLayer> parent_layer_;
4369a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<SolidColorLayer> child_layer_;
4370a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
4371a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4372a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPushHiddenLayer);
4373a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4374a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class LayerTreeHostTestUpdateLayerInEmptyViewport : public LayerTreeHostTest {
4375a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected:
4376a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
4377a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    settings->impl_side_painting = true;
4378a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4379a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4380a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
4381a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_layer_ = FakePictureLayer::Create(&client_);
4382a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_layer_->SetAnchorPoint(gfx::PointF());
4383a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_layer_->SetBounds(gfx::Size(10, 10));
4384a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4385a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
4386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
4387a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4389a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void BeginTest() OVERRIDE {
4390a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // The viewport is empty, but we still need to update layers on the main
4391a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // thread.
4392a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(0, 0));
4393a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
4394a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4395a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4396a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
4397a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // The layer should be updated even though the viewport is empty, so we
4398a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // are capable of drawing it on the impl tree.
4399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_GT(root_layer_->update_count(), 0u);
4400a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EndTest();
4401a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4402a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4403a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
4404a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4405a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  FakeContentLayerClient client_;
4406a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<FakePictureLayer> root_layer_;
4407a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
4408a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4409a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestUpdateLayerInEmptyViewport);
4410a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
44113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass LayerTreeHostTestAbortEvictedTextures : public LayerTreeHostTest {
44123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch public:
44133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  LayerTreeHostTestAbortEvictedTextures()
44141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      : num_will_begin_main_frames_(0), num_impl_commits_(0) {}
44153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
44163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch protected:
44173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void SetupTree() OVERRIDE {
44183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    scoped_refptr<SolidColorLayer> root_layer = SolidColorLayer::Create();
44193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    root_layer->SetBounds(gfx::Size(200, 200));
44203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    root_layer->SetIsDrawable(true);
44213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
44223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    layer_tree_host()->SetRootLayer(root_layer);
44233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    LayerTreeHostTest::SetupTree();
44243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
44253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
44263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
44273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
44281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void WillBeginMainFrame() OVERRIDE {
44291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    num_will_begin_main_frames_++;
44301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    switch (num_will_begin_main_frames_) {
44313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      case 2:
44323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        // Send a redraw to the compositor thread.  This will (wrongly) be
44333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        // ignored unless aborting resets the texture state.
44343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        layer_tree_host()->SetNeedsRedraw();
44353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        break;
44363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    }
44373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
44383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
44393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void BeginCommitOnThread(LayerTreeHostImpl* impl) OVERRIDE {
44403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    num_impl_commits_++;
44413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
44423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
44433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
44443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    switch (impl->SourceAnimationFrameNumber()) {
44453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      case 1:
44463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        // Prevent draws until commit.
44473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        impl->active_tree()->SetContentsTexturesPurged();
44483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        EXPECT_FALSE(impl->CanDraw());
44493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        // Trigger an abortable commit.
44503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        impl->SetNeedsCommit();
44513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        break;
44523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      case 2:
44533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        EndTest();
44543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        break;
44553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    }
44563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
44573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
44583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void AfterTest() OVERRIDE {
44593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // Ensure that the commit was truly aborted.
44601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_EQ(2, num_will_begin_main_frames_);
44613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    EXPECT_EQ(1, num_impl_commits_);
44623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
44633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
44643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch private:
44651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int num_will_begin_main_frames_;
44663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  int num_impl_commits_;
44673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch};
44683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
44693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// Commits can only be aborted when using the thread proxy.
44703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestAbortEvictedTextures);
44713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
447258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostTestMaxTransferBufferUsageBytes : public LayerTreeHostTest {
447358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
447458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
447558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings->impl_side_painting = true;
4476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    settings->default_tile_size = gfx::Size(128, 128);
447758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
447858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
44795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback)
448058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      OVERRIDE {
4481d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    scoped_refptr<TestContextProvider> context_provider =
4482d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        TestContextProvider::Create();
4483d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    context_provider->SetMaxTransferBufferUsageBytes(1024 * 1024);
44845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return FakeOutputSurface::Create3d(context_provider);
448558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
448658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
448758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
448858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_refptr<FakePictureLayer> root_layer =
448958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        FakePictureLayer::Create(&client_);
449058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    root_layer->SetBounds(gfx::Size(6000, 6000));
449158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    root_layer->SetIsDrawable(true);
449258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
449358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer);
449458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
449558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
449658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
44975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
449858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
449958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
45005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
450158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
450258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Expect that the transfer buffer memory used is equal to the
450358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // MaxTransferBufferUsageBytes value set in CreateOutputSurface.
4504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // NOTE: This is now 1/2 due to raster memory limit in TileManager.
4505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    //       Only half the limit will be reached unless the task set
4506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    //       thrashes to a completly new set of tiles.
45075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(512 * 1024u, context->GetPeakTransferBufferMemoryUsedBytes());
450858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
450958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
451058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
451158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
451258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
451358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
451458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeContentLayerClient client_;
451558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
451658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
451758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Impl-side painting is a multi-threaded compositor feature.
451858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestMaxTransferBufferUsageBytes);
451958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
452068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Test ensuring that memory limits are sent to the prioritized resource
452168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// manager.
452268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class LayerTreeHostTestMemoryLimits : public LayerTreeHostTest {
452368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public:
452468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  LayerTreeHostTestMemoryLimits() : num_commits_(0) {}
452568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
452668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
452768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
45285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void WillCommit() OVERRIDE {
45295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Some commits are aborted, so increment number of attempted commits here.
45305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    num_commits_++;
45315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
45325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
453368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
45345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (num_commits_) {
45355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 1:
453668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // Verify default values.
45375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(PrioritizedResourceManager::DefaultMemoryAllocationLimit(),
45385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  layer_tree_host()
45395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->contents_texture_manager()
45405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->MaxMemoryLimitBytes());
45415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(PriorityCalculator::AllowEverythingCutoff(),
45425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  layer_tree_host()
45435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->contents_texture_manager()
45445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->ExternalPriorityCutoff());
454568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
454668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
45475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 2:
454868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // The values should remain the same until the commit after the policy
454968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // is changed.
45505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(PrioritizedResourceManager::DefaultMemoryAllocationLimit(),
45515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  layer_tree_host()
45525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->contents_texture_manager()
45535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->MaxMemoryLimitBytes());
45545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(PriorityCalculator::AllowEverythingCutoff(),
45555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  layer_tree_host()
45565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->contents_texture_manager()
45575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->ExternalPriorityCutoff());
455868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
45595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 3:
456068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // Verify values were correctly passed.
45615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(16u * 1024u * 1024u,
45625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  layer_tree_host()
45635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->contents_texture_manager()
45645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->MaxMemoryLimitBytes());
45655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(PriorityCalculator::AllowVisibleAndNearbyCutoff(),
45665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  layer_tree_host()
45675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->contents_texture_manager()
45685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->ExternalPriorityCutoff());
456968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EndTest();
457068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
45715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 4:
457268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // Make sure no extra commits happen.
457368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        NOTREACHED();
457468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
457568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
457668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
457768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
457868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
45795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (num_commits_) {
458068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 1:
45815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
45825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 2:
458368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // This will trigger a commit because the priority cutoff has changed.
458468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        impl->SetMemoryPolicy(ManagedMemoryPolicy(
45855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            16u * 1024u * 1024u,
45861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE,
458768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            1000));
458868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
45895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 3:
459068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // This will not trigger a commit because the priority cutoff has not
459168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // changed, and there is already enough memory for all allocations.
459268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        impl->SetMemoryPolicy(ManagedMemoryPolicy(
45935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            32u * 1024u * 1024u,
45941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE,
459568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            1000));
459668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
45975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 4:
459868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        NOTREACHED();
459968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
460068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
460168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
460268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
460368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
460468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
460568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private:
460668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int num_commits_;
460768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
460868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
46098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostTestMemoryLimits);
461068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
46114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerSetsNeedsFilterContext : public Layer {
46124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
46134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static scoped_refptr<LayerSetsNeedsFilterContext> Create() {
46144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return make_scoped_refptr(new LayerSetsNeedsFilterContext());
46154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
46164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual bool Update(ResourceUpdateQueue* queue,
4618a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      const OcclusionTracker<Layer>* occlusion) OVERRIDE {
46194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    bool updated = Layer::Update(queue, occlusion);
46204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (needs_context_) {
46214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      layer_tree_host()->set_needs_filter_context();
46224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return true;
46234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
46244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return updated;
46254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
46264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void set_needs_context(bool need) { needs_context_ = need; }
46284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
46304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerSetsNeedsFilterContext() : needs_context_(false) {}
46314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~LayerSetsNeedsFilterContext() {}
46324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool needs_context_;
46344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
46354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestOffscreenContext : public LayerTreeHostTest {
46374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
46384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
46394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<LayerSetsNeedsFilterContext> root =
46404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        LayerSetsNeedsFilterContext::Create();
46414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->SetIsDrawable(true);
46424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->SetAnchorPoint(gfx::PointF());
46434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->SetBounds(gfx::Size(10, 10));
46444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->set_needs_context(with_context_);
46454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root);
46464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
46474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
46484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
46504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
46524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    bool expect_context = with_context_;
46534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (delegating_renderer())
46544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      expect_context = false;
46554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(expect_context, !!host_impl->offscreen_context_provider());
46564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EndTest();
46574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
46584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
46604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool with_context_;
46624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
46634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestOffscreenContext_NoContext
46654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostTestOffscreenContext {
46664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
46674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerTreeHostTestOffscreenContext_NoContext() { with_context_ = false; }
46684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
46694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestOffscreenContext_NoContext);
46714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestOffscreenContext_WithContext
46734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostTestOffscreenContext {
46744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
46754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerTreeHostTestOffscreenContext_WithContext() { with_context_ = true; }
46764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
46774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestOffscreenContext_WithContext);
46794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestNoQuadsForEmptyLayer : public LayerTreeHostTest {
46814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
46824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
46834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
46844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_layer_ = FakeContentLayer::Create(&client_);
46854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(10, 10));
46864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_layer_->SetIsDrawable(false);
46874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_layer_->SetHaveWheelEventHandlers(true);
46884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
46894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
46904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
46914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
46934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
46954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    FakeContentLayerImpl* layer_impl =
46965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        static_cast<FakeContentLayerImpl*>(impl->RootLayer());
46974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_FALSE(layer_impl->DrawsContent());
46984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(0u, layer_impl->append_quads_count());
46994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
47004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
47014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
47024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // The layer is not drawable, so it should not be updated.
47034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(0u, root_layer_->update_count());
47044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EndTest();
47054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
47064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
47074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
47084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
47094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeContentLayerClient client_;
47104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root_layer_;
47114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
47124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
47134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoQuadsForEmptyLayer);
47144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
47152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
47163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
47174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestSetMemoryPolicyOnLostOutputSurface
47184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostTest {
47194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
47204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerTreeHostTestSetMemoryPolicyOnLostOutputSurface()
47214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : first_output_surface_memory_limit_(4321234),
47224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        second_output_surface_memory_limit_(1234321) {}
47234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
47245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback)
47254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      OVERRIDE {
47264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!first_context_provider_) {
47274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      first_context_provider_ = TestContextProvider::Create();
47284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    } else {
47294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_FALSE(second_context_provider_);
47304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      second_context_provider_ = TestContextProvider::Create();
47314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
47324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
47335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<FakeOutputSurface> output_surface(FakeOutputSurface::Create3d(
47345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        second_context_provider_ ? second_context_provider_
47355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 : first_context_provider_));
47365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    output_surface->SetMemoryPolicyToSetAtBind(
47375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        make_scoped_ptr(new ManagedMemoryPolicy(
47385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            second_context_provider_ ? second_output_surface_memory_limit_
47395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     : first_output_surface_memory_limit_,
47401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE,
47411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            ManagedMemoryPolicy::kDefaultNumResourcesLimit)));
47425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return output_surface.Pass();
47434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
47444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
47454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
47464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_ = FakeContentLayer::Create(&client_);
47474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_->SetBounds(gfx::Size(20, 20));
47484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
47494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
47504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
47514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
47525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
47534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
47544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
47554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Lost context sometimes takes two frames to recreate. The third frame
47564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // is sometimes aborted, so wait until the fourth frame to verify that
47574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // the memory has been set, and the fifth frame to end the test.
47584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (layer_tree_host()->source_frame_number() < 5) {
47594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
47604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    } else if (layer_tree_host()->source_frame_number() == 5) {
47614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EndTest();
47624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
47634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
47644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
47655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* impl,
47665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   bool result) OVERRIDE {
47674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
47684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
47694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(first_output_surface_memory_limit_,
47704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  impl->memory_allocation_limit_bytes());
47714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Lose the output surface.
47724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        first_context_provider_->TestContext3d()->loseContextCHROMIUM(
47735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB);
47744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
47754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
47764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(second_output_surface_memory_limit_,
47774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  impl->memory_allocation_limit_bytes());
47784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
47794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
47804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
47814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
47824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
47834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
47844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<TestContextProvider> first_context_provider_;
47854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<TestContextProvider> second_context_provider_;
47864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t first_output_surface_memory_limit_;
47874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t second_output_surface_memory_limit_;
47884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeContentLayerClient client_;
47894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root_;
47904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
47914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
47924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// No output to copy for delegated renderers.
47934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
47944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostTestSetMemoryPolicyOnLostOutputSurface);
47954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct TestSwapPromiseResult {
47975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestSwapPromiseResult()
47985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : did_swap_called(false),
47995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        did_not_swap_called(false),
48005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        dtor_called(false),
48015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        reason(SwapPromise::DID_NOT_SWAP_UNKNOWN) {}
4802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool did_swap_called;
4804f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool did_not_swap_called;
4805f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool dtor_called;
4806f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SwapPromise::DidNotSwapReason reason;
4807f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::Lock lock;
4808f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
4809f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4810f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TestSwapPromise : public SwapPromise {
4811f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
48125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit TestSwapPromise(TestSwapPromiseResult* result) : result_(result) {}
4813f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4814f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~TestSwapPromise() {
4815f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::AutoLock lock(result_->lock);
4816f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    result_->dtor_called = true;
4817f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4818f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4819a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void DidSwap(CompositorFrameMetadata* metadata) OVERRIDE {
4820f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::AutoLock lock(result_->lock);
4821f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(result_->did_swap_called);
4822f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(result_->did_not_swap_called);
4823f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    result_->did_swap_called = true;
4824f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4825f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4826f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void DidNotSwap(DidNotSwapReason reason) OVERRIDE {
4827f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::AutoLock lock(result_->lock);
4828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(result_->did_swap_called);
4829f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(result_->did_not_swap_called);
4830f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    result_->did_not_swap_called = true;
4831f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    result_->reason = reason;
4832f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4833f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4834f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
4835f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Not owned.
4836f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestSwapPromiseResult* result_;
4837f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
4838f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
48395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestBreakSwapPromise : public LayerTreeHostTest {
4840f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected:
4841f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LayerTreeHostTestBreakSwapPromise()
48425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : commit_count_(0), commit_complete_count_(0) {}
4843f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4844f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void WillBeginMainFrame() OVERRIDE {
4845f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_LE(commit_count_, 2);
48465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<SwapPromise> swap_promise(
48475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new TestSwapPromise(&swap_promise_result_[commit_count_]));
4848f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    layer_tree_host()->QueueSwapPromise(swap_promise.Pass());
4849f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
4852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4853f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
4854f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    commit_count_++;
4855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (commit_count_ == 2) {
4856f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // This commit will finish.
4857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
4858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
4859f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4860f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4861f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4862f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    commit_complete_count_++;
4863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (commit_complete_count_ == 1) {
4864f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // This commit will be aborted because no actual update.
4865f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      PostSetNeedsUpdateLayersToMainThread();
4866f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    } else {
4867f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EndTest();
4868f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
4869f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4870f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4871f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
4872f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // 3 commits are scheduled. 2 completes. 1 is aborted.
4873f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(commit_count_, 3);
4874f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(commit_complete_count_, 2);
4875f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
4877f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // The first commit completes and causes swap buffer which finishes
4878f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // the promise.
4879f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::AutoLock lock(swap_promise_result_[0].lock);
4880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_TRUE(swap_promise_result_[0].did_swap_called);
4881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_FALSE(swap_promise_result_[0].did_not_swap_called);
4882f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_TRUE(swap_promise_result_[0].dtor_called);
4883f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
4884f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4885f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
4886f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // The second commit aborts.
4887f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::AutoLock lock(swap_promise_result_[1].lock);
4888f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_FALSE(swap_promise_result_[1].did_swap_called);
4889f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called);
4890f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_[1].reason);
4891f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_TRUE(swap_promise_result_[1].dtor_called);
4892f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
4893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4894f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
4895f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // The last commit completes but it does not cause swap buffer because
4896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // there is no damage in the frame data.
4897f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::AutoLock lock(swap_promise_result_[2].lock);
4898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_FALSE(swap_promise_result_[2].did_swap_called);
4899f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called);
4900f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason);
4901f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_TRUE(swap_promise_result_[2].dtor_called);
4902f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
4903f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4904f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4905f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int commit_count_;
4906f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int commit_complete_count_;
4907f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestSwapPromiseResult swap_promise_result_[3];
4908f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
4909f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4910f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestBreakSwapPromise);
4911f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4912a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class SimpleSwapPromiseMonitor : public SwapPromiseMonitor {
4913a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
4914a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SimpleSwapPromiseMonitor(LayerTreeHost* layer_tree_host,
4915a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           LayerTreeHostImpl* layer_tree_host_impl,
4916a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           int* set_needs_commit_count,
4917a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           int* set_needs_redraw_count)
4918a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      : SwapPromiseMonitor(layer_tree_host, layer_tree_host_impl),
4919a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        set_needs_commit_count_(set_needs_commit_count),
4920a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        set_needs_redraw_count_(set_needs_redraw_count) {}
4921a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4922a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~SimpleSwapPromiseMonitor() {}
4923a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4924a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnSetNeedsCommitOnMain() OVERRIDE {
4925a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    (*set_needs_commit_count_)++;
4926a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
4927a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4928a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnSetNeedsRedrawOnImpl() OVERRIDE {
4929a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    (*set_needs_redraw_count_)++;
4930a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
4931a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4932a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
4933a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int* set_needs_commit_count_;
4934a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int* set_needs_redraw_count_;
4935a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
4936a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
49375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestSimpleSwapPromiseMonitor : public LayerTreeHostTest {
49385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
4939a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
4940a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4941a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void WillBeginMainFrame() OVERRIDE {
4942a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int set_needs_commit_count = 0;
4943a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int set_needs_redraw_count = 0;
4944a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4945a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    {
4946a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor(
4947a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          new SimpleSwapPromiseMonitor(layer_tree_host(),
4948a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       NULL,
4949a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       &set_needs_commit_count,
4950a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       &set_needs_redraw_count));
4951a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
4952a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(1, set_needs_commit_count);
4953a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(0, set_needs_redraw_count);
4954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
4955a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4956a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Now the monitor is destroyed, SetNeedsCommit() is no longer being
4957a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // monitored.
4958a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    layer_tree_host()->SetNeedsCommit();
4959a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1, set_needs_commit_count);
4960a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(0, set_needs_redraw_count);
4961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4962a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    {
4963a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor(
4964a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          new SimpleSwapPromiseMonitor(layer_tree_host(),
4965a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       NULL,
4966a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       &set_needs_commit_count,
4967a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       &set_needs_redraw_count));
4968a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      layer_tree_host()->SetNeedsUpdateLayers();
4969a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(2, set_needs_commit_count);
4970a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(0, set_needs_redraw_count);
4971a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
4972a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4973a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    {
4974a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor(
4975a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          new SimpleSwapPromiseMonitor(layer_tree_host(),
4976a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       NULL,
4977a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       &set_needs_commit_count,
4978a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       &set_needs_redraw_count));
4979a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      layer_tree_host()->SetNeedsAnimate();
4980a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(3, set_needs_commit_count);
4981a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(0, set_needs_redraw_count);
4982a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
4983a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4984a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EndTest();
4985a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
4986a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4987a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
4988a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
4989a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4990a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSimpleSwapPromiseMonitor);
4991a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4992a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostTestHighResRequiredAfterEvictingUIResources
4993a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public LayerTreeHostTest {
4994a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
4995a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
4996a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    settings->impl_side_painting = true;
4997a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4998a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4999a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
5000a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
5001a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
5002a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5003a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5004a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
5005a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5006a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
5007a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    host_impl->EvictAllUIResources();
5008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Existence of evicted UI resources will trigger NEW_CONTENT_TAKES_PRIORITY
5009a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // mode. Active tree should require high-res to draw after entering this
5010a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // mode to ensure that high-res tiles are also required for a pending tree
5011a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // to be activated.
5012a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(host_impl->active_tree()->RequiresHighResToDraw());
5013a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5014a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5015a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
5016a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int frame = layer_tree_host()->source_frame_number();
5017a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    switch (frame) {
5018a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      case 1:
5019a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
5020a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
5021a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      case 2:
5022a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ui_resource_.reset();
5023a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        EndTest();
5024a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
5025a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
5026a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5027a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5028a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
5029a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5030a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FakeContentLayerClient client_;
5031a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<FakeScopedUIResource> ui_resource_;
5032a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
5033a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5034a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestHighResRequiredAfterEvictingUIResources);
5035a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5036a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostTestHybridRasterizationSetting : public LayerTreeHostTest {
5037a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
5038a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
5039a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    settings->impl_side_painting = true;
5040a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    settings->rasterization_site = LayerTreeSettings::HybridRasterization;
5041a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5042a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5043a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
5044a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
5045a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5046a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    scoped_refptr<PictureLayer> parent = PictureLayer::Create(&client_);
5047a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent->SetBounds(gfx::Size(10, 10));
5048a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(parent);
5049a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5050a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    scoped_refptr<Layer> child = PictureLayer::Create(&client_);
5051a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    child->SetBounds(gfx::Size(10, 10));
5052a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent->AddChild(child);
5053a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5054a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent->SetHasGpuRasterizationHint(true);
5055a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5056a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5057a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
5058a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5059a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
5060a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerImpl* root = host_impl->pending_tree()->root_layer();
5061a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PictureLayerImpl* parent =
5062a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        static_cast<PictureLayerImpl*>(root->children()[0]);
5063a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PictureLayerImpl* child =
5064a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        static_cast<PictureLayerImpl*>(parent->children()[0]);
5065a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5066a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Only layers with a GPU rasterization hint should use GPU rasterization.
5067a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(parent->ShouldUseGpuRasterization());
5068a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(child->ShouldUseGpuRasterization());
5069a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5070a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5071a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
5072a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerImpl* root = host_impl->active_tree()->root_layer();
5073a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PictureLayerImpl* parent =
5074a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        static_cast<PictureLayerImpl*>(root->children()[0]);
5075a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PictureLayerImpl* child =
5076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        static_cast<PictureLayerImpl*>(parent->children()[0]);
5077a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5078a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Only layers with a GPU rasterization hint should use GPU rasterization.
5079a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(parent->ShouldUseGpuRasterization());
5080a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(child->ShouldUseGpuRasterization());
5081a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EndTest();
5082a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5083a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5084a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
5085a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5086a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FakeContentLayerClient client_;
5087a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
5088a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5089a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestHybridRasterizationSetting);
5090a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5091a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostTestGpuRasterizationSetting : public LayerTreeHostTest {
5092a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
5093a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
5094a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    settings->impl_side_painting = true;
5095a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    settings->rasterization_site = LayerTreeSettings::GpuRasterization;
5096a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5097a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5098a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
5099a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
5100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    scoped_refptr<PictureLayer> parent = PictureLayer::Create(&client_);
5102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent->SetBounds(gfx::Size(10, 10));
5103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(parent);
5104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    scoped_refptr<Layer> child = PictureLayer::Create(&client_);
5106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    child->SetBounds(gfx::Size(10, 10));
5107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent->AddChild(child);
5108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent->SetHasGpuRasterizationHint(true);
5110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
5113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
5115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerImpl* root = host_impl->pending_tree()->root_layer();
5116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PictureLayerImpl* parent =
5117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        static_cast<PictureLayerImpl*>(root->children()[0]);
5118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PictureLayerImpl* child =
5119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        static_cast<PictureLayerImpl*>(parent->children()[0]);
5120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // All layers should use GPU rasterization, regardless of whether a GPU
5122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // rasterization hint has been set.
5123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(parent->ShouldUseGpuRasterization());
5124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(child->ShouldUseGpuRasterization());
5125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
5128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerImpl* root = host_impl->active_tree()->root_layer();
5129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PictureLayerImpl* parent =
5130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        static_cast<PictureLayerImpl*>(root->children()[0]);
5131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PictureLayerImpl* child =
5132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        static_cast<PictureLayerImpl*>(parent->children()[0]);
5133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // All layers should use GPU rasterization, regardless of whether a GPU
5135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // rasterization hint has been set.
5136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(parent->ShouldUseGpuRasterization());
5137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(child->ShouldUseGpuRasterization());
5138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EndTest();
5139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
5142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FakeContentLayerClient client_;
5144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
5145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestGpuRasterizationSetting);
5147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass LayerTreeHostTestContinuousPainting : public LayerTreeHostTest {
5149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
5150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  LayerTreeHostTestContinuousPainting()
5151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      : num_commits_(0), num_draws_(0), bounds_(20, 20), child_layer_(NULL) {}
5152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected:
5154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  enum { kExpectedNumCommits = 10 };
5155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void SetupTree() OVERRIDE {
5157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    scoped_refptr<Layer> root_layer = Layer::Create();
5158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    root_layer->SetBounds(bounds_);
5159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (layer_tree_host()->settings().impl_side_painting) {
5161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      picture_layer_ = FakePictureLayer::Create(&client_);
5162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      child_layer_ = picture_layer_.get();
5163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    } else {
5164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      content_layer_ = ContentLayerWithUpdateTracking::Create(&client_);
5165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      child_layer_ = content_layer_.get();
5166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
5167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    child_layer_->SetBounds(bounds_);
5168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    child_layer_->SetIsDrawable(true);
5169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    root_layer->AddChild(child_layer_);
5170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    layer_tree_host()->SetRootLayer(root_layer);
5172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    layer_tree_host()->SetViewportSize(bounds_);
5173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    LayerTreeHostTest::SetupTree();
5174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
5175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void BeginTest() OVERRIDE {
5177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Wait 50x longer than expected.
5178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    double milliseconds_per_frame =
5179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        1000 / layer_tree_host()->settings().refresh_rate;
5180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EndTestAfterDelay(50 * kExpectedNumCommits * milliseconds_per_frame);
5181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    MainThreadTaskRunner()->PostTask(
5182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        FROM_HERE,
5183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        base::Bind(
5184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            &LayerTreeHostTestContinuousPainting::EnableContinuousPainting,
5185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            base::Unretained(this)));
5186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
5187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void Animate(base::TimeTicks monotonic_time) OVERRIDE {
5189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    child_layer_->SetNeedsDisplay();
5190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
5191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void AfterTest() OVERRIDE {
5193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_LE(kExpectedNumCommits, num_commits_);
5194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_LE(kExpectedNumCommits, num_draws_);
5195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int update_count = content_layer_ ? content_layer_->PaintContentsCount()
5196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                      : picture_layer_->update_count();
5197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_LE(kExpectedNumCommits, update_count);
5198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
5199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
5201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (++num_draws_ == kExpectedNumCommits)
5202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      EndTest();
5203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
5204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
5206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ++num_commits_;
5207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
5208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private:
5210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void EnableContinuousPainting() {
5211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    LayerTreeDebugState debug_state = layer_tree_host()->debug_state();
5212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    debug_state.continuous_painting = true;
5213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    layer_tree_host()->SetDebugState(debug_state);
5214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
5215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int num_commits_;
5217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int num_draws_;
5218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const gfx::Size bounds_;
5219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FakeContentLayerClient client_;
5220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<ContentLayerWithUpdateTracking> content_layer_;
5221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<FakePictureLayer> picture_layer_;
5222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Layer* child_layer_;
5223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
5224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestContinuousPainting);
5226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
52272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
5228