layer_tree_host_unittest_context.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_provider.h"
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_resource_collection.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/io_surface_layer.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h"
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/layers/painted_scrollbar_layer.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/texture_layer.h"
17a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "cc/layers/texture_layer_impl.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer_impl.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/output/filter_operations.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_impl.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer_impl.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h"
288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "cc/test/fake_output_surface_client.h"
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_painted_scrollbar_layer.h"
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_scoped_ui_resource.h"
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/test/fake_scrollbar.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_video_frame_provider.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_common.h"
350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_context_provider.h"
360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.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)
9400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)class DISABLED_LayerTreeHostContextTestLostContextWhileUpdatingResources
941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
9430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DISABLED_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)
9970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Disabled (crbug.com/313790)
9988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F(
9990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    DISABLED_LayerTreeHostContextTestLostContextWhileUpdatingResources);
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLayersNotified
1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostContextTestLayersNotified()
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostContextTest(),
1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        num_commits_(0) {}
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_ = FakeContentLayer::Create(&client_);
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child_ = FakeContentLayer::Create(&client_);
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    grandchild_ = FakeContentLayer::Create(&client_);
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->AddChild(child_);
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child_->AddChild(grandchild_);
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
10257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    LayerTreeHostContextTest::DidActivateTreeOnThread(host_impl);
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerImpl* root = static_cast<FakeContentLayerImpl*>(
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->active_tree()->root_layer());
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerImpl* child = static_cast<FakeContentLayerImpl*>(
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        root->children()[0]);
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerImpl* grandchild = static_cast<FakeContentLayerImpl*>(
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        child->children()[0]);
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_commits_;
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (num_commits_) {
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, root->lost_output_surface_count());
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, child->lost_output_surface_count());
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, grandchild->lost_output_surface_count());
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Lose the context and struggle to recreate it.
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoseContext();
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_create_ = 1;
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, root->lost_output_surface_count());
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, child->lost_output_surface_count());
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, grandchild->lost_output_surface_count());
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Lose the context and again during recreate.
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoseContext();
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_lose_on_create_ = 1;
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, root->lost_output_surface_count());
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, child->lost_output_surface_count());
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, grandchild->lost_output_surface_count());
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Lose the context and again during reinitialization.
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoseContext();
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        times_to_fail_initialize_ = 1;
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 4:
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(5u, root->lost_output_surface_count());
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(5u, child->lost_output_surface_count());
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(5u, grandchild->lost_output_surface_count());
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default:
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTREACHED();
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_commits_;
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> root_;
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> child_;
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FakeContentLayer> grandchild_;
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLayersNotified);
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestDontUseLostResources
1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
10878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  LayerTreeHostContextTestDontUseLostResources()
10888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      : lost_context_(false) {
10894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    context_should_support_io_surface_ = true;
10908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
10918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    child_output_surface_ = FakeOutputSurface::Create3d();
10928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    child_output_surface_->BindToClient(&output_surface_client_);
10938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    child_resource_provider_ =
10940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        ResourceProvider::Create(child_output_surface_.get(),
10950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                 NULL,
10960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                 0,
10970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                 false,
10980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                 1);
10994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  static void EmptyReleaseCallback(unsigned sync_point, bool lost) {}
11028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
11048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    WebKit::WebGraphicsContext3D* context3d =
11058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        child_output_surface_->context_provider()->Context3d();
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
11088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scoped_ptr<TestRenderPass> pass_for_quad = TestRenderPass::Create();
11108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    pass_for_quad->SetNew(
11118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        // AppendOneOfEveryQuadType() makes a RenderPass quad with this id.
11128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        RenderPass::Id(2, 1),
11138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Rect(0, 0, 10, 10),
11148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Rect(0, 0, 10, 10),
11158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Transform());
11168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scoped_ptr<TestRenderPass> pass = TestRenderPass::Create();
11188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    pass->SetNew(RenderPass::Id(1, 1),
11198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 gfx::Rect(0, 0, 10, 10),
11208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 gfx::Rect(0, 0, 10, 10),
11218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 gfx::Transform());
11228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    pass->AppendOneOfEveryQuadType(child_resource_provider_.get(),
11238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                   RenderPass::Id(2, 1));
11248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    frame_data->render_pass_list.push_back(pass_for_quad.PassAs<RenderPass>());
11268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    frame_data->render_pass_list.push_back(pass.PassAs<RenderPass>());
11274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated_resource_collection_ = new DelegatedFrameResourceCollection;
11294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated_frame_provider_ = new DelegatedFrameProvider(
11304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_resource_collection_.get(), frame_data.Pass());
11314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ResourceProvider::ResourceId resource =
11338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        child_resource_provider_->CreateResource(
11348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            gfx::Size(4, 4),
11358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            GL_CLAMP_TO_EDGE,
11368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            ResourceProvider::TextureUsageAny,
11378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            RGBA_8888);
11388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ResourceProvider::ScopedWriteLockGL lock(child_resource_provider_.get(),
11398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                             resource);
11408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    gpu::Mailbox mailbox;
11428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    context3d->genMailboxCHROMIUM(mailbox.name);
11438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    unsigned sync_point = context3d->insertSyncPoint();
11448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scoped_refptr<Layer> root = Layer::Create();
11468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    root->SetBounds(gfx::Size(10, 10));
11478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    root->SetAnchorPoint(gfx::PointF());
11488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    root->SetIsDrawable(true);
11498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<FakeDelegatedRendererLayer> delegated =
11514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        FakeDelegatedRendererLayer::Create(NULL,
11524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                           delegated_frame_provider_.get());
11534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetBounds(gfx::Size(10, 10));
11544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetAnchorPoint(gfx::PointF());
11554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetIsDrawable(true);
11564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(delegated);
11574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<ContentLayer> content = ContentLayer::Create(&client_);
11594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content->SetBounds(gfx::Size(10, 10));
11604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content->SetAnchorPoint(gfx::PointF());
11614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content->SetIsDrawable(true);
11624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(content);
11634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scoped_refptr<TextureLayer> texture = TextureLayer::CreateForMailbox(NULL);
11654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    texture->SetBounds(gfx::Size(10, 10));
11664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    texture->SetAnchorPoint(gfx::PointF());
11674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    texture->SetIsDrawable(true);
11688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    texture->SetTextureMailbox(
11698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        TextureMailbox(mailbox, sync_point),
11708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        SingleReleaseCallback::Create(base::Bind(
11718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            &LayerTreeHostContextTestDontUseLostResources::
11728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                EmptyReleaseCallback)));
11734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(texture);
11744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<ContentLayer> mask = ContentLayer::Create(&client_);
11764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    mask->SetBounds(gfx::Size(10, 10));
11774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    mask->SetAnchorPoint(gfx::PointF());
11784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<ContentLayer> content_with_mask =
11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentLayer::Create(&client_);
11814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content_with_mask->SetBounds(gfx::Size(10, 10));
11824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content_with_mask->SetAnchorPoint(gfx::PointF());
11834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content_with_mask->SetIsDrawable(true);
11844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content_with_mask->SetMaskLayer(mask.get());
11854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(content_with_mask);
11864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<VideoLayer> video_color =
11884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        VideoLayer::Create(&color_frame_provider_);
11894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_color->SetBounds(gfx::Size(10, 10));
11904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_color->SetAnchorPoint(gfx::PointF());
11914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_color->SetIsDrawable(true);
11924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(video_color);
11934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<VideoLayer> video_hw =
11954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        VideoLayer::Create(&hw_frame_provider_);
11964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_hw->SetBounds(gfx::Size(10, 10));
11974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_hw->SetAnchorPoint(gfx::PointF());
11984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_hw->SetIsDrawable(true);
11994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(video_hw);
12004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<VideoLayer> video_scaled_hw =
12024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        VideoLayer::Create(&scaled_hw_frame_provider_);
12034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_scaled_hw->SetBounds(gfx::Size(10, 10));
12044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_scaled_hw->SetAnchorPoint(gfx::PointF());
12054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    video_scaled_hw->SetIsDrawable(true);
12064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(video_scaled_hw);
1207a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
12088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    color_video_frame_ = VideoFrame::CreateColorFrame(
12098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Size(4, 4), 0x80, 0x80, 0x80, base::TimeDelta());
12108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    hw_video_frame_ = VideoFrame::WrapNativeTexture(
12118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        new VideoFrame::MailboxHolder(
12128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            mailbox,
12138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            sync_point,
12148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            VideoFrame::MailboxHolder::TextureNoLongerNeededCallback()),
12158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        GL_TEXTURE_2D,
12168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Size(4, 4), gfx::Rect(0, 0, 4, 4), gfx::Size(4, 4),
12178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        base::TimeDelta(),
12188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        VideoFrame::ReadPixelsCB(),
12198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        base::Closure());
12208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scaled_hw_video_frame_ = VideoFrame::WrapNativeTexture(
12218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        new VideoFrame::MailboxHolder(
12228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            mailbox,
12238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            sync_point,
12248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            VideoFrame::MailboxHolder::TextureNoLongerNeededCallback()),
12258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        GL_TEXTURE_2D,
12268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Size(4, 4), gfx::Rect(0, 0, 3, 2), gfx::Size(4, 4),
12278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        base::TimeDelta(),
12288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        VideoFrame::ReadPixelsCB(),
12298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        base::Closure());
12308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
12318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    color_frame_provider_.set_frame(color_video_frame_);
12328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    hw_frame_provider_.set_frame(hw_video_frame_);
12338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scaled_hw_frame_provider_.set_frame(scaled_hw_video_frame_);
12348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1235a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (!delegating_renderer()) {
1236a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      // TODO(danakj): IOSurface layer can not be transported. crbug.com/239335
12374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      scoped_refptr<IOSurfaceLayer> io_surface = IOSurfaceLayer::Create();
12384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      io_surface->SetBounds(gfx::Size(10, 10));
12394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      io_surface->SetAnchorPoint(gfx::PointF());
12404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      io_surface->SetIsDrawable(true);
12414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      io_surface->SetIOSurfaceProperties(1, gfx::Size(10, 10));
12424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      root->AddChild(io_surface);
1243a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Enable the hud.
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeDebugState debug_state;
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    debug_state.show_property_changed_rects = true;
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetDebugState(debug_state);
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<PaintedScrollbarLayer> scrollbar =
12513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        PaintedScrollbarLayer::Create(
12524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            scoped_ptr<Scrollbar>(new FakeScrollbar).Pass(), content->id());
12534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scrollbar->SetBounds(gfx::Size(10, 10));
12544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scrollbar->SetAnchorPoint(gfx::PointF());
12554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scrollbar->SetIsDrawable(true);
12564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root->AddChild(scrollbar);
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root);
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(host_impl);
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() == 3) {
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // On the third commit we're recovering from context loss. Hardware
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // video frames should not be reused by the VideoFrameProvider, but
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // software frames can be.
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      hw_frame_provider_.set_frame(NULL);
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scaled_hw_frame_provider_.set_frame(NULL);
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
1277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     LayerTreeHostImpl::FrameData* frame,
1278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     bool result) OVERRIDE {
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() == 2) {
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Lose the context during draw on the second commit. This will cause
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // a third commit to recover.
12824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      context3d_->set_times_bind_texture_succeeds(0);
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual scoped_ptr<OutputSurface> CreateOutputSurface(
12884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      bool fallback) OVERRIDE {
12894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (layer_tree_host()) {
12904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      lost_context_ = true;
12914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_EQ(layer_tree_host()->source_frame_number(), 3);
12924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
12934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return LayerTreeHostContextTest::CreateOutputSurface(fallback);
12944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
12954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(layer_tree_host()->hud_layer());
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // End the test once we know the 3nd frame drew.
12994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (layer_tree_host()->source_frame_number() < 4) {
13004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      layer_tree_host()->root_layer()->SetNeedsDisplay();
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_tree_host()->SetNeedsCommit();
13024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    } else {
13034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EndTest();
13044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
13084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_TRUE(lost_context_);
13094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
13134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool lost_context_;
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  FakeOutputSurfaceClient output_surface_client_;
13168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<FakeOutputSurface> child_output_surface_;
13178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<ResourceProvider> child_resource_provider_;
13188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedFrameResourceCollection>
13204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      delegated_resource_collection_;
13214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedFrameProvider> delegated_frame_provider_;
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoFrame> color_video_frame_;
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoFrame> hw_video_frame_;
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<VideoFrame> scaled_hw_video_frame_;
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeVideoFrameProvider color_frame_provider_;
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeVideoFrameProvider hw_frame_provider_;
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeVideoFrameProvider scaled_hw_frame_provider_;
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestDontUseLostResources);
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLosesFirstOutputSurface
1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostContextTestLosesFirstOutputSurface() {
1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Always fail. This needs to be set before LayerTreeHost is created.
1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_to_lose_on_create_ = 1000;
1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1348b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(succeeded);
1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If we make it this far without crashing, we pass!
1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(false);
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestLosesFirstOutputSurface);
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds
1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_to_fail_initialize_ = 2;
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds);
1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestRetryWorksWithForcedInit
1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds {
1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidFailToInitializeOutputSurface() OVERRIDE {
1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds
1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ::DidFailToInitializeOutputSurface();
1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (times_create_failed_ == 1) {
1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // CompositeAndReadback force recreates the output surface, which should
1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // fail.
1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      char pixels[4];
1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_FALSE(layer_tree_host()->CompositeAndReadback(
1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            &pixels, gfx::Rect(1, 1)));
1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestRetryWorksWithForcedInit);
1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestCompositeAndReadbackBeforeOutputSurfaceInit
1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This must be called immediately after creating LTH, before the first
1406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // OutputSurface is initialized.
1407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(layer_tree_host()->output_surface_lost());
1408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_output_surface_created_ = 0;
1410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Post the SetNeedsCommit before the readback to make sure it is run
14121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // on the main thread before the readback's replacement commit when
14131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // we have a threaded compositor.
14141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
14151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    char pixels[4];
1417a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    bool result = layer_tree_host()->CompositeAndReadback(
1418a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        &pixels, gfx::Rect(1, 1));
1419a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_EQ(!delegating_renderer(), result);
1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, times_output_surface_created_);
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1423b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
1424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(succeeded);
1425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++times_output_surface_created_;
1426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {
1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Should not try to create output surface again after successfully
1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // created by CompositeAndReadback.
1435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, times_output_surface_created_);
1436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
143858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
143958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     LayerTreeHostImpl::FrameData* frame_data,
144058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     bool result) OVERRIDE {
144158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_GE(host_impl->active_tree()->source_frame_number(), 0);
144258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_LE(host_impl->active_tree()->source_frame_number(), 1);
144358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return true;
144458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
144558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
144658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
144758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only draw for the readback and the replacement commit.
144858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // The replacement commit will also be the first commit after output
144958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // surface initialization.
145058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_GE(host_impl->active_tree()->source_frame_number(), 0);
145158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_LE(host_impl->active_tree()->source_frame_number(), 1);
145258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
145358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
145458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
145558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   bool result) OVERRIDE {
145658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only swap for the replacement commit.
145758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(host_impl->active_tree()->source_frame_number(), 1);
145858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
145958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
146058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int times_output_surface_created_;
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostContextTestCompositeAndReadbackBeforeOutputSurfaceInit);
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
146858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This test verifies that losing an output surface during a
146958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// simultaneous readback and forced redraw works and does not deadlock.
147058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostContextTestLoseOutputSurfaceDuringReadbackAndForcedDraw
147158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public LayerTreeHostContextTest {
147258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
147358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kFirstOutputSurfaceInitSourceFrameNumber = 0;
147458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kReadbackSourceFrameNumber = 1;
147558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kReadbackReplacementSourceFrameNumber = 2;
147658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kSecondOutputSurfaceInitSourceFrameNumber = 3;
147758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
147858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeHostContextTestLoseOutputSurfaceDuringReadbackAndForcedDraw()
147958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : did_react_to_first_commit_(false) {}
148058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
148158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
148258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // This enables forced draws after a single prepare to draw failure.
148358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings->timeout_and_draw_when_animation_checkerboards = true;
148458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings->maximum_number_of_failed_draws_before_draw_is_forced_ = 1;
148558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
148658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
148758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
148858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
148958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
149058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     LayerTreeHostImpl::FrameData* frame_data,
149158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     bool result) OVERRIDE {
149258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
149358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kFirstOutputSurfaceInitSourceFrameNumber ||
149458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kSecondOutputSurfaceInitSourceFrameNumber ||
149558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackSourceFrameNumber)
149658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
149758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
149858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Before we react to the failed draw by initiating the forced draw
149958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // sequence, start a readback on the main thread and then lose the context
150058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // to start output surface initialization all at the same time.
150158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (sfn == kFirstOutputSurfaceInitSourceFrameNumber &&
150258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        !did_react_to_first_commit_) {
150358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      did_react_to_first_commit_ = true;
150458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      PostReadbackToMainThread();
150558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      LoseContext();
150658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
150758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
150858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return false;
150958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
151058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
151158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl,
151258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                           bool success) OVERRIDE {
151358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // -1 is for the first output surface initialization.
151458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
151558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == -1 || sfn == kReadbackReplacementSourceFrameNumber)
151658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
151758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
151858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
151958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
152058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only draw the first commit after output surface initialization
152158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // and attempt to draw the readback commit (which will fail).
152258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // All others should abort because the output surface is lost.
152358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
152458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kSecondOutputSurfaceInitSourceFrameNumber ||
152558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackSourceFrameNumber)
152658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
152758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
152858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
152958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
153058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   bool result) OVERRIDE {
153158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only swap the first commit after the second output surface
153258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // initialization.
153358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
153458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kSecondOutputSurfaceInitSourceFrameNumber) << sfn;
153558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
153658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
153758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
153858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
153958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
154058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int did_react_to_first_commit_;
154158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
154258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
154358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F(
154458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTestLoseOutputSurfaceDuringReadbackAndForcedDraw);
154558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
154658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This test verifies that losing an output surface right before a
154758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// simultaneous readback and forced redraw works and does not deadlock.
154858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostContextTestReadbackWithForcedDrawAndOutputSurfaceInit
154958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public LayerTreeHostContextTest {
155058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
155158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kFirstOutputSurfaceInitSourceFrameNumber = 0;
155258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kReadbackSourceFrameNumber = 1;
155358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kForcedDrawCommitSourceFrameNumber = 2;
155458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const int kSecondOutputSurfaceInitSourceFrameNumber = 2;
155558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
155658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeHostContextTestReadbackWithForcedDrawAndOutputSurfaceInit()
155758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : did_lose_context_(false) {}
155858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
155958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
156058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // This enables forced draws after a single prepare to draw failure.
156158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings->timeout_and_draw_when_animation_checkerboards = true;
156258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings->maximum_number_of_failed_draws_before_draw_is_forced_ = 1;
156358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
156458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
156558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
156658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
156758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
156858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     LayerTreeHostImpl::FrameData* frame_data,
156958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     bool result) OVERRIDE {
157058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
157158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kFirstOutputSurfaceInitSourceFrameNumber ||
157258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kSecondOutputSurfaceInitSourceFrameNumber ||
157358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackSourceFrameNumber)
157458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
157558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
157658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Before we react to the failed draw by initiating the forced draw
157758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // sequence, start a readback on the main thread and then lose the context
157858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // to start output surface initialization all at the same time.
157958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (sfn == kFirstOutputSurfaceInitSourceFrameNumber && !did_lose_context_) {
158058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      did_lose_context_ = true;
158158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      LoseContext();
158258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
158358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
158458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Returning false will result in a forced draw.
158558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return false;
158658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
158758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
158858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
158958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(succeeded);
159058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (layer_tree_host()->source_frame_number() > 0) {
159158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Perform a readback right after the second output surface
159258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // initialization.
159358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      char pixels[4];
159458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1));
159558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
159658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
159758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
159858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl,
159958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                           bool success) OVERRIDE {
160058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // -1 is for the first output surface initialization.
160158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
160258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == -1 || sfn == kFirstOutputSurfaceInitSourceFrameNumber)
160358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
160458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
160558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
160658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
160758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only draw the first commit after output surface initialization
160858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // and attempt to draw the readback commit (which will fail).
160958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // All others should abort because the output surface is lost.
161058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
161158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kForcedDrawCommitSourceFrameNumber ||
161258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                sfn == kReadbackSourceFrameNumber)
161358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        << sfn;
161458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
161558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
161658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
161758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   bool result) OVERRIDE {
161858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We should only swap the first commit after the second output surface
161958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // initialization.
162058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int sfn = host_impl->active_tree()->source_frame_number();
162158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(sfn == kForcedDrawCommitSourceFrameNumber) << sfn;
162258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
162358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
162458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
162558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
162658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
162758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int did_lose_context_;
162858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
162958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
163058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F(
163158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTestReadbackWithForcedDrawAndOutputSurfaceInit);
163258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ImplSidePaintingLayerTreeHostContextTest
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostContextTest {
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings->impl_side_painting = true;
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestImplSidePainting
1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public ImplSidePaintingLayerTreeHostContextTest {
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<Layer> root = Layer::Create();
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->SetBounds(gfx::Size(10, 10));
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->SetAnchorPoint(gfx::PointF());
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->SetIsDrawable(true);
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<PictureLayer> picture = PictureLayer::Create(&client_);
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    picture->SetBounds(gfx::Size(10, 10));
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    picture->SetAnchorPoint(gfx::PointF());
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    picture->SetIsDrawable(true);
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->AddChild(picture);
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root);
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_to_lose_during_commit_ = 1;
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1667b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(succeeded);
16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeContentLayerClient client_;
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostContextTestImplSidePainting);
16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScrollbarLayerLostContext : public LayerTreeHostContextTest {
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollbarLayerLostContext() : commits_(0) {}
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<Layer> scroll_layer = Layer::Create();
16843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scrollbar_layer_ = FakePaintedScrollbarLayer::Create(
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        false, true, scroll_layer->id());
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scrollbar_layer_->SetBounds(gfx::Size(10, 100));
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(scrollbar_layer_);
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(scroll_layer);
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++commits_;
1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (commits_) {
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // First (regular) update, we should upload 2 resources (thumb, and
17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // backtrack).
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1, scrollbar_layer_->update_count());
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoseContext();
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Second update, after the lost context, we should still upload 2
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // resources even if the contents haven't changed.
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2, scrollbar_layer_->update_count());
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
171158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 3:
171258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Single thread proxy issues extra commits after context lost.
171358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // http://crbug.com/287250
171458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (HasImplThread())
171558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          NOTREACHED();
171658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default:
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTREACHED();
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int commits_;
17243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<FakePaintedScrollbarLayer> scrollbar_layer_;
17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(ScrollbarLayerLostContext);
1728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestFailsToCreateSurface
1730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public LayerTreeHostContextTest {
1731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostContextTestFailsToCreateSurface()
1733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : LayerTreeHostContextTest(),
1734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        failure_count_(0) {
1735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_to_lose_on_create_ = 10;
1736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
1740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1744b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool success) OVERRIDE {
1745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(success);
1746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, failure_count_);
1747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    times_to_lose_on_create_ = 0;
1748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    failure_count_++;
1749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Normally, the embedder should stop trying to use the compositor at
1750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // this point, but let's force it back into action when we shouldn't.
1751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    char pixels[4];
1752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(
1753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        layer_tree_host()->CompositeAndReadback(pixels, gfx::Rect(1, 1)));
1754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If we've made it this far without crashing, we've succeeded.
1755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTest();
1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int failure_count_;
1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1762a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1763a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LayerTreeHostContextTestFailsToCreateSurface);
1764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Not reusing LayerTreeTest because it expects creating LTH to always succeed.
1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface
1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public testing::Test,
1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      public FakeLayerTreeHostClient {
1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface()
1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : FakeLayerTreeHostClient(FakeLayerTreeHostClient::DIRECT_3D) {}
1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1773a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // FakeLayerTreeHostClient implementation.
1774a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual scoped_ptr<OutputSurface> CreateOutputSurface(bool fallback)
1775a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      OVERRIDE {
1776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return scoped_ptr<OutputSurface>();
1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1779a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void RunTest(bool threaded,
1780a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)               bool delegating_renderer,
1781a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)               bool impl_side_painting) {
1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<base::Thread> impl_thread;
1783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (threaded) {
1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      impl_thread.reset(new base::Thread("LayerTreeTest"));
1785eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ASSERT_TRUE(impl_thread->Start());
1786eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ASSERT_TRUE(impl_thread->message_loop_proxy().get());
1787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeSettings settings;
1790a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    settings.impl_side_painting = impl_side_painting;
1791eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<LayerTreeHost> layer_tree_host = LayerTreeHost::Create(
1792eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        this,
17931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        NULL,
1794eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        settings,
1795eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        impl_thread ? impl_thread->message_loop_proxy() : NULL);
1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(layer_tree_host);
1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface);
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1803a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class UIResourceLostTest : public LayerTreeHostContextTest {
1804a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
1805a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceLostTest() : time_step_(0) {}
18060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
18070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    settings->texture_id_allocation_chunk_size = 1;
18080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1809a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
1810a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
1811a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
181258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // This is called on the main thread after each commit and
181358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // DidActivateTreeOnThread, with the value of time_step_ at the time
181458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // of the call to DidActivateTreeOnThread. Similar tests will do
181558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // work on the main thread in DidCommit but that is unsuitable because
181658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // the main thread work for these tests must happen after
181758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // DidActivateTreeOnThread, which happens after DidCommit with impl-side
181858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // painting.
181958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int time_step) = 0;
182058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
182158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Called after DidActivateTreeOnThread. If this is done during the commit,
182258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // the call to StepCompleteOnMainThread will not occur until after
182358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // the commit completes, because the main thread is blocked.
182458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void PostStepCompleteToMainThread() {
182558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    proxy()->MainThreadTaskRunner()->PostTask(
182658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        FROM_HERE,
182758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(
182858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            &UIResourceLostTest::StepCompleteOnMainThreadInternal,
182958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            base::Unretained(this),
183058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            time_step_));
183158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
183258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
183358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void PostLoseContextToImplThread() {
183458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
183558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::SingleThreadTaskRunner* task_runner =
183658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        HasImplThread() ? ImplThreadTaskRunner()
183758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        : base::MessageLoopProxy::current();
183858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    task_runner->PostTask(
183958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        FROM_HERE,
184058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(
184158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            &LayerTreeHostContextTest::LoseContext,
184258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            base::Unretained(this)));
184358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
184458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1845a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected:
1846a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int time_step_;
1847a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<FakeScopedUIResource> ui_resource_;
184858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
184958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
185058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void StepCompleteOnMainThreadInternal(int step) {
185158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
185258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    StepCompleteOnMainThread(step);
185358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
1854a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
1855a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
185658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostTestSimple : public UIResourceLostTest {
1857a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
185858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // This is called when the commit is complete and the new layer tree has been
185958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // activated.
186058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) = 0;
186158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1862a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void CommitCompleteOnThread(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)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
187158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (layer_tree_host()->settings().impl_side_painting) {
187258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      StepCompleteOnImplThread(impl);
187358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      PostStepCompleteToMainThread();
187458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ++time_step_;
187558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
187658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
187758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
187858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
187958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Losing context after an UI resource has been created.
188058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostAfterCommit : public UIResourceLostTestSimple {
188158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
188258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int step) OVERRIDE {
188358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
188458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (step) {
1885a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 0:
1886a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
1887a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Expects a valid UIResourceId.
1888a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_NE(0, ui_resource_->id());
1889a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
1890a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
189158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 4:
189258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Release resource before ending the test.
189358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ui_resource_.reset();
189458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EndTest();
189558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
189658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 5:
189758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Single thread proxy issues extra commits after context lost.
189858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // http://crbug.com/287250
189958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (HasImplThread())
190058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          NOTREACHED();
190158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
190258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 6:
190358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NOTREACHED();
190458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
190558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
190658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
190758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE {
190858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
190958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (time_step_) {
1910a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
1911a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource should have been created on LTHI after the commit.
191258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1913a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
1914a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1915a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 2:
1916a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        LoseContext();
1917a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1918a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
1919a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resources should have been recreated. The bitmap callback should
1920a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // have been called once with the resource_lost flag set to true.
1921a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(1, ui_resource_->lost_resource_count);
1922a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Resource Id on the impl-side have been recreated as well. Note
1923a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // that the same UIResourceId persists after the context lost.
192458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1925a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
1926a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1927a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
1928a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
1929a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
1930a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1931a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostAfterCommit);
1932a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1933a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Losing context before UI resource requests can be commited.  Three sequences
1934a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// of creation/deletion are considered:
1935a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 1. Create one resource -> Context Lost => Expect the resource to have been
1936a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// created.
1937a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 2. Delete an exisiting resource (test_id0_) -> create a second resource
1938a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// (test_id1_) -> Context Lost => Expect the test_id0_ to be removed and
1939a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// test_id1_ to have been created.
1940a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 3. Create one resource -> Delete that same resource -> Context Lost => Expect
1941a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// the resource to not exist in the manager.
194258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostBeforeCommit : public UIResourceLostTestSimple {
1943a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
1944a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceLostBeforeCommit()
1945a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      : test_id0_(0),
1946a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        test_id1_(0) {}
1947a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
194858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int step) OVERRIDE {
194958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (step) {
1950a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 0:
1951a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
195258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Lose the context on the impl thread before the commit.
195358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostLoseContextToImplThread();
1954a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1955a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 2:
1956a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Sequence 2:
1957a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Currently one resource has been created.
1958a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        test_id0_ = ui_resource_->id();
1959a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Delete this resource.
1960a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_.reset();
1961a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Create another resource.
1962a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
1963a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        test_id1_ = ui_resource_->id();
1964a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Sanity check that two resource creations return different ids.
1965a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_NE(test_id0_, test_id1_);
196658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Lose the context on the impl thread before the commit.
196758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostLoseContextToImplThread();
1968a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1969a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
1970a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Clear the manager of resources.
1971a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_.reset();
1972a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
1973a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1974a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 4:
1975a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Sequence 3:
1976a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
1977a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        test_id0_ = ui_resource_->id();
1978a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Sanity check the UIResourceId should not be 0.
1979a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_NE(0, test_id0_);
1980a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // Usually ScopedUIResource are deleted from the manager in their
1981a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // destructor (so usually ui_resource_.reset()).  But here we need
1982a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // ui_resource_ for the next step, so call DeleteUIResource directly.
1983a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        layer_tree_host()->DeleteUIResource(test_id0_);
198458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Delete the resouce and then lose the context.
198558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostLoseContextToImplThread();
1986a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1987a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 5:
198858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Release resource before ending the test.
1989a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_.reset();
1990a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EndTest();
1991a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
199258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 6:
199358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Single thread proxy issues extra commits after context lost.
199458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // http://crbug.com/287250
199558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (HasImplThread())
199658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          NOTREACHED();
199758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
199858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 8:
199958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NOTREACHED();
2000a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
2001a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2002a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
200358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE {
200458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
2005a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (time_step_) {
2006a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
200758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Sequence 1 (continued):
200858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The first context lost happens before the resources were created,
200958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // and because it resulted in no resources being destroyed, it does not
201058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // trigger resource re-creation.
201158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
201258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
201358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Resource Id on the impl-side has been created.
201458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
2015a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2016a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
201758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Sequence 2 (continued):
201858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The previous resource should have been deleted.
201958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_));
202058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (HasImplThread()) {
202158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          // The second resource should have been created.
2022a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_));
202358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        } else {
202458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          // The extra commit that happens at context lost in the single thread
202558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          // proxy changes the timing so that the resource has been destroyed.
202658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          // http://crbug.com/287250
202758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id1_));
2028a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        }
202958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The second resource called the resource callback once and since the
203058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // context is lost, a "resource lost" callback was also issued.
203158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(2, ui_resource_->resource_create_count);
203258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->lost_resource_count);
2033a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2034a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 5:
203558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Sequence 3 (continued):
203658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Expect the resource callback to have been called once.
203758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
203858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // No "resource lost" callbacks.
203958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
204058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The UI resource id should not be valid
204158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_));
2042a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2043a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
2044a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2045a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2046a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
2047a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceId test_id0_;
2048a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceId test_id1_;
2049a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
2050a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2051a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostBeforeCommit);
2052a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2053a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Losing UI resource before the pending trees is activated but after the
2054a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// commit.  Impl-side-painting only.
2055a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class UIResourceLostBeforeActivateTree : public UIResourceLostTest {
205658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int step) OVERRIDE {
205758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
205858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (step) {
2059a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 0:
2060a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
2061a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
2062a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2063a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
2064a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        test_id_ = ui_resource_->id();
2065a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ui_resource_.reset();
2066a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        PostSetNeedsCommitToMainThread();
2067a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2068a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 5:
206958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Release resource before ending the test.
207058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ui_resource_.reset();
2071a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EndTest();
2072a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
207358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 6:
207458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Make sure no extra commits happened.
207558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NOTREACHED();
2076a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
2077a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2078a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
207958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
208058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
2081a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (time_step_) {
208258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 2:
208358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
2084a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
208558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 4:
208658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
208758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
208858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
208958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
209058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
209158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
209258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (time_step_) {
2093a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
2094a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource creation callback has been called.
2095a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
2096a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource is not yet lost (sanity check).
2097a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
2098a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource should not have been created yet on the impl-side.
2099a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
2100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        LoseContext();
2101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 3:
2103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        LoseContext();
2104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
2106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
2109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LayerTreeHostContextTest::DidActivateTreeOnThread(impl);
2110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    switch (time_step_) {
2111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 1:
2112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The pending requests on the impl-side should have been processed.
2113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
2114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 2:
2116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The "lost resource" callback should have been called once.
2117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(1, ui_resource_->lost_resource_count);
2118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case 4:
2120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // The resource is deleted and should not be in the manager.  Use
2121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        // test_id_ since ui_resource_ has been deleted.
2122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id_));
2123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
2124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
212558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
212658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PostStepCompleteToMainThread();
2127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ++time_step_;
2128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
2131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceId test_id_;
2132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
2133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(UIResourceLostBeforeActivateTree,
2135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)       RunMultiThread_DirectRenderer_ImplSidePaint) {
2136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RunTest(true, false, true);
2137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
2138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(UIResourceLostBeforeActivateTree,
2140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)       RunMultiThread_DelegatingRenderer_ImplSidePaint) {
2141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RunTest(true, true, true);
2142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
2143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
214458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Resources evicted explicitly and by visibility changes.
214558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostEviction : public UIResourceLostTestSimple {
214658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
214758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnMainThread(int step) OVERRIDE {
214858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
214958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (step) {
215058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 0:
215158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
215258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0, ui_resource_->id());
215358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
215458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
215558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 2:
215658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Make the tree not visible.
215758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PostSetVisibleToMainThread(false);
215858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
215958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 3:
216058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Release resource before ending the test.
216158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ui_resource_.reset();
216258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EndTest();
216358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
216458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 4:
216558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NOTREACHED();
216658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
216758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
216858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
216958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* impl,
217058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       bool visible) OVERRIDE {
217158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(
217258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        impl->output_surface()->context_provider()->Context3d());
217358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!visible) {
217458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // All resources should have been evicted.
217558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ASSERT_EQ(0u, context->NumTextures());
217658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
217758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_EQ(2, ui_resource_->resource_create_count);
217858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_EQ(1, ui_resource_->lost_resource_count);
217958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Drawing is disabled both because of the evicted resources and
218058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // because the renderer is not visible.
218158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_FALSE(impl->CanDraw());
218258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Make the renderer visible again.
218358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      PostSetVisibleToMainThread(true);
218458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
218558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
218658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
218758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE {
218858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(
218958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        impl->output_surface()->context_provider()->Context3d());
219058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
219158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (time_step_) {
219258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 1:
219358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The resource should have been created on LTHI after the commit.
219458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ASSERT_EQ(1u, context->NumTextures());
219558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
219658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
219758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
219858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_TRUE(impl->CanDraw());
219958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Evict all UI resources. This will trigger a commit.
220058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        impl->EvictAllUIResources();
220158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ASSERT_EQ(0u, context->NumTextures());
220258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
220358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->resource_create_count);
220458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(0, ui_resource_->lost_resource_count);
220558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_FALSE(impl->CanDraw());
220658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
220758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 2:
220858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The resource should have been recreated.
220958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ASSERT_EQ(1u, context->NumTextures());
221058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
221158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(2, ui_resource_->resource_create_count);
221258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(1, ui_resource_->lost_resource_count);
221358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_TRUE(impl->CanDraw());
221458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
221558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case 3:
221658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // The resource should have been recreated after visibility was
221758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // restored.
221858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ASSERT_EQ(1u, context->NumTextures());
221958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
222058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(3, ui_resource_->resource_create_count);
222158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(2, ui_resource_->lost_resource_count);
222258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_TRUE(impl->CanDraw());
222358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
222458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
222558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
222658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
222758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
222858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostEviction);
222958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostContextTestSurfaceCreateCallback
22314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostContextTest {
22324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
22334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerTreeHostContextTestSurfaceCreateCallback()
22344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : LayerTreeHostContextTest(),
22354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        layer_(FakeContentLayer::Create(&client_)),
22364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        num_commits_(0) {}
22374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
22394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_->SetBounds(gfx::Size(10, 20));
22404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_tree_host()->SetRootLayer(layer_);
22414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostContextTest::SetupTree();
22424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
22454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
22464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
22494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (num_commits_) {
22504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 0:
22514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(1u, layer_->output_surface_created_count());
22524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
22534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
22554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(1u, layer_->output_surface_created_count());
22564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
22574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
22594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(1u, layer_->output_surface_created_count());
22604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
22624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(2u, layer_->output_surface_created_count());
22634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
22644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
22664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ++num_commits_;
22674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
22704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostContextTest::CommitCompleteOnThread(impl);
22714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (num_commits_) {
22724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 0:
22734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
22754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
22774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        LoseContext();
22784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
22804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
22814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
22834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
22864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_TRUE(succeeded);
22874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AfterTest() OVERRIDE {}
22904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
22924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeContentLayerClient client_;
22934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<FakeContentLayer> layer_;
22944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int num_commits_;
22954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
22964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestSurfaceCreateCallback);
22984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
2301