layer_tree_host_unittest_context.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_provider.h"
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_resource_collection.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/io_surface_layer.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h"
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/layers/painted_scrollbar_layer.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/texture_layer.h"
17a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "cc/layers/texture_layer_impl.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer_impl.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/output/filter_operations.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_impl.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer_impl.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h"
288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "cc/test/fake_output_surface_client.h"
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_painted_scrollbar_layer.h"
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_scoped_ui_resource.h"
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/test/fake_scrollbar.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_video_frame_provider.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_common.h"
350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_context_provider.h"
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h"
370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/media.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using media::VideoFrame;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These tests deal with losing the 3d graphics context.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostContextTest : public LayerTreeTest {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTest()
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeTest(),
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        context3d_(NULL),
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_create_(0),
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_lose_during_commit_(0),
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_lose_during_draw_(0),
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_recreate_(0),
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        times_to_expect_create_failed_(0),
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        times_create_failed_(0),
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        committed_at_least_once_(false),
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        context_should_support_io_surface_(false),
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        fallback_context_works_(false) {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media::InitializeMediaLibraryForTesting();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LoseContext() {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context3d_->loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    GL_INNOCENT_CONTEXT_RESET_ARB);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context3d_ = NULL;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return TestWebGraphicsContext3D::Create();
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback)
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      OVERRIDE {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_fail_create_) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      --times_to_fail_create_;
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExpectCreateToFail();
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return scoped_ptr<FakeOutputSurface>();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TestWebGraphicsContext3D> context3d = CreateContext3d();
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context3d_ = context3d.get();
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (context_should_support_io_surface_) {
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      context3d_->set_have_extension_io_surface(true);
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      context3d_->set_have_extension_egl_image(true);
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (delegating_renderer())
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return FakeOutputSurface::CreateDelegating3d(context3d.Pass());
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    else
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return FakeOutputSurface::Create3d(context3d.Pass());
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual DrawResult PrepareToDrawOnThread(
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl* host_impl,
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl::FrameData* frame,
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      DrawResult draw_result) OVERRIDE {
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(DRAW_SUCCESS, draw_result);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!times_to_lose_during_draw_)
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return draw_result;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    --times_to_lose_during_draw_;
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    LoseContext();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_create_ = times_to_fail_recreate_;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_ = 0;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return draw_result;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    committed_at_least_once_ = true;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!times_to_lose_during_commit_)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    --times_to_lose_during_commit_;
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoseContext();
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_create_ = times_to_fail_recreate_;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_ = 0;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidFailToInitializeOutputSurface() OVERRIDE {
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++times_create_failed_;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeTest::TearDown();
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(times_to_expect_create_failed_, times_create_failed_);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ExpectCreateToFail() { ++times_to_expect_create_failed_; }
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestWebGraphicsContext3D* context3d_;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_fail_create_;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_lose_during_commit_;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_lose_during_draw_;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_fail_recreate_;
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int times_to_expect_create_failed_;
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int times_create_failed_;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool committed_at_least_once_;
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool context_should_support_io_surface_;
149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool fallback_context_works_;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextSucceeds
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLostContextSucceeds()
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostContextTest(),
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        test_case_(0),
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        num_losses_(0),
159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        num_losses_last_test_case_(-1),
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        recovered_context_(true),
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        first_initialized_(false) {}
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void DidInitializeOutputSurface() OVERRIDE {
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (first_initialized_)
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ++num_losses_;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    else
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      first_initialized_ = true;
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    recovered_context_ = true;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void AfterTest() OVERRIDE { EXPECT_EQ(7u, test_case_); }
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If the last frame had a context loss, then we'll commit again to
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // recover.
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!recovered_context_)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_lose_during_commit_)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_lose_during_draw_)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    recovered_context_ = false;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (NextTestCase())
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InvalidateAndSetNeedsCommit();
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EndTest();
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InvalidateAndSetNeedsCommit() {
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Cause damage so we try to draw.
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->SetNeedsDisplay();
196558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    layer_tree_host()->SetNeedsCommit();
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool NextTestCase() {
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static const TestCase kTests[] = {
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Losing the context and failing to recreate it (or losing it again
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // immediately) a small number of times should succeed.
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        {1,      // times_to_lose_during_commit
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         0,      // times_to_lose_during_draw
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         0,      // times_to_fail_recreate
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         false,  // fallback_context_works
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        },
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        {0,      // times_to_lose_during_commit
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         1,      // times_to_lose_during_draw
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         0,      // times_to_fail_recreate
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         false,  // fallback_context_works
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        },
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        {1,      // times_to_lose_during_commit
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         0,      // times_to_lose_during_draw
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         3,      // times_to_fail_recreate
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         false,  // fallback_context_works
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        },
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        {0,      // times_to_lose_during_commit
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         1,      // times_to_lose_during_draw
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         3,      // times_to_fail_recreate
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         false,  // fallback_context_works
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        },
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Losing the context and recreating it any number of times should
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // succeed.
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        {10,     // times_to_lose_during_commit
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         0,      // times_to_lose_during_draw
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         0,      // times_to_fail_recreate
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         false,  // fallback_context_works
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        },
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        {0,      // times_to_lose_during_commit
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         10,     // times_to_lose_during_draw
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         0,      // times_to_fail_recreate
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         false,  // fallback_context_works
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        },
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Losing the context, failing to reinitialize it, and making a fallback
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // context should work.
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        {0,     // times_to_lose_during_commit
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         1,     // times_to_lose_during_draw
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         0,     // times_to_fail_recreate
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         true,  // fallback_context_works
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        }, };
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (test_case_ >= arraysize(kTests))
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Make sure that we lost our context at least once in the last test run so
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // the test did something.
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_GT(num_losses_, num_losses_last_test_case_);
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    num_losses_last_test_case_ = num_losses_;
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_during_commit_ =
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kTests[test_case_].times_to_lose_during_commit;
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    times_to_lose_during_draw_ = kTests[test_case_].times_to_lose_during_draw;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_ = kTests[test_case_].times_to_fail_recreate;
254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    fallback_context_works_ = kTests[test_case_].fallback_context_works;
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++test_case_;
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct TestCase {
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_lose_during_commit;
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_lose_during_draw;
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_fail_recreate;
263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool fallback_context_works;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t test_case_;
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_losses_;
269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int num_losses_last_test_case_;
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool recovered_context_;
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool first_initialized_;
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLostContextSucceeds);
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostClientNotReadyDoesNotCreateOutputSurface
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public LayerTreeHostContextTest {
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerTreeHostClientNotReadyDoesNotCreateOutputSurface()
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : LayerTreeHostContextTest() {}
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void WillBeginTest() OVERRIDE {
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Override and do not signal SetLayerTreeHostClientReady.
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EndTest();
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<OutputSurface> CreateOutputSurface(bool fallback)
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OVERRIDE {
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(false);
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return scoped_ptr<OutputSurface>();
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void DidInitializeOutputSurface() OVERRIDE { EXPECT_TRUE(false); }
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostClientNotReadyDoesNotCreateOutputSurface);
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextSucceedsWithContent
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTestLostContextSucceeds {
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_ = Layer::Create();
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetBounds(gfx::Size(10, 10));
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetIsDrawable(true);
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_ = FakeContentLayer::Create(&client_);
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetBounds(gfx::Size(10, 10));
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetIsDrawable(true);
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(content_);
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InvalidateAndSetNeedsCommit() OVERRIDE {
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Invalidate the render surface so we don't try to use a cached copy of the
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // surface.  We want to make sure to test the drawing paths for drawing to
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // a child surface.
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetNeedsDisplay();
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTestLostContextSucceeds::InvalidateAndSetNeedsCommit();
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerImpl* content_impl = static_cast<FakeContentLayerImpl*>(
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->active_tree()->root_layer()->children()[0]);
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Even though the context was lost, we should have a resource. The
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TestWebGraphicsContext3D ensures that this resource is created with
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the active context.
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(content_impl->HaveResourceForTileAt(0, 0));
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> root_;
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ContentLayer> content_;
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// This test uses TiledLayer to check for a working context.
3475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuSINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F(
3485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    LayerTreeHostContextTestLostContextSucceedsWithContent);
349a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostContextTestCreateOutputSurfaceFails
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public LayerTreeHostContextTest {
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Run a test that initially fails OutputSurface creation |times_to_fail|
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // times. If |expect_fallback_attempt| is |true|, an attempt to create a
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // fallback/software OutputSurface is expected to occur.
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerTreeHostContextTestCreateOutputSurfaceFails(int times_to_fail,
3575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                                   bool expect_fallback_attempt)
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : times_to_fail_(times_to_fail),
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        expect_fallback_attempt_(expect_fallback_attempt),
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        did_attempt_fallback_(false),
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        times_initialized_(0) {}
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE {
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    times_to_fail_create_ = times_to_fail_;
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback)
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OVERRIDE {
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<FakeOutputSurface> surface =
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        LayerTreeHostContextTest::CreateFakeOutputSurface(fallback);
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (surface)
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(times_to_fail_, times_create_failed_);
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    did_attempt_fallback_ = fallback;
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return surface.Pass();
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void DidInitializeOutputSurface() OVERRIDE { times_initialized_++; }
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EndTest();
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(times_to_fail_, times_create_failed_);
3885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_NE(0, times_initialized_);
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(expect_fallback_attempt_, did_attempt_fallback_);
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int times_to_fail_;
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool expect_fallback_attempt_;
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool did_attempt_fallback_;
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int times_initialized_;
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostContextTestCreateOutputSurfaceFailsOnce
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public LayerTreeHostContextTestCreateOutputSurfaceFails {
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerTreeHostContextTestCreateOutputSurfaceFailsOnce()
4035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      : LayerTreeHostContextTestCreateOutputSurfaceFails(1, false) {}
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LayerTreeHostContextTestCreateOutputSurfaceFailsOnce);
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// After 4 failures we expect an attempt to create a fallback/software
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// OutputSurface.
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostContextTestCreateOutputSurfaceFailsWithFallback
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public LayerTreeHostContextTestCreateOutputSurfaceFails {
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerTreeHostContextTestCreateOutputSurfaceFailsWithFallback()
4155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      : LayerTreeHostContextTestCreateOutputSurfaceFails(4, true) {}
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LayerTreeHostContextTestCreateOutputSurfaceFailsWithFallback);
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextAndEvictTextures
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLostContextAndEvictTextures()
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostContextTest(),
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_(FakeContentLayer::Create(&client_)),
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        impl_host_(0),
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_commits_(0) {}
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_->SetBounds(gfx::Size(10, 20));
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PostEvictTextures() {
439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (HasImplThread()) {
440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ImplThreadTaskRunner()->PostTask(
441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          FROM_HERE,
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::Bind(&LayerTreeHostContextTestLostContextAndEvictTextures::
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          EvictTexturesOnImplThread,
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     base::Unretained(this)));
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DebugScopedSetImplThread impl(proxy());
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EvictTexturesOnImplThread();
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void EvictTexturesOnImplThread() {
452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    impl_host_->EvictTexturesForTesting();
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (lose_after_evict_)
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LoseContext();
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (num_commits_ > 1)
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(layer_->HaveBackingAt(0, 0));
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostEvictTextures();
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (num_commits_ > 1)
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_commits_;
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!lose_after_evict_)
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LoseContext();
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    impl_host_ = impl;
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void DidInitializeOutputSurface() OVERRIDE { EndTest(); }
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool lose_after_evict_;
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> layer_;
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostImpl* impl_host_;
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_commits_;
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
487a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseAfterEvict_SingleThread_DirectRenderer) {
488a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = true;
489a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
490a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
491a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
492a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
493a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseAfterEvict_SingleThread_DelegatingRenderer) {
494a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = true;
495a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, true, false);
496a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
497a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
498a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
499a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseAfterEvict_MultiThread_DirectRenderer_MainThreadPaint) {
500a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = true;
501a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
502a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
503a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
504a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
505a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseAfterEvict_MultiThread_DelegatingRenderer_MainThreadPaint) {
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lose_after_evict_ = true;
507a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, false);
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Flaky on all platforms, http://crbug.com/310979
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
5121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       DISABLED_LoseAfterEvict_MultiThread_DelegatingRenderer_ImplSidePaint) {
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lose_after_evict_ = true;
514a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
515a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
516a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
517a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
518a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_SingleThread_DirectRenderer) {
519a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = false;
520a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
521a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
522a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
523a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
524a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_SingleThread_DelegatingRenderer) {
525a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = false;
526a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, true, false);
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
530a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_MultiThread_DirectRenderer_MainThreadPaint) {
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lose_after_evict_ = false;
532a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
536a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_MultiThread_DirectRenderer_ImplSidePaint) {
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lose_after_evict_ = false;
538a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
539a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
540a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
541a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
542a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_MultiThread_DelegatingRenderer_MainThreadPaint) {
543a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = false;
544a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, false);
545a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
546a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
547a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
548a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_MultiThread_DelegatingRenderer_ImplSidePaint) {
549a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = false;
550a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class LayerTreeHostContextTestLostContextWhileUpdatingResources
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  LayerTreeHostContextTestLostContextWhileUpdatingResources()
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : parent_(FakeContentLayer::Create(&client_)),
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        num_children_(50),
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        times_to_lose_on_end_query_(3) {}
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() OVERRIDE {
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TestWebGraphicsContext3D> context =
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeHostContextTest::CreateContext3d();
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_lose_on_end_query_) {
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      --times_to_lose_on_end_query_;
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context->set_times_end_query_succeeds(5);
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return context.Pass();
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent_->SetBounds(gfx::Size(num_children_, 1));
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int i = 0; i < num_children_; i++) {
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<FakeContentLayer> child =
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          FakeContentLayer::Create(&client_);
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      child->SetPosition(gfx::PointF(i, 0.f));
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      child->SetBounds(gfx::Size(1, 1));
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_->AddChild(child);
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(parent_);
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(0, times_to_lose_on_end_query_);
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(0, times_to_lose_on_end_query_);
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> parent_;
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_children_;
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_lose_on_end_query_;
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F(
605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    LayerTreeHostContextTestLostContextWhileUpdatingResources);
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostContextTestLayersNotified : public LayerTreeHostContextTest {
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLayersNotified()
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : LayerTreeHostContextTest(), num_commits_(0) {}
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_ = FakeContentLayer::Create(&client_);
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child_ = FakeContentLayer::Create(&client_);
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    grandchild_ = FakeContentLayer::Create(&client_);
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(child_);
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child_->AddChild(grandchild_);
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
6277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    LayerTreeHostContextTest::DidActivateTreeOnThread(host_impl);
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerImpl* root = static_cast<FakeContentLayerImpl*>(
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->active_tree()->root_layer());
6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FakeContentLayerImpl* child =
6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        static_cast<FakeContentLayerImpl*>(root->children()[0]);
6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FakeContentLayerImpl* grandchild =
6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        static_cast<FakeContentLayerImpl*>(child->children()[0]);
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_commits_;
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (num_commits_) {
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, root->lost_output_surface_count());
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, child->lost_output_surface_count());
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, grandchild->lost_output_surface_count());
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Lose the context and struggle to recreate it.
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoseContext();
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_create_ = 1;
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        EXPECT_GE(1u, root->lost_output_surface_count());
648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        EXPECT_GE(1u, child->lost_output_surface_count());
649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        EXPECT_GE(1u, grandchild->lost_output_surface_count());
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default:
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTREACHED();
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_commits_;
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root_;
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> child_;
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> grandchild_;
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLayersNotified);
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestDontUseLostResources
671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerTreeHostContextTestDontUseLostResources() : lost_context_(false) {
6744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    context_should_support_io_surface_ = true;
6758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    child_output_surface_ = FakeOutputSurface::Create3d();
6778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    child_output_surface_->BindToClient(&output_surface_client_);
67823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    shared_bitmap_manager_.reset(new TestSharedBitmapManager());
6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    child_resource_provider_ = ResourceProvider::Create(
680010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        child_output_surface_.get(), shared_bitmap_manager_.get(), 0, false, 1,
681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        false);
6824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  static void EmptyReleaseCallback(unsigned sync_point, bool lost) {}
6858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gpu::gles2::GLES2Interface* gl =
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        child_output_surface_->context_provider()->ContextGL();
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
6918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scoped_ptr<TestRenderPass> pass_for_quad = TestRenderPass::Create();
6938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    pass_for_quad->SetNew(
6948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        // AppendOneOfEveryQuadType() makes a RenderPass quad with this id.
6958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        RenderPass::Id(2, 1),
6968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Rect(0, 0, 10, 10),
6978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Rect(0, 0, 10, 10),
6988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Transform());
6998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scoped_ptr<TestRenderPass> pass = TestRenderPass::Create();
7018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    pass->SetNew(RenderPass::Id(1, 1),
7028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 gfx::Rect(0, 0, 10, 10),
7038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 gfx::Rect(0, 0, 10, 10),
7048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 gfx::Transform());
7058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    pass->AppendOneOfEveryQuadType(child_resource_provider_.get(),
7068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                   RenderPass::Id(2, 1));
7078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    frame_data->render_pass_list.push_back(pass_for_quad.PassAs<RenderPass>());
7098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    frame_data->render_pass_list.push_back(pass.PassAs<RenderPass>());
7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated_resource_collection_ = new DelegatedFrameResourceCollection;
7124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated_frame_provider_ = new DelegatedFrameProvider(
7134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_resource_collection_.get(), frame_data.Pass());
7144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ResourceProvider::ResourceId resource =
7168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        child_resource_provider_->CreateResource(
7178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            gfx::Size(4, 4),
7188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            GL_CLAMP_TO_EDGE,
7198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            ResourceProvider::TextureUsageAny,
7208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            RGBA_8888);
7218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ResourceProvider::ScopedWriteLockGL lock(child_resource_provider_.get(),
7228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                             resource);
7238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    gpu::Mailbox mailbox;
7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->GenMailboxCHROMIUM(mailbox.name);
7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint sync_point = gl->InsertSyncPointCHROMIUM();
7278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scoped_refptr<Layer> root = Layer::Create();
7298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    root->SetBounds(gfx::Size(10, 10));
7308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    root->SetIsDrawable(true);
7318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<FakeDelegatedRendererLayer> delegated =
733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        FakeDelegatedRendererLayer::Create(delegated_frame_provider_.get());
7344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetBounds(gfx::Size(10, 10));
7354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetIsDrawable(true);
7364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(delegated);
7374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<ContentLayer> content = ContentLayer::Create(&client_);
7394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content->SetBounds(gfx::Size(10, 10));
7404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content->SetIsDrawable(true);
7414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(content);
7424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scoped_refptr<TextureLayer> texture = TextureLayer::CreateForMailbox(NULL);
7444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    texture->SetBounds(gfx::Size(10, 10));
7454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    texture->SetIsDrawable(true);
7468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    texture->SetTextureMailbox(
7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        TextureMailbox(mailbox, GL_TEXTURE_2D, sync_point),
7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        SingleReleaseCallback::Create(
7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base::Bind(&LayerTreeHostContextTestDontUseLostResources::
7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            EmptyReleaseCallback)));
7514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(texture);
7524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<ContentLayer> mask = ContentLayer::Create(&client_);
7544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    mask->SetBounds(gfx::Size(10, 10));
7554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<ContentLayer> content_with_mask =
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentLayer::Create(&client_);
7584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content_with_mask->SetBounds(gfx::Size(10, 10));
7594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content_with_mask->SetIsDrawable(true);
7604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content_with_mask->SetMaskLayer(mask.get());
7614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(content_with_mask);
7624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<VideoLayer> video_color =
7644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        VideoLayer::Create(&color_frame_provider_);
7654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_color->SetBounds(gfx::Size(10, 10));
7664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_color->SetIsDrawable(true);
7674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(video_color);
7684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<VideoLayer> video_hw =
7704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        VideoLayer::Create(&hw_frame_provider_);
7714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_hw->SetBounds(gfx::Size(10, 10));
7724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_hw->SetIsDrawable(true);
7734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(video_hw);
7744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<VideoLayer> video_scaled_hw =
7764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        VideoLayer::Create(&scaled_hw_frame_provider_);
7774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_scaled_hw->SetBounds(gfx::Size(10, 10));
7784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_scaled_hw->SetIsDrawable(true);
7794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(video_scaled_hw);
780a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
7818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    color_video_frame_ = VideoFrame::CreateColorFrame(
7828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Size(4, 4), 0x80, 0x80, 0x80, base::TimeDelta());
7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    hw_video_frame_ =
7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        VideoFrame::WrapNativeTexture(make_scoped_ptr(new gpu::MailboxHolder(
7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                          mailbox, GL_TEXTURE_2D, sync_point)),
7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      media::VideoFrame::ReleaseMailboxCB(),
7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      gfx::Size(4, 4),
7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      gfx::Rect(0, 0, 4, 4),
7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      gfx::Size(4, 4),
7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      base::TimeDelta(),
7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      VideoFrame::ReadPixelsCB());
7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scaled_hw_video_frame_ =
7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        VideoFrame::WrapNativeTexture(make_scoped_ptr(new gpu::MailboxHolder(
7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                          mailbox, GL_TEXTURE_2D, sync_point)),
7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      media::VideoFrame::ReleaseMailboxCB(),
7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      gfx::Size(4, 4),
7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      gfx::Rect(0, 0, 3, 2),
7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      gfx::Size(4, 4),
7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      base::TimeDelta(),
8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      VideoFrame::ReadPixelsCB());
8018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    color_frame_provider_.set_frame(color_video_frame_);
8038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    hw_frame_provider_.set_frame(hw_video_frame_);
8048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scaled_hw_frame_provider_.set_frame(scaled_hw_video_frame_);
8058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
806a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (!delegating_renderer()) {
807a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      // TODO(danakj): IOSurface layer can not be transported. crbug.com/239335
8084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      scoped_refptr<IOSurfaceLayer> io_surface = IOSurfaceLayer::Create();
8094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      io_surface->SetBounds(gfx::Size(10, 10));
8104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      io_surface->SetIsDrawable(true);
8114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      io_surface->SetIOSurfaceProperties(1, gfx::Size(10, 10));
8124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      root->AddChild(io_surface);
813a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Enable the hud.
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeDebugState debug_state;
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    debug_state.show_property_changed_rects = true;
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetDebugState(debug_state);
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<PaintedScrollbarLayer> scrollbar =
8213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        PaintedScrollbarLayer::Create(
8224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            scoped_ptr<Scrollbar>(new FakeScrollbar).Pass(), content->id());
8234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scrollbar->SetBounds(gfx::Size(10, 10));
8244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scrollbar->SetIsDrawable(true);
8254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(scrollbar);
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root);
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(host_impl);
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() == 3) {
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // On the third commit we're recovering from context loss. Hardware
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // video frames should not be reused by the VideoFrameProvider, but
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // software frames can be.
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      hw_frame_provider_.set_frame(NULL);
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scaled_hw_frame_provider_.set_frame(NULL);
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
845cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual DrawResult PrepareToDrawOnThread(
8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl* host_impl,
8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl::FrameData* frame,
848cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      DrawResult draw_result) OVERRIDE {
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() == 2) {
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Lose the context during draw on the second commit. This will cause
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // a third commit to recover.
8524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      context3d_->set_times_bind_texture_succeeds(0);
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return draw_result;
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback)
8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OVERRIDE {
8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // This will get called twice:
8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // First when we create the initial output surface...
8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (layer_tree_host()->source_frame_number() > 0) {
862a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      // ... and then again after we forced the context to be lost.
8634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      lost_context_ = true;
8644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return LayerTreeHostContextTest::CreateFakeOutputSurface(fallback);
8664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
8674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(layer_tree_host()->hud_layer());
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // End the test once we know the 3nd frame drew.
871a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (layer_tree_host()->source_frame_number() < 5) {
8724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      layer_tree_host()->root_layer()->SetNeedsDisplay();
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
8744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    } else {
8754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EndTest();
8764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE { EXPECT_TRUE(lost_context_); }
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
8834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool lost_context_;
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  FakeOutputSurfaceClient output_surface_client_;
8868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<FakeOutputSurface> child_output_surface_;
88723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
8888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<ResourceProvider> child_resource_provider_;
8898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedFrameResourceCollection>
8914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      delegated_resource_collection_;
8924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedFrameProvider> delegated_frame_provider_;
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoFrame> color_video_frame_;
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoFrame> hw_video_frame_;
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoFrame> scaled_hw_video_frame_;
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeVideoFrameProvider color_frame_provider_;
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeVideoFrameProvider hw_frame_provider_;
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeVideoFrameProvider scaled_hw_frame_provider_;
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestDontUseLostResources);
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ImplSidePaintingLayerTreeHostContextTest
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostContextTest {
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings->impl_side_painting = true;
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestImplSidePainting
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public ImplSidePaintingLayerTreeHostContextTest {
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<Layer> root = Layer::Create();
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->SetBounds(gfx::Size(10, 10));
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->SetIsDrawable(true);
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<PictureLayer> picture = PictureLayer::Create(&client_);
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    picture->SetBounds(gfx::Size(10, 10));
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    picture->SetIsDrawable(true);
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->AddChild(picture);
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root);
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_during_commit_ = 1;
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void DidInitializeOutputSurface() OVERRIDE { EndTest(); }
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostContextTestImplSidePainting);
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScrollbarLayerLostContext : public LayerTreeHostContextTest {
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollbarLayerLostContext() : commits_(0) {}
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<Layer> scroll_layer = Layer::Create();
9515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scrollbar_layer_ =
9525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        FakePaintedScrollbarLayer::Create(false, true, scroll_layer->id());
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scrollbar_layer_->SetBounds(gfx::Size(10, 100));
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(scrollbar_layer_);
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(scroll_layer);
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++commits_;
965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (commits_) {
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // First (regular) update, we should upload 2 resources (thumb, and
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // backtrack).
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1, scrollbar_layer_->update_count());
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoseContext();
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Second update, after the lost context, we should still upload 2
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // resources even if the contents haven't changed.
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2, scrollbar_layer_->update_count());
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
97858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 3:
97958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Single thread proxy issues extra commits after context lost.
98058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // http://crbug.com/287250
98158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (HasImplThread())
98258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          NOTREACHED();
98358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default:
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTREACHED();
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int commits_;
9913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<FakePaintedScrollbarLayer> scrollbar_layer_;
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(ScrollbarLayerLostContext);
995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
996a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class UIResourceLostTest : public LayerTreeHostContextTest {
997a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
998a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceLostTest() : time_step_(0) {}
9990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
10000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    settings->texture_id_allocation_chunk_size = 1;
10010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1002a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
1003a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1004a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
100558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // This is called on the main thread after each commit and
100658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // DidActivateTreeOnThread, with the value of time_step_ at the time
100758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // of the call to DidActivateTreeOnThread. Similar tests will do
100858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // work on the main thread in DidCommit but that is unsuitable because
100958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // the main thread work for these tests must happen after
101058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // DidActivateTreeOnThread, which happens after DidCommit with impl-side
101158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // painting.
101258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int time_step) = 0;
101358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
101458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Called after DidActivateTreeOnThread. If this is done during the commit,
101558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // the call to StepCompleteOnMainThread will not occur until after
101658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // the commit completes, because the main thread is blocked.
101758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void PostStepCompleteToMainThread() {
101858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    proxy()->MainThreadTaskRunner()->PostTask(
101958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        FROM_HERE,
10205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(&UIResourceLostTest::StepCompleteOnMainThreadInternal,
10215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   base::Unretained(this),
10225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   time_step_));
102358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
102458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
102558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void PostLoseContextToImplThread() {
102658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
102758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::SingleThreadTaskRunner* task_runner =
102858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        HasImplThread() ? ImplThreadTaskRunner()
102958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        : base::MessageLoopProxy::current();
10305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    task_runner->PostTask(FROM_HERE,
10315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::Bind(&LayerTreeHostContextTest::LoseContext,
10325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     base::Unretained(this)));
103358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
103458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1035a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected:
1036a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int time_step_;
1037a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<FakeScopedUIResource> ui_resource_;
103858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
103958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
104058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void StepCompleteOnMainThreadInternal(int step) {
104158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
104258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    StepCompleteOnMainThread(step);
104358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
1044a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
1045a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
104658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostTestSimple : public UIResourceLostTest {
1047a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
104858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // This is called when the commit is complete and the new layer tree has been
104958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // activated.
105058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) = 0;
105158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1052a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
105358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!layer_tree_host()->settings().impl_side_painting) {
105458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      StepCompleteOnImplThread(impl);
105558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      PostStepCompleteToMainThread();
105658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ++time_step_;
105758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
105858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
105958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
106058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
106158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (layer_tree_host()->settings().impl_side_painting) {
106258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      StepCompleteOnImplThread(impl);
106358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      PostStepCompleteToMainThread();
106458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ++time_step_;
106558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
106658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
106758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
106858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
106958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Losing context after an UI resource has been created.
107058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostAfterCommit : public UIResourceLostTestSimple {
107158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
107258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int step) OVERRIDE {
107358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
107458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (step) {
1075a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 0:
1076a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
1077a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Expects a valid UIResourceId.
1078a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_NE(0, ui_resource_->id());
1079a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
1080a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
108158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 4:
108258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Release resource before ending the test.
108358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ui_resource_.reset();
108458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EndTest();
108558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
108658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 5:
108758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Single thread proxy issues extra commits after context lost.
108858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // http://crbug.com/287250
108958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (HasImplThread())
109058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          NOTREACHED();
109158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
109258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 6:
109358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NOTREACHED();
109458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
109558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
109658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
109758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE {
109858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
109958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (time_step_) {
1100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
1101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource should have been created on LTHI after the commit.
110258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
1104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 2:
1106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        LoseContext();
1107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
1109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resources should have been recreated. The bitmap callback should
1110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // have been called once with the resource_lost flag set to true.
1111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(1, ui_resource_->lost_resource_count);
1112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Resource Id on the impl-side have been recreated as well. Note
1113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // that the same UIResourceId persists after the context lost.
111458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
1116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
1118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
1119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
1120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostAfterCommit);
1122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Losing context before UI resource requests can be commited.  Three sequences
1124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// of creation/deletion are considered:
1125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 1. Create one resource -> Context Lost => Expect the resource to have been
1126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// created.
1127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 2. Delete an exisiting resource (test_id0_) -> create a second resource
1128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// (test_id1_) -> Context Lost => Expect the test_id0_ to be removed and
1129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// test_id1_ to have been created.
1130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 3. Create one resource -> Delete that same resource -> Context Lost => Expect
1131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// the resource to not exist in the manager.
113258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostBeforeCommit : public UIResourceLostTestSimple {
1133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
11345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UIResourceLostBeforeCommit() : test_id0_(0), test_id1_(0) {}
1135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
113658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int step) OVERRIDE {
113758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (step) {
1138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 0:
1139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
114058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Lose the context on the impl thread before the commit.
114158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostLoseContextToImplThread();
1142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 2:
1144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Sequence 2:
1145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Currently one resource has been created.
1146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        test_id0_ = ui_resource_->id();
1147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Delete this resource.
1148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_.reset();
1149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Create another resource.
1150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
1151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        test_id1_ = ui_resource_->id();
1152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Sanity check that two resource creations return different ids.
1153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_NE(test_id0_, test_id1_);
115458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Lose the context on the impl thread before the commit.
115558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostLoseContextToImplThread();
1156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
1158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Clear the manager of resources.
1159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_.reset();
1160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
1161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 4:
1163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Sequence 3:
1164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
1165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        test_id0_ = ui_resource_->id();
1166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Sanity check the UIResourceId should not be 0.
1167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_NE(0, test_id0_);
1168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Usually ScopedUIResource are deleted from the manager in their
1169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // destructor (so usually ui_resource_.reset()).  But here we need
1170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // ui_resource_ for the next step, so call DeleteUIResource directly.
1171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        layer_tree_host()->DeleteUIResource(test_id0_);
117258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Delete the resouce and then lose the context.
117358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostLoseContextToImplThread();
1174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 5:
117658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Release resource before ending the test.
1177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_.reset();
1178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EndTest();
1179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
118058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 6:
118158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Single thread proxy issues extra commits after context lost.
118258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // http://crbug.com/287250
118358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (HasImplThread())
118458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          NOTREACHED();
118558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
118658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 8:
118758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NOTREACHED();
1188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
1189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
1190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
119158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE {
119258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
1193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (time_step_) {
1194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
119558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Sequence 1 (continued):
119658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The first context lost happens before the resources were created,
119758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // and because it resulted in no resources being destroyed, it does not
119858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // trigger resource re-creation.
119958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
120058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
120158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Resource Id on the impl-side has been created.
120258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
1203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
120558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Sequence 2 (continued):
120658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The previous resource should have been deleted.
120758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_));
120858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (HasImplThread()) {
120958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          // The second resource should have been created.
1210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_));
121158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        } else {
121258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          // The extra commit that happens at context lost in the single thread
121358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          // proxy changes the timing so that the resource has been destroyed.
121458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          // http://crbug.com/287250
121558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id1_));
1216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        }
121758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The second resource called the resource callback once and since the
121858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // context is lost, a "resource lost" callback was also issued.
121958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(2, ui_resource_->resource_create_count);
122058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->lost_resource_count);
1221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 5:
122358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Sequence 3 (continued):
122458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Expect the resource callback to have been called once.
122558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
122658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // No "resource lost" callbacks.
122758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
122858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The UI resource id should not be valid
122958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_));
1230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
1232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
1233a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
1235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceId test_id0_;
1236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceId test_id1_;
1237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
1238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostBeforeCommit);
1240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Losing UI resource before the pending trees is activated but after the
1242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// commit.  Impl-side-painting only.
1243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class UIResourceLostBeforeActivateTree : public UIResourceLostTest {
124458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int step) OVERRIDE {
124558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
124658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (step) {
1247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 0:
1248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
1249a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
1250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
1252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        test_id_ = ui_resource_->id();
1253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_.reset();
1254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
1255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 5:
125758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Release resource before ending the test.
125858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ui_resource_.reset();
1259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EndTest();
1260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
126158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 6:
126258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Make sure no extra commits happened.
126358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NOTREACHED();
1264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
1265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
1266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
126758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
126858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
1269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (time_step_) {
127058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 2:
127158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
1272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
127358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 4:
127458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
127558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
127658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
127758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
127858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
127958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
128058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (time_step_) {
1281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
1282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource creation callback has been called.
1283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
1284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource is not yet lost (sanity check).
1285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
1286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource should not have been created yet on the impl-side.
1287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        LoseContext();
1289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
1291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        LoseContext();
1292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
1294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
1295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1297a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LayerTreeHostContextTest::DidActivateTreeOnThread(impl);
1298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (time_step_) {
1299a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
1300a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The pending requests on the impl-side should have been processed.
1301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1303a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 2:
1304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The "lost resource" callback should have been called once.
1305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(1, ui_resource_->lost_resource_count);
1306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 4:
1308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource is deleted and should not be in the manager.  Use
1309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // test_id_ since ui_resource_ has been deleted.
1310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id_));
1311a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
131358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
131458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PostStepCompleteToMainThread();
1315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ++time_step_;
1316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
1317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
1319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceId test_id_;
1320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
1321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(UIResourceLostBeforeActivateTree,
1323a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)       RunMultiThread_DirectRenderer_ImplSidePaint) {
1324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RunTest(true, false, true);
1325a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
1326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(UIResourceLostBeforeActivateTree,
1328a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)       RunMultiThread_DelegatingRenderer_ImplSidePaint) {
1329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RunTest(true, true, true);
1330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
1331a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
133258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Resources evicted explicitly and by visibility changes.
133358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostEviction : public UIResourceLostTestSimple {
133458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
133558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int step) OVERRIDE {
133658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
133758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (step) {
133858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 0:
133958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
134058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0, ui_resource_->id());
134158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
134258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
134358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 2:
134458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Make the tree not visible.
134558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetVisibleToMainThread(false);
134658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
134758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 3:
134858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Release resource before ending the test.
134958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ui_resource_.reset();
135058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EndTest();
135158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
135258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 4:
135358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NOTREACHED();
135458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
135558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
135658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
135758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* impl,
135858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       bool visible) OVERRIDE {
13595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
136058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!visible) {
136158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // All resources should have been evicted.
136258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ASSERT_EQ(0u, context->NumTextures());
136358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
136458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_EQ(2, ui_resource_->resource_create_count);
136558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_EQ(1, ui_resource_->lost_resource_count);
136658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Drawing is disabled both because of the evicted resources and
136758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // because the renderer is not visible.
136858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_FALSE(impl->CanDraw());
136958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Make the renderer visible again.
137058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      PostSetVisibleToMainThread(true);
137158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
137258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
137358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
137458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE {
13755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestWebGraphicsContext3D* context = TestContext();
137658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
137758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (time_step_) {
137858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 1:
137958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The resource should have been created on LTHI after the commit.
138058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ASSERT_EQ(1u, context->NumTextures());
138158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
138258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
138358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
138458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_TRUE(impl->CanDraw());
138558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Evict all UI resources. This will trigger a commit.
138658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        impl->EvictAllUIResources();
138758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ASSERT_EQ(0u, context->NumTextures());
138858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
138958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
139058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
139158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_FALSE(impl->CanDraw());
139258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
139358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 2:
139458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The resource should have been recreated.
139558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ASSERT_EQ(1u, context->NumTextures());
139658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
139758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(2, ui_resource_->resource_create_count);
139858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->lost_resource_count);
139958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_TRUE(impl->CanDraw());
140058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
140158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 3:
140258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The resource should have been recreated after visibility was
140358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // restored.
140458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ASSERT_EQ(1u, context->NumTextures());
140558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
140658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(3, ui_resource_->resource_create_count);
140758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(2, ui_resource_->lost_resource_count);
140858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_TRUE(impl->CanDraw());
140958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
141058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
141158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
141258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
141358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
141458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostEviction);
141558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostContextTestSurfaceCreateCallback
14174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostContextTest {
14184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
14194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerTreeHostContextTestSurfaceCreateCallback()
14204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : LayerTreeHostContextTest(),
14215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        layer_(FakeContentLayer::Create(&client_)) {}
14224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
14244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_->SetBounds(gfx::Size(10, 20));
14254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
14264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
14274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
14284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
14304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
14325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (layer_tree_host()->source_frame_number()) {
14334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
14344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(1u, layer_->output_surface_created_count());
14354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
14364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
14374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
14384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(1u, layer_->output_surface_created_count());
14395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
14404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
14414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
14425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_EQ(1u, layer_->output_surface_created_count());
14435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
14445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 4:
14454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(2u, layer_->output_surface_created_count());
14464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
14474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
14484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
14494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
14504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
14524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
14535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (LastCommittedSourceFrameNumber(impl)) {
14544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 0:
14554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
14564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
14574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
14584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
14594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        LoseContext();
14604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
14614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
14624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
14634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
14644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
14654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
14664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
14684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
14704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeContentLayerClient client_;
14714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<FakeContentLayer> layer_;
14724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
14734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestSurfaceCreateCallback);
14754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class LayerTreeHostContextTestLoseAfterSendingBeginMainFrame
1477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : public LayerTreeHostContextTest {
1478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected:
1479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    deferred_ = false;
1481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
1482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
1483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1484f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void ScheduledActionWillSendBeginMainFrame() OVERRIDE {
1485f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (deferred_)
1486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return;
1487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    deferred_ = true;
1488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Defer commits before the BeginFrame arrives, causing it to be delayed.
1490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MainThreadTaskRunner()->PostTask(
1491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        FROM_HERE,
1492f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        base::Bind(&LayerTreeHostContextTestLoseAfterSendingBeginMainFrame::
1493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       DeferCommitsOnMainThread,
1494f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   base::Unretained(this),
1495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   true));
1496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Meanwhile, lose the context while we are in defer commits.
1497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ImplThreadTaskRunner()->PostTask(
1498f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        FROM_HERE,
1499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        base::Bind(&LayerTreeHostContextTestLoseAfterSendingBeginMainFrame::
1500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       LoseContextOnImplThread,
1501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   base::Unretained(this)));
1502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
1503f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1504f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void LoseContextOnImplThread() {
1505f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    LoseContext();
1506f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // After losing the context, stop deferring commits.
1508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MainThreadTaskRunner()->PostTask(
1509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        FROM_HERE,
1510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        base::Bind(&LayerTreeHostContextTestLoseAfterSendingBeginMainFrame::
1511f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       DeferCommitsOnMainThread,
1512f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   base::Unretained(this),
1513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   false));
1514f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
1515f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void DeferCommitsOnMainThread(bool defer_commits) {
1517f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    layer_tree_host()->SetDeferCommits(defer_commits);
1518f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
1519f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1520f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void WillBeginMainFrame() OVERRIDE {
1521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Don't begin a frame with a lost surface.
1522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_FALSE(layer_tree_host()->output_surface_lost());
1523f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
1524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE { EndTest(); }
1526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1527f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1528f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1529f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool deferred_;
1530f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
1531f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1532f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// TODO(danakj): We don't use scheduler with SingleThreadProxy yet.
1533f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostContextTestLoseAfterSendingBeginMainFrame);
1534f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
1537