layer_tree_host_unittest_context.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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"
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/debug/test_context_provider.h"
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/debug/test_web_graphics_context_3d.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h"
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_provider.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_resource_collection.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/io_surface_layer.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h"
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/layers/painted_scrollbar_layer.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/texture_layer.h"
19a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "cc/layers/texture_layer_impl.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer_impl.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/output/filter_operations.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_impl.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer_impl.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h"
308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "cc/test/fake_output_surface_client.h"
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_painted_scrollbar_layer.h"
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_scoped_ui_resource.h"
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/test/fake_scrollbar.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_video_frame_provider.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_common.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/media.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using media::VideoFrame;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebGraphicsContext3D;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These tests deal with losing the 3d graphics context.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostContextTest : public LayerTreeTest {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTest()
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeTest(),
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        context3d_(NULL),
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_create_(0),
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_initialize_(0),
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_lose_on_create_(0),
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_lose_during_commit_(0),
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_lose_during_draw_(0),
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_recreate_(0),
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_reinitialize_(0),
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_lose_on_recreate_(0),
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_create_offscreen_(0),
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_recreate_offscreen_(0),
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        times_to_expect_create_failed_(0),
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        times_create_failed_(0),
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_offscreen_created_(0),
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        committed_at_least_once_(false),
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        context_should_support_io_surface_(false),
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        fallback_context_works_(false) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media::InitializeMediaLibraryForTesting();
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LoseContext() {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context3d_->loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    GL_INNOCENT_CONTEXT_RESET_ARB);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context3d_ = NULL;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return TestWebGraphicsContext3D::Create();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual scoped_ptr<OutputSurface> CreateOutputSurface(bool fallback)
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      OVERRIDE {
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_fail_create_) {
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      --times_to_fail_create_;
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExpectCreateToFail();
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return scoped_ptr<OutputSurface>();
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TestWebGraphicsContext3D> context3d = CreateContext3d();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context3d_ = context3d.get();
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (context_should_support_io_surface_) {
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      context3d_->set_have_extension_io_surface(true);
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      context3d_->set_have_extension_egl_image(true);
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (times_to_fail_initialize_ && !(fallback && fallback_context_works_)) {
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      --times_to_fail_initialize_;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Make the context get lost during reinitialization.
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // The number of times MakeCurrent succeeds is not important, and
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // can be changed if needed to make this pass with future changes.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context3d_->set_times_make_current_succeeds(2);
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExpectCreateToFail();
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (times_to_lose_on_create_) {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      --times_to_lose_on_create_;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LoseContext();
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExpectCreateToFail();
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
113a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (delegating_renderer()) {
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return FakeOutputSurface::CreateDelegating3d(context3d.Pass())
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          .PassAs<OutputSurface>();
116a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return FakeOutputSurface::Create3d(context3d.Pass())
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        .PassAs<OutputSurface>();
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TestWebGraphicsContext3D> CreateOffscreenContext3d() {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!context3d_)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return scoped_ptr<TestWebGraphicsContext3D>();
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++times_offscreen_created_;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_fail_create_offscreen_) {
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      --times_to_fail_create_offscreen_;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExpectCreateToFail();
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return scoped_ptr<TestWebGraphicsContext3D>();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TestWebGraphicsContext3D> offscreen_context3d =
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestWebGraphicsContext3D::Create().Pass();
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(offscreen_context3d);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context3d_->add_share_group_context(offscreen_context3d.get());
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return offscreen_context3d.Pass();
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual scoped_refptr<ContextProvider> OffscreenContextProvider() OVERRIDE {
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!offscreen_contexts_.get() ||
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        offscreen_contexts_->DestroyedOnMainThread()) {
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      offscreen_contexts_ =
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          TestContextProvider::Create(CreateOffscreenContext3d());
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return offscreen_contexts_;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     LayerTreeHostImpl::FrameData* frame,
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     bool result) OVERRIDE {
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(result);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!times_to_lose_during_draw_)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return result;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    --times_to_lose_during_draw_;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context3d_->set_times_make_current_succeeds(0);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_create_ = times_to_fail_recreate_;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_ = 0;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_initialize_ = times_to_fail_reinitialize_;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_reinitialize_ = 0;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_on_create_ = times_to_lose_on_recreate_;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_on_recreate_ = 0;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_create_offscreen_ = times_to_fail_recreate_offscreen_;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_offscreen_ = 0;
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return result;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    committed_at_least_once_ = true;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!times_to_lose_during_commit_)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    --times_to_lose_during_commit_;
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoseContext();
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_create_ = times_to_fail_recreate_;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_ = 0;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_initialize_ = times_to_fail_reinitialize_;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_reinitialize_ = 0;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_on_create_ = times_to_lose_on_recreate_;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_on_recreate_ = 0;
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_create_offscreen_ = times_to_fail_recreate_offscreen_;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_offscreen_ = 0;
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidFailToInitializeOutputSurface() OVERRIDE {
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++times_create_failed_;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeTest::TearDown();
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(times_to_expect_create_failed_, times_create_failed_);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ExpectCreateToFail() {
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++times_to_expect_create_failed_;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestWebGraphicsContext3D* context3d_;
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_fail_create_;
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_fail_initialize_;
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_lose_on_create_;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_lose_during_commit_;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_lose_during_draw_;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_fail_recreate_;
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int times_to_fail_reinitialize_;
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_lose_on_recreate_;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_fail_create_offscreen_;
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_fail_recreate_offscreen_;
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int times_to_expect_create_failed_;
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int times_create_failed_;
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_offscreen_created_;
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool committed_at_least_once_;
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool context_should_support_io_surface_;
220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool fallback_context_works_;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<TestContextProvider> offscreen_contexts_;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextSucceeds
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLostContextSucceeds()
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostContextTest(),
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        test_case_(0),
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        num_losses_(0),
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        recovered_context_(true),
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        first_initialized_(false) {}
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(succeeded);
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (first_initialized_)
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ++num_losses_;
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    else
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      first_initialized_ = true;
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    recovered_context_ = true;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_EQ(11u, test_case_);
252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_EQ(8 + 10 + 10 + 1, num_losses_);
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If the last frame had a context loss, then we'll commit again to
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // recover.
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!recovered_context_)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_lose_during_commit_)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_lose_during_draw_)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    recovered_context_ = false;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (NextTestCase())
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InvalidateAndSetNeedsCommit();
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EndTest();
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InvalidateAndSetNeedsCommit() {
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Cause damage so we try to draw.
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->root_layer()->SetNeedsDisplay();
275558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    layer_tree_host()->SetNeedsCommit();
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool NextTestCase() {
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static const TestCase kTests[] = {
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Losing the context and failing to recreate it (or losing it again
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // immediately) a small number of times should succeed.
282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      { 1,      // times_to_lose_during_commit
283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_lose_during_draw
284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        3,      // times_to_fail_reinitialize
285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate
286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_lose_on_recreate
287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate_offscreen
288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        false,  // fallback_context_works
289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    },
290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      { 0,      // times_to_lose_during_commit
291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        1,      // times_to_lose_during_draw
292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        3,      // times_to_fail_reinitialize
293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate
294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_lose_on_recreate
295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate_offscreen
296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        false,  // fallback_context_works
297a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    },
298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      { 1,      // times_to_lose_during_commit
299a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_lose_during_draw
300a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_reinitialize
301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        3,      // times_to_fail_recreate
302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_lose_on_recreate
303a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate_offscreen
304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        false,  // fallback_context_works
305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    },
306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      { 0,      // times_to_lose_during_commit
307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        1,      // times_to_lose_during_draw
308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_reinitialize
309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        3,      // times_to_fail_recreate
310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_lose_on_recreate
311a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate_offscreen
312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        false,  // fallback_context_works
313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    },
314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      { 1,      // times_to_lose_during_commit
315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_lose_during_draw
316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_reinitialize
317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate
318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        3,      // times_to_lose_on_recreate
319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate_offscreen
320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        false,  // fallback_context_works
321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    },
322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      { 0,      // times_to_lose_during_commit
323a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        1,      // times_to_lose_during_draw
324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_reinitialize
325a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate
326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        3,      // times_to_lose_on_recreate
327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate_offscreen
328a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        false,  // fallback_context_works
329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    },
330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      { 1,      // times_to_lose_during_commit
331a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_lose_during_draw
332a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_reinitialize
333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate
334a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_lose_on_recreate
335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        3,      // times_to_fail_recreate_offscreen
336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        false,  // fallback_context_works
337a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    },
338a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      { 0,      // times_to_lose_during_commit
339a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        1,      // times_to_lose_during_draw
340a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_reinitialize
341a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate
342a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_lose_on_recreate
343a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        3,      // times_to_fail_recreate_offscreen
344a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        false,  // fallback_context_works
345a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    },
346a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)             // Losing the context and recreating it any number of times should
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // succeed.
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { 10,  // times_to_lose_during_commit
349a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,   // times_to_lose_during_draw
350a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,   // times_to_fail_reinitialize
351a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,   // times_to_fail_recreate
352a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,   // times_to_lose_on_recreate
353a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,   // times_to_fail_recreate_offscreen
354a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        false,  // fallback_context_works
355a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    },
356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      { 0,      // times_to_lose_during_commit
357a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        10,     // times_to_lose_during_draw
358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_reinitialize
359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate
360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_lose_on_recreate
361a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate_offscreen
362a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        false,  // fallback_context_works
363a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    },
364a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      // Losing the context, failing to reinitialize it, and making a fallback
365a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      // context should work.
366a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      { 0,      // times_to_lose_during_commit
367a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        1,      // times_to_lose_during_draw
368a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        10,     // times_to_fail_reinitialize
369a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate
370a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_lose_on_recreate
371a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        0,      // times_to_fail_recreate_offscreen
372a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        true,   // fallback_context_works
373a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    },
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (test_case_ >= arraysize(kTests))
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_during_commit_ =
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kTests[test_case_].times_to_lose_during_commit;
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_during_draw_ =
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kTests[test_case_].times_to_lose_during_draw;
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_reinitialize_ = kTests[test_case_].times_to_fail_reinitialize;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_ = kTests[test_case_].times_to_fail_recreate;
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_on_recreate_ = kTests[test_case_].times_to_lose_on_recreate;
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_recreate_offscreen_ =
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kTests[test_case_].times_to_fail_recreate_offscreen;
388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    fallback_context_works_ = kTests[test_case_].fallback_context_works;
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++test_case_;
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct TestCase {
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_lose_during_commit;
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_lose_during_draw;
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_fail_reinitialize;
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_fail_recreate;
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_lose_on_recreate;
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int times_to_fail_recreate_offscreen;
400a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool fallback_context_works;
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t test_case_;
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_losses_;
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool recovered_context_;
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool first_initialized_;
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLostContextSucceeds);
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextSucceedsWithContent
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTestLostContextSucceeds {
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLostContextSucceedsWithContent()
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : LayerTreeHostContextTestLostContextSucceeds() {}
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_ = Layer::Create();
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetBounds(gfx::Size(10, 10));
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetAnchorPoint(gfx::PointF());
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetIsDrawable(true);
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_ = FakeContentLayer::Create(&client_);
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetBounds(gfx::Size(10, 10));
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetAnchorPoint(gfx::PointF());
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetIsDrawable(true);
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (use_surface_) {
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_->SetForceRenderSurface(true);
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Filters require us to create an offscreen context.
431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FilterOperations filters;
432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_->SetFilters(filters);
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_->SetBackgroundFilters(filters);
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(content_);
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InvalidateAndSetNeedsCommit() OVERRIDE {
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Invalidate the render surface so we don't try to use a cached copy of the
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // surface.  We want to make sure to test the drawing paths for drawing to
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // a child surface.
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetNeedsDisplay();
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTestLostContextSucceeds::InvalidateAndSetNeedsCommit();
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerImpl* content_impl = static_cast<FakeContentLayerImpl*>(
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->active_tree()->root_layer()->children()[0]);
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Even though the context was lost, we should have a resource. The
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TestWebGraphicsContext3D ensures that this resource is created with
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the active context.
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(content_impl->HaveResourceForTileAt(0, 0));
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ContextProvider* contexts = host_impl->offscreen_context_provider();
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (use_surface_) {
461424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ASSERT_TRUE(contexts);
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_TRUE(contexts->Context3d());
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // TODO(danakj): Make a fake GrContext.
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // EXPECT_TRUE(contexts->GrContext());
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_FALSE(contexts);
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTestLostContextSucceeds::AfterTest();
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (use_surface_) {
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // 1 create to start with +
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // 6 from test cases that fail on initializing the renderer (after the
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // offscreen context is created) +
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // 6 from test cases that lose the offscreen context directly +
477a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      // 4 from test cases that create a fallback +
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // All the test cases that recreate both contexts only once
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // per time it is lost.
480a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      EXPECT_EQ(6 + 6 + 1 + 4 + num_losses_, times_offscreen_created_);
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(0, times_offscreen_created_);
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool use_surface_;
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> root_;
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ContentLayer> content_;
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
494a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       NoSurface_SingleThread_DirectRenderer) {
495a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  use_surface_ = false;
496a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
497a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
498a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
499a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
500a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       NoSurface_SingleThread_DelegatingRenderer) {
501a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  use_surface_ = false;
502a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, true, false);
503a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
504a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
505a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
506a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       NoSurface_MultiThread_DirectRenderer_MainThreadPaint) {
507a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  use_surface_ = false;
508a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
509a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
510a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
511a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
512a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       NoSurface_MultiThread_DelegatingRenderer_MainThreadPaint) {
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  use_surface_ = false;
514a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, false);
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
517a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Surfaces don't exist with a delegating renderer.
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
519a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       WithSurface_SingleThread_DirectRenderer) {
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  use_surface_ = true;
521a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent,
525a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       WithSurface_MultiThread_DirectRenderer_MainThreadPaint) {
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  use_surface_ = true;
527a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
528a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
529a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostContextTestOffscreenContextFails
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostContextTest {
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_ = Layer::Create();
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetBounds(gfx::Size(10, 10));
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetAnchorPoint(gfx::PointF());
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetIsDrawable(true);
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_ = FakeContentLayer::Create(&client_);
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetBounds(gfx::Size(10, 10));
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetAnchorPoint(gfx::PointF());
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetIsDrawable(true);
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetForceRenderSurface(true);
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Filters require us to create an offscreen context.
545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    FilterOperations filters;
546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetFilters(filters);
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_->SetBackgroundFilters(filters);
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(content_);
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_create_offscreen_ = 1;
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ContextProvider* contexts = host_impl->offscreen_context_provider();
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(contexts);
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This did not lead to create failure.
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_to_expect_create_failed_ = 0;
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> root_;
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ContentLayer> content_;
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestOffscreenContextFails);
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextFails
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLostContextFails()
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostContextTest(),
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_commits_(0),
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        first_initialized_(false) {
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_during_commit_ = 1;
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
594b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (first_initialized_) {
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_FALSE(succeeded);
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      first_initialized_ = true;
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(host_impl);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_commits_;
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (num_commits_ == 1) {
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // When the context is ok, we should have these things.
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_TRUE(host_impl->output_surface());
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_TRUE(host_impl->renderer());
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_TRUE(host_impl->resource_provider());
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // When context recreation fails we shouldn't be left with any of them.
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(host_impl->output_surface());
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(host_impl->renderer());
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(host_impl->resource_provider());
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_commits_;
625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool first_initialized_;
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
629a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailReinitialize100_SingleThread_DirectRenderer) {
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_reinitialize_ = 100;
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_recreate_ = 0;
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
633a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
637a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailReinitialize100_SingleThread_DelegatingRenderer) {
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_reinitialize_ = 100;
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_recreate_ = 0;
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
641a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, true, false);
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
645a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailReinitialize100_MultiThread_DirectRenderer_MainThreadPaint) {
646a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 100;
647a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
648a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
649a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
650a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
651a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
652a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
653a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailReinitialize100_MultiThread_DirectRenderer_ImplSidePaint) {
654a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 100;
655a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
656a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
657a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
658a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
659a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
660a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
661a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailReinitialize100_MultiThread_DelegatingRenderer_MainThreadPaint) {
662a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 100;
663a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
664a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
665a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, false);
666a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
667a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
668a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
669a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailReinitialize100_MultiThread_DelegatingRenderer_ImplSidePaint) {
670a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 100;
671a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
672a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
673a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
674a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
675a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
676a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
677a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailRecreate100_SingleThread_DirectRenderer) {
678a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
679a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 100;
680a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
681a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
682a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
683a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
684a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
685a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailRecreate100_SingleThread_DelegatingRenderer) {
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_recreate_ = 100;
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
689a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, true, false);
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
693a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailRecreate100_MultiThread_DirectRenderer_MainThreadPaint) {
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_recreate_ = 100;
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
697a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
701a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailRecreate100_MultiThread_DirectRenderer_ImplSidePaint) {
702a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
703a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 100;
704a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
705a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
706a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
707a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
708a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
709a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailRecreate100_MultiThread_DelegatingRenderer_MainThreadPaint) {
710a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
711a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 100;
712a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
713a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, false);
714a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
715a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
716a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
717a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       FailRecreate100_MultiThread_DelegatingRenderer_ImplSidePaint) {
718a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
719a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 100;
720a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 0;
721a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
722a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
723a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
724a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
725a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseOnRecreate100_SingleThread_DirectRenderer) {
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_recreate_ = 0;
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_lose_on_recreate_ = 100;
729a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
733a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseOnRecreate100_SingleThread_DelegatingRenderer) {
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_fail_recreate_ = 0;
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  times_to_lose_on_recreate_ = 100;
737a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, true, false);
738a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
739a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
740a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
741a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseOnRecreate100_MultiThread_DirectRenderer_MainThreadPaint) {
742a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
743a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
744a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 100;
745a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
746a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
747a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
748a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
749a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseOnRecreate100_MultiThread_DirectRenderer_ImplSidePaint) {
750a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
751a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
752a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 100;
753a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
754a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
755a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
756a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
757a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseOnRecreate100_MultiThread_DelegatingRenderer_MainThreadPaint) {
758a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
759a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
760a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 100;
761a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, false);
762a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
763a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
764a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails,
765a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseOnRecreate100_MultiThread_DelegatingRenderer_ImplSidePaint) {
766a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_reinitialize_ = 0;
767a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_fail_recreate_ = 0;
768a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  times_to_lose_on_recreate_ = 100;
769a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestFinishAllRenderingAfterLoss
773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Lose the context until the compositor gives up on it.
777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    first_initialized_ = false;
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_during_commit_ = 1;
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_fail_reinitialize_ = 10;
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
783b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (first_initialized_) {
785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_FALSE(succeeded);
786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_host()->FinishAllRendering();
787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EndTest();
788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      first_initialized_ = true;
790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool first_initialized_;
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestFinishAllRenderingAfterLoss);
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextAndEvictTextures
803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLostContextAndEvictTextures()
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostContextTest(),
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_(FakeContentLayer::Create(&client_)),
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        impl_host_(0),
809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_commits_(0) {}
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_->SetBounds(gfx::Size(10, 20));
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PostEvictTextures() {
822eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (HasImplThread()) {
823eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ImplThreadTaskRunner()->PostTask(
824eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          FROM_HERE,
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              &LayerTreeHostContextTestLostContextAndEvictTextures::
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              EvictTexturesOnImplThread,
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::Unretained(this)));
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DebugScopedSetImplThread impl(proxy());
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EvictTexturesOnImplThread();
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void EvictTexturesOnImplThread() {
836eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    impl_host_->EvictTexturesForTesting();
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (lose_after_evict_)
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LoseContext();
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (num_commits_ > 1)
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(layer_->HaveBackingAt(0, 0));
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostEvictTextures();
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (num_commits_ > 1)
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_commits_;
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!lose_after_evict_)
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LoseContext();
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    impl_host_ = impl;
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
858b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(succeeded);
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool lose_after_evict_;
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> layer_;
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostImpl* impl_host_;
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_commits_;
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
874a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseAfterEvict_SingleThread_DirectRenderer) {
875a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = true;
876a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
877a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
878a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
879a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
880a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseAfterEvict_SingleThread_DelegatingRenderer) {
881a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = true;
882a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, true, false);
883a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
884a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
885a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
886a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseAfterEvict_MultiThread_DirectRenderer_MainThreadPaint) {
887a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = true;
888a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
889a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
890a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
891a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
892a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseAfterEvict_MultiThread_DelegatingRenderer_MainThreadPaint) {
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lose_after_evict_ = true;
894a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, false);
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Flaky on all platforms, http://crbug.com/310979
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
8991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       DISABLED_LoseAfterEvict_MultiThread_DelegatingRenderer_ImplSidePaint) {
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lose_after_evict_ = true;
901a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
902a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
903a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
904a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
905a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_SingleThread_DirectRenderer) {
906a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = false;
907a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, false, false);
908a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
909a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
910a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
911a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_SingleThread_DelegatingRenderer) {
912a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = false;
913a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(false, true, false);
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
917a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_MultiThread_DirectRenderer_MainThreadPaint) {
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lose_after_evict_ = false;
919a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, false);
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
923a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_MultiThread_DirectRenderer_ImplSidePaint) {
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lose_after_evict_ = false;
925a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, false, true);
926a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
927a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
928a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
929a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_MultiThread_DelegatingRenderer_MainThreadPaint) {
930a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = false;
931a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, false);
932a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
933a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
934a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures,
935a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       LoseBeforeEvict_MultiThread_DelegatingRenderer_ImplSidePaint) {
936a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  lose_after_evict_ = false;
937a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  RunTest(true, true, true);
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextWhileUpdatingResources
941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLostContextWhileUpdatingResources()
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : parent_(FakeContentLayer::Create(&client_)),
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        num_children_(50),
946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        times_to_lose_on_end_query_(3) {}
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() OVERRIDE {
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TestWebGraphicsContext3D> context =
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeHostContextTest::CreateContext3d();
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (times_to_lose_on_end_query_) {
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      --times_to_lose_on_end_query_;
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context->set_times_end_query_succeeds(5);
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return context.Pass();
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent_->SetBounds(gfx::Size(num_children_, 1));
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int i = 0; i < num_children_; i++) {
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<FakeContentLayer> child =
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          FakeContentLayer::Create(&client_);
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      child->SetPosition(gfx::PointF(i, 0.f));
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      child->SetBounds(gfx::Size(1, 1));
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_->AddChild(child);
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(parent_);
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(succeeded);
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(0, times_to_lose_on_end_query_);
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> parent_;
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_children_;
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_to_lose_on_end_query_;
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F(
998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestLostContextWhileUpdatingResources);
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLayersNotified
1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLayersNotified()
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostContextTest(),
1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_commits_(0) {}
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_ = FakeContentLayer::Create(&client_);
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child_ = FakeContentLayer::Create(&client_);
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    grandchild_ = FakeContentLayer::Create(&client_);
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(child_);
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child_->AddChild(grandchild_);
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
10247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    LayerTreeHostContextTest::DidActivateTreeOnThread(host_impl);
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerImpl* root = static_cast<FakeContentLayerImpl*>(
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->active_tree()->root_layer());
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerImpl* child = static_cast<FakeContentLayerImpl*>(
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        root->children()[0]);
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerImpl* grandchild = static_cast<FakeContentLayerImpl*>(
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        child->children()[0]);
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_commits_;
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (num_commits_) {
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, root->lost_output_surface_count());
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, child->lost_output_surface_count());
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, grandchild->lost_output_surface_count());
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Lose the context and struggle to recreate it.
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoseContext();
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_create_ = 1;
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, root->lost_output_surface_count());
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, child->lost_output_surface_count());
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, grandchild->lost_output_surface_count());
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Lose the context and again during recreate.
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoseContext();
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_lose_on_create_ = 1;
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, root->lost_output_surface_count());
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, child->lost_output_surface_count());
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, grandchild->lost_output_surface_count());
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Lose the context and again during reinitialization.
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoseContext();
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_initialize_ = 1;
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 4:
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(5u, root->lost_output_surface_count());
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(5u, child->lost_output_surface_count());
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(5u, grandchild->lost_output_surface_count());
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default:
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTREACHED();
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_commits_;
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root_;
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> child_;
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> grandchild_;
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLayersNotified);
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestDontUseLostResources
1084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
10868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  LayerTreeHostContextTestDontUseLostResources()
10878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      : lost_context_(false) {
10884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    context_should_support_io_surface_ = true;
10898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
10908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    child_output_surface_ = FakeOutputSurface::Create3d();
10918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    child_output_surface_->BindToClient(&output_surface_client_);
10928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    child_resource_provider_ =
10931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        ResourceProvider::Create(child_output_surface_.get(), NULL, 0, false);
10944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  static void EmptyReleaseCallback(unsigned sync_point, bool lost) {}
10978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
10984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
10998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    WebKit::WebGraphicsContext3D* context3d =
11008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        child_output_surface_->context_provider()->Context3d();
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
11038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scoped_ptr<TestRenderPass> pass_for_quad = TestRenderPass::Create();
11058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    pass_for_quad->SetNew(
11068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        // AppendOneOfEveryQuadType() makes a RenderPass quad with this id.
11078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        RenderPass::Id(2, 1),
11088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Rect(0, 0, 10, 10),
11098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Rect(0, 0, 10, 10),
11108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Transform());
11118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scoped_ptr<TestRenderPass> pass = TestRenderPass::Create();
11138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    pass->SetNew(RenderPass::Id(1, 1),
11148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 gfx::Rect(0, 0, 10, 10),
11158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 gfx::Rect(0, 0, 10, 10),
11168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 gfx::Transform());
11178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    pass->AppendOneOfEveryQuadType(child_resource_provider_.get(),
11188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                   RenderPass::Id(2, 1));
11198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    frame_data->render_pass_list.push_back(pass_for_quad.PassAs<RenderPass>());
11218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    frame_data->render_pass_list.push_back(pass.PassAs<RenderPass>());
11224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated_resource_collection_ = new DelegatedFrameResourceCollection;
11244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated_frame_provider_ = new DelegatedFrameProvider(
11254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_resource_collection_.get(), frame_data.Pass());
11264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ResourceProvider::ResourceId resource =
11288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        child_resource_provider_->CreateResource(
11298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            gfx::Size(4, 4),
11308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            GL_CLAMP_TO_EDGE,
11318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            ResourceProvider::TextureUsageAny,
11328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            RGBA_8888);
11338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ResourceProvider::ScopedWriteLockGL lock(child_resource_provider_.get(),
11348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                             resource);
11358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    gpu::Mailbox mailbox;
11378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    context3d->genMailboxCHROMIUM(mailbox.name);
11388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    unsigned sync_point = context3d->insertSyncPoint();
11398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scoped_refptr<Layer> root = Layer::Create();
11418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    root->SetBounds(gfx::Size(10, 10));
11428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    root->SetAnchorPoint(gfx::PointF());
11438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    root->SetIsDrawable(true);
11448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<FakeDelegatedRendererLayer> delegated =
11464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        FakeDelegatedRendererLayer::Create(NULL,
11474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                           delegated_frame_provider_.get());
11484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetBounds(gfx::Size(10, 10));
11494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetAnchorPoint(gfx::PointF());
11504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetIsDrawable(true);
11514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(delegated);
11524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<ContentLayer> content = ContentLayer::Create(&client_);
11544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content->SetBounds(gfx::Size(10, 10));
11554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content->SetAnchorPoint(gfx::PointF());
11564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content->SetIsDrawable(true);
11574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(content);
11584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scoped_refptr<TextureLayer> texture = TextureLayer::CreateForMailbox(NULL);
11604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    texture->SetBounds(gfx::Size(10, 10));
11614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    texture->SetAnchorPoint(gfx::PointF());
11624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    texture->SetIsDrawable(true);
11638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    texture->SetTextureMailbox(
11648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        TextureMailbox(mailbox, sync_point),
11658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        SingleReleaseCallback::Create(base::Bind(
11668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            &LayerTreeHostContextTestDontUseLostResources::
11678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                EmptyReleaseCallback)));
11684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(texture);
11694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<ContentLayer> mask = ContentLayer::Create(&client_);
11714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    mask->SetBounds(gfx::Size(10, 10));
11724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    mask->SetAnchorPoint(gfx::PointF());
11734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<ContentLayer> content_with_mask =
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentLayer::Create(&client_);
11764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content_with_mask->SetBounds(gfx::Size(10, 10));
11774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content_with_mask->SetAnchorPoint(gfx::PointF());
11784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content_with_mask->SetIsDrawable(true);
11794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content_with_mask->SetMaskLayer(mask.get());
11804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(content_with_mask);
11814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<VideoLayer> video_color =
11834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        VideoLayer::Create(&color_frame_provider_);
11844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_color->SetBounds(gfx::Size(10, 10));
11854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_color->SetAnchorPoint(gfx::PointF());
11864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_color->SetIsDrawable(true);
11874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(video_color);
11884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<VideoLayer> video_hw =
11904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        VideoLayer::Create(&hw_frame_provider_);
11914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_hw->SetBounds(gfx::Size(10, 10));
11924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_hw->SetAnchorPoint(gfx::PointF());
11934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_hw->SetIsDrawable(true);
11944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(video_hw);
11954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<VideoLayer> video_scaled_hw =
11974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        VideoLayer::Create(&scaled_hw_frame_provider_);
11984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_scaled_hw->SetBounds(gfx::Size(10, 10));
11994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_scaled_hw->SetAnchorPoint(gfx::PointF());
12004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_scaled_hw->SetIsDrawable(true);
12014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(video_scaled_hw);
1202a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
12038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    color_video_frame_ = VideoFrame::CreateColorFrame(
12048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Size(4, 4), 0x80, 0x80, 0x80, base::TimeDelta());
12058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    hw_video_frame_ = VideoFrame::WrapNativeTexture(
12068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        new VideoFrame::MailboxHolder(
12078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            mailbox,
12088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            sync_point,
12098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            VideoFrame::MailboxHolder::TextureNoLongerNeededCallback()),
12108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        GL_TEXTURE_2D,
12118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Size(4, 4), gfx::Rect(0, 0, 4, 4), gfx::Size(4, 4),
12128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        base::TimeDelta(),
12138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        VideoFrame::ReadPixelsCB(),
12148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        base::Closure());
12158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scaled_hw_video_frame_ = VideoFrame::WrapNativeTexture(
12168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        new VideoFrame::MailboxHolder(
12178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            mailbox,
12188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            sync_point,
12198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            VideoFrame::MailboxHolder::TextureNoLongerNeededCallback()),
12208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        GL_TEXTURE_2D,
12218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Size(4, 4), gfx::Rect(0, 0, 3, 2), gfx::Size(4, 4),
12228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        base::TimeDelta(),
12238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        VideoFrame::ReadPixelsCB(),
12248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        base::Closure());
12258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
12268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    color_frame_provider_.set_frame(color_video_frame_);
12278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    hw_frame_provider_.set_frame(hw_video_frame_);
12288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scaled_hw_frame_provider_.set_frame(scaled_hw_video_frame_);
12298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1230a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (!delegating_renderer()) {
1231a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      // TODO(danakj): IOSurface layer can not be transported. crbug.com/239335
12324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      scoped_refptr<IOSurfaceLayer> io_surface = IOSurfaceLayer::Create();
12334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      io_surface->SetBounds(gfx::Size(10, 10));
12344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      io_surface->SetAnchorPoint(gfx::PointF());
12354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      io_surface->SetIsDrawable(true);
12364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      io_surface->SetIOSurfaceProperties(1, gfx::Size(10, 10));
12374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      root->AddChild(io_surface);
1238a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Enable the hud.
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeDebugState debug_state;
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    debug_state.show_property_changed_rects = true;
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetDebugState(debug_state);
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<PaintedScrollbarLayer> scrollbar =
12463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        PaintedScrollbarLayer::Create(
12474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            scoped_ptr<Scrollbar>(new FakeScrollbar).Pass(), content->id());
12484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scrollbar->SetBounds(gfx::Size(10, 10));
12494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scrollbar->SetAnchorPoint(gfx::PointF());
12504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scrollbar->SetIsDrawable(true);
12514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(scrollbar);
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root);
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(host_impl);
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() == 3) {
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // On the third commit we're recovering from context loss. Hardware
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // video frames should not be reused by the VideoFrameProvider, but
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // software frames can be.
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      hw_frame_provider_.set_frame(NULL);
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scaled_hw_frame_provider_.set_frame(NULL);
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     LayerTreeHostImpl::FrameData* frame,
1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     bool result) OVERRIDE {
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() == 2) {
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Lose the context during draw on the second commit. This will cause
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // a third commit to recover.
12774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      context3d_->set_times_bind_texture_succeeds(0);
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual scoped_ptr<OutputSurface> CreateOutputSurface(
12834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      bool fallback) OVERRIDE {
12844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (layer_tree_host()) {
12854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      lost_context_ = true;
12864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_EQ(layer_tree_host()->source_frame_number(), 3);
12874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
12884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return LayerTreeHostContextTest::CreateOutputSurface(fallback);
12894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
12904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(layer_tree_host()->hud_layer());
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // End the test once we know the 3nd frame drew.
12944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (layer_tree_host()->source_frame_number() < 4) {
12954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      layer_tree_host()->root_layer()->SetNeedsDisplay();
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
12974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    } else {
12984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EndTest();
12994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
13034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_TRUE(lost_context_);
13044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
13084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool lost_context_;
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  FakeOutputSurfaceClient output_surface_client_;
13118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<FakeOutputSurface> child_output_surface_;
13128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<ResourceProvider> child_resource_provider_;
13138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedFrameResourceCollection>
13154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      delegated_resource_collection_;
13164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedFrameProvider> delegated_frame_provider_;
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoFrame> color_video_frame_;
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoFrame> hw_video_frame_;
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoFrame> scaled_hw_video_frame_;
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeVideoFrameProvider color_frame_provider_;
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeVideoFrameProvider hw_frame_provider_;
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeVideoFrameProvider scaled_hw_frame_provider_;
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestDontUseLostResources);
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLosesFirstOutputSurface
1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostContextTestLosesFirstOutputSurface() {
1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Always fail. This needs to be set before LayerTreeHost is created.
1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_to_lose_on_create_ = 1000;
1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1343b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(succeeded);
1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If we make it this far without crashing, we pass!
1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(false);
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestLosesFirstOutputSurface);
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds
1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_to_fail_initialize_ = 2;
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds);
1375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestRetryWorksWithForcedInit
1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds {
1378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidFailToInitializeOutputSurface() OVERRIDE {
1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds
1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ::DidFailToInitializeOutputSurface();
1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (times_create_failed_ == 1) {
1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // CompositeAndReadback force recreates the output surface, which should
1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // fail.
1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      char pixels[4];
1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_FALSE(layer_tree_host()->CompositeAndReadback(
1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            &pixels, gfx::Rect(1, 1)));
1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestRetryWorksWithForcedInit);
1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestCompositeAndReadbackBeforeOutputSurfaceInit
1397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This must be called immediately after creating LTH, before the first
1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // OutputSurface is initialized.
1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(layer_tree_host()->output_surface_lost());
1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_output_surface_created_ = 0;
1405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Post the SetNeedsCommit before the readback to make sure it is run
14071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // on the main thread before the readback's replacement commit when
14081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // we have a threaded compositor.
14091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
14101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    char pixels[4];
1412a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    bool result = layer_tree_host()->CompositeAndReadback(
1413a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        &pixels, gfx::Rect(1, 1));
1414a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_EQ(!delegating_renderer(), result);
1415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, times_output_surface_created_);
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)
143358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
143458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     LayerTreeHostImpl::FrameData* frame_data,
143558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     bool result) OVERRIDE {
143658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_GE(host_impl->active_tree()->source_frame_number(), 0);
143758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_LE(host_impl->active_tree()->source_frame_number(), 1);
143858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return true;
143958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
144058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
144158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
144258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only draw for the readback and the replacement commit.
144358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // The replacement commit will also be the first commit after output
144458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // surface initialization.
144558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_GE(host_impl->active_tree()->source_frame_number(), 0);
144658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_LE(host_impl->active_tree()->source_frame_number(), 1);
144758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
144858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
144958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
145058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   bool result) OVERRIDE {
145158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only swap for the replacement commit.
145258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(host_impl->active_tree()->source_frame_number(), 1);
145358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
145458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
145558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int times_output_surface_created_;
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestCompositeAndReadbackBeforeOutputSurfaceInit);
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
146358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This test verifies that losing an output surface during a
146458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// simultaneous readback and forced redraw works and does not deadlock.
146558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostContextTestLoseOutputSurfaceDuringReadbackAndForcedDraw
146658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public LayerTreeHostContextTest {
146758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
146858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kFirstOutputSurfaceInitSourceFrameNumber = 0;
146958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kReadbackSourceFrameNumber = 1;
147058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kReadbackReplacementSourceFrameNumber = 2;
147158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kSecondOutputSurfaceInitSourceFrameNumber = 3;
147258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
147358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeHostContextTestLoseOutputSurfaceDuringReadbackAndForcedDraw()
147458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : did_react_to_first_commit_(false) {}
147558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
147658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
147758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // This enables forced draws after a single prepare to draw failure.
147858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings->timeout_and_draw_when_animation_checkerboards = true;
147958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings->maximum_number_of_failed_draws_before_draw_is_forced_ = 1;
148058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
148158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
148258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
148358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
148458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
148558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     LayerTreeHostImpl::FrameData* frame_data,
148658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     bool result) OVERRIDE {
148758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
148858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kFirstOutputSurfaceInitSourceFrameNumber ||
148958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kSecondOutputSurfaceInitSourceFrameNumber ||
149058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackSourceFrameNumber)
149158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
149258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
149358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Before we react to the failed draw by initiating the forced draw
149458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // sequence, start a readback on the main thread and then lose the context
149558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // to start output surface initialization all at the same time.
149658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (sfn == kFirstOutputSurfaceInitSourceFrameNumber &&
149758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        !did_react_to_first_commit_) {
149858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      did_react_to_first_commit_ = true;
149958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      PostReadbackToMainThread();
150058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      LoseContext();
150158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
150258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
150358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return false;
150458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
150558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
150658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl,
150758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                           bool success) OVERRIDE {
150858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // -1 is for the first output surface initialization.
150958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
151058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == -1 || sfn == kReadbackReplacementSourceFrameNumber)
151158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
151258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
151358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
151458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
151558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only draw the first commit after output surface initialization
151658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // and attempt to draw the readback commit (which will fail).
151758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // All others should abort because the output surface is lost.
151858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
151958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kSecondOutputSurfaceInitSourceFrameNumber ||
152058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackSourceFrameNumber)
152158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
152258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
152358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
152458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
152558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   bool result) OVERRIDE {
152658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only swap the first commit after the second output surface
152758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // initialization.
152858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
152958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kSecondOutputSurfaceInitSourceFrameNumber) << sfn;
153058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
153158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
153258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
153358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
153458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
153558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int did_react_to_first_commit_;
153658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
153758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
153858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F(
153958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTestLoseOutputSurfaceDuringReadbackAndForcedDraw);
154058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
154158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This test verifies that losing an output surface right before a
154258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// simultaneous readback and forced redraw works and does not deadlock.
154358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostContextTestReadbackWithForcedDrawAndOutputSurfaceInit
154458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public LayerTreeHostContextTest {
154558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
154658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kFirstOutputSurfaceInitSourceFrameNumber = 0;
154758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kReadbackSourceFrameNumber = 1;
154858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kForcedDrawCommitSourceFrameNumber = 2;
154958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kSecondOutputSurfaceInitSourceFrameNumber = 2;
155058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
155158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeHostContextTestReadbackWithForcedDrawAndOutputSurfaceInit()
155258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : did_lose_context_(false) {}
155358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
155458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
155558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // This enables forced draws after a single prepare to draw failure.
155658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings->timeout_and_draw_when_animation_checkerboards = true;
155758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings->maximum_number_of_failed_draws_before_draw_is_forced_ = 1;
155858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
155958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
156058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
156158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
156258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
156358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     LayerTreeHostImpl::FrameData* frame_data,
156458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     bool result) OVERRIDE {
156558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
156658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kFirstOutputSurfaceInitSourceFrameNumber ||
156758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kSecondOutputSurfaceInitSourceFrameNumber ||
156858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackSourceFrameNumber)
156958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
157058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
157158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Before we react to the failed draw by initiating the forced draw
157258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // sequence, start a readback on the main thread and then lose the context
157358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // to start output surface initialization all at the same time.
157458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (sfn == kFirstOutputSurfaceInitSourceFrameNumber && !did_lose_context_) {
157558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      did_lose_context_ = true;
157658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      LoseContext();
157758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
157858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
157958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Returning false will result in a forced draw.
158058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return false;
158158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
158258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
158358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
158458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(succeeded);
158558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (layer_tree_host()->source_frame_number() > 0) {
158658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Perform a readback right after the second output surface
158758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // initialization.
158858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      char pixels[4];
158958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1));
159058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
159158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
159258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
159358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl,
159458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                           bool success) OVERRIDE {
159558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // -1 is for the first output surface initialization.
159658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
159758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == -1 || sfn == kFirstOutputSurfaceInitSourceFrameNumber)
159858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
159958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
160058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
160158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
160258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only draw the first commit after output surface initialization
160358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // and attempt to draw the readback commit (which will fail).
160458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // All others should abort because the output surface is lost.
160558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
160658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kForcedDrawCommitSourceFrameNumber ||
160758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackSourceFrameNumber)
160858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
160958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
161058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
161158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
161258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   bool result) OVERRIDE {
161358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only swap the first commit after the second output surface
161458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // initialization.
161558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
161658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kForcedDrawCommitSourceFrameNumber) << sfn;
161758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
161858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
161958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
162058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
162158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
162258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int did_lose_context_;
162358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
162458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
162558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F(
162658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTestReadbackWithForcedDrawAndOutputSurfaceInit);
162758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ImplSidePaintingLayerTreeHostContextTest
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostContextTest {
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings->impl_side_painting = true;
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestImplSidePainting
1637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public ImplSidePaintingLayerTreeHostContextTest {
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<Layer> root = Layer::Create();
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->SetBounds(gfx::Size(10, 10));
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->SetAnchorPoint(gfx::PointF());
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->SetIsDrawable(true);
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<PictureLayer> picture = PictureLayer::Create(&client_);
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    picture->SetBounds(gfx::Size(10, 10));
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    picture->SetAnchorPoint(gfx::PointF());
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    picture->SetIsDrawable(true);
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->AddChild(picture);
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root);
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_during_commit_ = 1;
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(succeeded);
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostContextTestImplSidePainting);
16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScrollbarLayerLostContext : public LayerTreeHostContextTest {
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollbarLayerLostContext() : commits_(0) {}
16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<Layer> scroll_layer = Layer::Create();
16793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scrollbar_layer_ = FakePaintedScrollbarLayer::Create(
16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        false, true, scroll_layer->id());
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scrollbar_layer_->SetBounds(gfx::Size(10, 100));
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(scrollbar_layer_);
16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(scroll_layer);
16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++commits_;
1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (commits_) {
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // First (regular) update, we should upload 2 resources (thumb, and
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // backtrack).
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1, scrollbar_layer_->update_count());
16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoseContext();
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Second update, after the lost context, we should still upload 2
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // resources even if the contents haven't changed.
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2, scrollbar_layer_->update_count());
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
170658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 3:
170758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Single thread proxy issues extra commits after context lost.
170858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // http://crbug.com/287250
170958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (HasImplThread())
171058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          NOTREACHED();
171158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default:
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTREACHED();
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int commits_;
17193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<FakePaintedScrollbarLayer> scrollbar_layer_;
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(ScrollbarLayerLostContext);
1723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestFailsToCreateSurface
1725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
1726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostContextTestFailsToCreateSurface()
1728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : LayerTreeHostContextTest(),
1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        failure_count_(0) {
1730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_to_lose_on_create_ = 10;
1731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1739b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool success) OVERRIDE {
1740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(success);
1741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, failure_count_);
1742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_to_lose_on_create_ = 0;
1743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    failure_count_++;
1744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Normally, the embedder should stop trying to use the compositor at
1745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // this point, but let's force it back into action when we shouldn't.
1746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    char pixels[4];
1747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(
1748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->CompositeAndReadback(pixels, gfx::Rect(1, 1)));
1749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If we've made it this far without crashing, we've succeeded.
1750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int failure_count_;
1755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1757a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1758a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LayerTreeHostContextTestFailsToCreateSurface);
1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Not reusing LayerTreeTest because it expects creating LTH to always succeed.
1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface
1762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public testing::Test,
1763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      public FakeLayerTreeHostClient {
1764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface()
1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : FakeLayerTreeHostClient(FakeLayerTreeHostClient::DIRECT_3D) {}
1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1768a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // FakeLayerTreeHostClient implementation.
1769a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual scoped_ptr<OutputSurface> CreateOutputSurface(bool fallback)
1770a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      OVERRIDE {
1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return scoped_ptr<OutputSurface>();
1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1774a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void RunTest(bool threaded,
1775a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)               bool delegating_renderer,
1776a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)               bool impl_side_painting) {
1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<base::Thread> impl_thread;
1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (threaded) {
1779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      impl_thread.reset(new base::Thread("LayerTreeTest"));
1780eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ASSERT_TRUE(impl_thread->Start());
1781eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ASSERT_TRUE(impl_thread->message_loop_proxy().get());
1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeSettings settings;
1785a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    settings.impl_side_painting = impl_side_painting;
1786eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<LayerTreeHost> layer_tree_host = LayerTreeHost::Create(
1787eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        this,
17881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        NULL,
1789eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        settings,
1790eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        impl_thread ? impl_thread->message_loop_proxy() : NULL);
1791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(layer_tree_host);
1792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface);
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1798a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class UIResourceLostTest : public LayerTreeHostContextTest {
1799a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
1800a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceLostTest() : time_step_(0) {}
1801a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
1802a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1803a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
180458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // This is called on the main thread after each commit and
180558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // DidActivateTreeOnThread, with the value of time_step_ at the time
180658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // of the call to DidActivateTreeOnThread. Similar tests will do
180758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // work on the main thread in DidCommit but that is unsuitable because
180858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // the main thread work for these tests must happen after
180958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // DidActivateTreeOnThread, which happens after DidCommit with impl-side
181058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // painting.
181158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int time_step) = 0;
181258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
181358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Called after DidActivateTreeOnThread. If this is done during the commit,
181458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // the call to StepCompleteOnMainThread will not occur until after
181558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // the commit completes, because the main thread is blocked.
181658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void PostStepCompleteToMainThread() {
181758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    proxy()->MainThreadTaskRunner()->PostTask(
181858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        FROM_HERE,
181958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(
182058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            &UIResourceLostTest::StepCompleteOnMainThreadInternal,
182158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            base::Unretained(this),
182258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            time_step_));
182358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
182458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
182558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void PostLoseContextToImplThread() {
182658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
182758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::SingleThreadTaskRunner* task_runner =
182858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        HasImplThread() ? ImplThreadTaskRunner()
182958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        : base::MessageLoopProxy::current();
183058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    task_runner->PostTask(
183158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        FROM_HERE,
183258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(
183358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            &LayerTreeHostContextTest::LoseContext,
183458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            base::Unretained(this)));
183558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
183658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1837a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected:
1838a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int time_step_;
1839a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<FakeScopedUIResource> ui_resource_;
184058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
184158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
184258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void StepCompleteOnMainThreadInternal(int step) {
184358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
184458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    StepCompleteOnMainThread(step);
184558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
1846a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
1847a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
184858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostTestSimple : public UIResourceLostTest {
1849a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
185058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // This is called when the commit is complete and the new layer tree has been
185158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // activated.
185258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) = 0;
185358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1854a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
185558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!layer_tree_host()->settings().impl_side_painting) {
185658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      StepCompleteOnImplThread(impl);
185758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      PostStepCompleteToMainThread();
185858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ++time_step_;
185958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
186058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
186158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
186258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
186358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (layer_tree_host()->settings().impl_side_painting) {
186458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      StepCompleteOnImplThread(impl);
186558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      PostStepCompleteToMainThread();
186658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ++time_step_;
186758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
186858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
186958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
187058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
187158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Losing context after an UI resource has been created.
187258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostAfterCommit : public UIResourceLostTestSimple {
187358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
187458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int step) OVERRIDE {
187558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
187658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (step) {
1877a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 0:
1878a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
1879a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Expects a valid UIResourceId.
1880a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_NE(0, ui_resource_->id());
1881a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
1882a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
188358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 4:
188458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Release resource before ending the test.
188558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ui_resource_.reset();
188658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EndTest();
188758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
188858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 5:
188958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Single thread proxy issues extra commits after context lost.
189058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // http://crbug.com/287250
189158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (HasImplThread())
189258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          NOTREACHED();
189358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
189458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 6:
189558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NOTREACHED();
189658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
189758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
189858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
189958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE {
190058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
190158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (time_step_) {
1902a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
1903a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource should have been created on LTHI after the commit.
190458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1905a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
1906a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1907a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 2:
1908a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        LoseContext();
1909a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1910a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
1911a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resources should have been recreated. The bitmap callback should
1912a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // have been called once with the resource_lost flag set to true.
1913a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(1, ui_resource_->lost_resource_count);
1914a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Resource Id on the impl-side have been recreated as well. Note
1915a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // that the same UIResourceId persists after the context lost.
191658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1917a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
1918a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1919a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
1920a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
1921a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
1922a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1923a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostAfterCommit);
1924a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1925a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Losing context before UI resource requests can be commited.  Three sequences
1926a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// of creation/deletion are considered:
1927a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 1. Create one resource -> Context Lost => Expect the resource to have been
1928a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// created.
1929a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 2. Delete an exisiting resource (test_id0_) -> create a second resource
1930a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// (test_id1_) -> Context Lost => Expect the test_id0_ to be removed and
1931a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// test_id1_ to have been created.
1932a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 3. Create one resource -> Delete that same resource -> Context Lost => Expect
1933a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// the resource to not exist in the manager.
193458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostBeforeCommit : public UIResourceLostTestSimple {
1935a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
1936a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceLostBeforeCommit()
1937a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      : test_id0_(0),
1938a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        test_id1_(0) {}
1939a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
194058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int step) OVERRIDE {
194158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (step) {
1942a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 0:
1943a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
194458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Lose the context on the impl thread before the commit.
194558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostLoseContextToImplThread();
1946a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1947a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 2:
1948a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Sequence 2:
1949a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Currently one resource has been created.
1950a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        test_id0_ = ui_resource_->id();
1951a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Delete this resource.
1952a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_.reset();
1953a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Create another resource.
1954a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
1955a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        test_id1_ = ui_resource_->id();
1956a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Sanity check that two resource creations return different ids.
1957a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_NE(test_id0_, test_id1_);
195858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Lose the context on the impl thread before the commit.
195958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostLoseContextToImplThread();
1960a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1961a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
1962a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Clear the manager of resources.
1963a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_.reset();
1964a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
1965a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1966a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 4:
1967a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Sequence 3:
1968a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
1969a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        test_id0_ = ui_resource_->id();
1970a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Sanity check the UIResourceId should not be 0.
1971a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_NE(0, test_id0_);
1972a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Usually ScopedUIResource are deleted from the manager in their
1973a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // destructor (so usually ui_resource_.reset()).  But here we need
1974a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // ui_resource_ for the next step, so call DeleteUIResource directly.
1975a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        layer_tree_host()->DeleteUIResource(test_id0_);
197658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Delete the resouce and then lose the context.
197758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostLoseContextToImplThread();
1978a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1979a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 5:
198058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Release resource before ending the test.
1981a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_.reset();
1982a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EndTest();
1983a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
198458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 6:
198558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Single thread proxy issues extra commits after context lost.
198658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // http://crbug.com/287250
198758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (HasImplThread())
198858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          NOTREACHED();
198958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
199058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 8:
199158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NOTREACHED();
1992a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
1993a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
1994a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
199558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE {
199658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
1997a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (time_step_) {
1998a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
199958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Sequence 1 (continued):
200058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The first context lost happens before the resources were created,
200158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // and because it resulted in no resources being destroyed, it does not
200258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // trigger resource re-creation.
200358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
200458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
200558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Resource Id on the impl-side has been created.
200658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
2007a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2008a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
200958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Sequence 2 (continued):
201058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The previous resource should have been deleted.
201158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_));
201258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (HasImplThread()) {
201358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          // The second resource should have been created.
2014a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_));
201558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        } else {
201658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          // The extra commit that happens at context lost in the single thread
201758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          // proxy changes the timing so that the resource has been destroyed.
201858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          // http://crbug.com/287250
201958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id1_));
2020a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        }
202158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The second resource called the resource callback once and since the
202258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // context is lost, a "resource lost" callback was also issued.
202358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(2, ui_resource_->resource_create_count);
202458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->lost_resource_count);
2025a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2026a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 5:
202758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Sequence 3 (continued):
202858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Expect the resource callback to have been called once.
202958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
203058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // No "resource lost" callbacks.
203158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
203258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The UI resource id should not be valid
203358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_));
2034a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2035a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
2036a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2037a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2038a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
2039a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceId test_id0_;
2040a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceId test_id1_;
2041a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
2042a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2043a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostBeforeCommit);
2044a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2045a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Losing UI resource before the pending trees is activated but after the
2046a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// commit.  Impl-side-painting only.
2047a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class UIResourceLostBeforeActivateTree : public UIResourceLostTest {
204858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int step) OVERRIDE {
204958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
205058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (step) {
2051a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 0:
2052a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
2053a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
2054a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2055a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
2056a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        test_id_ = ui_resource_->id();
2057a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_.reset();
2058a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
2059a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2060a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 5:
206158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Release resource before ending the test.
206258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ui_resource_.reset();
2063a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EndTest();
2064a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
206558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 6:
206658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Make sure no extra commits happened.
206758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NOTREACHED();
2068a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
2069a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2070a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
207158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
207258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
2073a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (time_step_) {
207458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 2:
207558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
2076a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
207758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 4:
207858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
207958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
208058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
208158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
208258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
208358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
208458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (time_step_) {
2085a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
2086a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource creation callback has been called.
2087a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
2088a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource is not yet lost (sanity check).
2089a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
2090a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource should not have been created yet on the impl-side.
2091a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
2092a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        LoseContext();
2093a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2094a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
2095a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        LoseContext();
2096a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2097a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
2098a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2099a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
2101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LayerTreeHostContextTest::DidActivateTreeOnThread(impl);
2102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (time_step_) {
2103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
2104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The pending requests on the impl-side should have been processed.
2105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
2106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 2:
2108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The "lost resource" callback should have been called once.
2109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(1, ui_resource_->lost_resource_count);
2110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 4:
2112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource is deleted and should not be in the manager.  Use
2113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // test_id_ since ui_resource_ has been deleted.
2114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id_));
2115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
211758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
211858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PostStepCompleteToMainThread();
2119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ++time_step_;
2120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
2123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceId test_id_;
2124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
2125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(UIResourceLostBeforeActivateTree,
2127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)       RunMultiThread_DirectRenderer_ImplSidePaint) {
2128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RunTest(true, false, true);
2129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
2130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(UIResourceLostBeforeActivateTree,
2132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)       RunMultiThread_DelegatingRenderer_ImplSidePaint) {
2133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RunTest(true, true, true);
2134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
2135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
213658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Resources evicted explicitly and by visibility changes.
213758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostEviction : public UIResourceLostTestSimple {
213858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
213958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int step) OVERRIDE {
214058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
214158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (step) {
214258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 0:
214358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
214458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0, ui_resource_->id());
214558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
214658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
214758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 2:
214858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Make the tree not visible.
214958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetVisibleToMainThread(false);
215058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
215158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 3:
215258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Release resource before ending the test.
215358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ui_resource_.reset();
215458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EndTest();
215558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
215658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 4:
215758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NOTREACHED();
215858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
215958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
216058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
216158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* impl,
216258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       bool visible) OVERRIDE {
216358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(
216458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        impl->output_surface()->context_provider()->Context3d());
216558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!visible) {
216658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // All resources should have been evicted.
216758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ASSERT_EQ(0u, context->NumTextures());
216858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
216958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_EQ(2, ui_resource_->resource_create_count);
217058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_EQ(1, ui_resource_->lost_resource_count);
217158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Drawing is disabled both because of the evicted resources and
217258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // because the renderer is not visible.
217358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_FALSE(impl->CanDraw());
217458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Make the renderer visible again.
217558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      PostSetVisibleToMainThread(true);
217658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
217758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
217858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
217958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE {
218058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(
218158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        impl->output_surface()->context_provider()->Context3d());
218258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
218358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (time_step_) {
218458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 1:
218558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The resource should have been created on LTHI after the commit.
218658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ASSERT_EQ(1u, context->NumTextures());
218758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
218858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
218958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
219058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_TRUE(impl->CanDraw());
219158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Evict all UI resources. This will trigger a commit.
219258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        impl->EvictAllUIResources();
219358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ASSERT_EQ(0u, context->NumTextures());
219458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
219558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
219658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
219758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_FALSE(impl->CanDraw());
219858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
219958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 2:
220058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The resource should have been recreated.
220158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ASSERT_EQ(1u, context->NumTextures());
220258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
220358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(2, ui_resource_->resource_create_count);
220458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->lost_resource_count);
220558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_TRUE(impl->CanDraw());
220658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
220758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 3:
220858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The resource should have been recreated after visibility was
220958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // restored.
221058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ASSERT_EQ(1u, context->NumTextures());
221158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
221258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(3, ui_resource_->resource_create_count);
221358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(2, ui_resource_->lost_resource_count);
221458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_TRUE(impl->CanDraw());
221558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
221658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
221758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
221858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
221958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
222058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostEviction);
222158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostContextTestSurfaceCreateCallback
22234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostContextTest {
22244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
22254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerTreeHostContextTestSurfaceCreateCallback()
22264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : LayerTreeHostContextTest(),
22274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        layer_(FakeContentLayer::Create(&client_)),
22284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        num_commits_(0) {}
22294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
22314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_->SetBounds(gfx::Size(10, 20));
22324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
22334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
22344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
22374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
22384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
22414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (num_commits_) {
22424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 0:
22434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(1u, layer_->output_surface_created_count());
22444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
22454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
22474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(1u, layer_->output_surface_created_count());
22484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
22494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
22514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(1u, layer_->output_surface_created_count());
22524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
22544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(2u, layer_->output_surface_created_count());
22554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
22564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
22584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ++num_commits_;
22594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
22624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
22634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (num_commits_) {
22644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 0:
22654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
22674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
22694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        LoseContext();
22704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
22724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
22734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
22754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
22784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_TRUE(succeeded);
22794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
22824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
22844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeContentLayerClient client_;
22854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<FakeContentLayer> layer_;
22864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int num_commits_;
22874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
22884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestSurfaceCreateCallback);
22904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
2293