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"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/output/compositor_frame_ack.h"
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/output/copy_output_request.h"
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/copy_output_result.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/output_surface.h"
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "cc/quads/draw_quad.h"
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "cc/quads/io_surface_draw_quad.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_queue.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h"
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_content_layer_impl.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h"
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_painted_scrollbar_layer.h"
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/test/fake_picture_layer.h"
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/test/fake_picture_layer_impl.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_proxy.h"
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_scoped_ui_resource.h"
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_video_frame_provider.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h"
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h"
460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/thread_proxy.h"
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/refptr.h"
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h"
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h"
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkPicture.h"
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/frame_time.h"
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/point_conversions.h"
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h"
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h"
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::_;
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AnyNumber;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AtLeast;
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::Mock;
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTest : public LayerTreeTest {};
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Two setNeedsCommits in a row should lead to at least 1 commit and at least 1
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// draw with frame 0.
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit1 : public LayerTreeHostTest {
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetNeedsCommit1() : num_commits_(0), num_draws_(0) {}
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draws_++;
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!impl->active_tree()->source_frame_number())
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_LE(1, num_commits_);
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_LE(1, num_draws_);
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit1);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
105a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// A SetNeedsCommit should lead to 1 commit. Issuing a second commit after that
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// first committed frame draws should lead to another commit.
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit2 : public LayerTreeHostTest {
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetNeedsCommit2() : num_commits_(0), num_draws_(0) {}
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_draws_;
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_commits_;
119a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    switch (num_commits_) {
120a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 1:
121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 2:
124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EndTest();
125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      default:
127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        NOTREACHED();
128a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(2, num_commits_);
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_LE(1, num_draws_);
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit2);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that we pass property values in PushPropertiesTo.
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass LayerTreeHostTestPushPropertiesTo : public LayerTreeHostTest {
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void SetupTree() OVERRIDE {
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_refptr<Layer> root = Layer::Create();
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    root->SetBounds(gfx::Size(10, 10));
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    layer_tree_host()->SetRootLayer(root);
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    LayerTreeHostTest::SetupTree();
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  enum Properties {
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    STARTUP,
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    BOUNDS,
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HIDE_LAYER_AND_SUBTREE,
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DRAWS_CONTENT,
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DONE,
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void BeginTest() OVERRIDE {
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    index_ = STARTUP;
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PostSetNeedsCommitToMainThread();
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    VerifyAfterValues(impl->active_tree()->root_layer());
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SetBeforeValues(layer_tree_host()->root_layer());
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    VerifyBeforeValues(layer_tree_host()->root_layer());
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ++index_;
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (index_ == DONE) {
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EndTest();
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return;
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SetAfterValues(layer_tree_host()->root_layer());
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void AfterTest() OVERRIDE {}
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void VerifyBeforeValues(Layer* layer) {
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(gfx::Size(10, 10).ToString(), layer->bounds().ToString());
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(layer->hide_layer_and_subtree());
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(layer->DrawsContent());
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetBeforeValues(Layer* layer) {
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    layer->SetBounds(gfx::Size(10, 10));
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    layer->SetHideLayerAndSubtree(false);
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    layer->SetIsDrawable(false);
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void VerifyAfterValues(LayerImpl* layer) {
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    switch (static_cast<Properties>(index_)) {
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case STARTUP:
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case DONE:
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case BOUNDS:
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        EXPECT_EQ(gfx::Size(20, 20).ToString(), layer->bounds().ToString());
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case HIDE_LAYER_AND_SUBTREE:
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        EXPECT_TRUE(layer->hide_layer_and_subtree());
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case DRAWS_CONTENT:
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        EXPECT_TRUE(layer->DrawsContent());
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetAfterValues(Layer* layer) {
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    switch (static_cast<Properties>(index_)) {
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case STARTUP:
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case DONE:
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case BOUNDS:
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        layer->SetBounds(gfx::Size(20, 20));
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case HIDE_LAYER_AND_SUBTREE:
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        layer->SetHideLayerAndSubtree(true);
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case DRAWS_CONTENT:
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        layer->SetIsDrawable(true);
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int index_;
232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesTo);
235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1 setNeedsRedraw after the first commit has completed should lead to 1
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// additional draw.
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedraw : public LayerTreeHostTest {
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetNeedsRedraw() : num_commits_(0), num_draws_(0) {}
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, impl->active_tree()->source_frame_number());
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!num_draws_) {
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Redraw again to verify that the second redraw doesn't commit.
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PostSetNeedsRedrawToMainThread();
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draws_++;
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, num_draws_);
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_GE(2, num_draws_);
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, num_commits_);
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedraw);
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// After setNeedsRedrawRect(invalid_rect) the final damage_rect
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// must contain invalid_rect.
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedrawRect : public LayerTreeHostTest {
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetNeedsRedrawRect()
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : num_draws_(0),
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        bounds_(50, 50),
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        invalid_rect_(10, 10, 20, 20),
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        root_layer_(ContentLayer::Create(&client_)) {}
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetIsDrawable(true);
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(bounds_);
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(bounds_);
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual DrawResult PrepareToDrawOnThread(
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl* host_impl,
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl::FrameData* frame_data,
293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      DrawResult draw_result) OVERRIDE {
294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(DRAW_SUCCESS, draw_result);
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::RectF root_damage_rect;
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!frame_data->render_passes.empty())
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_damage_rect = frame_data->render_passes.back()->damage_rect;
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!num_draws_) {
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // If this is the first frame, expect full frame damage.
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_RECT_EQ(root_damage_rect, gfx::Rect(bounds_));
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Check that invalid_rect_ is indeed repainted.
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(root_damage_rect.Contains(invalid_rect_));
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return draw_result;
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!num_draws_) {
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PostSetNeedsRedrawRectToMainThread(invalid_rect_);
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draws_++;
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE { EXPECT_EQ(2, num_draws_); }
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Size bounds_;
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect invalid_rect_;
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<ContentLayer> root_layer_;
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedrawRect);
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromInvalidate : public LayerTreeHostTest {
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
335b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    settings->layer_transforms_should_scale_layer_contents = true;
336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
338b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
339b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    root_layer_ = Layer::Create();
340b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(10, 20));
341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
342b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    scaled_layer_ = FakeContentLayer::Create(&client_);
343b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    scaled_layer_->SetBounds(gfx::Size(1, 1));
344b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    root_layer_->AddChild(scaled_layer_);
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
347b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
348b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
349b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() == 1)
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
358bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    switch (layer_tree_host()->source_frame_number()) {
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
360b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Changing the device scale factor causes a commit. It also changes
361b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // the content bounds of |scaled_layer_|, which should not generate
362b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // a second commit as a result.
363b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetDeviceScaleFactor(4.f);
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No extra commits.
367bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        EXPECT_EQ(2, layer_tree_host()->source_frame_number());
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
371b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
372b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    EXPECT_EQ(gfx::Size(4, 4).ToString(),
373b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)              scaled_layer_->content_bounds().ToString());
374b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
378b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_refptr<Layer> root_layer_;
379b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_refptr<FakeContentLayer> scaled_layer_;
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoExtraCommitFromInvalidate);
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromScrollbarInvalidate
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
387b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
388b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    settings->layer_transforms_should_scale_layer_contents = true;
389b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
392b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    root_layer_ = Layer::Create();
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(10, 20));
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool paint_scrollbar = true;
396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool has_thumb = false;
3973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scrollbar_ = FakePaintedScrollbarLayer::Create(
3983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        paint_scrollbar, has_thumb, root_layer_->id());
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetPosition(gfx::Point(0, 10));
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetBounds(gfx::Size(10, 10));
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->AddChild(scrollbar_);
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() == 1)
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
416bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    switch (layer_tree_host()->source_frame_number()) {
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
418b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Changing the device scale factor causes a commit. It also changes
419b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // the content bounds of |scrollbar_|, which should not generate
420b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // a second commit as a result.
421b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetDeviceScaleFactor(4.f);
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No extra commits.
425bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        EXPECT_EQ(2, layer_tree_host()->source_frame_number());
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
429b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
430b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    EXPECT_EQ(gfx::Size(40, 40).ToString(),
431b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)              scrollbar_->content_bounds().ToString());
432b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
436b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_refptr<Layer> root_layer_;
4373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<FakePaintedScrollbarLayer> scrollbar_;
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestNoExtraCommitFromScrollbarInvalidate);
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestSetNextCommitForcesRedraw : public LayerTreeHostTest {
4444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
4454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerTreeHostTestSetNextCommitForcesRedraw()
4464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : num_draws_(0),
4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        bounds_(50, 50),
4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        invalid_rect_(10, 10, 20, 20),
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        root_layer_(ContentLayer::Create(&client_)) {}
4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
4524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_layer_->SetIsDrawable(true);
4534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_layer_->SetBounds(bounds_);
4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_tree_host()->SetViewportSize(bounds_);
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (num_draws_ == 3 && host_impl->settings().impl_side_painting)
4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      host_impl->SetNeedsRedrawRect(invalid_rect_);
4624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual DrawResult PrepareToDrawOnThread(
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl* host_impl,
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl::FrameData* frame_data,
467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      DrawResult draw_result) OVERRIDE {
468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(DRAW_SUCCESS, draw_result);
4694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    gfx::RectF root_damage_rect;
4714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!frame_data->render_passes.empty())
4724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      root_damage_rect = frame_data->render_passes.back()->damage_rect;
4734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (num_draws_) {
4754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 0:
4764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_RECT_EQ(gfx::Rect(bounds_), root_damage_rect);
4774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
4784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
4794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
4804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root_damage_rect);
4814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_RECT_EQ(invalid_rect_, root_damage_rect);
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_RECT_EQ(gfx::Rect(bounds_), root_damage_rect);
4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      default:
4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        NOTREACHED();
4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
4914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return draw_result;
4934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (num_draws_) {
4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 0:
4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
4994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Cycle through a couple of empty commits to ensure we're observing the
5004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // right behavior
5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
5024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
5034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
5044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Should force full frame damage on the next commit
5054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        PostSetNextCommitForcesRedrawToMainThread();
5064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        if (host_impl->settings().impl_side_painting)
5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          host_impl->BlockNotifyReadyToActivateForTesting(true);
5094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        else
5104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          num_draws_++;
5114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
5124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
5134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        host_impl->BlockNotifyReadyToActivateForTesting(false);
5144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
5154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      default:
5164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
5174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
5184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
5194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    num_draws_++;
5204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
5214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE { EXPECT_EQ(5, num_draws_); }
5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
5254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int num_draws_;
5264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const gfx::Size bounds_;
5274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const gfx::Rect invalid_rect_;
5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeContentLayerClient client_;
5294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<ContentLayer> root_layer_;
5304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
5314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNextCommitForcesRedraw);
5334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Tests that if a layer is not drawn because of some reason in the parent then
5351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// its damage is preserved until the next time it is drawn.
5361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class LayerTreeHostTestUndrawnLayersDamageLater : public LayerTreeHostTest {
5371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
5381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  LayerTreeHostTestUndrawnLayersDamageLater()
5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : root_layer_(ContentLayer::Create(&client_)) {}
5401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
5421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    root_layer_->SetIsDrawable(true);
5431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    root_layer_->SetBounds(gfx::Size(50, 50));
5441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
5451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // The initially transparent layer has a larger child layer, which is
5471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // not initially drawn because of the this (parent) layer.
5481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    parent_layer_ = FakeContentLayer::Create(&client_);
5491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    parent_layer_->SetBounds(gfx::Size(15, 15));
5501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    parent_layer_->SetOpacity(0.0f);
5511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    root_layer_->AddChild(parent_layer_);
5521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    child_layer_ = FakeContentLayer::Create(&client_);
5541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    child_layer_->SetBounds(gfx::Size(25, 25));
5551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    parent_layer_->AddChild(child_layer_);
5561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
5581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
5591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
5611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual DrawResult PrepareToDrawOnThread(
5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl* host_impl,
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl::FrameData* frame_data,
565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      DrawResult draw_result) OVERRIDE {
566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(DRAW_SUCCESS, draw_result);
5671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    gfx::RectF root_damage_rect;
5691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!frame_data->render_passes.empty())
5701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      root_damage_rect = frame_data->render_passes.back()->damage_rect;
5711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // The first time, the whole view needs be drawn.
5731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Afterwards, just the opacity of surface_layer1 is changed a few times,
5741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // and each damage should be the bounding box of it and its child. If this
5751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // was working improperly, the damage might not include its childs bounding
5761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // box.
577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
578f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      case 0:
5791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        EXPECT_RECT_EQ(gfx::Rect(root_layer_->bounds()), root_damage_rect);
5801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      case 1:
5821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 2:
5831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 3:
5841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        EXPECT_RECT_EQ(gfx::Rect(child_layer_->bounds()), root_damage_rect);
5851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
5861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      default:
5871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        NOTREACHED();
5881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
5891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return draw_result;
5911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
5921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
5941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    switch (layer_tree_host()->source_frame_number()) {
5951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 1:
5961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        // Test not owning the surface.
5971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        parent_layer_->SetOpacity(1.0f);
5981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
5991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 2:
6001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        parent_layer_->SetOpacity(0.0f);
6011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
6021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 3:
6031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        // Test owning the surface.
6041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        parent_layer_->SetOpacity(0.5f);
6051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        parent_layer_->SetForceRenderSurface(true);
6061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
6071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 4:
6081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        EndTest();
6091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
6101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      default:
6111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        NOTREACHED();
6121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
6131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
6141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
6161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
6181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  FakeContentLayerClient client_;
6191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<ContentLayer> root_layer_;
6201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<FakeContentLayer> parent_layer_;
6211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<FakeContentLayer> child_layer_;
6221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
6231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
624f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestUndrawnLayersDamageLater);
6251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Tests that if a layer is not drawn because of some reason in the parent,
627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// causing its content bounds to not be computed, then when it is later drawn,
628a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// its content bounds get pushed.
629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostTestUndrawnLayersPushContentBoundsLater
630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public LayerTreeHostTest {
631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LayerTreeHostTestUndrawnLayersPushContentBoundsLater()
633a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      : root_layer_(Layer::Create()) {}
634a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
635a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
636a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    root_layer_->SetIsDrawable(true);
637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    root_layer_->SetBounds(gfx::Size(20, 20));
638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent_layer_ = Layer::Create();
641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent_layer_->SetBounds(gfx::Size(20, 20));
642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent_layer_->SetOpacity(0.0f);
643a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    root_layer_->AddChild(parent_layer_);
644a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    child_layer_ = Layer::Create();
646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    child_layer_->SetBounds(gfx::Size(15, 15));
647a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent_layer_->AddChild(child_layer_);
648a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
649a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
650a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
652a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
653a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
654a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
655a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerImpl* root = host_impl->active_tree()->root_layer();
656a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerImpl* parent = root->children()[0];
657a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerImpl* child = parent->children()[0];
658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
659a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
660a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      case 0:
661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        EXPECT_EQ(0.f, parent->opacity());
662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        EXPECT_EQ(gfx::SizeF(), child->content_bounds());
663a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      case 1:
665a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        EXPECT_EQ(1.f, parent->opacity());
666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        EXPECT_EQ(gfx::SizeF(15.f, 15.f), child->content_bounds());
667a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        EndTest();
668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      default:
670a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        NOTREACHED();
671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    switch (layer_tree_host()->source_frame_number()) {
676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      case 1:
677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        parent_layer_->SetOpacity(1.0f);
678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      case 2:
680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      default:
682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        NOTREACHED();
683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
684a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
686a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
687a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
688a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
689a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_refptr<Layer> root_layer_;
690a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_refptr<Layer> parent_layer_;
691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_refptr<Layer> child_layer_;
692a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
693a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
694a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
695a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerTreeHostTestUndrawnLayersPushContentBoundsLater);
696a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test verifies that properties on the layer tree host are commited
698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to the impl side.
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCommit : public LayerTreeHostTest {
700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestCommit() {}
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(20, 20));
705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->set_background_color(SK_ColorGRAY);
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
71158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(gfx::Size(20, 20), impl->DrawViewportSize());
712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(SK_ColorGRAY, impl->active_tree()->background_color());
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCommit);
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This test verifies that LayerTreeHostImpl's current frame time gets
72390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// updated in consecutive frames when it doesn't draw due to tree
72490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// activation failure.
72590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestFrameTimeUpdatesAfterActivationFails
72690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : public LayerTreeHostTest {
72790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
728424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LayerTreeHostTestFrameTimeUpdatesAfterActivationFails()
729424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      : frame_count_with_pending_tree_(0) {}
73090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
73190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
73290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(20, 20));
73390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    layer_tree_host()->set_background_color(SK_ColorGRAY);
73490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
73590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
73690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginCommitOnThread(LayerTreeHostImpl* impl) OVERRIDE {
7394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(frame_count_with_pending_tree_, 0);
7404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    impl->BlockNotifyReadyToActivateForTesting(true);
7414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
7424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void WillBeginImplFrameOnThread(LayerTreeHostImpl* impl,
744424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                          const BeginFrameArgs& args) OVERRIDE {
7454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (impl->pending_tree())
746424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      frame_count_with_pending_tree_++;
7474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (frame_count_with_pending_tree_ == 1) {
7494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_EQ(first_frame_time_.ToInternalValue(), 0);
75003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      first_frame_time_ = impl->CurrentBeginFrameArgs().frame_time;
751a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    } else if (frame_count_with_pending_tree_ == 2) {
752a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      impl->BlockNotifyReadyToActivateForTesting(false);
7534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
754424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
755424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
75690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
757424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (frame_count_with_pending_tree_ > 1) {
7584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_NE(first_frame_time_.ToInternalValue(), 0);
759424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      EXPECT_NE(first_frame_time_.ToInternalValue(),
76003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                impl->CurrentBeginFrameArgs().frame_time.ToInternalValue());
76190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EndTest();
76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return;
76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
76490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_FALSE(impl->settings().impl_side_painting);
76690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EndTest();
76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
768424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
769424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (impl->settings().impl_side_painting)
770424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      EXPECT_NE(frame_count_with_pending_tree_, 1);
77190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
77290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
77390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
77490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
776424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int frame_count_with_pending_tree_;
77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::TimeTicks first_frame_time_;
77890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
77990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
78090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
78190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LayerTreeHostTestFrameTimeUpdatesAfterActivationFails);
78290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
78390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This test verifies that LayerTreeHostImpl's current frame time gets
78490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// updated in consecutive frames when it draws in each frame.
78590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestFrameTimeUpdatesAfterDraw : public LayerTreeHostTest {
78690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
78790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LayerTreeHostTestFrameTimeUpdatesAfterDraw() : frame_(0) {}
78890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
78990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
79090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(20, 20));
79190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    layer_tree_host()->set_background_color(SK_ColorGRAY);
79290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
79390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
79490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
79590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
79690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
79790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    frame_++;
79890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (frame_ == 1) {
79903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      first_frame_time_ = impl->CurrentBeginFrameArgs().frame_time;
80090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      impl->SetNeedsRedraw();
80190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // Since we might use a low-resolution clock on Windows, we need to
8031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // make sure that the clock has incremented past first_frame_time_.
8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      while (first_frame_time_ == gfx::FrameTime::Now()) {
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
80690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
80790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return;
80890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
80990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
81003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_NE(first_frame_time_, impl->CurrentBeginFrameArgs().frame_time);
81190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EndTest();
81290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
81390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
81490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
81590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Ensure there isn't a commit between the two draws, to ensure that a
81690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // commit isn't required for updating the current frame time. We can
81790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // only check for this in the multi-threaded case, since in the single-
81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // threaded case there will always be a commit between consecutive draws.
819eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (HasImplThread())
82090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_EQ(0, frame_);
82190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
82290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
82390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
82490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
82590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
82690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int frame_;
82790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::TimeTicks first_frame_time_;
82890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
82990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
83090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFrameTimeUpdatesAfterDraw);
83190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verifies that StartPageScaleAnimation events propagate correctly
833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from LayerTreeHost to LayerTreeHostImpl in the MT compositor.
8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestStartPageScaleAnimation : public LayerTreeHostTest {
835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
8360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  LayerTreeHostTestStartPageScaleAnimation() {}
837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
838a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
839a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
840a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
8410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (layer_tree_host()->settings().impl_side_painting) {
8420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      scoped_refptr<FakePictureLayer> layer =
8430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          FakePictureLayer::Create(&client_);
8440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      layer->set_always_update_resources(true);
8450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      scroll_layer_ = layer;
8460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    } else {
8470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      scroll_layer_ = FakeContentLayer::Create(&client_);
8480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
8490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Layer* root_layer = layer_tree_host()->root_layer();
8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scroll_layer_->SetScrollClipLayerId(root_layer->id());
8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scroll_layer_->SetIsContainerForFixedPositionLayers(true);
8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scroll_layer_->SetBounds(gfx::Size(2 * root_layer->bounds().width(),
8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       2 * root_layer->bounds().height()));
855a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    scroll_layer_->SetScrollOffset(gfx::Vector2d());
856a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(scroll_layer_);
8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // This test requires the page_scale and inner viewport layers to be
8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // identified.
8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    layer_tree_host()->RegisterViewportLayers(
8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        root_layer, scroll_layer_.get(), NULL);
8610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.5f, 2.f);
862a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
863a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   float scale,
8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   float) OVERRIDE {
869a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    gfx::Vector2d offset = scroll_layer_->scroll_offset();
870a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    scroll_layer_->SetScrollOffset(offset + scroll_delta);
871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetPageScaleFactorAndLimits(scale, 0.5f, 2.f);
872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // We get one commit before the first draw, and the animation doesn't happen
876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // until the second draw.
877a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
878a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 0:
879a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EXPECT_EQ(1.f, impl->active_tree()->page_scale_factor());
880a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        // We'll start an animation when we get back to the main thread.
881a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
882a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 1:
883a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EXPECT_EQ(1.f, impl->active_tree()->page_scale_factor());
884a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
885a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 2:
886a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EXPECT_EQ(1.25f, impl->active_tree()->page_scale_factor());
887a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        EndTest();
888a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
889a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      default:
890a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        NOTREACHED();
891a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
892a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
893a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
894a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
895bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    switch (layer_tree_host()->source_frame_number()) {
896a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      case 1:
897a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        layer_tree_host()->StartPageScaleAnimation(
898a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            gfx::Vector2d(), false, 1.25f, base::TimeDelta());
899a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        break;
900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
904a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
905a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  FakeContentLayerClient client_;
9060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_refptr<Layer> scroll_layer_;
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestStartPageScaleAnimation);
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetVisible : public LayerTreeHostTest {
912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestSetVisible() : num_draws_(0) {}
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetVisibleToMainThread(false);
918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This is suppressed while we're invisible.
919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsRedrawToMainThread();
920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Triggers the redraw.
921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetVisibleToMainThread(true);
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(impl->visible());
926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_draws_;
927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_draws_); }
931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draws_;
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetVisible);
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestOpacityChangeLayerDelegate : public ContentLayerClient {
939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestOpacityChangeLayerDelegate() : test_layer_(0) {}
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetTestLayer(Layer* test_layer) { test_layer_ = test_layer; }
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
944010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void PaintContents(
945010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      SkCanvas* canvas,
946010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const gfx::Rect& clip,
947010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ContentLayerClient::GraphicsContextStatus gc_status) OVERRIDE {
948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Set layer opacity to 0.
949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (test_layer_)
950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      test_layer_->SetOpacity(0.f);
951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidChangeLayerCanUseLCDText() OVERRIDE {}
953effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual bool FillsBoundsCompletely() const OVERRIDE { return false; }
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Layer* test_layer_;
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContentLayerWithUpdateTracking : public ContentLayer {
960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_refptr<ContentLayerWithUpdateTracking> Create(
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ContentLayerClient* client) {
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return make_scoped_refptr(new ContentLayerWithUpdateTracking(client));
964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int PaintContentsCount() { return paint_contents_count_; }
967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ResetPaintContentsCount() { paint_contents_count_ = 0; }
968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual bool Update(ResourceUpdateQueue* queue,
970a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      const OcclusionTracker<Layer>* occlusion) OVERRIDE {
9717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool updated = ContentLayer::Update(queue, occlusion);
972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    paint_contents_count_++;
9737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return updated;
974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit ContentLayerWithUpdateTracking(ContentLayerClient* client)
978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : ContentLayer(client), paint_contents_count_(0) {
979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetBounds(gfx::Size(10, 10));
980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetIsDrawable(true);
981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~ContentLayerWithUpdateTracking() {}
983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int paint_contents_count_;
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Layer opacity change during paint should not prevent compositor resources
988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from being updated during commit.
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestOpacityChange : public LayerTreeHostTest {
990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestOpacityChange()
992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : test_opacity_change_delegate_(),
993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        update_check_layer_(ContentLayerWithUpdateTracking::Create(
994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            &test_opacity_change_delegate_)) {
995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_opacity_change_delegate_.SetTestLayer(update_check_layer_.get());
996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(10, 10));
1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(update_check_layer_);
1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Update() should have been called once.
1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, update_check_layer_->PaintContentsCount());
1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestOpacityChangeLayerDelegate test_opacity_change_delegate_;
1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<ContentLayerWithUpdateTracking> update_check_layer_;
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestOpacityChange);
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NoScaleContentLayer : public ContentLayer {
1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_refptr<NoScaleContentLayer> Create(ContentLayerClient* client) {
1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return make_scoped_refptr(new NoScaleContentLayer(client));
1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CalculateContentsScale(float ideal_contents_scale,
1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      float* contents_scale_x,
1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      float* contents_scale_y,
1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      gfx::Size* contentBounds) OVERRIDE {
1031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Skip over the ContentLayer's method to the base Layer class.
1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer::CalculateContentsScale(ideal_contents_scale,
1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  contents_scale_x,
1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  contents_scale_y,
1035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  contentBounds);
1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit NoScaleContentLayer(ContentLayerClient* client)
1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : ContentLayer(client) {}
1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~NoScaleContentLayer() {}
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers
1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers()
1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : root_layer_(NoScaleContentLayer::Create(&client_)),
1049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        child_layer_(ContentLayer::Create(&client_)) {}
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(60, 60));
1053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetDeviceScaleFactor(1.5);
1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(gfx::Size(60, 60), layer_tree_host()->device_viewport_size());
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->AddChild(child_layer_);
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetIsDrawable(true);
1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(30, 30));
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer_->SetIsDrawable(true);
1062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer_->SetPosition(gfx::Point(2, 2));
1063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer_->SetBounds(gfx::Size(10, 10));
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Should only do one commit.
1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, impl->active_tree()->source_frame_number());
1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Device scale factor should come over to impl.
1074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_NEAR(impl->device_scale_factor(), 1.5f, 0.00001f);
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Both layers are on impl.
1077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(1u, impl->active_tree()->root_layer()->children().size());
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Device viewport is scaled.
108058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(gfx::Size(60, 60), impl->DrawViewportSize());
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerImpl* root = impl->active_tree()->root_layer();
1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerImpl* child = impl->active_tree()->root_layer()->children()[0];
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Positions remain in layout pixels.
1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(gfx::Point(0, 0), root->position());
1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(gfx::Point(2, 2), child->position());
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Compute all the layer transforms for the frame.
1090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostImpl::FrameData frame_data;
1091cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    impl->PrepareToDraw(&frame_data);
1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    impl->DidDrawAllLayers(frame_data);
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const LayerImplList& render_surface_layer_list =
1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        *frame_data.render_surface_layer_list;
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Both layers should be drawing into the root render surface.
1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(1u, render_surface_layer_list.size());
1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(root->render_surface(),
1100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              render_surface_layer_list[0]->render_surface());
1101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(2u, root->render_surface()->layer_list().size());
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The root render surface is the size of the viewport.
1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_RECT_EQ(gfx::Rect(0, 0, 60, 60),
1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   root->render_surface()->content_rect());
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The content bounds of the child should be scaled.
1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Size child_bounds_scaled =
1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        gfx::ToCeiledSize(gfx::ScaleSize(child->bounds(), 1.5));
1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(child_bounds_scaled, child->content_bounds());
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform scale_transform;
1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scale_transform.Scale(impl->device_scale_factor(),
1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          impl->device_scale_factor());
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The root layer is scaled by 2x.
1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform root_screen_space_transform = scale_transform;
1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform root_draw_transform = scale_transform;
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(root_draw_transform, root->draw_transform());
1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(root_screen_space_transform, root->screen_space_transform());
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The child is at position 2,2, which is transformed to 3,3 after the scale
1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform child_screen_space_transform;
1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_screen_space_transform.Translate(3.f, 3.f);
1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform child_draw_transform = child_screen_space_transform;
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRANSFORMATION_MATRIX_EQ(child_draw_transform,
1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    child->draw_transform());
1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRANSFORMATION_MATRIX_EQ(child_screen_space_transform,
1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    child->screen_space_transform());
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<NoScaleContentLayer> root_layer_;
1141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<ContentLayer> child_layer_;
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers);
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify atomicity of commits and reuse of textures.
11473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class LayerTreeHostTestDirectRendererAtomicCommit : public LayerTreeHostTest {
1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
11500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    settings->texture_id_allocation_chunk_size = 1;
1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Make sure partial texture updates are turned off.
1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings->max_partial_texture_updates = 0;
1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Linear fade animator prevents scrollbars from drawing immediately.
1154424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    settings->scrollbar_animator = LayerTreeSettings::NoAnimator;
1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
1158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_ = FakeContentLayer::Create(&client_);
1159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_->SetBounds(gfx::Size(10, 20));
1160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool paint_scrollbar = true;
1162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool has_thumb = false;
11633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scrollbar_ = FakePaintedScrollbarLayer::Create(
11643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        paint_scrollbar, has_thumb, layer_->id());
1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetPosition(gfx::Point(0, 10));
1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetBounds(gfx::Size(10, 10));
1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_->AddChild(scrollbar_);
1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
117590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    drew_frame_ = -1;
117690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
117790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(0u, layer_tree_host()->settings().max_partial_texture_updates);
1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 0:
1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures should be one for each layer
1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ASSERT_EQ(2u, context->NumTextures());
1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures used for commit should be one for each layer.
1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Verify that used texture is correct.
1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
11973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Number of textures should be one for scrollbar layer since it was
11983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // requested and deleted on the impl-thread, and double for the content
11993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // layer since its first texture is used by impl thread and cannot by
12003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // used for update.
12013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ASSERT_EQ(3u, context->NumTextures());
12023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Number of textures used for commit should be one for each layer.
1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // First textures should not have been used.
1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(context->UsedTexture(context->TextureAt(0)));
12063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // New textures should have been used.
1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EndTest();
1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
12215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (drew_frame_ == impl->active_tree()->source_frame_number()) {
122490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_EQ(0u, context->NumUsedTextures()) << "For frame " << drew_frame_;
122590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return;
122690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
122790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    drew_frame_ = impl->active_tree()->source_frame_number();
122890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1229a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // We draw/ship one texture each frame for each layer.
1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(2u, context->NumUsedTextures());
1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    context->ResetUsedTextures();
123223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
123323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    if (!TestEnded())
123423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      PostSetNeedsCommitToMainThread();
1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Layout() OVERRIDE {
1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_->SetNeedsDisplay();
1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scrollbar_->SetNeedsDisplay();
1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) protected:
1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> layer_;
12473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<FakePaintedScrollbarLayer> scrollbar_;
124890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int drew_frame_;
1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F(
12523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    LayerTreeHostTestDirectRendererAtomicCommit);
12533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
12543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class LayerTreeHostTestDelegatingRendererAtomicCommit
12553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : public LayerTreeHostTestDirectRendererAtomicCommit {
12563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
12573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
12583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_EQ(0u, layer_tree_host()->settings().max_partial_texture_updates);
12593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
12605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
12613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
12623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
12633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case 0:
12643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Number of textures should be one for each layer
12653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ASSERT_EQ(2u, context->NumTextures());
12663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Number of textures used for commit should be one for each layer.
12673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
12683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Verify that used texture is correct.
12693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
12703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
12713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        context->ResetUsedTextures();
12723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        break;
12733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case 1:
12743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Number of textures should be doubled as the first context layer
12753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // texture is being used by the impl-thread and cannot be used for
12763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // update.  The scrollbar behavior is different direct renderer because
12773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // UI resource deletion with delegating renderer occurs after tree
12783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // activation.
12793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ASSERT_EQ(4u, context->NumTextures());
12803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Number of textures used for commit should still be
12813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // one for each layer.
12823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
12833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // First textures should not have been used.
12843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_FALSE(context->UsedTexture(context->TextureAt(0)));
12853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_FALSE(context->UsedTexture(context->TextureAt(1)));
12863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // New textures should have been used.
12873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
12883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
12893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        context->ResetUsedTextures();
12903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        break;
12913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case 2:
12923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EndTest();
12933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        break;
12943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      default:
12953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        NOTREACHED();
12963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        break;
12973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
12983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
12993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
13003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
130123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)MULTI_THREAD_DELEGATING_RENDERER_NOIMPL_TEST_F(
130223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    LayerTreeHostTestDelegatingRendererAtomicCommit);
1303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void SetLayerPropertiesForTesting(Layer* layer,
1305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         Layer* parent,
1306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         const gfx::Transform& transform,
130746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                         const gfx::Point3F& transform_origin,
13085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         const gfx::PointF& position,
13095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         const gfx::Size& bounds,
1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         bool opaque) {
1311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->RemoveAllChildren();
1312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (parent)
1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    parent->AddChild(layer);
1314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetTransform(transform);
131546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  layer->SetTransformOrigin(transform_origin);
1316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetPosition(position);
1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetBounds(bounds);
1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetContentsOpaque(opaque);
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAtomicCommitWithPartialUpdate
1322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
13250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    settings->texture_id_allocation_chunk_size = 1;
1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Allow one partial texture update.
1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings->max_partial_texture_updates = 1;
1328a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // No partial updates when impl side painting is enabled.
1329a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    settings->impl_side_painting = false;
1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    parent_ = FakeContentLayer::Create(&client_);
1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    parent_->SetBounds(gfx::Size(10, 20));
1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_ = FakeContentLayer::Create(&client_);
1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_->SetPosition(gfx::Point(0, 10));
1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_->SetBounds(gfx::Size(3, 10));
1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    parent_->AddChild(child_);
1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(parent_);
1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
134790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
134890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1349bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    switch (layer_tree_host()->source_frame_number()) {
135090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 1:
135190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        parent_->SetNeedsDisplay();
135290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        child_->SetNeedsDisplay();
135390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
135490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 2:
135590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        // Damage part of layers.
135690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        parent_->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f));
135790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        child_->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f));
135890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
135990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 3:
136090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        child_->SetNeedsDisplay();
136190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(10, 10));
136290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
136390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 4:
136490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(10, 20));
136590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
136690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case 5:
136790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        EndTest();
136890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
136990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      default:
1370bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        NOTREACHED() << layer_tree_host()->source_frame_number();
137190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
137290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
137390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(1u, layer_tree_host()->settings().max_partial_texture_updates);
1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 0:
1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures should be one for each layer.
1383a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ASSERT_EQ(2u, context->NumTextures());
1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures used for commit should be one for each layer.
1385a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Verify that used textures are correct.
1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
13924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        if (HasImplThread()) {
13934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // Number of textures should be two for each content layer.
13944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ASSERT_EQ(4u, context->NumTextures());
13954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        } else {
13964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // In single thread we can always do partial updates, so the limit has
13974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // no effect.
13984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ASSERT_EQ(2u, context->NumTextures());
13994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures used for commit should be one for each content
1401a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // layer.
1402a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        if (HasImplThread()) {
14054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // First content textures should not have been used.
14064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_FALSE(context->UsedTexture(context->TextureAt(0)));
14074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_FALSE(context->UsedTexture(context->TextureAt(1)));
14084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // New textures should have been used.
14094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
14104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
14114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        } else {
14124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // In single thread we can always do partial updates, so the limit has
14134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // no effect.
14144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
14154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
14164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
14214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        if (HasImplThread()) {
14224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // Number of textures should be two for each content layer.
14234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ASSERT_EQ(4u, context->NumTextures());
14244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        } else {
14254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // In single thread we can always do partial updates, so the limit has
14264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // no effect.
14274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ASSERT_EQ(2u, context->NumTextures());
14284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Number of textures used for commit should be one for each content
1430a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // layer.
1431a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(2u, context->NumUsedTextures());
1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        if (HasImplThread()) {
14344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // One content layer does a partial update also.
14354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
14364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_FALSE(context->UsedTexture(context->TextureAt(3)));
14374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        } else {
14384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // In single thread we can always do partial updates, so the limit has
14394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          // no effect.
14404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
14414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
14424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 3:
1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No textures should be used for commit.
1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(0u, context->NumUsedTextures());
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 4:
1453a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Number of textures used for commit should be one, for the
1454a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // content layer.
1455a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(1u, context->NumUsedTextures());
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context->ResetUsedTextures();
1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
146690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_LT(impl->active_tree()->source_frame_number(), 5);
146790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Number of textures used for drawing should one per layer except for
1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // frame 3 where the viewport only contains one layer.
147290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (impl->active_tree()->source_frame_number() == 3) {
1473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(1u, context->NumUsedTextures());
147490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
14755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(2u, context->NumUsedTextures())
14765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          << "For frame " << impl->active_tree()->source_frame_number();
147790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
1478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    context->ResetUsedTextures();
1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> parent_;
1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> child_;
1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1490a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Partial updates are not possible with a delegating renderer.
149190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
1492a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LayerTreeHostTestAtomicCommitWithPartialUpdate);
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit
1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
14967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
14977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
14987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_layer_ = FakeContentLayer::Create(&client_);
1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(100, 100));
15007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    surface_layer1_ = FakeContentLayer::Create(&client_);
1502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer1_->SetBounds(gfx::Size(100, 100));
1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer1_->SetForceRenderSurface(true);
1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer1_->SetOpacity(0.5f);
15057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_layer_->AddChild(surface_layer1_);
15067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    surface_layer2_ = FakeContentLayer::Create(&client_);
1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer2_->SetBounds(gfx::Size(100, 100));
1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer2_->SetForceRenderSurface(true);
1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer2_->SetOpacity(0.5f);
15117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    surface_layer1_->AddChild(surface_layer2_);
1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    replica_layer1_ = FakeContentLayer::Create(&client_);
1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer1_->SetReplicaLayer(replica_layer1_.get());
15157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    replica_layer2_ = FakeContentLayer::Create(&client_);
1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface_layer2_->SetReplicaLayer(replica_layer2_.get());
1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
15207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
15217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Renderer* renderer = host_impl->renderer();
152703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    RenderPassId surface1_render_pass_id = host_impl->active_tree()
152803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                               ->root_layer()
152903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                               ->children()[0]
153003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                               ->render_surface()
153103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                               ->GetRenderPassId();
153203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    RenderPassId surface2_render_pass_id = host_impl->active_tree()
153303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                               ->root_layer()
153403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                               ->children()[0]
153503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                               ->children()[0]
153603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                               ->render_surface()
153703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                               ->GetRenderPassId();
1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 0:
15415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_TRUE(
15425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            renderer->HasAllocatedResourcesForTesting(surface1_render_pass_id));
15435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_TRUE(
15445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            renderer->HasAllocatedResourcesForTesting(surface2_render_pass_id));
1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Reduce the memory limit to only fit the root layer and one render
1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // surface. This prevents any contents drawing into surfaces
1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // from being allocated.
1549a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        host_impl->SetMemoryPolicy(ManagedMemoryPolicy(100 * 100 * 4 * 2));
1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
15525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_FALSE(
15535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            renderer->HasAllocatedResourcesForTesting(surface1_render_pass_id));
15545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_FALSE(
15555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            renderer->HasAllocatedResourcesForTesting(surface2_render_pass_id));
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EndTest();
1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1563bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    if (layer_tree_host()->source_frame_number() < 2)
1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_layer_->SetNeedsDisplay();
1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
15687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_LE(2u, root_layer_->update_count());
15697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_LE(2u, surface_layer1_->update_count());
15707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_LE(2u, surface_layer2_->update_count());
1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root_layer_;
1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> surface_layer1_;
1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> replica_layer1_;
1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> surface_layer2_;
1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> replica_layer2_;
1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Surfaces don't exist with a delegated renderer.
15828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F(
1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit);
15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EvictionTestLayer : public Layer {
1586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_refptr<EvictionTestLayer> Create() {
1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return make_scoped_refptr(new EvictionTestLayer());
1589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool Update(ResourceUpdateQueue*,
1592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      const OcclusionTracker<Layer>*) OVERRIDE;
1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool DrawsContent() const OVERRIDE { return true; }
1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl)
1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OVERRIDE;
1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void PushPropertiesTo(LayerImpl* impl) OVERRIDE;
1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetTexturePriorities(const PriorityCalculator&) OVERRIDE;
1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool HaveBackingTexture() const {
1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return texture_.get() ? texture_->have_backing_texture() : false;
1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EvictionTestLayer() : Layer() {}
1606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~EvictionTestLayer() {}
1607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CreateTextureIfNeeded() {
1609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (texture_)
1610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
1611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    texture_ = PrioritizedResource::Create(
1612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->contents_texture_manager());
1613d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    texture_->SetDimensions(gfx::Size(10, 10), RGBA_8888);
1614effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bitmap_.allocN32Pixels(10, 10);
1615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<PrioritizedResource> texture_;
1618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkBitmap bitmap_;
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EvictionTestLayerImpl : public LayerImpl {
1622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_ptr<EvictionTestLayerImpl> Create(LayerTreeImpl* tree_impl,
1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                  int id) {
1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return make_scoped_ptr(new EvictionTestLayerImpl(tree_impl, id));
1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~EvictionTestLayerImpl() {}
1628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void AppendQuads(RenderPass* render_pass,
1630116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           const OcclusionTracker<LayerImpl>& occlusion_tracker,
1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           AppendQuadsData* append_quads_data) OVERRIDE {
1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(has_texture_);
1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_NE(0u, layer_tree_impl()->resource_provider()->num_resources());
1634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetHasTexture(bool has_texture) { has_texture_ = has_texture; }
1637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EvictionTestLayerImpl(LayerTreeImpl* tree_impl, int id)
1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : LayerImpl(tree_impl, id), has_texture_(false) {}
1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool has_texture_;
1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::SetTexturePriorities(const PriorityCalculator&) {
1646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateTextureIfNeeded();
1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!texture_)
1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  texture_->set_request_priority(PriorityCalculator::UIPriority(true));
1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool EvictionTestLayer::Update(ResourceUpdateQueue* queue,
1653a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               const OcclusionTracker<Layer>* occlusion) {
1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateTextureIfNeeded();
1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!texture_)
16567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect full_rect(0, 0, 10, 10);
1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResourceUpdate upload = ResourceUpdate::Create(
1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      texture_.get(), &bitmap_, full_rect, full_rect, gfx::Vector2d());
1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  queue->AppendFullUpload(upload);
16627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return true;
1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<LayerImpl> EvictionTestLayer::CreateLayerImpl(
1666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeImpl* tree_impl) {
1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return EvictionTestLayerImpl::Create(tree_impl, layer_id_)
1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .PassAs<LayerImpl>();
1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::PushPropertiesTo(LayerImpl* layer_impl) {
1672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Layer::PushPropertiesTo(layer_impl);
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EvictionTestLayerImpl* test_layer_impl =
1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      static_cast<EvictionTestLayerImpl*>(layer_impl);
1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_layer_impl->SetHasTexture(texture_->have_backing_texture());
1677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestEvictTextures : public LayerTreeHostTest {
1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestEvictTextures()
1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : layer_(EvictionTestLayer::Create()),
1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        impl_for_evict_textures_(0),
1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_commits_(0) {}
1685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(10, 20));
1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform identity_matrix;
1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetLayerPropertiesForTesting(layer_.get(),
1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 0,
1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 identity_matrix,
169446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                 gfx::Point3F(0.f, 0.f, 0.f),
1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 gfx::PointF(0.f, 0.f),
1696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 gfx::Size(10, 20),
1697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 true);
1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void PostEvictTextures() {
1703eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ImplThreadTaskRunner()->PostTask(
1704eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        FROM_HERE,
1705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&LayerTreeHostTestEvictTextures::EvictTexturesOnImplThread,
1706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   base::Unretained(this)));
1707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void EvictTexturesOnImplThread() {
1710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(impl_for_evict_textures_);
1711eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    impl_for_evict_textures_->EvictTexturesForTesting();
1712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 1: Just commit and draw normally, then post an eviction at the end
1715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // that will trigger a commit.
1716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 2: Triggered by the eviction, let it go through and then set
1717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // needsCommit.
1718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 3: Triggered by the setNeedsCommit. In Layout(), post an eviction
1719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // task, which will be handled before the commit. Don't set needsCommit, it
1720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // should have been posted. A frame should not be drawn (note,
1721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // didCommitAndDrawFrame may be called anyway).
1722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 4: Triggered by the eviction, let it go through and then set
1723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // needsCommit.
1724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 5: Triggered by the setNeedsCommit, post an eviction task in
1725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Layout(), a frame should not be drawn but a commit will be posted.
1726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commit 6: Triggered by the eviction, post an eviction task in
1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Layout(), which will be a noop, letting the commit (which recreates the
1728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // textures) go through and draw a frame, then end the test.
1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
1730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commits 1+2 test the eviction recovery path where eviction happens outside
1731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // of the beginFrame/commit pair.
1732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commits 3+4 test the eviction recovery path where eviction happens inside
1733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the beginFrame/commit pair.
1734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Commits 5+6 test the path where an eviction happens during the eviction
1735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // recovery path.
1736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
1737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_commits_) {
1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
1739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_->HaveBackingTexture());
1740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostEvictTextures();
1741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
1743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_->HaveBackingTexture());
1744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
1745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 3:
1747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 4:
1749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_->HaveBackingTexture());
1750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
1751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 5:
1753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 6:
1755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_->HaveBackingTexture());
1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EndTest();
1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    impl_for_evict_textures_ = impl;
1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Layout() OVERRIDE {
1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_commits_;
1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_commits_) {
1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
1773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 3:
1775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostEvictTextures();
1776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 4:
1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // We couldn't check in didCommitAndDrawFrame on commit 3,
1779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // so check here.
1780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(layer_->HaveBackingTexture());
1781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 5:
1783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostEvictTextures();
1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 6:
1786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // We couldn't check in didCommitAndDrawFrame on commit 5,
1787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // so check here.
1788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(layer_->HaveBackingTexture());
1789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostEvictTextures();
1790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
1792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
1793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<EvictionTestLayer> layer_;
1802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostImpl* impl_for_evict_textures_;
1803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostTestEvictTextures);
18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestContinuousInvalidate : public LayerTreeHostTest {
1809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestContinuousInvalidate()
1811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : num_commit_complete_(0), num_draw_layers_(0) {}
1812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(10, 10));
1815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10));
1816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_ = ContentLayer::Create(&client_);
1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_->SetBounds(gfx::Size(10, 10));
1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_->SetPosition(gfx::PointF(0.f, 0.f));
1820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_->SetIsDrawable(true);
1821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(content_layer_);
1822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
182690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 2)
1828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
1829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content_layer_->SetNeedsDisplay();
1830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 1)
1834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      num_commit_complete_++;
1835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_draw_layers_++;
1839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_draw_layers_ == 2)
1840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
1841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
1844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check that we didn't commit twice between first and second draw.
1845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, num_commit_complete_);
1846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
1850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Layer> content_layer_;
1851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commit_complete_;
1852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_draw_layers_;
18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostTestContinuousInvalidate);
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestDeferCommits : public LayerTreeHostTest {
1858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestDeferCommits()
1860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : num_commits_deferred_(0), num_complete_commits_(0) {}
1861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
1863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidDeferCommit() OVERRIDE {
1865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_deferred_++;
1866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetDeferCommits(false);
1867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
1870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_complete_commits_++;
1871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_complete_commits_) {
1872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
1873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(0, num_commits_deferred_);
1874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->SetDeferCommits(true);
18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
1876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
1878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EndTest();
1879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
1880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
1881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
1882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
1887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, num_commits_deferred_);
1888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(2, num_complete_commits_);
1889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_deferred_;
1893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_complete_commits_;
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
189603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits);
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostWithProxy : public LayerTreeHost {
1899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostWithProxy(FakeLayerTreeHostClient* client,
1901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         const LayerTreeSettings& settings,
1902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         scoped_ptr<FakeProxy> proxy)
19031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      : LayerTreeHost(client, NULL, settings) {
1904a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    proxy->SetLayerTreeHost(this);
19051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    client->SetLayerTreeHost(this);
19065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InitializeForTesting(proxy.PassAs<Proxy>());
1907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, LimitPartialUpdates) {
1911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When partial updates are not allowed, max updates should be 0.
1912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
1913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1915eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<FakeProxy> proxy(new FakeProxy);
1916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->GetRendererCapabilities().allow_partial_texture_updates = false;
1917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->SetMaxPartialTextureUpdates(5);
19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeSettings settings;
1920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings.max_partial_texture_updates = 10;
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostWithProxy host(&client, settings, proxy.Pass());
1923cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    host.OnCreateAndInitializeOutputSurfaceAttempted(true);
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(0u, host.MaxPartialTextureUpdates());
1926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When partial updates are allowed,
1929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // max updates should be limited by the proxy.
1930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
1931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<FakeProxy> proxy(new FakeProxy);
1934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->GetRendererCapabilities().allow_partial_texture_updates = true;
1935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->SetMaxPartialTextureUpdates(5);
19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeSettings settings;
1938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings.max_partial_texture_updates = 10;
19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostWithProxy host(&client, settings, proxy.Pass());
1941cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    host.OnCreateAndInitializeOutputSurfaceAttempted(true);
19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(5u, host.MaxPartialTextureUpdates());
1944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When partial updates are allowed,
1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // max updates should also be limited by the settings.
1948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
1949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1951eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<FakeProxy> proxy(new FakeProxy);
1952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->GetRendererCapabilities().allow_partial_texture_updates = true;
1953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    proxy->SetMaxPartialTextureUpdates(20);
19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeSettings settings;
1956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings.max_partial_texture_updates = 10;
19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostWithProxy host(&client, settings, proxy.Pass());
1959cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    host.OnCreateAndInitializeOutputSurfaceAttempted(true);
19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(10u, host.MaxPartialTextureUpdates());
1962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithGLRenderer) {
1966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeSettings settings;
1969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings.max_partial_texture_updates = 4;
197003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  settings.single_thread_proxy_scheduler = false;
19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
197223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
197323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
19745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<LayerTreeHost> host =
19755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      LayerTreeHost::CreateSingleThreaded(&client,
19765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          &client,
19775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          shared_bitmap_manager.get(),
19785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          settings,
19795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          base::MessageLoopProxy::current());
19801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.SetLayerTreeHost(host.get());
1981cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  host->Composite(base::TimeTicks::Now());
1982cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(4u, host->settings().max_partial_texture_updates);
19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithSoftwareRenderer) {
1987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_SOFTWARE);
19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeSettings settings;
1990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings.max_partial_texture_updates = 4;
199103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  settings.single_thread_proxy_scheduler = false;
19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
199323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
199423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
19955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<LayerTreeHost> host =
19965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      LayerTreeHost::CreateSingleThreaded(&client,
19975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          &client,
19985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          shared_bitmap_manager.get(),
19995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          settings,
20005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          base::MessageLoopProxy::current());
20011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.SetLayerTreeHost(host.get());
2002cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  host->Composite(base::TimeTicks::Now());
2003cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(4u, host->settings().max_partial_texture_updates);
20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithDelegatingRendererAndGLContent) {
2008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_3D);
20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeSettings settings;
2011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings.max_partial_texture_updates = 4;
201203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  settings.single_thread_proxy_scheduler = false;
20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
201423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
201523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
20165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<LayerTreeHost> host =
20175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      LayerTreeHost::CreateSingleThreaded(&client,
20185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          &client,
20195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          shared_bitmap_manager.get(),
20205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          settings,
20215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          base::MessageLoopProxy::current());
20221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.SetLayerTreeHost(host.get());
2023cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  host->Composite(base::TimeTicks::Now());
2024cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
20254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, host->MaxPartialTextureUpdates());
20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest,
2029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     PartialUpdatesWithDelegatingRendererAndSoftwareContent) {
2030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_SOFTWARE);
20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeSettings settings;
2033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings.max_partial_texture_updates = 4;
203403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  settings.single_thread_proxy_scheduler = false;
20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
203623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
203723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
20385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<LayerTreeHost> host =
20395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      LayerTreeHost::CreateSingleThreaded(&client,
20405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          &client,
20415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          shared_bitmap_manager.get(),
20425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          settings,
20435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          base::MessageLoopProxy::current());
20441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.SetLayerTreeHost(host.get());
2045cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  host->Composite(base::TimeTicks::Now());
2046cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
20474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, host->MaxPartialTextureUpdates());
20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted
2051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
2052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted()
2054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : root_layer_(FakeContentLayer::Create(&client_)),
2055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        child_layer1_(FakeContentLayer::Create(&client_)),
2056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        child_layer2_(FakeContentLayer::Create(&client_)),
2057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_commits_(0) {}
2058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(100, 100));
2061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->SetBounds(gfx::Size(100, 100));
2062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer1_->SetBounds(gfx::Size(100, 100));
2063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child_layer2_->SetBounds(gfx::Size(100, 100));
2064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->AddChild(child_layer1_);
2065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer_->AddChild(child_layer2_);
2066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
2067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* host_impl,
2071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       bool visible) OVERRIDE {
20720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (visible) {
20730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      // One backing should remain unevicted.
20740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      EXPECT_EQ(
20750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          100u * 100u * 4u * 1u,
20760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          layer_tree_host()->contents_texture_manager()->MemoryUseBytes());
20770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    } else {
20780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      EXPECT_EQ(
20795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          0u, layer_tree_host()->contents_texture_manager()->MemoryUseBytes());
20800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
20810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Make sure that contents textures are marked as having been
2083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // purged.
2084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(host_impl->active_tree()->ContentsTexturesPurged());
2085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // End the test in this state.
2086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
2087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++num_commits_;
2091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_commits_) {
2092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
2093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // All three backings should have memory.
2094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(
2095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            100u * 100u * 4u * 3u,
2096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            layer_tree_host()->contents_texture_manager()->MemoryUseBytes());
2097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Set a new policy that will kick out 1 of the 3 resources.
2098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Because a resource was evicted, a commit will be kicked off.
2099eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        host_impl->SetMemoryPolicy(
2100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            ManagedMemoryPolicy(100 * 100 * 4 * 2,
21011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING,
2102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                1000));
2103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
2105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Only two backings should have memory.
2106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(
2107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            100u * 100u * 4u * 2u,
2108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            layer_tree_host()->contents_texture_manager()->MemoryUseBytes());
2109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Become backgrounded, which will cause 1 more resource to be
2110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // evicted.
2111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PostSetVisibleToMainThread(false);
2112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
2114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No further commits should happen because this is not visible
2115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // anymore.
2116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
2117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
2125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root_layer_;
2126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> child_layer1_;
2127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakeContentLayer> child_layer2_;
2128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F(
2132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted);
21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestLCDNotification : public LayerTreeHostTest {
2135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class NotificationClient : public ContentLayerClient {
2137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   public:
2138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NotificationClient()
2139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        : layer_(0), paint_count_(0), lcd_notification_count_(0) {}
2140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    void set_layer(Layer* layer) { layer_ = layer; }
2142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int paint_count() const { return paint_count_; }
2143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int lcd_notification_count() const { return lcd_notification_count_; }
2144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    virtual void PaintContents(
2146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        SkCanvas* canvas,
2147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        const gfx::Rect& clip,
2148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        ContentLayerClient::GraphicsContextStatus gc_status) OVERRIDE {
2149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ++paint_count_;
2150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void DidChangeLayerCanUseLCDText() OVERRIDE {
2152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ++lcd_notification_count_;
2153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_->SetNeedsDisplay();
2154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual bool FillsBoundsCompletely() const OVERRIDE { return false; }
2156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   private:
2158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer* layer_;
2159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int paint_count_;
2160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int lcd_notification_count_;
2161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
2162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<Layer> root_layer;
2165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (layer_tree_host()->settings().impl_side_painting)
2166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      root_layer = PictureLayer::Create(&client_);
2167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    else
2168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      root_layer = ContentLayer::Create(&client_);
2169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetIsDrawable(true);
2170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetBounds(gfx::Size(1, 1));
2171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer);
2173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    client_.set_layer(root_layer.get());
2174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The expecations are based on the assumption that the default
2176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // LCD settings are:
2177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->settings().can_use_lcd_text);
2178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(root_layer->can_use_lcd_text());
2179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
2181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
2187bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    switch (layer_tree_host()->source_frame_number()) {
2188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 1:
2189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        // The first update consists of one LCD notification and one paint.
2190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, client_.lcd_notification_count());
2191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, client_.paint_count());
2192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // LCD text must have been enabled on the layer.
2193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text());
21942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
2195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 2:
2197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Since nothing changed on layer, there should be no notification
2198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // or paint on the second update.
2199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, client_.lcd_notification_count());
2200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(1, client_.paint_count());
2201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // LCD text must not have changed.
2202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text());
2203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Change layer opacity that should trigger lcd notification.
2204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->root_layer()->SetOpacity(.5f);
2205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // No need to request a commit - setting opacity will do it.
2206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
2208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        // Verify that there is no extra commit due to layer invalidation.
2209bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        EXPECT_EQ(3, layer_tree_host()->source_frame_number());
2210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // LCD notification count should have incremented due to
2211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // change in layer opacity.
2212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2, client_.lcd_notification_count());
2213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Paint count should be incremented due to invalidation.
2214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2, client_.paint_count());
2215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // LCD text must have been disabled on the layer due to opacity.
2216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_FALSE(layer_tree_host()->root_layer()->can_use_lcd_text());
22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
2218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
22192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NotificationClient client_;
2224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
22252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestLCDNotification);
2227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2228a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Verify that the BeginFrame notification is used to initiate rendering.
2229a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass LayerTreeHostTestBeginFrameNotification : public LayerTreeHostTest {
2230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
22325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    settings->begin_frame_scheduling_enabled = true;
2233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2236a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // This will trigger a SetNeedsBeginFrame which will trigger a
2237a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // BeginFrame.
2238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual DrawResult PrepareToDrawOnThread(
2242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerTreeHostImpl* host_impl,
2243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerTreeHostImpl::FrameData* frame,
2244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      DrawResult draw_result) OVERRIDE {
2245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
2246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return DRAW_SUCCESS;
2247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks frame_time_;
2253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
22542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2255a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestBeginFrameNotification);
2256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2257a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass LayerTreeHostTestBeginFrameNotificationShutdownWhileEnabled
2258a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    : public LayerTreeHostTest {
2259a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) public:
2260a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
22615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    settings->begin_frame_scheduling_enabled = true;
226290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    settings->using_synchronous_renderer_compositor = true;
2263a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
2264a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2265a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2266a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2267a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // The BeginFrame notification is turned off now but will get enabled
226990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // once we return. End test while it's enabled.
2270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ImplThreadTaskRunner()->PostTask(
2271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        FROM_HERE,
2272a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        base::Bind(&LayerTreeHostTestBeginFrameNotification::EndTest,
2273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   base::Unretained(this)));
2274a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
2275a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2276a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2277a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)};
2278a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
227990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MULTI_THREAD_TEST_F(
2280a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    LayerTreeHostTestBeginFrameNotificationShutdownWhileEnabled);
2281a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
22824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestAbortedCommitDoesntStall : public LayerTreeHostTest {
228358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
22844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerTreeHostTestAbortedCommitDoesntStall()
22855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : commit_count_(0), commit_abort_count_(0), commit_complete_count_(0) {}
228658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
228758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
22885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    settings->begin_frame_scheduling_enabled = true;
228958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
229058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
229158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
229258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
229358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
229458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    commit_count_++;
22955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (commit_count_ == 4) {
22965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // After two aborted commits, request a real commit now to make sure a
229758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // real commit following an aborted commit will still complete and
229858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // end the test even when the Impl thread is idle.
229958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
230058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
230158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
230258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl,
23045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             bool did_handle) OVERRIDE {
23055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    commit_abort_count_++;
23065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Initiate another abortable commit.
23075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    host_impl->SetNeedsCommit();
23085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
23095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
231058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
231158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    commit_complete_count_++;
231258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (commit_complete_count_ == 1) {
23135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Initiate an abortable commit after the first commit.
231458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      host_impl->SetNeedsCommit();
231558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    } else {
231658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EndTest();
231758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
231858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
231958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
232058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
23215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(commit_count_, 5);
23225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(commit_abort_count_, 3);
232358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(commit_complete_count_, 2);
232458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
232558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
232658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int commit_count_;
23275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int commit_abort_count_;
232858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int commit_complete_count_;
232958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
233058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor
23324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostTestAbortedCommitDoesntStall {
23334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
23344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostTestAbortedCommitDoesntStall::InitializeSettings(settings);
23354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    settings->using_synchronous_renderer_compositor = true;
23364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
23374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
23384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
233958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F(
23404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor);
23414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestAbortedCommitDoesntStallDisabledVsync
23434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostTestAbortedCommitDoesntStall {
23444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
23454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostTestAbortedCommitDoesntStall::InitializeSettings(settings);
23464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    settings->throttle_frame_production = false;
23474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
23484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
23494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAbortedCommitDoesntStallDisabledVsync);
235158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestUninvertibleTransformDoesNotBlockActivation
2353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
2354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
2355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
2356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings->impl_side_painting = true;
2357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
23612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<Layer> layer = PictureLayer::Create(&client_);
2363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer->SetTransform(gfx::Transform(0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
2364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer->SetBounds(gfx::Size(10, 10));
2365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(layer);
2366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
23672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
2372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeContentLayerClient client_;
23772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
23782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(
2380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestUninvertibleTransformDoesNotBlockActivation);
23812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestChangeLayerPropertiesInPaintContents
2383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostTest {
2384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class SetBoundsClient : public ContentLayerClient {
2386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   public:
2387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetBoundsClient() : layer_(0) {}
23882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    void set_layer(Layer* layer) { layer_ = layer; }
23902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    virtual void PaintContents(
2392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        SkCanvas* canvas,
2393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        const gfx::Rect& clip,
2394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        ContentLayerClient::GraphicsContextStatus gc_status) OVERRIDE {
2395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_->SetBounds(gfx::Size(2, 2));
23962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
23972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void DidChangeLayerCanUseLCDText() OVERRIDE {}
23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual bool FillsBoundsCompletely() const OVERRIDE { return false; }
2401effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   private:
2403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer* layer_;
2404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
24052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestChangeLayerPropertiesInPaintContents() : num_commits_(0) {}
24072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<ContentLayer> root_layer = ContentLayer::Create(&client_);
2410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetIsDrawable(true);
2411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_layer->SetBounds(gfx::Size(1, 1));
24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer);
2414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    client_.set_layer(root_layer.get());
24152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
2417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
24212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    num_commits_++;
2424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (num_commits_ == 1) {
2425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerImpl* root_layer = host_impl->active_tree()->root_layer();
2426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_SIZE_EQ(gfx::Size(1, 1), root_layer->bounds());
2427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
2428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerImpl* root_layer = host_impl->active_tree()->root_layer();
2429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_SIZE_EQ(gfx::Size(2, 2), root_layer->bounds());
2430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
24312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
24332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetBoundsClient client_;
2436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_commits_;
24372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
24382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_THREAD_TEST_F(LayerTreeHostTestChangeLayerPropertiesInPaintContents);
2440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class MockIOSurfaceWebGraphicsContext3D : public TestWebGraphicsContext3D {
2442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2443424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  MockIOSurfaceWebGraphicsContext3D() {
24445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_capabilities_.gpu.iosurface = true;
24455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_capabilities_.gpu.texture_rectangle = true;
2446424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
2447424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
24485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual GLuint createTexture() OVERRIDE {
2449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return 1;
2450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
24515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD1(activeTexture, void(GLenum texture));
24525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD2(bindTexture, void(GLenum target,
24535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 GLuint texture_id));
24545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD3(texParameteri, void(GLenum target,
24555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   GLenum pname,
24565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   GLint param));
24575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD5(texImageIOSurface2DCHROMIUM, void(GLenum target,
24585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 GLint width,
24595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 GLint height,
24605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 GLuint ioSurfaceId,
24615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 GLuint plane));
24625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD4(drawElements, void(GLenum mode,
24635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  GLsizei count,
24645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  GLenum type,
24655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  GLintptr offset));
24665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD1(deleteTexture, void(GLenum texture));
2467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MOCK_METHOD2(produceTextureCHROMIUM,
2468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               void(GLenum target, const GLbyte* mailbox));
2469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
24702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestIOSurfaceDrawing : public LayerTreeHostTest {
2472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
24735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback)
2474a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      OVERRIDE {
24753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_ptr<MockIOSurfaceWebGraphicsContext3D> mock_context_owned(
2476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new MockIOSurfaceWebGraphicsContext3D);
24773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    mock_context_ = mock_context_owned.get();
24783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (delegating_renderer()) {
2480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return FakeOutputSurface::CreateDelegating3d(
2481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          mock_context_owned.PassAs<TestWebGraphicsContext3D>());
2482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    } else {
2483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return FakeOutputSurface::Create3d(
2484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          mock_context_owned.PassAs<TestWebGraphicsContext3D>());
2485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
2486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
2490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->SetIsDrawable(false);
2492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_id_ = 9;
2494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_size_ = gfx::Size(6, 7);
2495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<IOSurfaceLayer> io_surface_layer = IOSurfaceLayer::Create();
2497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_layer->SetBounds(gfx::Size(10, 10));
2498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_layer->SetIsDrawable(true);
2499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    io_surface_layer->SetContentsOpaque(true);
2500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    io_surface_layer->SetIOSurfaceProperties(io_surface_id_, io_surface_size_);
2501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(io_surface_layer);
2502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(0u, host_impl->resource_provider()->num_resources());
2508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // In WillDraw, the IOSurfaceLayer sets up the io surface texture.
2509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_, activeTexture(_)).Times(0);
2511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1))
2512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(AtLeast(1));
25135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_,
25145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                texParameteri(
25155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR))
2516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(1);
25175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_,
25185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                texParameteri(
25195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR))
2520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(1);
25215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_,
25225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                texParameteri(GL_TEXTURE_RECTANGLE_ARB,
2523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              GL_TEXTURE_POOL_CHROMIUM,
2524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              GL_TEXTURE_POOL_UNMANAGED_CHROMIUM)).Times(1);
2525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*mock_context_,
2526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                texParameteri(GL_TEXTURE_RECTANGLE_ARB,
25275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              GL_TEXTURE_WRAP_S,
25285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              GL_CLAMP_TO_EDGE)).Times(1);
25295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_,
25305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                texParameteri(GL_TEXTURE_RECTANGLE_ARB,
25315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              GL_TEXTURE_WRAP_T,
25325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              GL_CLAMP_TO_EDGE)).Times(1);
25335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
25345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_,
25355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                texImageIOSurface2DCHROMIUM(GL_TEXTURE_RECTANGLE_ARB,
25365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            io_surface_size_.width(),
25375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            io_surface_size_.height(),
25385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            io_surface_id_,
25395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            0)).Times(1);
25405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
25415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*mock_context_, bindTexture(_, 0)).Times(AnyNumber());
25425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
25435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual DrawResult PrepareToDrawOnThread(
2545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerTreeHostImpl* host_impl,
2546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerTreeHostImpl::FrameData* frame,
2547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      DrawResult draw_result) OVERRIDE {
2548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Mock::VerifyAndClearExpectations(&mock_context_);
2549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ResourceProvider* resource_provider = host_impl->resource_provider();
2550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(1u, resource_provider->num_resources());
2551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    CHECK_EQ(1u, frame->render_passes.size());
2552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    CHECK_LE(1u, frame->render_passes[0]->quad_list.size());
25531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const DrawQuad* quad = frame->render_passes[0]->quad_list.front();
2554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    CHECK_EQ(DrawQuad::IO_SURFACE_CONTENT, quad->material);
2555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const IOSurfaceDrawQuad* io_surface_draw_quad =
2556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        IOSurfaceDrawQuad::MaterialCast(quad);
2557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_SIZE_EQ(io_surface_size_, io_surface_draw_quad->io_surface_size);
2558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_NE(0u, io_surface_draw_quad->io_surface_resource_id);
2559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB),
2560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              resource_provider->TargetForTesting(
2561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  io_surface_draw_quad->io_surface_resource_id));
2562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1))
2564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(1);
2565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (delegating_renderer()) {
2566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      // The io surface layer's resource should be sent to the parent.
2567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      EXPECT_CALL(*mock_context_,
2568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  produceTextureCHROMIUM(GL_TEXTURE_RECTANGLE_ARB, _)).Times(1);
2569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    } else {
2570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      // The io surface layer's texture is drawn.
2571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      EXPECT_CALL(*mock_context_, activeTexture(GL_TEXTURE0)).Times(AtLeast(1));
2572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      EXPECT_CALL(*mock_context_, drawElements(GL_TRIANGLES, 6, _, _))
2573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          .Times(AtLeast(1));
2574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
2575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return draw_result;
2577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Mock::VerifyAndClearExpectations(&mock_context_);
25813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*mock_context_, deleteTexture(1)).Times(AtLeast(1));
2583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
2584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int io_surface_id_;
2589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockIOSurfaceWebGraphicsContext3D* mock_context_;
2590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size io_surface_size_;
2591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
25922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestIOSurfaceDrawing);
2594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2595b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class LayerTreeHostTestNumFramesPending : public LayerTreeHostTest {
2596b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public:
2597a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2598a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    frame_ = 0;
2599a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2600b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
2601b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2602b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Round 1: commit + draw
2603b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Round 2: commit only (no draw/swap)
2604b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Round 3: draw only (no commit)
2605b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2606b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
2607bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int commit = layer_tree_host()->source_frame_number();
2608b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    switch (commit) {
2609b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 2:
2610b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Round 2 done.
2611b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(1, frame_);
2612b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetNeedsRedraw();
2613b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
2614b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
2615b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
2616b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2617b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidCompleteSwapBuffers() OVERRIDE {
2618bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int commit = layer_tree_host()->source_frame_number();
2619b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    ++frame_;
2620b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    switch (frame_) {
2621b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 1:
2622b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Round 1 done.
2623b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(1, commit);
2624b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
2625b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
2626b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case 2:
2627b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // Round 3 done.
2628b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EXPECT_EQ(2, commit);
2629b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        EndTest();
2630b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
2631b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
2632b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
2633b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2634b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2635b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2636b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) protected:
2637b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int frame_;
2638b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)};
2639b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2640effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Flaky on all platforms: http://crbug.com/327498
2641effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(LayerTreeHostTestNumFramesPending, DISABLED_DelegatingRenderer) {
2642a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
2643b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
2644b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2645effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(LayerTreeHostTestNumFramesPending, DISABLED_GLRenderer) {
2646a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
2647b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
2648b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2649868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class LayerTreeHostTestDeferredInitialize : public LayerTreeHostTest {
2650868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
2651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
2652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // PictureLayer can only be used with impl side painting enabled.
2653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    settings->impl_side_painting = true;
2654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
2655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    layer_ = FakePictureLayer::Create(&client_);
2658558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    // Force commits to not be aborted so new frames get drawn, otherwise
2659558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    // the renderer gets deferred initialized but nothing new needs drawing.
2660558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    layer_->set_always_update_resources(true);
2661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
2662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
2663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
2664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void BeginTest() OVERRIDE {
26667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    did_initialize_gl_ = false;
26677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    did_release_gl_ = false;
2668ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    last_source_frame_number_drawn_ = -1;  // Never drawn.
2669868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
2670868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
2671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
26725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback)
2673a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      OVERRIDE {
2674868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<TestWebGraphicsContext3D> context3d(
2675868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        TestWebGraphicsContext3D::Create());
2676868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2677868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return FakeOutputSurface::CreateDeferredGL(
2678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        scoped_ptr<SoftwareOutputDevice>(new SoftwareOutputDevice),
2679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        delegating_renderer());
2680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
2681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
2683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_TRUE(host_impl->RootLayer());
2684868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    FakePictureLayerImpl* layer_impl =
2685868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        static_cast<FakePictureLayerImpl*>(host_impl->RootLayer());
2686ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2687ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // The same frame can be draw multiple times if new visible tiles are
2688ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // rasterized. But we want to make sure we only post DeferredInitialize
2689ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // and ReleaseGL once, so early out if the same frame is drawn again.
2690ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (last_source_frame_number_drawn_ ==
2691ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        host_impl->active_tree()->source_frame_number())
2692ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return;
2693ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2694ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    last_source_frame_number_drawn_ =
2695ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        host_impl->active_tree()->source_frame_number();
2696ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
26977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (!did_initialize_gl_) {
2698ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      EXPECT_LE(1u, layer_impl->append_quads_count());
26997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ImplThreadTaskRunner()->PostTask(
27007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          FROM_HERE,
27017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          base::Bind(
27027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              &LayerTreeHostTestDeferredInitialize::DeferredInitializeAndRedraw,
27037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              base::Unretained(this),
27047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              base::Unretained(host_impl)));
27057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    } else if (did_initialize_gl_ && !did_release_gl_) {
2706ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      EXPECT_LE(2u, layer_impl->append_quads_count());
27077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ImplThreadTaskRunner()->PostTask(
27087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          FROM_HERE,
27095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::Bind(&LayerTreeHostTestDeferredInitialize::ReleaseGLAndRedraw,
27105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     base::Unretained(this),
27115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     base::Unretained(host_impl)));
27127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    } else if (did_initialize_gl_ && did_release_gl_) {
2713ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      EXPECT_LE(3u, layer_impl->append_quads_count());
27147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EndTest();
2715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
2716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
2717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void DeferredInitializeAndRedraw(LayerTreeHostImpl* host_impl) {
27197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(did_initialize_gl_);
27207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // SetAndInitializeContext3D calls SetNeedsCommit.
27213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    FakeOutputSurface* fake_output_surface =
27223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        static_cast<FakeOutputSurface*>(host_impl->output_surface());
27233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_refptr<TestContextProvider> context_provider =
27243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        TestContextProvider::Create();  // Not bound to thread.
27255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(
27265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        fake_output_surface->InitializeAndSetContext3d(context_provider));
27277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    did_initialize_gl_ = true;
27287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
27297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
27307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void ReleaseGLAndRedraw(LayerTreeHostImpl* host_impl) {
27317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(did_initialize_gl_);
27327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(did_release_gl_);
27337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // ReleaseGL calls SetNeedsCommit.
27347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    static_cast<FakeOutputSurface*>(host_impl->output_surface())->ReleaseGL();
27357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    did_release_gl_ = true;
2736868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
2737868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2738cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
2739cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                   bool result) OVERRIDE {
2740cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_TRUE(result);
2741cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DelegatedFrameData* delegated_frame_data =
2742cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        output_surface()->last_sent_frame().delegated_frame_data.get();
2743cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!delegated_frame_data)
2744cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
2745cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2746cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Return all resources immediately.
2747cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    TransferableResourceArray resources_to_return =
2748cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        output_surface()->resources_held_by_parent();
2749cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2750cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CompositorFrameAck ack;
2751cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (size_t i = 0; i < resources_to_return.size(); ++i)
2752cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      output_surface()->ReturnResource(resources_to_return[i].id, &ack);
2753cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    host_impl->ReclaimResources(&ack);
2754cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
2755cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {
27577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(did_initialize_gl_);
27587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(did_release_gl_);
2759868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
2760868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2761868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
2762868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FakeContentLayerClient client_;
2763868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<FakePictureLayer> layer_;
27647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool did_initialize_gl_;
27657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool did_release_gl_;
2766ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int last_source_frame_number_drawn_;
2767868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
2768868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferredInitialize);
2770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
27715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class LayerTreeHostTestDeferredInitializeWithGpuRasterization
27725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : public LayerTreeHostTestDeferredInitialize {
27735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
27745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // PictureLayer can only be used with impl side painting enabled.
27755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    settings->impl_side_painting = true;
27765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    settings->gpu_rasterization_enabled = true;
27775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    settings->gpu_rasterization_forced = true;
27785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
27795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
27805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
27815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferredInitializeWithGpuRasterization);
27825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2783a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Test for UI Resource management.
2784a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class LayerTreeHostTestUIResource : public LayerTreeHostTest {
2785a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
27865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerTreeHostTestUIResource() : num_ui_resources_(0) {}
2787a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
27880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
27890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    settings->texture_id_allocation_chunk_size = 1;
27900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
27910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2792a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2793a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2794a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
27955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int frame = layer_tree_host()->source_frame_number();
2796a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (frame) {
2797a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
2798a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        CreateResource();
2799a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        CreateResource();
2800a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
2801a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2802a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 2:
2803a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Usually ScopedUIResource are deleted from the manager in their
2804a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // destructor.  Here we just want to test that a direct call to
2805a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // DeleteUIResource works.
2806a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        layer_tree_host()->DeleteUIResource(ui_resources_[0]->id());
2807a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
2808a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2809a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
2810a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // DeleteUIResource can be called with an invalid id.
2811a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        layer_tree_host()->DeleteUIResource(ui_resources_[0]->id());
2812a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
2813a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2814a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 4:
2815a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        CreateResource();
2816a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        CreateResource();
2817a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
2818a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2819a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 5:
2820a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ClearResources();
2821a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EndTest();
2822a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2823a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
2824a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2825a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2826a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void PerformTest(LayerTreeHostImpl* impl) {
28275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
2828a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
28295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int frame = impl->active_tree()->source_frame_number();
2830a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (frame) {
28315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 0:
2832a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ASSERT_EQ(0u, context->NumTextures());
2833a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
28345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 1:
2835a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Created two textures.
2836a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ASSERT_EQ(2u, context->NumTextures());
2837a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
28385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 2:
2839a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // One texture left after one deletion.
2840a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ASSERT_EQ(1u, context->NumTextures());
2841a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
28425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 3:
2843a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Resource manager state should not change when delete is called on an
2844a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // invalid id.
2845a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ASSERT_EQ(1u, context->NumTextures());
2846a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
28475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 4:
2848a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Creation after deletion: two more creates should total up to
2849a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // three textures.
2850a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ASSERT_EQ(3u, context->NumTextures());
2851a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2852a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
2853a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2854a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2855a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
2856a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!layer_tree_host()->settings().impl_side_painting)
2857a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      PerformTest(impl);
2858a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2859a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2860a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
2861a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (layer_tree_host()->settings().impl_side_painting)
2862a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      PerformTest(impl);
2863a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2864a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2865a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
2866a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2867a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
2868a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Must clear all resources before exiting.
2869a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void ClearResources() {
2870a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    for (int i = 0; i < num_ui_resources_; i++)
2871a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      ui_resources_[i].reset();
2872a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2873a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2874a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void CreateResource() {
2875a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ui_resources_[num_ui_resources_++] =
2876a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        FakeScopedUIResource::Create(layer_tree_host());
2877a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2878a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2879a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<FakeScopedUIResource> ui_resources_[5];
2880a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int num_ui_resources_;
2881a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
2882a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2883a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestUIResource);
2884a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
28855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PushPropertiesCountingLayerImpl : public LayerImpl {
28865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
28875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static scoped_ptr<PushPropertiesCountingLayerImpl> Create(
28885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeImpl* tree_impl, int id) {
28895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return make_scoped_ptr(new PushPropertiesCountingLayerImpl(tree_impl, id));
28905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
28915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
28925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~PushPropertiesCountingLayerImpl() {}
28935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
28945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void PushPropertiesTo(LayerImpl* layer) OVERRIDE {
28955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LayerImpl::PushPropertiesTo(layer);
28965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    push_properties_count_++;
28975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Push state to the active tree because we can only access it from there.
28985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static_cast<PushPropertiesCountingLayerImpl*>(
28995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        layer)->push_properties_count_ = push_properties_count_;
29005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
29015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl)
29035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OVERRIDE {
29045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return PushPropertiesCountingLayerImpl::Create(tree_impl, id()).
29055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        PassAs<LayerImpl>();
29065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
29075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t push_properties_count() const { return push_properties_count_; }
29095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void reset_push_properties_count() { push_properties_count_ = 0; }
29105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
29125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t push_properties_count_;
29135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PushPropertiesCountingLayerImpl(LayerTreeImpl* tree_impl, int id)
29155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : LayerImpl(tree_impl, id),
29165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        push_properties_count_(0) {
29175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetBounds(gfx::Size(1, 1));
29185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
29195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
29205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass PushPropertiesCountingLayer : public Layer {
29227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
29237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static scoped_refptr<PushPropertiesCountingLayer> Create() {
29247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return new PushPropertiesCountingLayer();
29257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
29267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void PushPropertiesTo(LayerImpl* layer) OVERRIDE {
29287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Layer::PushPropertiesTo(layer);
29297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    push_properties_count_++;
29307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (persist_needs_push_properties_)
29317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      needs_push_properties_ = true;
29327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
29337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl)
29355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OVERRIDE {
29365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return PushPropertiesCountingLayerImpl::Create(tree_impl, id()).
29375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        PassAs<LayerImpl>();
29385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
29395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void SetDrawsContent(bool draws_content) { SetIsDrawable(draws_content); }
29416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
29427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t push_properties_count() const { return push_properties_count_; }
29437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void reset_push_properties_count() { push_properties_count_ = 0; }
29447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void set_persist_needs_push_properties(bool persist) {
29467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    persist_needs_push_properties_ = persist;
29477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
29487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private:
29507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PushPropertiesCountingLayer()
29515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : push_properties_count_(0), persist_needs_push_properties_(false) {
29527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SetBounds(gfx::Size(1, 1));
29537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
29547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual ~PushPropertiesCountingLayer() {}
29557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t push_properties_count_;
29577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool persist_needs_push_properties_;
29587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
29597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestLayersPushProperties : public LayerTreeHostTest {
29617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
29627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void BeginTest() OVERRIDE {
29637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    num_commits_ = 0;
29647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_root_ = 0;
29657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_child_ = 0;
29667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_grandchild_ = 0;
29677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_child2_ = 0;
29687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_other_root_ = 0;
29697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_leaf_layer_ = 0;
29707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PostSetNeedsCommitToMainThread();
29717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
29727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
29747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_ = PushPropertiesCountingLayer::Create();
29757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_ = PushPropertiesCountingLayer::Create();
29767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child2_ = PushPropertiesCountingLayer::Create();
29777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grandchild_ = PushPropertiesCountingLayer::Create();
29784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    leaf_always_pushing_layer_ = PushPropertiesCountingLayer::Create();
29794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    leaf_always_pushing_layer_->set_persist_needs_push_properties(true);
29807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(child_);
29827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(child2_);
29837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_->AddChild(grandchild_);
29844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    child2_->AddChild(leaf_always_pushing_layer_);
29857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    other_root_ = PushPropertiesCountingLayer::Create();
29877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Don't set the root layer here.
29897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
29907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
29917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
29937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ++num_commits_;
29947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_root_, root_->push_properties_count());
29967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_child_, child_->push_properties_count());
29977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_grandchild_,
29987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              grandchild_->push_properties_count());
29997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_child2_,
30007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              child2_->push_properties_count());
30017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_push_properties_other_root_,
30027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              other_root_->push_properties_count());
30033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(expected_push_properties_leaf_layer_,
30044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              leaf_always_pushing_layer_->push_properties_count());
30057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
30063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // The scrollbar layer always needs to be pushed.
30077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (root_->layer_tree_host()) {
30087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_TRUE(root_->descendant_needs_push_properties());
30097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(root_->needs_push_properties());
30107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
30117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (child2_->layer_tree_host()) {
30127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_TRUE(child2_->descendant_needs_push_properties());
30137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(child2_->needs_push_properties());
30147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
30154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (leaf_always_pushing_layer_->layer_tree_host()) {
30164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_FALSE(
30174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          leaf_always_pushing_layer_->descendant_needs_push_properties());
30184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_TRUE(leaf_always_pushing_layer_->needs_push_properties());
30197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
30207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
30217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // child_ and grandchild_ don't persist their need to push properties.
30227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (child_->layer_tree_host()) {
30237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(child_->descendant_needs_push_properties());
30247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(child_->needs_push_properties());
30257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
30267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (grandchild_->layer_tree_host()) {
30277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(grandchild_->descendant_needs_push_properties());
30287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(grandchild_->needs_push_properties());
30297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
30307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
30317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (other_root_->layer_tree_host()) {
30327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(other_root_->descendant_needs_push_properties());
30337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_FALSE(other_root_->needs_push_properties());
30347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
30357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
30367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (num_commits_) {
30377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
30387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
30397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
30407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_root_;
30417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
30427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
30437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child2_;
30447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
30457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 2:
30467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetNeedsCommit();
30477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
30487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
30497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 3:
30507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(other_root_);
30517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
30527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_other_root_;
30537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
30547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 4:
30557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
30567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
30577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_root_;
30587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
30597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
30607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child2_;
30617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
30627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 5:
30637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetNeedsCommit();
30647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
30657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
30667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 6:
30677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
30687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
30697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
30707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 7:
30717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        root_->AddChild(child_);
30727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
30737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
30747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
30757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
30767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 8:
30777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild_->RemoveFromParent();
30787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
30797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
30807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 9:
30817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->AddChild(grandchild_);
30827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
30837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
30847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
30857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 10:
30867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetViewportSize(gfx::Size(20, 20));
30877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
30887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
30897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 11:
30907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.8f, 1.1f);
30917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // No layers need commit.
30927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
30937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 12:
30947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->SetPosition(gfx::Point(1, 1));
30957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // The modified layer needs commit
30967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
30977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
30987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 13:
30997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child2_->SetPosition(gfx::Point(1, 1));
31007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // The modified layer needs commit
31017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child2_;
31027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
31037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 14:
31047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
31057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        root_->AddChild(child_);
31067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Layers added to the tree get committed.
31077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
31087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
31097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
31107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 15:
31117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild_->SetPosition(gfx::Point(1, 1));
31127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // The modified layer needs commit
31137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_grandchild_;
31147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
31157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 16:
3116558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        // SetNeedsDisplay does not always set needs commit (so call it
3117558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        // explicitly), but is a property change.
31187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->SetNeedsDisplay();
31197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++expected_push_properties_child_;
3120558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        layer_tree_host()->SetNeedsCommit();
31217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
31227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 17:
31237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
31247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
31257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
31267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // The leaf layer always pushes.
31284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (leaf_always_pushing_layer_->layer_tree_host())
31297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ++expected_push_properties_leaf_layer_;
31307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
31317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AfterTest() OVERRIDE {}
31337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int num_commits_;
31357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FakeContentLayerClient client_;
31367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> root_;
31377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> child_;
31387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> child2_;
31397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> grandchild_;
31407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> other_root_;
31414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<PushPropertiesCountingLayer> leaf_always_pushing_layer_;
31427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_root_;
31437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_child_;
31447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_child2_;
31457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_grandchild_;
31467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_other_root_;
31477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_leaf_layer_;
31487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
31497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31507dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestLayersPushProperties);
31517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestImplLayersPushProperties
31535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public LayerTreeHostTestLayersPushProperties {
31547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
31557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void BeginTest() OVERRIDE {
31565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expected_push_properties_root_impl_ = 0;
31575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expected_push_properties_child_impl_ = 0;
31585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expected_push_properties_grandchild_impl_ = 0;
31595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expected_push_properties_child2_impl_ = 0;
31605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expected_push_properties_grandchild2_impl_ = 0;
31615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LayerTreeHostTestLayersPushProperties::BeginTest();
31627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
31637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
31645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
31655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // These commits are in response to the changes made in
31665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // LayerTreeHostTestLayersPushProperties::DidCommitAndDrawFrame()
31675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (num_commits_) {
31685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 0:
31695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Tree hasn't been setup yet don't bother to check anything.
31705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return;
31715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 1:
31725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Root gets set up, Everyone is initialized.
31735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_root_impl_;
31745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child_impl_;
31755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
31765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child2_impl_;
31775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
31785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
31795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 2:
31805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Tree doesn't change but the one leaf that always pushes is pushed.
31815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
31825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
31835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 3:
31845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Root is swapped here.
31855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Clear the expected push properties the tree will be rebuilt.
31865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_root_impl_ = 0;
31875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_child_impl_ = 0;
31885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_grandchild_impl_ = 0;
31895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_child2_impl_ = 0;
31905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_grandchild2_impl_ = 0;
31915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
31925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Make sure the new root is pushed.
31935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(1u, static_cast<PushPropertiesCountingLayerImpl*>(
31945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                host_impl->RootLayer())->push_properties_count());
31955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return;
31965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 4:
31975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Root is swapped back all of the layers in the tree get pushed.
31985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_root_impl_;
31995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child_impl_;
32005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
32015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child2_impl_;
32025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
32035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
32045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 5:
32055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Tree doesn't change but the one leaf that always pushes is pushed.
32065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
32075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
32085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 6:
32095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // First child is removed. Structure of the tree changes here so swap
32105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // some of the values. child_impl becomes child2_impl.
32115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_child_impl_ =
32125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            expected_push_properties_child2_impl_;
32135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_child2_impl_ = 0;
32145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // grandchild_impl becomes grandchild2_impl.
32155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_grandchild_impl_ =
32165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            expected_push_properties_grandchild2_impl_;
32175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_grandchild2_impl_ = 0;
32185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // grandchild_impl is now the leaf that always pushes. It is pushed.
32205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
32215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
32225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 7:
32235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
32245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
32255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Child is added back. New layers are initialized.
32275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
32285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child2_impl_;
32295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
32305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 8:
32315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Leaf is removed.
32325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expected_push_properties_grandchild2_impl_ = 0;
32335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Always pushing.
32355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
32365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
32375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 9:
32385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Leaf is added back
32395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
32405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
32425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
32435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
32445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 10:
32455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
32465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
32475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
32485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 11:
32495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
32505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
32515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
32525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 12:
32535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
32545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
32555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // This child position was changed.
32575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child2_impl_;
32585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
32595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 13:
32605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The position of this child was changed.
32615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child_impl_;
32625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
32645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
32655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
32665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 14:
32675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Second child is removed from tree. Don't discard counts because
32685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // they are added back before commit.
32695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
32715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
32725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Second child added back.
32745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child2_impl_;
32755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
32765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
32785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 15:
32795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The position of this child was changed.
32805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild2_impl_;
32815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushes is pushed.
32835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
32845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
32855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 16:
32865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Second child is invalidated with SetNeedsDisplay
32875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_child2_impl_;
32885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // The leaf that always pushed is pushed.
32905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++expected_push_properties_grandchild_impl_;
32915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
32925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
32935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PushPropertiesCountingLayerImpl* root_impl_ = NULL;
32955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PushPropertiesCountingLayerImpl* child_impl_ = NULL;
32965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PushPropertiesCountingLayerImpl* child2_impl_ = NULL;
32975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PushPropertiesCountingLayerImpl* grandchild_impl_ = NULL;
32985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PushPropertiesCountingLayerImpl* leaf_always_pushing_layer_impl_ = NULL;
32995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Pull the layers that we need from the tree assuming the same structure
33015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // as LayerTreeHostTestLayersPushProperties
33025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    root_impl_ = static_cast<PushPropertiesCountingLayerImpl*>(
33035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        host_impl->RootLayer());
33045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (root_impl_ && root_impl_->children().size() > 0) {
33065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      child_impl_ = static_cast<PushPropertiesCountingLayerImpl*>(
33075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          root_impl_->children()[0]);
33085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (child_impl_ && child_impl_->children().size() > 0)
33105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        grandchild_impl_ = static_cast<PushPropertiesCountingLayerImpl*>(
33115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            child_impl_->children()[0]);
33125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
33135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (root_impl_ && root_impl_->children().size() > 1) {
33155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      child2_impl_ = static_cast<PushPropertiesCountingLayerImpl*>(
33165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          root_impl_->children()[1]);
33175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (child2_impl_ && child2_impl_->children().size() > 0)
33195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        leaf_always_pushing_layer_impl_ =
33205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            static_cast<PushPropertiesCountingLayerImpl*>(
33215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                child2_impl_->children()[0]);
33225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
33235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (root_impl_)
33255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(expected_push_properties_root_impl_,
33265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                root_impl_->push_properties_count());
33275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (child_impl_)
33285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(expected_push_properties_child_impl_,
33295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                child_impl_->push_properties_count());
33305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (grandchild_impl_)
33315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(expected_push_properties_grandchild_impl_,
33325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                grandchild_impl_->push_properties_count());
33335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (child2_impl_)
33345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(expected_push_properties_child2_impl_,
33355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                child2_impl_->push_properties_count());
33365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (leaf_always_pushing_layer_impl_)
33375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(expected_push_properties_grandchild2_impl_,
33385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                leaf_always_pushing_layer_impl_->push_properties_count());
33395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
33405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t expected_push_properties_root_impl_;
33425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t expected_push_properties_child_impl_;
33435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t expected_push_properties_child2_impl_;
33445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t expected_push_properties_grandchild_impl_;
33455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t expected_push_properties_grandchild2_impl_;
33465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
33475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(LayerTreeHostTestImplLayersPushProperties, DelegatingRenderer) {
33495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunTestWithImplSidePainting();
33505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
33515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestPropertyChangesDuringUpdateArePushed
33535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public LayerTreeHostTest {
33545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
33555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
33565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
33587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_ = Layer::Create();
33597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->SetBounds(gfx::Size(1, 1));
33607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool paint_scrollbar = true;
33627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool has_thumb = false;
33633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scrollbar_layer_ = FakePaintedScrollbarLayer::Create(
33643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        paint_scrollbar, has_thumb, root_->id());
33657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(scrollbar_layer_);
33677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    layer_tree_host()->SetRootLayer(root_);
33697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
33707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
33717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
3373bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    switch (layer_tree_host()->source_frame_number()) {
33747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
33757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1: {
33777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // During update, the ignore_set_needs_commit_ bit is set to true to
33787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // avoid causing a second commit to be scheduled. If a property change
33797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // is made during this, however, it needs to be pushed in the upcoming
33807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // commit.
33817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        scoped_ptr<base::AutoReset<bool> > ignore =
33827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            scrollbar_layer_->IgnoreSetNeedsCommit();
33837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        scrollbar_layer_->SetBounds(gfx::Size(30, 30));
33857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(scrollbar_layer_->needs_push_properties());
33877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
33887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetNeedsCommit();
33897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        scrollbar_layer_->reset_push_properties_count();
33917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_EQ(0u, scrollbar_layer_->push_properties_count());
33927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
33947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 2:
33957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_EQ(1u, scrollbar_layer_->push_properties_count());
33967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
33977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
33987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
33997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
34007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AfterTest() OVERRIDE {}
34027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<Layer> root_;
34043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<FakePaintedScrollbarLayer> scrollbar_layer_;
34057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
34067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34077dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPropertyChangesDuringUpdateArePushed);
34087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class LayerTreeHostTestSetDrawableCausesCommit : public LayerTreeHostTest {
34106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected:
34116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
34126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
34136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
34146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    root_ = PushPropertiesCountingLayer::Create();
34156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    child_ = PushPropertiesCountingLayer::Create();
34166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    root_->AddChild(child_);
34176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
34186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
34196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
34206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
34216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
34226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
34236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    switch (layer_tree_host()->source_frame_number()) {
34246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      case 0:
34256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        break;
34266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      case 1: {
34276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        // During update, the ignore_set_needs_commit_ bit is set to true to
34286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        // avoid causing a second commit to be scheduled. If a property change
34296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        // is made during this, however, it needs to be pushed in the upcoming
34306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        // commit.
34316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        EXPECT_FALSE(root_->needs_push_properties());
34326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        EXPECT_FALSE(child_->needs_push_properties());
34336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        EXPECT_EQ(0, root_->NumDescendantsThatDrawContent());
34346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        root_->reset_push_properties_count();
34356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        child_->reset_push_properties_count();
34366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        child_->SetDrawsContent(true);
34376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        EXPECT_EQ(1, root_->NumDescendantsThatDrawContent());
34386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        EXPECT_EQ(0u, root_->push_properties_count());
34396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        EXPECT_EQ(0u, child_->push_properties_count());
34406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        EXPECT_TRUE(root_->needs_push_properties());
34416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        EXPECT_TRUE(child_->needs_push_properties());
34426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        break;
34436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      }
34446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      case 2:
34456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        EXPECT_EQ(1u, root_->push_properties_count());
34466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        EXPECT_EQ(1u, child_->push_properties_count());
34476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        EXPECT_FALSE(root_->needs_push_properties());
34486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        EXPECT_FALSE(child_->needs_push_properties());
34496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        EndTest();
34506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        break;
34516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
34526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
34536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
34546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
34556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
34566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_refptr<PushPropertiesCountingLayer> root_;
34576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_refptr<PushPropertiesCountingLayer> child_;
34586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
34596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
34606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetDrawableCausesCommit);
34616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
34627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestCasePushPropertiesThreeGrandChildren
34637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTest {
34647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
34657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void BeginTest() OVERRIDE {
34667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_root_ = 0;
34677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_child_ = 0;
34687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_grandchild1_ = 0;
34697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_grandchild2_ = 0;
34707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    expected_push_properties_grandchild3_ = 0;
34717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PostSetNeedsCommitToMainThread();
34727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
34737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetupTree() OVERRIDE {
34757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_ = PushPropertiesCountingLayer::Create();
34767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_ = PushPropertiesCountingLayer::Create();
34777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grandchild1_ = PushPropertiesCountingLayer::Create();
34787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grandchild2_ = PushPropertiesCountingLayer::Create();
34797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    grandchild3_ = PushPropertiesCountingLayer::Create();
34807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    root_->AddChild(child_);
34827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_->AddChild(grandchild1_);
34837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_->AddChild(grandchild2_);
34847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    child_->AddChild(grandchild3_);
34857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Don't set the root layer here.
34877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTest::SetupTree();
34887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
34897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AfterTest() OVERRIDE {}
34917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FakeContentLayerClient client_;
34937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> root_;
34947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> child_;
34957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> grandchild1_;
34967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> grandchild2_;
34977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<PushPropertiesCountingLayer> grandchild3_;
34987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_root_;
34997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_child_;
35007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_grandchild1_;
35017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_grandchild2_;
35027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t expected_push_properties_grandchild3_;
35037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
35047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesAddingToTreeRequiresPush
35067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
35077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
35087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
3509bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int last_source_frame_number = layer_tree_host()->source_frame_number() - 1;
35107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
35117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
35127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
35137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
35147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
35157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
35167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
35177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
35187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
35197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
35207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
35217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
35227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
35247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->needs_push_properties());
35267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
35277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
35287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
35297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
35307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
35317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
35327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
35337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild3_->needs_push_properties());
35347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
35357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
35367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
35377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
35387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
35397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
35407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
35417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
35427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35437dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesAddingToTreeRequiresPush);
35447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesRemovingChildStopsRecursion
35467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
35477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
35487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
3549bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int last_source_frame_number = layer_tree_host()->source_frame_number() - 1;
35507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
35517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
35527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
35537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
35547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
35557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
35567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
35577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
35587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
35597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
35607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
35617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
35627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
35637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
35647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
35657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
35677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->SetPosition(gfx::Point(1, 1));
35687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
35707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
35717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
35727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
35737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
35747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
35757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
35767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
35777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->AddChild(grandchild1_);
35797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
35817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
35827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
35837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
35847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
35857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
35867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
35877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
35887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
35897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
35907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->SetPosition(gfx::Point(1, 1));
35927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
35947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
35957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
35967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
35977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
35987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
35997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
36007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
36017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
36027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
36037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // grandchild2_ will still need a push properties.
36057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
36067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
36087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
36097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
36107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
36117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // grandchild3_ does not need a push properties, so recursing should
36137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // no longer be needed.
36147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
36157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
36177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
36187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
36197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
36207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
36217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
36227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
36237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
36247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
36257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36267dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesRemovingChildStopsRecursion);
36277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesRemovingChildStopsRecursionWithPersistence
36297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
36307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
36317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
3632bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int last_source_frame_number = layer_tree_host()->source_frame_number() - 1;
36337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
36347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
36357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
36367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->set_persist_needs_push_properties(true);
36377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->set_persist_needs_push_properties(true);
36387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
36397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
36407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
36417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
36427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
36437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
36447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
36457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
36467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
36477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
36487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
36497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
36507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // grandchild2_ will still need a push properties.
36527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
36537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
36557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
36567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
36577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
36587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // grandchild3_ does not need a push properties, so recursing should
36607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // no longer be needed.
36617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
36627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
36647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
36657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
36667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
36677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
36687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
36697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
36707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
36717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
36727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36737dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(
36747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTestPushPropertiesRemovingChildStopsRecursionWithPersistence);
36757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertiesWhileOutsideTree
36777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
36787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
36797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
3680bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int last_source_frame_number = layer_tree_host()->source_frame_number() - 1;
36817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
36827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
36837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
36847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
36857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
36867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
36877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
36887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
36897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
36907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
36917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
36927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
36937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
36947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
36957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
36967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
36977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Change grandchildren while their parent is not in the tree.
36987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
36997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->SetPosition(gfx::Point(1, 1));
37007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->SetPosition(gfx::Point(1, 1));
37017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        root_->AddChild(child_);
37027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
37057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
37067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
37077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
37087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
37097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
37107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
37117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild3_->needs_push_properties());
37127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
37137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
37157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
37187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
37197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
37207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
37227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
37257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
37267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
37277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild3_->RemoveFromParent();
37297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
37327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
37337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
37347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
37367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
37377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
37387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
37397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
37407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37417dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(
37427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTestPushPropertiesSetPropertiesWhileOutsideTree);
37437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertyInParentThenChild
37457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
37467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
37477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
3748bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int last_source_frame_number = layer_tree_host()->source_frame_number() - 1;
37497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
37507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
37517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
37527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
37537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
37547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
37567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
37577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
37587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
37597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
37607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
37617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
37627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
37637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
37647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->SetPosition(gfx::Point(1, 1));
37667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->SetPosition(gfx::Point(1, 1));
37677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->SetPosition(gfx::Point(1, 1));
37687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
37717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
37727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
37737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
37747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
37757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
37767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
37777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
37787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
37797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
37817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
37847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
37857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
37867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
37887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
37917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
37927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
37937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
37957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
37977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
37987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
37997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
38007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
38017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
38027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
38037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
38047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38057dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(
38067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTestPushPropertiesSetPropertyInParentThenChild);
38077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertyInChildThenParent
38097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren {
38107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
38117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
3812bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int last_source_frame_number = layer_tree_host()->source_frame_number() - 1;
38137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    switch (last_source_frame_number) {
38147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 0:
38157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_tree_host()->SetRootLayer(root_);
38167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
38177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      case 1:
38187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
38197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
38207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->needs_push_properties());
38217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
38227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->needs_push_properties());
38237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
38247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->needs_push_properties());
38257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
38267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
38277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
38287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->SetPosition(gfx::Point(1, 1));
38307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->SetPosition(gfx::Point(1, 1));
38317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->SetPosition(gfx::Point(1, 1));
38327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
38347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
38357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
38367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
38377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild1_->needs_push_properties());
38387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild1_->descendant_needs_push_properties());
38397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(grandchild2_->needs_push_properties());
38407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild2_->descendant_needs_push_properties());
38417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->needs_push_properties());
38427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(grandchild3_->descendant_needs_push_properties());
38437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild1_->RemoveFromParent();
38457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
38477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
38487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
38497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->descendant_needs_push_properties());
38507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        grandchild2_->RemoveFromParent();
38527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
38547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(root_->descendant_needs_push_properties());
38557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_TRUE(child_->needs_push_properties());
38567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(child_->descendant_needs_push_properties());
38577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        child_->RemoveFromParent();
38597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->needs_push_properties());
38617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EXPECT_FALSE(root_->descendant_needs_push_properties());
38627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        EndTest();
38647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
38657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
38667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
38677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
38687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
38697dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(
38707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerTreeHostTestPushPropertiesSetPropertyInChildThenParent);
38717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3872ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// This test verifies that the tree activation callback is invoked correctly.
3873ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass LayerTreeHostTestTreeActivationCallback : public LayerTreeHostTest {
3874ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public:
3875ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  LayerTreeHostTestTreeActivationCallback()
3876ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      : num_commits_(0), callback_count_(0) {}
3877ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3878ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual void BeginTest() OVERRIDE {
3879ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_TRUE(HasImplThread());
3880ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    PostSetNeedsCommitToMainThread();
3881ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
3882ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3883cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual DrawResult PrepareToDrawOnThread(
38845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl* host_impl,
38855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl::FrameData* frame_data,
3886cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      DrawResult draw_result) OVERRIDE {
3887ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ++num_commits_;
3888ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    switch (num_commits_) {
3889ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      case 1:
3890ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        EXPECT_EQ(0, callback_count_);
3891ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        callback_count_ = 0;
3892ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        SetCallback(true);
3893ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        PostSetNeedsCommitToMainThread();
3894ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        break;
3895ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      case 2:
3896ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        EXPECT_EQ(1, callback_count_);
3897ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        callback_count_ = 0;
3898ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        SetCallback(false);
3899ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        PostSetNeedsCommitToMainThread();
3900ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        break;
3901ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      case 3:
3902ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        EXPECT_EQ(0, callback_count_);
3903ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        callback_count_ = 0;
3904ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        EndTest();
3905ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        break;
3906ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      default:
3907ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        ADD_FAILURE() << num_commits_;
3908ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        EndTest();
3909ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        break;
3910ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
39115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return LayerTreeHostTest::PrepareToDrawOnThread(
39125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        host_impl, frame_data, draw_result);
3913ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
3914ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
39155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE { EXPECT_EQ(3, num_commits_); }
3916ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3917ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void SetCallback(bool enable) {
39185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    output_surface()->SetTreeActivationCallback(
39195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        enable
39205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ? base::Bind(
39215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  &LayerTreeHostTestTreeActivationCallback::ActivationCallback,
39225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  base::Unretained(this))
39235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            : base::Closure());
3924ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
3925ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
39265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ActivationCallback() { ++callback_count_; }
3927ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3928ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int num_commits_;
3929ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int callback_count_;
3930ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
3931ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3932ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(LayerTreeHostTestTreeActivationCallback, DirectRenderer) {
3933ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RunTest(true, false, true);
3934ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
3935ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3936ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(LayerTreeHostTestTreeActivationCallback, DelegatingRenderer) {
3937ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RunTest(true, true, true);
3938ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
3939ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
39402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass LayerInvalidateCausesDraw : public LayerTreeHostTest {
3941a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
39422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  LayerInvalidateCausesDraw() : num_commits_(0), num_draws_(0) {}
3943a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3944a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void BeginTest() OVERRIDE {
39451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_TRUE(!!invalidate_layer_.get())
39462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        << "Derived tests must set this in SetupTree";
39472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
3948a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // One initial commit.
3949a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
3950a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
3951a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3952a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
39532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    // After commit, invalidate the layer.  This should cause a commit.
3954a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (layer_tree_host()->source_frame_number() == 1)
39555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      invalidate_layer_->SetNeedsDisplay();
3956a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
3957a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3958a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
3959a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    num_draws_++;
3960a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (impl->active_tree()->source_frame_number() == 1)
3961a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      EndTest();
3962a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
3963a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3964a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
3965a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    num_commits_++;
3966a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
3967a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3968a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {
3969a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_GE(2, num_commits_);
3970a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_GE(2, num_draws_);
3971a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
3972a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
39732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch protected:
39742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  scoped_refptr<Layer> invalidate_layer_;
39752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
3976a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
3977a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int num_commits_;
3978a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int num_draws_;
3979a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
3980a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
39812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// VideoLayer must support being invalidated and then passing that along
39822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// to the compositor thread, even though no resources are updated in
39832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// response to that invalidation.
39842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass LayerTreeHostTestVideoLayerInvalidate : public LayerInvalidateCausesDraw {
39852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch public:
39862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual void SetupTree() OVERRIDE {
39872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    LayerTreeHostTest::SetupTree();
39886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    scoped_refptr<VideoLayer> video_layer =
39896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        VideoLayer::Create(&provider_, media::VIDEO_ROTATION_0);
39902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    video_layer->SetBounds(gfx::Size(10, 10));
39912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    video_layer->SetIsDrawable(true);
39922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    layer_tree_host()->root_layer()->AddChild(video_layer);
39932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
39942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    invalidate_layer_ = video_layer;
39952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
39962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
39972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch private:
39982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  FakeVideoFrameProvider provider_;
39992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch};
40002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4001a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestVideoLayerInvalidate);
4002a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
40032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// IOSurfaceLayer must support being invalidated and then passing that along
40042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// to the compositor thread, even though no resources are updated in
40052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// response to that invalidation.
40062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass LayerTreeHostTestIOSurfaceLayerInvalidate
40072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    : public LayerInvalidateCausesDraw {
40082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch public:
40092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual void SetupTree() OVERRIDE {
40102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    LayerTreeHostTest::SetupTree();
40112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    scoped_refptr<IOSurfaceLayer> layer = IOSurfaceLayer::Create();
40122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    layer->SetBounds(gfx::Size(10, 10));
40132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    uint32_t fake_io_surface_id = 7;
40142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    layer->SetIOSurfaceProperties(fake_io_surface_id, layer->bounds());
40152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    layer->SetIsDrawable(true);
40162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    layer_tree_host()->root_layer()->AddChild(layer);
40172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
40182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    invalidate_layer_ = layer;
40192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
40202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch};
40212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
40222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// TODO(danakj): IOSurface layer can not be transported. crbug.com/239335
40232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochSINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
40242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    LayerTreeHostTestIOSurfaceLayerInvalidate);
40252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4026a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class LayerTreeHostTestPushHiddenLayer : public LayerTreeHostTest {
4027a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected:
4028a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
4029a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_layer_ = Layer::Create();
4030a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_layer_->SetPosition(gfx::Point());
4031a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_layer_->SetBounds(gfx::Size(10, 10));
4032a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4033a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    parent_layer_ = SolidColorLayer::Create();
4034a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    parent_layer_->SetPosition(gfx::Point());
4035a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    parent_layer_->SetBounds(gfx::Size(10, 10));
4036a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    parent_layer_->SetIsDrawable(true);
4037a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_layer_->AddChild(parent_layer_);
4038a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4039a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    child_layer_ = SolidColorLayer::Create();
4040a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    child_layer_->SetPosition(gfx::Point());
4041a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    child_layer_->SetBounds(gfx::Size(10, 10));
4042a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    child_layer_->SetIsDrawable(true);
4043a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    parent_layer_->AddChild(child_layer_);
4044a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4045a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
4046a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
4047a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4048a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4049a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
4050a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4051a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
4052a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (layer_tree_host()->source_frame_number()) {
4053a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
4054a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The layer type used does not need to push properties every frame.
4055a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_FALSE(child_layer_->needs_push_properties());
4056a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4057a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Change the bounds of the child layer, but make it skipped
4058a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // by CalculateDrawProperties.
4059a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        parent_layer_->SetOpacity(0.f);
4060a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        child_layer_->SetBounds(gfx::Size(5, 5));
4061a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
4062a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 2:
4063a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The bounds of the child layer were pushed to the impl side.
4064a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_FALSE(child_layer_->needs_push_properties());
4065a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4066a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EndTest();
4067a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
4068a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
4069a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4070a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4071a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
4072a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LayerImpl* root = impl->active_tree()->root_layer();
4073a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LayerImpl* parent = root->children()[0];
4074a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LayerImpl* child = parent->children()[0];
4075a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4076a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
4077a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
4078a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(gfx::Size(5, 5).ToString(), child->bounds().ToString());
4079a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
4080a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
4081a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4082a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4083a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
4084a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4085a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<Layer> root_layer_;
4086a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<SolidColorLayer> parent_layer_;
4087a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<SolidColorLayer> child_layer_;
4088a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
4089a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4090a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPushHiddenLayer);
4091a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4092a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class LayerTreeHostTestUpdateLayerInEmptyViewport : public LayerTreeHostTest {
4093a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected:
4094a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
4095a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    settings->impl_side_painting = true;
4096a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4097a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4098a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
4099a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_layer_ = FakePictureLayer::Create(&client_);
4100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_layer_->SetBounds(gfx::Size(10, 10));
4101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer_);
4103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
4104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void BeginTest() OVERRIDE {
4107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // The viewport is empty, but we still need to update layers on the main
4108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // thread.
4109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size(0, 0));
4110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
4111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
4114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // The layer should be updated even though the viewport is empty, so we
4115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // are capable of drawing it on the impl tree.
4116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_GT(root_layer_->update_count(), 0u);
4117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EndTest();
4118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
4121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  FakeContentLayerClient client_;
4123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<FakePictureLayer> root_layer_;
4124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
4125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestUpdateLayerInEmptyViewport);
4127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
41283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass LayerTreeHostTestAbortEvictedTextures : public LayerTreeHostTest {
41293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch public:
41303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  LayerTreeHostTestAbortEvictedTextures()
41311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      : num_will_begin_main_frames_(0), num_impl_commits_(0) {}
41323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
41333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch protected:
41343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void SetupTree() OVERRIDE {
41353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    scoped_refptr<SolidColorLayer> root_layer = SolidColorLayer::Create();
41363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    root_layer->SetBounds(gfx::Size(200, 200));
41373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    root_layer->SetIsDrawable(true);
41383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
41393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    layer_tree_host()->SetRootLayer(root_layer);
41403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    LayerTreeHostTest::SetupTree();
41413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
41423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
41433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
41443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
41451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void WillBeginMainFrame() OVERRIDE {
41461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    num_will_begin_main_frames_++;
41471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    switch (num_will_begin_main_frames_) {
41483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      case 2:
41493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        // Send a redraw to the compositor thread.  This will (wrongly) be
41503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        // ignored unless aborting resets the texture state.
41513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        layer_tree_host()->SetNeedsRedraw();
41523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        break;
41533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    }
41543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
41553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
41563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void BeginCommitOnThread(LayerTreeHostImpl* impl) OVERRIDE {
41573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    num_impl_commits_++;
41583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
41593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
41603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
41613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    switch (impl->SourceAnimationFrameNumber()) {
41623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      case 1:
41633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        // Prevent draws until commit.
41643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        impl->active_tree()->SetContentsTexturesPurged();
41653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        EXPECT_FALSE(impl->CanDraw());
41663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        // Trigger an abortable commit.
41673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        impl->SetNeedsCommit();
41683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        break;
41693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      case 2:
41703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        EndTest();
41713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        break;
41723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    }
41733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
41743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
41753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void AfterTest() OVERRIDE {
41763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // Ensure that the commit was truly aborted.
41771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_EQ(2, num_will_begin_main_frames_);
41783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    EXPECT_EQ(1, num_impl_commits_);
41793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
41803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
41813240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch private:
41821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int num_will_begin_main_frames_;
41833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  int num_impl_commits_;
41843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch};
41853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
41863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// Commits can only be aborted when using the thread proxy.
41873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestAbortEvictedTextures);
41883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
418958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostTestMaxTransferBufferUsageBytes : public LayerTreeHostTest {
419058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
419158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
419258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings->impl_side_painting = true;
419358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
419458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
41955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback)
419658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      OVERRIDE {
4197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    scoped_refptr<TestContextProvider> context_provider =
4198d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        TestContextProvider::Create();
4199d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    context_provider->SetMaxTransferBufferUsageBytes(1024 * 1024);
4200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (delegating_renderer())
4201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return FakeOutputSurface::CreateDelegating3d(context_provider);
4202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    else
4203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return FakeOutputSurface::Create3d(context_provider);
420458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
420558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
420658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
42071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    client_.set_fill_with_nonsolid_color(true);
420858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_refptr<FakePictureLayer> root_layer =
420958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        FakePictureLayer::Create(&client_);
421058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    root_layer->SetBounds(gfx::Size(6000, 6000));
421158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    root_layer->SetIsDrawable(true);
421258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
421358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_layer);
421458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
421558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
421658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
42175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
421858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
421958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
42205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
422158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
422258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Expect that the transfer buffer memory used is equal to the
422358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // MaxTransferBufferUsageBytes value set in CreateOutputSurface.
4224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(1024 * 1024u, context->max_used_transfer_buffer_usage_bytes());
422558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
422658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
422758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
422858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
422958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
423058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
423158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeContentLayerClient client_;
423258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
423358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
423458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Impl-side painting is a multi-threaded compositor feature.
423558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestMaxTransferBufferUsageBytes);
423658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
423768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Test ensuring that memory limits are sent to the prioritized resource
423868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// manager.
423968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class LayerTreeHostTestMemoryLimits : public LayerTreeHostTest {
424068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public:
424168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  LayerTreeHostTestMemoryLimits() : num_commits_(0) {}
424268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
424368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
424468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
42455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void WillCommit() OVERRIDE {
42465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Some commits are aborted, so increment number of attempted commits here.
42475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    num_commits_++;
42485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
42495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
425068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
42515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (num_commits_) {
42525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 1:
425368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // Verify default values.
42545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(PrioritizedResourceManager::DefaultMemoryAllocationLimit(),
42555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  layer_tree_host()
42565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->contents_texture_manager()
42575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->MaxMemoryLimitBytes());
42585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(PriorityCalculator::AllowEverythingCutoff(),
42595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  layer_tree_host()
42605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->contents_texture_manager()
42615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->ExternalPriorityCutoff());
426268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
426368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
42645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 2:
426568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // The values should remain the same until the commit after the policy
426668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // is changed.
42675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(PrioritizedResourceManager::DefaultMemoryAllocationLimit(),
42685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  layer_tree_host()
42695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->contents_texture_manager()
42705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->MaxMemoryLimitBytes());
42715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(PriorityCalculator::AllowEverythingCutoff(),
42725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  layer_tree_host()
42735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->contents_texture_manager()
42745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->ExternalPriorityCutoff());
427568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
42765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 3:
427768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // Verify values were correctly passed.
42785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(16u * 1024u * 1024u,
42795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  layer_tree_host()
42805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->contents_texture_manager()
42815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->MaxMemoryLimitBytes());
42825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(PriorityCalculator::AllowVisibleAndNearbyCutoff(),
42835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  layer_tree_host()
42845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->contents_texture_manager()
42855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      ->ExternalPriorityCutoff());
428668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EndTest();
428768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
42885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 4:
428968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // Make sure no extra commits happen.
429068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        NOTREACHED();
429168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
429268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
429368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
429468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
429568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
42965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (num_commits_) {
429768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 1:
42985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
42995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 2:
430068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // This will trigger a commit because the priority cutoff has changed.
430168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        impl->SetMemoryPolicy(ManagedMemoryPolicy(
43025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            16u * 1024u * 1024u,
43031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE,
430468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            1000));
430568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
43065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 3:
430768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // This will not trigger a commit because the priority cutoff has not
430868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // changed, and there is already enough memory for all allocations.
430968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        impl->SetMemoryPolicy(ManagedMemoryPolicy(
43105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            32u * 1024u * 1024u,
43111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE,
431268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            1000));
431368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
43145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 4:
431568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        NOTREACHED();
431668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
431768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
431868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
431968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
432068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
432168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
432268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private:
432368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int num_commits_;
432468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
432568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
43268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostTestMemoryLimits);
432768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
43282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
43293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
43304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestSetMemoryPolicyOnLostOutputSurface
43314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostTest {
43324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
43334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerTreeHostTestSetMemoryPolicyOnLostOutputSurface()
43344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : first_output_surface_memory_limit_(4321234),
43354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        second_output_surface_memory_limit_(1234321) {}
43364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
43375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback)
43384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      OVERRIDE {
43391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!first_context_provider_.get()) {
43404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      first_context_provider_ = TestContextProvider::Create();
43414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    } else {
43421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_FALSE(second_context_provider_.get());
43434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      second_context_provider_ = TestContextProvider::Create();
43444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
43454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
43461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_refptr<TestContextProvider> provider(second_context_provider_.get()
4347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                    ? second_context_provider_
4348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                    : first_context_provider_);
4349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_ptr<FakeOutputSurface> output_surface;
4350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (delegating_renderer())
4351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      output_surface = FakeOutputSurface::CreateDelegating3d(provider);
4352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    else
4353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      output_surface = FakeOutputSurface::Create3d(provider);
43545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    output_surface->SetMemoryPolicyToSetAtBind(
43555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        make_scoped_ptr(new ManagedMemoryPolicy(
43561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            second_context_provider_.get() ? second_output_surface_memory_limit_
43571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           : first_output_surface_memory_limit_,
43581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE,
43591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            ManagedMemoryPolicy::kDefaultNumResourcesLimit)));
43605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return output_surface.Pass();
43614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
43624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
43634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
43644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_ = FakeContentLayer::Create(&client_);
43654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_->SetBounds(gfx::Size(20, 20));
43664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
43674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
43684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
43694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
43705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
43714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
43724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
43734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Lost context sometimes takes two frames to recreate. The third frame
43744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // is sometimes aborted, so wait until the fourth frame to verify that
43754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // the memory has been set, and the fifth frame to end the test.
43764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (layer_tree_host()->source_frame_number() < 5) {
43774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
43784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    } else if (layer_tree_host()->source_frame_number() == 5) {
43794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EndTest();
43804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
43814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
43824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
43835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* impl,
43845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   bool result) OVERRIDE {
43854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (impl->active_tree()->source_frame_number()) {
43864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
43874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(first_output_surface_memory_limit_,
43884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  impl->memory_allocation_limit_bytes());
43894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Lose the output surface.
43904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        first_context_provider_->TestContext3d()->loseContextCHROMIUM(
43915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB);
43924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
43934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
43944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(second_output_surface_memory_limit_,
43954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  impl->memory_allocation_limit_bytes());
43964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
43974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
43984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
43994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
44004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
44014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
44024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<TestContextProvider> first_context_provider_;
44034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<TestContextProvider> second_context_provider_;
44044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t first_output_surface_memory_limit_;
44054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t second_output_surface_memory_limit_;
44064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeContentLayerClient client_;
44074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root_;
44084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
44094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
44104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// No output to copy for delegated renderers.
44114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
44124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostTestSetMemoryPolicyOnLostOutputSurface);
44134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct TestSwapPromiseResult {
44155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestSwapPromiseResult()
44165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : did_swap_called(false),
44175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        did_not_swap_called(false),
44185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        dtor_called(false),
44195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        reason(SwapPromise::DID_NOT_SWAP_UNKNOWN) {}
4420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool did_swap_called;
4422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool did_not_swap_called;
4423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool dtor_called;
4424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SwapPromise::DidNotSwapReason reason;
4425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::Lock lock;
4426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
4427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TestSwapPromise : public SwapPromise {
4429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
44305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit TestSwapPromise(TestSwapPromiseResult* result) : result_(result) {}
4431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~TestSwapPromise() {
4433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::AutoLock lock(result_->lock);
4434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    result_->dtor_called = true;
4435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void DidSwap(CompositorFrameMetadata* metadata) OVERRIDE {
4438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::AutoLock lock(result_->lock);
4439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(result_->did_swap_called);
4440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(result_->did_not_swap_called);
4441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    result_->did_swap_called = true;
4442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void DidNotSwap(DidNotSwapReason reason) OVERRIDE {
4445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::AutoLock lock(result_->lock);
4446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(result_->did_swap_called);
4447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(result_->did_not_swap_called);
4448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    result_->did_not_swap_called = true;
4449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    result_->reason = reason;
4450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
44526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual int64 TraceId() const OVERRIDE { return 0; }
44536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
4455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Not owned.
4456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestSwapPromiseResult* result_;
4457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
4458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
44595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestBreakSwapPromise : public LayerTreeHostTest {
4460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected:
4461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LayerTreeHostTestBreakSwapPromise()
44625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : commit_count_(0), commit_complete_count_(0) {}
4463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void WillBeginMainFrame() OVERRIDE {
4465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_LE(commit_count_, 2);
44665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<SwapPromise> swap_promise(
44675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new TestSwapPromise(&swap_promise_result_[commit_count_]));
4468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    layer_tree_host()->QueueSwapPromise(swap_promise.Pass());
4469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
4472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
4474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    commit_count_++;
4475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (commit_count_ == 2) {
4476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // This commit will finish.
4477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
4478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
4479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    commit_complete_count_++;
4483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (commit_complete_count_ == 1) {
4484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // This commit will be aborted because no actual update.
4485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      PostSetNeedsUpdateLayersToMainThread();
4486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    } else {
4487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EndTest();
4488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
4489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
4492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // 3 commits are scheduled. 2 completes. 1 is aborted.
4493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(commit_count_, 3);
4494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(commit_complete_count_, 2);
4495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
4497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // The first commit completes and causes swap buffer which finishes
4498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // the promise.
4499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::AutoLock lock(swap_promise_result_[0].lock);
4500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_TRUE(swap_promise_result_[0].did_swap_called);
4501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_FALSE(swap_promise_result_[0].did_not_swap_called);
4502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_TRUE(swap_promise_result_[0].dtor_called);
4503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
4504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
45065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // The second commit is aborted since it contains no updates.
4507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::AutoLock lock(swap_promise_result_[1].lock);
4508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_FALSE(swap_promise_result_[1].did_swap_called);
4509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called);
45105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_EQ(SwapPromise::COMMIT_NO_UPDATE, swap_promise_result_[1].reason);
4511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_TRUE(swap_promise_result_[1].dtor_called);
4512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
4513f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
4515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // The last commit completes but it does not cause swap buffer because
4516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // there is no damage in the frame data.
4517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::AutoLock lock(swap_promise_result_[2].lock);
4518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_FALSE(swap_promise_result_[2].did_swap_called);
4519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called);
4520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason);
4521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_TRUE(swap_promise_result_[2].dtor_called);
4522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
4523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int commit_count_;
4526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int commit_complete_count_;
4527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestSwapPromiseResult swap_promise_result_[3];
4528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
4529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
45306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestBreakSwapPromise);
4531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
45326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class LayerTreeHostTestBreakSwapPromiseForVisibilityAbortedCommit
45335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : public LayerTreeHostTest {
45345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected:
45355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
45365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
45376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
45385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    layer_tree_host()->SetDeferCommits(true);
45395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    layer_tree_host()->SetNeedsCommit();
45405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
45415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
45425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void DidDeferCommit() OVERRIDE {
45435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    layer_tree_host()->SetVisible(false);
45446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    scoped_ptr<SwapPromise> swap_promise(
45456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new TestSwapPromise(&swap_promise_result_));
45466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer_tree_host()->QueueSwapPromise(swap_promise.Pass());
45475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    layer_tree_host()->SetDeferCommits(false);
45486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
45496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
45506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl,
45516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                             bool did_handle) OVERRIDE {
45526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EndTest();
45536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
45546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
45556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {
45566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    {
45576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::AutoLock lock(swap_promise_result_.lock);
45586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      EXPECT_FALSE(swap_promise_result_.did_swap_called);
45596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      EXPECT_TRUE(swap_promise_result_.did_not_swap_called);
45606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason);
45616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      EXPECT_TRUE(swap_promise_result_.dtor_called);
45626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
45636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
45646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
45656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  TestSwapPromiseResult swap_promise_result_;
45666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
45676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
456803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
45696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    LayerTreeHostTestBreakSwapPromiseForVisibilityAbortedCommit);
45706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
45716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class LayerTreeHostTestBreakSwapPromiseForContextAbortedCommit
45726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : public LayerTreeHostTest {
45736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected:
45746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
45755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
45766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
45776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (TestEnded())
45786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return;
45796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer_tree_host()->SetDeferCommits(true);
45806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer_tree_host()->SetNeedsCommit();
45816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
45826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
45836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void DidDeferCommit() OVERRIDE {
45846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer_tree_host()->DidLoseOutputSurface();
45855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    scoped_ptr<SwapPromise> swap_promise(
45865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        new TestSwapPromise(&swap_promise_result_));
45875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    layer_tree_host()->QueueSwapPromise(swap_promise.Pass());
45886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer_tree_host()->SetDeferCommits(false);
45895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
45905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
45915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl,
45925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             bool did_handle) OVERRIDE {
45935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EndTest();
45946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // This lets the test finally commit and exit.
45956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    MainThreadTaskRunner()->PostTask(
45966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        FROM_HERE,
45976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        base::Bind(&LayerTreeHostTestBreakSwapPromiseForContextAbortedCommit::
45986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       FindOutputSurface,
45996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                   base::Unretained(this)));
46006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
46016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
46026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void FindOutputSurface() {
46036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer_tree_host()->OnCreateAndInitializeOutputSurfaceAttempted(true);
46045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
46055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
46065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
46075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    {
46085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::AutoLock lock(swap_promise_result_.lock);
46095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_FALSE(swap_promise_result_.did_swap_called);
46105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_TRUE(swap_promise_result_.did_not_swap_called);
46115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason);
46125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_TRUE(swap_promise_result_.dtor_called);
46135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
46145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
46155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
46165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestSwapPromiseResult swap_promise_result_;
46175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
46185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
461903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
462003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    LayerTreeHostTestBreakSwapPromiseForContextAbortedCommit);
46215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class SimpleSwapPromiseMonitor : public SwapPromiseMonitor {
4623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
4624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SimpleSwapPromiseMonitor(LayerTreeHost* layer_tree_host,
4625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           LayerTreeHostImpl* layer_tree_host_impl,
4626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           int* set_needs_commit_count,
4627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           int* set_needs_redraw_count)
4628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      : SwapPromiseMonitor(layer_tree_host, layer_tree_host_impl),
46296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        set_needs_commit_count_(set_needs_commit_count) {}
4630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~SimpleSwapPromiseMonitor() {}
4632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnSetNeedsCommitOnMain() OVERRIDE {
4634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    (*set_needs_commit_count_)++;
4635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
4636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnSetNeedsRedrawOnImpl() OVERRIDE {
46386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ADD_FAILURE() << "Should not get called on main thread.";
46396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
46406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
46416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnForwardScrollUpdateToMainThreadOnImpl() OVERRIDE {
46426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ADD_FAILURE() << "Should not get called on main thread.";
4643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
4644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
4646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int* set_needs_commit_count_;
4647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
4648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
46495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestSimpleSwapPromiseMonitor : public LayerTreeHostTest {
46505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
4651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
4652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void WillBeginMainFrame() OVERRIDE {
46546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (TestEnded())
46556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return;
46566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int set_needs_commit_count = 0;
4658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int set_needs_redraw_count = 0;
4659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    {
4661a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor(
4662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          new SimpleSwapPromiseMonitor(layer_tree_host(),
4663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       NULL,
4664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       &set_needs_commit_count,
4665a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       &set_needs_redraw_count));
4666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
4667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(1, set_needs_commit_count);
4668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(0, set_needs_redraw_count);
4669a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
4670a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4671a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Now the monitor is destroyed, SetNeedsCommit() is no longer being
4672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // monitored.
4673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    layer_tree_host()->SetNeedsCommit();
4674a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1, set_needs_commit_count);
4675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(0, set_needs_redraw_count);
4676a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    {
4678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor(
4679a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          new SimpleSwapPromiseMonitor(layer_tree_host(),
4680a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       NULL,
4681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       &set_needs_commit_count,
4682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       &set_needs_redraw_count));
4683a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      layer_tree_host()->SetNeedsUpdateLayers();
4684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(2, set_needs_commit_count);
4685a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(0, set_needs_redraw_count);
4686a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
4687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    {
4689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor(
4690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          new SimpleSwapPromiseMonitor(layer_tree_host(),
4691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       NULL,
4692a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       &set_needs_commit_count,
4693a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       &set_needs_redraw_count));
4694a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      layer_tree_host()->SetNeedsAnimate();
4695a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(3, set_needs_commit_count);
4696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(0, set_needs_redraw_count);
4697a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
4698a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EndTest();
4700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
4701a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
4703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
4704a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
470503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSimpleSwapPromiseMonitor);
4706a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4707a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostTestHighResRequiredAfterEvictingUIResources
4708a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public LayerTreeHostTest {
4709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
4710a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
4711a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    settings->impl_side_painting = true;
4712a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4713a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
4715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
4716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
4717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4719a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
4720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4721a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4722a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    host_impl->EvictAllUIResources();
4723a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Existence of evicted UI resources will trigger NEW_CONTENT_TAKES_PRIORITY
4724a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // mode. Active tree should require high-res to draw after entering this
4725a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // mode to ensure that high-res tiles are also required for a pending tree
4726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // to be activated.
4727a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(host_impl->active_tree()->RequiresHighResToDraw());
4728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4730a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
4731a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int frame = layer_tree_host()->source_frame_number();
4732a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    switch (frame) {
4733a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      case 1:
4734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
4735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
4736a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      case 2:
4737a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ui_resource_.reset();
4738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        EndTest();
4739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
4740a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
4741a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4742a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4743a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
4744a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FakeContentLayerClient client_;
4746a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<FakeScopedUIResource> ui_resource_;
4747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
4748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4749f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// This test is flaky, see http://crbug.com/386199
4750116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// MULTI_THREAD_TEST_F(LayerTreeHostTestHighResRequiredAfterEvictingUIResources)
4751a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4752010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class LayerTreeHostTestGpuRasterizationDefault : public LayerTreeHostTest {
4753a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
4754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
4755a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    settings->impl_side_painting = true;
4756010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4757010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_FALSE(settings->gpu_rasterization_enabled);
4758010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_FALSE(settings->gpu_rasterization_forced);
4759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
4762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
4763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_refptr<PictureLayer> layer = PictureLayer::Create(&layer_client_);
4765010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layer->SetBounds(gfx::Size(10, 10));
4766010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layer->SetIsDrawable(true);
4767010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(layer);
4768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
4769a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4770010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
4771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Layer* root = layer_tree_host()->root_layer();
4772010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PictureLayer* layer = static_cast<PictureLayer*>(root->child_at(0));
4773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PicturePile* pile = layer->GetPicturePileForTesting();
4774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Verify default values.
4776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(root->IsSuitableForGpuRasterization());
4777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(layer->IsSuitableForGpuRasterization());
4778010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(pile->is_suitable_for_gpu_rasterization());
4779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_FALSE(layer_tree_host()->has_gpu_rasterization_trigger());
4780010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_FALSE(layer_tree_host()->UseGpuRasterization());
4781010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4782010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Setting gpu rasterization trigger does not enable gpu rasterization.
478346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    layer_tree_host()->SetHasGpuRasterizationTrigger(true);
4784010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->has_gpu_rasterization_trigger());
4785010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_FALSE(layer_tree_host()->UseGpuRasterization());
4786a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
4788010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
4789a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4790a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4791cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_FALSE(host_impl->pending_tree()->use_gpu_rasterization());
4792cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_FALSE(host_impl->use_gpu_rasterization());
4793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4795a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4796cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_FALSE(host_impl->active_tree()->use_gpu_rasterization());
4797cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_FALSE(host_impl->use_gpu_rasterization());
4798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EndTest();
4799a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4800a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4801a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
4802a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  FakeContentLayerClient layer_client_;
4804a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
4805a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4806010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestGpuRasterizationDefault);
4807a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4808010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class LayerTreeHostTestGpuRasterizationEnabled : public LayerTreeHostTest {
4809a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
4810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
4811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    settings->impl_side_painting = true;
4812010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4813010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_FALSE(settings->gpu_rasterization_enabled);
4814010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    settings->gpu_rasterization_enabled = true;
4815a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4816a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4817a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetupTree() OVERRIDE {
4818a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerTreeHostTest::SetupTree();
4819a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4820010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_refptr<PictureLayer> layer = PictureLayer::Create(&layer_client_);
4821010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layer->SetBounds(gfx::Size(10, 10));
4822010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layer->SetIsDrawable(true);
4823010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(layer);
4824010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
4825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
4827010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Layer* root = layer_tree_host()->root_layer();
4828010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PictureLayer* layer = static_cast<PictureLayer*>(root->child_at(0));
4829010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PicturePile* pile = layer->GetPicturePileForTesting();
4830010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4831010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Verify default values.
4832010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(root->IsSuitableForGpuRasterization());
4833010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(layer->IsSuitableForGpuRasterization());
4834010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(pile->is_suitable_for_gpu_rasterization());
4835010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_FALSE(layer_tree_host()->has_gpu_rasterization_trigger());
4836010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_FALSE(layer_tree_host()->UseGpuRasterization());
4837010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4838010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Gpu rasterization trigger is relevant.
483946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    layer_tree_host()->SetHasGpuRasterizationTrigger(true);
4840010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->has_gpu_rasterization_trigger());
4841010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->UseGpuRasterization());
4842010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4843010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Content-based veto is relevant as well.
4844010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    pile->SetUnsuitableForGpuRasterizationForTesting();
4845010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_FALSE(pile->is_suitable_for_gpu_rasterization());
4846010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_FALSE(layer->IsSuitableForGpuRasterization());
4847010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Veto will take effect when layers are updated.
4848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // The results will be verified after commit is completed below.
4849010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Since we are manually marking picture pile as unsuitable,
4850010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // make sure that the layer gets a chance to update.
4851010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layer->SetNeedsDisplay();
4852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
4853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
4854010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4855010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4856cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_FALSE(host_impl->pending_tree()->use_gpu_rasterization());
4857cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_FALSE(host_impl->use_gpu_rasterization());
4858010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
4859a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4860010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4861cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_FALSE(host_impl->active_tree()->use_gpu_rasterization());
4862cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_FALSE(host_impl->use_gpu_rasterization());
4863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EndTest();
4864a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4865a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4866010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
4867010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4868010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  FakeContentLayerClient layer_client_;
4869010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
4870010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4871010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestGpuRasterizationEnabled);
4872010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4873010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class LayerTreeHostTestGpuRasterizationForced : public LayerTreeHostTest {
4874010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected:
4875010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
4876010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    settings->impl_side_painting = true;
4877010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4878010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_FALSE(settings->gpu_rasterization_forced);
4879010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    settings->gpu_rasterization_forced = true;
4880010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
4881010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4882010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
4883010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    LayerTreeHostTest::SetupTree();
4884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4885010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_refptr<PictureLayer> layer = PictureLayer::Create(&layer_client_);
4886010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layer->SetBounds(gfx::Size(10, 10));
4887010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layer->SetIsDrawable(true);
4888010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(layer);
4889010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
4890010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4891010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
4892010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Layer* root = layer_tree_host()->root_layer();
4893010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PictureLayer* layer = static_cast<PictureLayer*>(root->child_at(0));
4894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PicturePile* pile = layer->GetPicturePileForTesting();
4895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4896010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Verify default values.
4897010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(root->IsSuitableForGpuRasterization());
4898010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(layer->IsSuitableForGpuRasterization());
4899010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(pile->is_suitable_for_gpu_rasterization());
4900010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_FALSE(layer_tree_host()->has_gpu_rasterization_trigger());
4901010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4902010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // With gpu rasterization forced, gpu rasterization trigger is irrelevant.
4903010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->UseGpuRasterization());
490446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    layer_tree_host()->SetHasGpuRasterizationTrigger(true);
4905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->has_gpu_rasterization_trigger());
4906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->UseGpuRasterization());
4907010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4908010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Content-based veto is irrelevant as well.
4909010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    pile->SetUnsuitableForGpuRasterizationForTesting();
4910010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_FALSE(pile->is_suitable_for_gpu_rasterization());
4911010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_FALSE(layer->IsSuitableForGpuRasterization());
4912010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Veto will take effect when layers are updated.
4913010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // The results will be verified after commit is completed below.
4914010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Since we are manually marking picture pile as unsuitable,
4915010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // make sure that the layer gets a chance to update.
4916010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layer->SetNeedsDisplay();
4917010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
4918010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
4919a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4920a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4921cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(host_impl->pending_tree()->use_gpu_rasterization());
4922cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(host_impl->use_gpu_rasterization());
4923a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4924a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4925a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4926cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(host_impl->active_tree()->use_gpu_rasterization());
4927cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(host_impl->use_gpu_rasterization());
4928a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EndTest();
4929a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4930a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4931a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
4932a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4933010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  FakeContentLayerClient layer_client_;
4934a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
4935a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4936010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestGpuRasterizationForced);
4937a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4938c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass LayerTreeHostTestContinuousPainting : public LayerTreeHostTest {
4939c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
4940c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  LayerTreeHostTestContinuousPainting()
4941c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      : num_commits_(0), num_draws_(0), bounds_(20, 20), child_layer_(NULL) {}
4942c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
4943c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected:
4944c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  enum { kExpectedNumCommits = 10 };
4945c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
4946c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void SetupTree() OVERRIDE {
4947c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    scoped_refptr<Layer> root_layer = Layer::Create();
4948c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    root_layer->SetBounds(bounds_);
4949c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
4950c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (layer_tree_host()->settings().impl_side_painting) {
4951c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      picture_layer_ = FakePictureLayer::Create(&client_);
4952c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      child_layer_ = picture_layer_.get();
4953c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    } else {
4954c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      content_layer_ = ContentLayerWithUpdateTracking::Create(&client_);
4955c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      child_layer_ = content_layer_.get();
4956c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
4957c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    child_layer_->SetBounds(bounds_);
4958c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    child_layer_->SetIsDrawable(true);
4959c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    root_layer->AddChild(child_layer_);
4960c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
4961c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    layer_tree_host()->SetRootLayer(root_layer);
4962c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    layer_tree_host()->SetViewportSize(bounds_);
4963c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    LayerTreeHostTest::SetupTree();
4964c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
4965c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
4966c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void BeginTest() OVERRIDE {
4967c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    MainThreadTaskRunner()->PostTask(
4968c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        FROM_HERE,
4969c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        base::Bind(
4970c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            &LayerTreeHostTestContinuousPainting::EnableContinuousPainting,
4971c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            base::Unretained(this)));
49726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Wait 50x longer than expected.
49736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    double milliseconds_per_frame =
49746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        1000.0 / layer_tree_host()->settings().refresh_rate;
49756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    MainThreadTaskRunner()->PostDelayedTask(
49766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        FROM_HERE,
49776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        base::Bind(
49786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            &LayerTreeHostTestContinuousPainting::DisableContinuousPainting,
49796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            base::Unretained(this)),
49806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(50 * kExpectedNumCommits *
49816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                          milliseconds_per_frame));
4982c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
4983c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
498403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void BeginMainFrame(const BeginFrameArgs& args) OVERRIDE {
4985c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    child_layer_->SetNeedsDisplay();
4986c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
4987c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
4988c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void AfterTest() OVERRIDE {
4989c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_LE(kExpectedNumCommits, num_commits_);
4990c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_LE(kExpectedNumCommits, num_draws_);
49911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int update_count = content_layer_.get()
49921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           ? content_layer_->PaintContentsCount()
49931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           : picture_layer_->update_count();
4994c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_LE(kExpectedNumCommits, update_count);
4995c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
4996c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
4997c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
4998c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (++num_draws_ == kExpectedNumCommits)
4999c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      EndTest();
5000c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
5001c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5002c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
5003c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ++num_commits_;
5004c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
5005c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5006c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private:
5007c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void EnableContinuousPainting() {
5008c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    LayerTreeDebugState debug_state = layer_tree_host()->debug_state();
5009c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    debug_state.continuous_painting = true;
5010c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    layer_tree_host()->SetDebugState(debug_state);
5011c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
5012c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
50136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void DisableContinuousPainting() {
50146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    LayerTreeDebugState debug_state = layer_tree_host()->debug_state();
50156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    debug_state.continuous_painting = false;
50166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer_tree_host()->SetDebugState(debug_state);
50176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EndTest();
50186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
50196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
5020c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int num_commits_;
5021c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int num_draws_;
5022c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const gfx::Size bounds_;
5023c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FakeContentLayerClient client_;
5024c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<ContentLayerWithUpdateTracking> content_layer_;
5025c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<FakePictureLayer> picture_layer_;
5026c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Layer* child_layer_;
5027c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
5028c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5029c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestContinuousPainting);
5030c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
50311675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdochclass LayerTreeHostTestActivateOnInvisible : public LayerTreeHostTest {
50321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
50331675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  LayerTreeHostTestActivateOnInvisible()
50341675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      : activation_count_(0), visible_(true) {}
50351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
50361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
50371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    settings->impl_side_painting = true;
50381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
50391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
50401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void BeginTest() OVERRIDE {
50411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Kick off the test with a commit.
50421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PostSetNeedsCommitToMainThread();
50431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
50441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
50451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void BeginCommitOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
50461675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    // Make sure we don't activate using the notify signal from tile manager.
50471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    host_impl->BlockNotifyReadyToActivateForTesting(true);
50481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
50491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
50501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void DidCommit() OVERRIDE { layer_tree_host()->SetVisible(false); }
50511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
50521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* host_impl,
50531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       bool visible) OVERRIDE {
50541675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    visible_ = visible;
50551675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
50561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Once invisible, we can go visible again.
50571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!visible) {
50581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PostSetVisibleToMainThread(true);
50591675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    } else {
50601675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      EXPECT_TRUE(host_impl->active_tree()->RequiresHighResToDraw());
50611675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      EndTest();
50621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
50631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
50641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
50651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
50661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ++activation_count_;
50671675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    EXPECT_FALSE(visible_);
50681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
50691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
50701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void AfterTest() OVERRIDE {
50711675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    // Ensure we activated even though the signal was blocked.
50721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(1, activation_count_);
50731675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    EXPECT_TRUE(visible_);
50741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
50751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
50761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
50771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int activation_count_;
50781675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  bool visible_;
50791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
50801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FakeContentLayerClient client_;
50811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<FakePictureLayer> picture_layer_;
50821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
50831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
50841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(vmpstr): Enable with single thread impl-side painting.
50851675a649fd7a8b3cb80ffddae2dc181f122353c5Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestActivateOnInvisible);
50861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
50875b892326406927b709cdaf6c384d4ababf456332Ben Murdoch// Make sure page scale and top control deltas are applied to the client even
50885b892326406927b709cdaf6c384d4ababf456332Ben Murdoch// when the LayerTreeHost doesn't have a root layer.
50895b892326406927b709cdaf6c384d4ababf456332Ben Murdochclass LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer
50905b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    : public LayerTreeHostTest {
50915b892326406927b709cdaf6c384d4ababf456332Ben Murdoch public:
50925b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer()
50935b892326406927b709cdaf6c384d4ababf456332Ben Murdoch      : deltas_sent_to_client_(false) {}
50945b892326406927b709cdaf6c384d4ababf456332Ben Murdoch
50955b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  virtual void BeginTest() OVERRIDE {
50965b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    layer_tree_host()->SetRootLayer(nullptr);
50975b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    info_.page_scale_delta = 3.14f;
50985b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    info_.top_controls_delta = 2.73f;
50995b892326406927b709cdaf6c384d4ababf456332Ben Murdoch
51005b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    PostSetNeedsCommitToMainThread();
51015b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  }
51025b892326406927b709cdaf6c384d4ababf456332Ben Murdoch
51035b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  virtual void BeginMainFrame(const BeginFrameArgs& args) OVERRIDE {
51045b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    EXPECT_EQ(nullptr, layer_tree_host()->root_layer());
51055b892326406927b709cdaf6c384d4ababf456332Ben Murdoch
51065b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    layer_tree_host()->ApplyScrollAndScale(&info_);
51075b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    EndTest();
51085b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  }
51095b892326406927b709cdaf6c384d4ababf456332Ben Murdoch
51105b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  virtual void ApplyViewportDeltas(
51115b892326406927b709cdaf6c384d4ababf456332Ben Murdoch      const gfx::Vector2d& scroll,
51125b892326406927b709cdaf6c384d4ababf456332Ben Murdoch      float scale_delta,
51135b892326406927b709cdaf6c384d4ababf456332Ben Murdoch      float top_controls_delta) OVERRIDE {
51145b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    EXPECT_EQ(info_.page_scale_delta, scale_delta);
51155b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    EXPECT_EQ(info_.top_controls_delta, top_controls_delta);
51165b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    deltas_sent_to_client_ = true;
51175b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  }
51185b892326406927b709cdaf6c384d4ababf456332Ben Murdoch
51195b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  virtual void AfterTest() OVERRIDE {
51205b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    EXPECT_TRUE(deltas_sent_to_client_);
51215b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  }
51225b892326406927b709cdaf6c384d4ababf456332Ben Murdoch
51235b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  ScrollAndScaleSet info_;
51245b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  bool deltas_sent_to_client_;
51255b892326406927b709cdaf6c384d4ababf456332Ben Murdoch};
51265b892326406927b709cdaf6c384d4ababf456332Ben Murdoch
51275b892326406927b709cdaf6c384d4ababf456332Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer);
51282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
5129