layer_tree_host_unittest_context.cc revision 558790d6acca3451cf3a6b497803a5f07d0bec58
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"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/io_surface_layer.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/scrollbar_layer.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/texture_layer.h"
15a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "cc/layers/texture_layer_impl.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer_impl.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/output/filter_operations.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_impl.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_context_provider.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer_impl.h"
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h"
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/test/fake_scrollbar.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_scrollbar_layer.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_video_frame_provider.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_common.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/media.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using media::VideoFrame;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebGraphicsContext3D;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These tests deal with losing the 3d graphics context.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostContextTest : public LayerTreeTest {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTest()
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeTest(),
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        context3d_(NULL),
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_create_(0),
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_initialize_(0),
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_lose_on_create_(0),
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_lose_during_commit_(0),
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_lose_during_draw_(0),
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_recreate_(0),
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_reinitialize_(0),
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_lose_on_recreate_(0),
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_create_offscreen_(0),
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_recreate_offscreen_(0),
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        times_to_expect_create_failed_(0),
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        times_create_failed_(0),
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_offscreen_created_(0),
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        committed_at_least_once_(false),
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        context_should_support_io_surface_(false) {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media::InitializeMediaLibraryForTesting();
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LoseContext() {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context3d_->loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    GL_INNOCENT_CONTEXT_RESET_ARB);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context3d_ = NULL;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return TestWebGraphicsContext3D::Create();
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_fail_create_) {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      --times_to_fail_create_;
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExpectCreateToFail();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return scoped_ptr<OutputSurface>();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TestWebGraphicsContext3D> context3d = CreateContext3d();
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context3d_ = context3d.get();
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (context_should_support_io_surface_) {
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      context3d_->set_have_extension_io_surface(true);
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      context3d_->set_have_extension_egl_image(true);
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_fail_initialize_) {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      --times_to_fail_initialize_;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Make the context get lost during reinitialization.
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // The number of times MakeCurrent succeeds is not important, and
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // can be changed if needed to make this pass with future changes.
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context3d_->set_times_make_current_succeeds(2);
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExpectCreateToFail();
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (times_to_lose_on_create_) {
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      --times_to_lose_on_create_;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LoseContext();
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExpectCreateToFail();
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
107a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (delegating_renderer()) {
108a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return FakeOutputSurface::CreateDelegating3d(
109a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)          context3d.PassAs<WebGraphicsContext3D>()).PassAs<OutputSurface>();
110a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return FakeOutputSurface::Create3d(
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        context3d.PassAs<WebGraphicsContext3D>()).PassAs<OutputSurface>();
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TestWebGraphicsContext3D> CreateOffscreenContext3d() {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!context3d_)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return scoped_ptr<TestWebGraphicsContext3D>();
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++times_offscreen_created_;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_fail_create_offscreen_) {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      --times_to_fail_create_offscreen_;
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExpectCreateToFail();
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return scoped_ptr<TestWebGraphicsContext3D>();
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TestWebGraphicsContext3D> offscreen_context3d =
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestWebGraphicsContext3D::Create().Pass();
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(offscreen_context3d);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context3d_->add_share_group_context(offscreen_context3d.get());
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return offscreen_context3d.Pass();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_refptr<cc::ContextProvider>
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OffscreenContextProviderForMainThread() OVERRIDE {
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK(!HasImplThread());
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (!offscreen_contexts_main_thread_.get() ||
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        offscreen_contexts_main_thread_->DestroyedOnMainThread()) {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      offscreen_contexts_main_thread_ = FakeContextProvider::Create(
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(&LayerTreeHostContextTest::CreateOffscreenContext3d,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::Unretained(this)));
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (offscreen_contexts_main_thread_.get() &&
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          !offscreen_contexts_main_thread_->BindToCurrentThread())
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        offscreen_contexts_main_thread_ = NULL;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return offscreen_contexts_main_thread_;
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_refptr<cc::ContextProvider>
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OffscreenContextProviderForCompositorThread() OVERRIDE {
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK(HasImplThread());
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (!offscreen_contexts_compositor_thread_.get() ||
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        offscreen_contexts_compositor_thread_->DestroyedOnMainThread()) {
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      offscreen_contexts_compositor_thread_ = FakeContextProvider::Create(
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(&LayerTreeHostContextTest::CreateOffscreenContext3d,
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::Unretained(this)));
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return offscreen_contexts_compositor_thread_;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     LayerTreeHostImpl::FrameData* frame,
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     bool result) OVERRIDE {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(result);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!times_to_lose_during_draw_)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return result;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    --times_to_lose_during_draw_;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context3d_->set_times_make_current_succeeds(0);
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_create_ = times_to_fail_recreate_;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_ = 0;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_initialize_ = times_to_fail_reinitialize_;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_reinitialize_ = 0;
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_on_create_ = times_to_lose_on_recreate_;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_on_recreate_ = 0;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_create_offscreen_ = times_to_fail_recreate_offscreen_;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_offscreen_ = 0;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return result;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    committed_at_least_once_ = true;
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!times_to_lose_during_commit_)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    --times_to_lose_during_commit_;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoseContext();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_create_ = times_to_fail_recreate_;
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_ = 0;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_initialize_ = times_to_fail_reinitialize_;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_reinitialize_ = 0;
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_on_create_ = times_to_lose_on_recreate_;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_on_recreate_ = 0;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_create_offscreen_ = times_to_fail_recreate_offscreen_;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_offscreen_ = 0;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidFailToInitializeOutputSurface() OVERRIDE {
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++times_create_failed_;
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeTest::TearDown();
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(times_to_expect_create_failed_, times_create_failed_);
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ExpectCreateToFail() {
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++times_to_expect_create_failed_;
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestWebGraphicsContext3D* context3d_;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_fail_create_;
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_fail_initialize_;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_lose_on_create_;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_lose_during_commit_;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_lose_during_draw_;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_fail_recreate_;
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int times_to_fail_reinitialize_;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_lose_on_recreate_;
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_fail_create_offscreen_;
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_fail_recreate_offscreen_;
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int times_to_expect_create_failed_;
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int times_create_failed_;
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_offscreen_created_;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool committed_at_least_once_;
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool context_should_support_io_surface_;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContextProvider> offscreen_contexts_main_thread_;
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContextProvider> offscreen_contexts_compositor_thread_;
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextSucceeds
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLostContextSucceeds()
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostContextTest(),
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        test_case_(0),
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        num_losses_(0),
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        recovered_context_(true),
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        first_initialized_(false) {}
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
253b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(succeeded);
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (first_initialized_)
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ++num_losses_;
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    else
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      first_initialized_ = true;
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    recovered_context_ = true;
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(10u, test_case_);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(8 + 10 + 10, num_losses_);
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If the last frame had a context loss, then we'll commit again to
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // recover.
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!recovered_context_)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_lose_during_commit_)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_lose_during_draw_)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    recovered_context_ = false;
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (NextTestCase())
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InvalidateAndSetNeedsCommit();
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EndTest();
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InvalidateAndSetNeedsCommit() {
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Cause damage so we try to draw.
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->SetNeedsDisplay();
289558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    layer_tree_host()->SetNeedsCommit();
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool NextTestCase() {
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static const TestCase kTests[] = {
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Losing the context and failing to recreate it (or losing it again
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // immediately) a small number of times should succeed.
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { 1,  // times_to_lose_during_commit
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_lose_during_draw
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        3,  // times_to_fail_reinitialize
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_lose_on_recreate
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate_offscreen
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      },
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { 0,  // times_to_lose_during_commit
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        1,  // times_to_lose_during_draw
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        3,  // times_to_fail_reinitialize
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_lose_on_recreate
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate_offscreen
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      },
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { 1,  // times_to_lose_during_commit
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_lose_during_draw
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_reinitialize
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        3,  // times_to_fail_recreate
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_lose_on_recreate
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate_offscreen
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      },
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { 0,  // times_to_lose_during_commit
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        1,  // times_to_lose_during_draw
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_reinitialize
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        3,  // times_to_fail_recreate
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_lose_on_recreate
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate_offscreen
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      },
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { 1,  // times_to_lose_during_commit
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_lose_during_draw
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_reinitialize
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        3,  // times_to_lose_on_recreate
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate_offscreen
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      },
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { 0,  // times_to_lose_during_commit
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        1,  // times_to_lose_during_draw
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_reinitialize
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        3,  // times_to_lose_on_recreate
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate_offscreen
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      },
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { 1,  // times_to_lose_during_commit
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_lose_during_draw
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_reinitialize
341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_lose_on_recreate
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        3,  // times_to_fail_recreate_offscreen
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      },
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { 0,  // times_to_lose_during_commit
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        1,  // times_to_lose_during_draw
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_reinitialize
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_lose_on_recreate
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        3,  // times_to_fail_recreate_offscreen
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      },
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Losing the context and recreating it any number of times should
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // succeed.
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { 10,  // times_to_lose_during_commit
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_lose_during_draw
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_reinitialize
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_lose_on_recreate
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate_offscreen
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      },
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { 0,  // times_to_lose_during_commit
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        10,  // times_to_lose_during_draw
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_reinitialize
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_lose_on_recreate
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        0,  // times_to_fail_recreate_offscreen
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      },
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (test_case_ >= arraysize(kTests))
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_during_commit_ =
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kTests[test_case_].times_to_lose_during_commit;
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_during_draw_ =
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kTests[test_case_].times_to_lose_during_draw;
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_reinitialize_ = kTests[test_case_].times_to_fail_reinitialize;
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_ = kTests[test_case_].times_to_fail_recreate;
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_on_recreate_ = kTests[test_case_].times_to_lose_on_recreate;
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_offscreen_ =
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kTests[test_case_].times_to_fail_recreate_offscreen;
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++test_case_;
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct TestCase {
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_lose_during_commit;
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_lose_during_draw;
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_fail_reinitialize;
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_fail_recreate;
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_lose_on_recreate;
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_fail_recreate_offscreen;
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t test_case_;
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_losses_;
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool recovered_context_;
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool first_initialized_;
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLostContextSucceeds);
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextSucceedsWithContent
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTestLostContextSucceeds {
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLostContextSucceedsWithContent()
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : LayerTreeHostContextTestLostContextSucceeds() {}
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_ = Layer::Create();
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetBounds(gfx::Size(10, 10));
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetAnchorPoint(gfx::PointF());
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetIsDrawable(true);
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_ = FakeContentLayer::Create(&client_);
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetBounds(gfx::Size(10, 10));
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetAnchorPoint(gfx::PointF());
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetIsDrawable(true);
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (use_surface_) {
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_->SetForceRenderSurface(true);
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Filters require us to create an offscreen context.
423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FilterOperations filters;
424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_->SetFilters(filters);
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_->SetBackgroundFilters(filters);
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(content_);
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InvalidateAndSetNeedsCommit() OVERRIDE {
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Invalidate the render surface so we don't try to use a cached copy of the
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // surface.  We want to make sure to test the drawing paths for drawing to
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // a child surface.
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetNeedsDisplay();
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTestLostContextSucceeds::InvalidateAndSetNeedsCommit();
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerImpl* content_impl = static_cast<FakeContentLayerImpl*>(
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->active_tree()->root_layer()->children()[0]);
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Even though the context was lost, we should have a resource. The
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TestWebGraphicsContext3D ensures that this resource is created with
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the active context.
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(content_impl->HaveResourceForTileAt(0, 0));
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cc::ContextProvider* contexts =
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->offscreen_context_provider();
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (use_surface_) {
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_TRUE(contexts->Context3d());
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // TODO(danakj): Make a fake GrContext.
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // EXPECT_TRUE(contexts->GrContext());
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_FALSE(contexts);
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTestLostContextSucceeds::AfterTest();
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (use_surface_) {
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // 1 create to start with +
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // 6 from test cases that fail on initializing the renderer (after the
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // offscreen context is created) +
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // 6 from test cases that lose the offscreen context directly +
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // All the test cases that recreate both contexts only once
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // per time it is lost.
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(6 + 6 + 1 + num_losses_, times_offscreen_created_);
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(0, times_offscreen_created_);
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool use_surface_;
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> root_;
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ContentLayer> content_;
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
485a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       NoSurface_SingleThread_DirectRenderer) {
486a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  use_surface_ = false;
487a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
488a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
489a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
490a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
491a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       NoSurface_SingleThread_DelegatingRenderer) {
492a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  use_surface_ = false;
493a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, true, false);
494a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
495a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
496a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
497a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       NoSurface_MultiThread_DirectRenderer_MainThreadPaint) {
498a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  use_surface_ = false;
499a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
500a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
501a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
502a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
503a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       NoSurface_MultiThread_DirectRenderer_ImplSidePaint) {
504a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  use_surface_ = false;
505a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
506a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
507a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
508a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
509a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       NoSurface_MultiThread_DelegatingRenderer_MainThreadPaint) {
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  use_surface_ = false;
511a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, false);
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
515a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       NoSurface_MultiThread_DelegatingRenderer_ImplSidePaint) {
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  use_surface_ = false;
517a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
520a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Surfaces don't exist with a delegating renderer.
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
522a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       WithSurface_SingleThread_DirectRenderer) {
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  use_surface_ = true;
524a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
528a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       WithSurface_MultiThread_DirectRenderer_MainThreadPaint) {
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  use_surface_ = true;
530a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
531a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
532a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
533a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
534a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       WithSurface_MultiThread_DirectRenderer_ImplSidePaint) {
535a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  use_surface_ = true;
536a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostContextTestOffscreenContextFails
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostContextTest {
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_ = Layer::Create();
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetBounds(gfx::Size(10, 10));
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetAnchorPoint(gfx::PointF());
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetIsDrawable(true);
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_ = FakeContentLayer::Create(&client_);
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetBounds(gfx::Size(10, 10));
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetAnchorPoint(gfx::PointF());
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetIsDrawable(true);
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetForceRenderSurface(true);
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Filters require us to create an offscreen context.
554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    FilterOperations filters;
555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetFilters(filters);
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetBackgroundFilters(filters);
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(content_);
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_create_offscreen_ = 1;
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cc::ContextProvider* contexts =
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->offscreen_context_provider();
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(contexts);
574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This did not lead to create failure.
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_to_expect_create_failed_ = 0;
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> root_;
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ContentLayer> content_;
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestOffscreenContextFails);
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextFails
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLostContextFails()
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostContextTest(),
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_commits_(0),
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        first_initialized_(false) {
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_during_commit_ = 1;
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
604b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (first_initialized_) {
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_FALSE(succeeded);
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      first_initialized_ = true;
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(host_impl);
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_commits_;
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (num_commits_ == 1) {
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // When the context is ok, we should have these things.
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_TRUE(host_impl->output_surface());
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_TRUE(host_impl->renderer());
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_TRUE(host_impl->resource_provider());
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // When context recreation fails we shouldn't be left with any of them.
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(host_impl->output_surface());
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(host_impl->renderer());
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(host_impl->resource_provider());
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_commits_;
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool first_initialized_;
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
639a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailReinitialize100_SingleThread_DirectRenderer) {
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_reinitialize_ = 100;
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_recreate_ = 0;
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
643a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
647a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailReinitialize100_SingleThread_DelegatingRenderer) {
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_reinitialize_ = 100;
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_recreate_ = 0;
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
651a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, true, false);
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
655a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailReinitialize100_MultiThread_DirectRenderer_MainThreadPaint) {
656a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 100;
657a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
658a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
659a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
660a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
661a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
662a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
663a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailReinitialize100_MultiThread_DirectRenderer_ImplSidePaint) {
664a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 100;
665a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
666a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
667a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
668a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
669a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
670a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
671a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailReinitialize100_MultiThread_DelegatingRenderer_MainThreadPaint) {
672a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 100;
673a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
674a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
675a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, false);
676a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
677a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
678a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
679a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailReinitialize100_MultiThread_DelegatingRenderer_ImplSidePaint) {
680a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 100;
681a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
682a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
683a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
684a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
685a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
686a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
687a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailRecreate100_SingleThread_DirectRenderer) {
688a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
689a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 100;
690a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
691a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
692a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
693a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
694a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
695a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailRecreate100_SingleThread_DelegatingRenderer) {
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_recreate_ = 100;
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
699a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, true, false);
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
703a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailRecreate100_MultiThread_DirectRenderer_MainThreadPaint) {
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_recreate_ = 100;
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
707a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
711a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailRecreate100_MultiThread_DirectRenderer_ImplSidePaint) {
712a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
713a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 100;
714a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
715a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
716a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
717a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
718a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
719a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailRecreate100_MultiThread_DelegatingRenderer_MainThreadPaint) {
720a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
721a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 100;
722a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
723a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, false);
724a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
725a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
726a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
727a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailRecreate100_MultiThread_DelegatingRenderer_ImplSidePaint) {
728a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
729a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 100;
730a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
731a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
732a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
733a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
734a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
735a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseOnRecreate100_SingleThread_DirectRenderer) {
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_recreate_ = 0;
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_lose_on_recreate_ = 100;
739a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
743a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseOnRecreate100_SingleThread_DelegatingRenderer) {
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_recreate_ = 0;
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_lose_on_recreate_ = 100;
747a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, true, false);
748a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
749a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
750a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
751a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseOnRecreate100_MultiThread_DirectRenderer_MainThreadPaint) {
752a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
753a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
754a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 100;
755a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
756a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
757a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
758a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
759a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseOnRecreate100_MultiThread_DirectRenderer_ImplSidePaint) {
760a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
761a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
762a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 100;
763a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
764a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
765a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
766a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
767a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseOnRecreate100_MultiThread_DelegatingRenderer_MainThreadPaint) {
768a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
769a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
770a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 100;
771a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, false);
772a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
773a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
774a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
775a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseOnRecreate100_MultiThread_DelegatingRenderer_ImplSidePaint) {
776a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
777a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
778a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 100;
779a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestFinishAllRenderingAfterLoss
783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Lose the context until the compositor gives up on it.
787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    first_initialized_ = false;
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_during_commit_ = 1;
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_reinitialize_ = 10;
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
793b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (first_initialized_) {
795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_FALSE(succeeded);
796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->FinishAllRendering();
797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      first_initialized_ = true;
800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool first_initialized_;
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestFinishAllRenderingAfterLoss);
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextAndEvictTextures
813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLostContextAndEvictTextures()
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostContextTest(),
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_(FakeContentLayer::Create(&client_)),
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        impl_host_(0),
819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_commits_(0) {}
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_->SetBounds(gfx::Size(10, 20));
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PostEvictTextures() {
832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (HasImplThread()) {
833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ImplThreadTaskRunner()->PostTask(
834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          FROM_HERE,
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              &LayerTreeHostContextTestLostContextAndEvictTextures::
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              EvictTexturesOnImplThread,
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::Unretained(this)));
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DebugScopedSetImplThread impl(proxy());
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EvictTexturesOnImplThread();
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void EvictTexturesOnImplThread() {
846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    impl_host_->EvictTexturesForTesting();
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (lose_after_evict_)
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LoseContext();
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (num_commits_ > 1)
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(layer_->HaveBackingAt(0, 0));
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostEvictTextures();
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (num_commits_ > 1)
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_commits_;
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!lose_after_evict_)
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LoseContext();
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    impl_host_ = impl;
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
868b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(succeeded);
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool lose_after_evict_;
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> layer_;
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostImpl* impl_host_;
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_commits_;
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
884a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseAfterEvict_SingleThread_DirectRenderer) {
885a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = true;
886a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
887a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
888a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
889a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
890a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseAfterEvict_SingleThread_DelegatingRenderer) {
891a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = true;
892a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, true, false);
893a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
894a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
895a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
896a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseAfterEvict_MultiThread_DirectRenderer_MainThreadPaint) {
897a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = true;
898a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
899a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
900a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
901a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
902a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseAfterEvict_MultiThread_DirectRenderer_ImplSidePaint) {
903a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = true;
904a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
905a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
906a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
907a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
908a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseAfterEvict_MultiThread_DelegatingRenderer_MainThreadPaint) {
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lose_after_evict_ = true;
910a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, false);
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
914a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseAfterEvict_MultiThread_DelegatingRenderer_ImplSidePaint) {
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lose_after_evict_ = true;
916a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
917a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
918a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
919a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
920a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_SingleThread_DirectRenderer) {
921a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = false;
922a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
923a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
924a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
925a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
926a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_SingleThread_DelegatingRenderer) {
927a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = false;
928a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, true, false);
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
932a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_MultiThread_DirectRenderer_MainThreadPaint) {
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lose_after_evict_ = false;
934a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
938a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_MultiThread_DirectRenderer_ImplSidePaint) {
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lose_after_evict_ = false;
940a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
941a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
942a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
943a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
944a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_MultiThread_DelegatingRenderer_MainThreadPaint) {
945a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = false;
946a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, false);
947a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
948a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
949a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
950a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_MultiThread_DelegatingRenderer_ImplSidePaint) {
951a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = false;
952a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextWhileUpdatingResources
956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLostContextWhileUpdatingResources()
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : parent_(FakeContentLayer::Create(&client_)),
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        num_children_(50),
961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        times_to_lose_on_end_query_(3) {}
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() OVERRIDE {
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TestWebGraphicsContext3D> context =
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeHostContextTest::CreateContext3d();
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_lose_on_end_query_) {
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      --times_to_lose_on_end_query_;
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context->set_times_end_query_succeeds(5);
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return context.Pass();
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent_->SetBounds(gfx::Size(num_children_, 1));
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int i = 0; i < num_children_; i++) {
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<FakeContentLayer> child =
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          FakeContentLayer::Create(&client_);
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      child->SetPosition(gfx::PointF(i, 0.f));
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      child->SetBounds(gfx::Size(1, 1));
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_->AddChild(child);
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(parent_);
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
997b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(succeeded);
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(0, times_to_lose_on_end_query_);
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> parent_;
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_children_;
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_lose_on_end_query_;
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestLostContextWhileUpdatingResources);
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLayersNotified
1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLayersNotified()
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostContextTest(),
1020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_commits_(0) {}
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_ = FakeContentLayer::Create(&client_);
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child_ = FakeContentLayer::Create(&client_);
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    grandchild_ = FakeContentLayer::Create(&client_);
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(child_);
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child_->AddChild(grandchild_);
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
10397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    LayerTreeHostContextTest::DidActivateTreeOnThread(host_impl);
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerImpl* root = static_cast<FakeContentLayerImpl*>(
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->active_tree()->root_layer());
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerImpl* child = static_cast<FakeContentLayerImpl*>(
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        root->children()[0]);
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerImpl* grandchild = static_cast<FakeContentLayerImpl*>(
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        child->children()[0]);
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_commits_;
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (num_commits_) {
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, root->lost_output_surface_count());
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, child->lost_output_surface_count());
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, grandchild->lost_output_surface_count());
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Lose the context and struggle to recreate it.
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoseContext();
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_create_ = 1;
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, root->lost_output_surface_count());
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, child->lost_output_surface_count());
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, grandchild->lost_output_surface_count());
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Lose the context and again during recreate.
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoseContext();
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_lose_on_create_ = 1;
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, root->lost_output_surface_count());
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, child->lost_output_surface_count());
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, grandchild->lost_output_surface_count());
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Lose the context and again during reinitialization.
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoseContext();
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_initialize_ = 1;
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 4:
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(5u, root->lost_output_surface_count());
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(5u, child->lost_output_surface_count());
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(5u, grandchild->lost_output_surface_count());
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default:
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTREACHED();
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_commits_;
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root_;
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> child_;
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> grandchild_;
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLayersNotified);
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestDontUseLostResources
1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<Layer> root_ = Layer::Create();
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetBounds(gfx::Size(10, 10));
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetAnchorPoint(gfx::PointF());
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetIsDrawable(true);
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<FakeDelegatedRendererLayer> delegated_ =
1108b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        FakeDelegatedRendererLayer::Create(NULL);
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegated_->SetBounds(gfx::Size(10, 10));
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegated_->SetAnchorPoint(gfx::PointF());
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegated_->SetIsDrawable(true);
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(delegated_);
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ContentLayer> content_ = ContentLayer::Create(&client_);
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetBounds(gfx::Size(10, 10));
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetAnchorPoint(gfx::PointF());
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetIsDrawable(true);
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(content_);
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<TextureLayer> texture_ = TextureLayer::Create(NULL);
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    texture_->SetBounds(gfx::Size(10, 10));
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    texture_->SetAnchorPoint(gfx::PointF());
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    texture_->SetIsDrawable(true);
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(texture_);
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ContentLayer> mask_ = ContentLayer::Create(&client_);
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mask_->SetBounds(gfx::Size(10, 10));
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mask_->SetAnchorPoint(gfx::PointF());
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ContentLayer> content_with_mask_ =
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentLayer::Create(&client_);
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_with_mask_->SetBounds(gfx::Size(10, 10));
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_with_mask_->SetAnchorPoint(gfx::PointF());
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_with_mask_->SetIsDrawable(true);
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_with_mask_->SetMaskLayer(mask_.get());
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(content_with_mask_);
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<VideoLayer> video_color_ = VideoLayer::Create(
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &color_frame_provider_);
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    video_color_->SetBounds(gfx::Size(10, 10));
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    video_color_->SetAnchorPoint(gfx::PointF());
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    video_color_->SetIsDrawable(true);
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(video_color_);
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_refptr<VideoLayer> video_hw_ = VideoLayer::Create(
1146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        &hw_frame_provider_);
1147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    video_hw_->SetBounds(gfx::Size(10, 10));
1148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    video_hw_->SetAnchorPoint(gfx::PointF());
1149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    video_hw_->SetIsDrawable(true);
1150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    root_->AddChild(video_hw_);
1151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_refptr<VideoLayer> video_scaled_hw_ = VideoLayer::Create(
1153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        &scaled_hw_frame_provider_);
1154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    video_scaled_hw_->SetBounds(gfx::Size(10, 10));
1155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    video_scaled_hw_->SetAnchorPoint(gfx::PointF());
1156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    video_scaled_hw_->SetIsDrawable(true);
1157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    root_->AddChild(video_scaled_hw_);
1158a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1159a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (!delegating_renderer()) {
1160a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      // TODO(danakj): IOSurface layer can not be transported. crbug.com/239335
1161a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      scoped_refptr<IOSurfaceLayer> io_surface_ = IOSurfaceLayer::Create();
1162a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      io_surface_->SetBounds(gfx::Size(10, 10));
1163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      io_surface_->SetAnchorPoint(gfx::PointF());
1164a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      io_surface_->SetIsDrawable(true);
1165a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      io_surface_->SetIOSurfaceProperties(1, gfx::Size(10, 10));
1166a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      root_->AddChild(io_surface_);
1167a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Enable the hud.
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeDebugState debug_state;
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    debug_state.show_property_changed_rects = true;
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetDebugState(debug_state);
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ScrollbarLayer> scrollbar_ = ScrollbarLayer::Create(
117590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        scoped_ptr<Scrollbar>(new FakeScrollbar).Pass(),
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content_->id());
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scrollbar_->SetBounds(gfx::Size(10, 10));
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scrollbar_->SetAnchorPoint(gfx::PointF());
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scrollbar_->SetIsDrawable(true);
11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(scrollbar_);
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    context_should_support_io_surface_ = true;
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(host_impl);
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider* resource_provider = host_impl->resource_provider();
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() == 0) {
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Set up impl resources on the first commit.
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<TestRenderPass> pass_for_quad = TestRenderPass::Create();
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pass_for_quad->SetNew(
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          // AppendOneOfEveryQuadType() makes a RenderPass quad with this id.
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          RenderPass::Id(1, 1),
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Rect(0, 0, 10, 10),
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Rect(0, 0, 10, 10),
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Transform());
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<TestRenderPass> pass = TestRenderPass::Create();
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pass->SetNew(
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          RenderPass::Id(2, 1),
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Rect(0, 0, 10, 10),
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Rect(0, 0, 10, 10),
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Transform());
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pass->AppendOneOfEveryQuadType(resource_provider, RenderPass::Id(2, 1));
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ScopedPtrVector<RenderPass> pass_list;
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pass_list.push_back(pass_for_quad.PassAs<RenderPass>());
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pass_list.push_back(pass.PassAs<RenderPass>());
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // First child is the delegated layer.
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FakeDelegatedRendererLayerImpl* delegated_impl =
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          static_cast<FakeDelegatedRendererLayerImpl*>(
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              host_impl->active_tree()->root_layer()->children()[0]);
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegated_impl->SetFrameDataForRenderPasses(&pass_list);
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_TRUE(pass_list.empty());
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1226a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      // Third child is the texture layer.
1227a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      TextureLayerImpl* texture_impl =
1228a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)          static_cast<TextureLayerImpl*>(
1229a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)              host_impl->active_tree()->root_layer()->children()[2]);
1230a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      texture_impl->set_texture_id(
1231a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)          resource_provider->GraphicsContext3D()->createTexture());
1232a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1233a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      DCHECK(resource_provider->GraphicsContext3D());
1234a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      ResourceProvider::ResourceId texture = resource_provider->CreateResource(
1235a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)          gfx::Size(4, 4),
1236a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)          resource_provider->default_resource_type(),
1237a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)          ResourceProvider::TextureUsageAny);
1238a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      ResourceProvider::ScopedWriteLockGL lock(resource_provider, texture);
1239a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      gpu::Mailbox mailbox;
1241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      resource_provider->GraphicsContext3D()->genMailboxCHROMIUM(mailbox.name);
1242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      unsigned sync_point =
1243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          resource_provider->GraphicsContext3D()->insertSyncPoint();
1244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      color_video_frame_ = VideoFrame::CreateColorFrame(
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Size(4, 4), 0x80, 0x80, 0x80, base::TimeDelta());
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      hw_video_frame_ = VideoFrame::WrapNativeTexture(
1248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          new VideoFrame::MailboxHolder(
1249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              mailbox,
1250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              sync_point,
1251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              VideoFrame::MailboxHolder::TextureNoLongerNeededCallback()),
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GL_TEXTURE_2D,
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Size(4, 4), gfx::Rect(0, 0, 4, 4), gfx::Size(4, 4),
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::TimeDelta(),
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          VideoFrame::ReadPixelsCB(),
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Closure());
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scaled_hw_video_frame_ = VideoFrame::WrapNativeTexture(
1258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          new VideoFrame::MailboxHolder(
1259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              mailbox,
1260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              sync_point,
1261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              VideoFrame::MailboxHolder::TextureNoLongerNeededCallback()),
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GL_TEXTURE_2D,
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Size(4, 4), gfx::Rect(0, 0, 3, 2), gfx::Size(4, 4),
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::TimeDelta(),
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          VideoFrame::ReadPixelsCB(),
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Closure());
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      color_frame_provider_.set_frame(color_video_frame_);
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      hw_frame_provider_.set_frame(hw_video_frame_);
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scaled_hw_frame_provider_.set_frame(scaled_hw_video_frame_);
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() == 3) {
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // On the third commit we're recovering from context loss. Hardware
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // video frames should not be reused by the VideoFrameProvider, but
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // software frames can be.
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      hw_frame_provider_.set_frame(NULL);
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scaled_hw_frame_provider_.set_frame(NULL);
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
1284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     LayerTreeHostImpl::FrameData* frame,
1285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     bool result) OVERRIDE {
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() == 2) {
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Lose the context during draw on the second commit. This will cause
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // a third commit to recover.
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (context3d_)
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        context3d_->set_times_bind_texture_succeeds(4);
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(layer_tree_host()->hud_layer());
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // End the test once we know the 3nd frame drew.
1298bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    if (layer_tree_host()->source_frame_number() == 4)
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EndTest();
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> root_;
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_;
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ContentLayer> content_;
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TextureLayer> texture_;
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ContentLayer> mask_;
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ContentLayer> content_with_mask_;
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoLayer> video_color_;
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoLayer> video_hw_;
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoLayer> video_scaled_hw_;
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<IOSurfaceLayer> io_surface_;
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ScrollbarLayer> scrollbar_;
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoFrame> color_video_frame_;
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoFrame> hw_video_frame_;
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoFrame> scaled_hw_video_frame_;
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeVideoFrameProvider color_frame_provider_;
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeVideoFrameProvider hw_frame_provider_;
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeVideoFrameProvider scaled_hw_frame_provider_;
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestDontUseLostResources);
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLosesFirstOutputSurface
1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostContextTestLosesFirstOutputSurface() {
1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Always fail. This needs to be set before LayerTreeHost is created.
1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_to_lose_on_create_ = 1000;
1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1346b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(succeeded);
1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If we make it this far without crashing, we pass!
1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(false);
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestLosesFirstOutputSurface);
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds
1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_to_fail_initialize_ = 2;
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds);
1378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestRetryWorksWithForcedInit
1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds {
1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidFailToInitializeOutputSurface() OVERRIDE {
1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds
1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ::DidFailToInitializeOutputSurface();
1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (times_create_failed_ == 1) {
1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // CompositeAndReadback force recreates the output surface, which should
1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // fail.
1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      char pixels[4];
1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_FALSE(layer_tree_host()->CompositeAndReadback(
1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            &pixels, gfx::Rect(1, 1)));
1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestRetryWorksWithForcedInit);
1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestCompositeAndReadbackBeforeOutputSurfaceInit
1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This must be called immediately after creating LTH, before the first
1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // OutputSurface is initialized.
1405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(layer_tree_host()->output_surface_lost());
1406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_output_surface_created_ = 0;
1408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    char pixels[4];
1410a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    bool result = layer_tree_host()->CompositeAndReadback(
1411a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        &pixels, gfx::Rect(1, 1));
1412a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_EQ(!delegating_renderer(), result);
1413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, times_output_surface_created_);
1414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1418b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(succeeded);
1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++times_output_surface_created_;
1421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
1428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Should not try to create output surface again after successfully
1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // created by CompositeAndReadback.
1430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, times_output_surface_created_);
1431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int times_output_surface_created_;
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestCompositeAndReadbackBeforeOutputSurfaceInit);
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ImplSidePaintingLayerTreeHostContextTest
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostContextTest {
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings->impl_side_painting = true;
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestImplSidePainting
1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public ImplSidePaintingLayerTreeHostContextTest {
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<Layer> root = Layer::Create();
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->SetBounds(gfx::Size(10, 10));
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->SetAnchorPoint(gfx::PointF());
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->SetIsDrawable(true);
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<PictureLayer> picture = PictureLayer::Create(&client_);
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    picture->SetBounds(gfx::Size(10, 10));
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    picture->SetAnchorPoint(gfx::PointF());
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    picture->SetIsDrawable(true);
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->AddChild(picture);
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root);
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_during_commit_ = 1;
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1474b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(succeeded);
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostContextTestImplSidePainting);
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScrollbarLayerLostContext : public LayerTreeHostContextTest {
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollbarLayerLostContext() : commits_(0) {}
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<Layer> scroll_layer = Layer::Create();
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scrollbar_layer_ = FakeScrollbarLayer::Create(
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        false, true, scroll_layer->id());
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scrollbar_layer_->SetBounds(gfx::Size(10, 100));
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(scrollbar_layer_);
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(scroll_layer);
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++commits_;
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t upload_count = scrollbar_layer_->last_update_full_upload_size() +
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scrollbar_layer_->last_update_partial_upload_size();
1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (commits_) {
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // First (regular) update, we should upload 2 resources (thumb, and
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // backtrack).
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1, scrollbar_layer_->update_count());
1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2u, upload_count);
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoseContext();
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Second update, after the lost context, we should still upload 2
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // resources even if the contents haven't changed.
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2, scrollbar_layer_->update_count());
1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(2u, upload_count);
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default:
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTREACHED();
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int commits_;
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeScrollbarLayer> scrollbar_layer_;
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(ScrollbarLayerLostContext);
1533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestFailsToCreateSurface
1535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
1536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostContextTestFailsToCreateSurface()
1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : LayerTreeHostContextTest(),
1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        failure_count_(0) {
1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_to_lose_on_create_ = 10;
1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1549b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool success) OVERRIDE {
1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(success);
1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, failure_count_);
1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_to_lose_on_create_ = 0;
1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    failure_count_++;
1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Normally, the embedder should stop trying to use the compositor at
1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // this point, but let's force it back into action when we shouldn't.
1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    char pixels[4];
1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(
1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->CompositeAndReadback(pixels, gfx::Rect(1, 1)));
1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If we've made it this far without crashing, we've succeeded.
1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int failure_count_;
1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1567a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1568a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LayerTreeHostContextTestFailsToCreateSurface);
1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Not reusing LayerTreeTest because it expects creating LTH to always succeed.
1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface
1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public testing::Test,
1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      public FakeLayerTreeHostClient {
1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface()
1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : FakeLayerTreeHostClient(FakeLayerTreeHostClient::DIRECT_3D) {}
1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1578a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // FakeLayerTreeHostClient implementation.
1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE {
1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return scoped_ptr<OutputSurface>();
1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1583a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void RunTest(bool threaded,
1584a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)               bool delegating_renderer,
1585a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)               bool impl_side_painting) {
1586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<base::Thread> impl_thread;
1587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (threaded) {
1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      impl_thread.reset(new base::Thread("LayerTreeTest"));
1589eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ASSERT_TRUE(impl_thread->Start());
1590eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ASSERT_TRUE(impl_thread->message_loop_proxy().get());
1591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeSettings settings;
1594a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    settings.impl_side_painting = impl_side_painting;
1595eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<LayerTreeHost> layer_tree_host = LayerTreeHost::Create(
1596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        this,
1597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        settings,
1598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        impl_thread ? impl_thread->message_loop_proxy() : NULL);
1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(layer_tree_host);
1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface);
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
1608