Re-subimission of https://codereview.chromium.org/1041213003/
[chromium-blink-merge.git] / content / browser / compositor / image_transport_factory_browsertest.cc
blob327db05f62ff41a4e79f6a620c3090859597c447
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/browser/compositor/image_transport_factory.h"
7 #include "base/run_loop.h"
8 #include "cc/output/context_provider.h"
9 #include "content/browser/compositor/owned_mailbox.h"
10 #include "content/public/browser/gpu_data_manager.h"
11 #include "content/public/test/content_browser_test.h"
12 #include "gpu/GLES2/gl2extchromium.h"
13 #include "gpu/command_buffer/client/gles2_interface.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "ui/compositor/compositor.h"
17 namespace content {
18 namespace {
20 typedef ContentBrowserTest ImageTransportFactoryBrowserTest;
22 class MockImageTransportFactoryObserver : public ImageTransportFactoryObserver {
23 public:
24 MOCK_METHOD0(OnLostResources, void());
27 // This crashes on Mac ASAN: http://crbug.com/335083
28 // Flaky on ChromeOS: crbug.com/394083
29 #if defined(OS_MACOSX) || defined(OS_CHROMEOS)
30 #define MAYBE_TestLostContext DISABLED_TestLostContext
31 #else
32 #define MAYBE_TestLostContext TestLostContext
33 #endif
34 // Checks that upon context loss, the observer is called and the created
35 // resources are reset.
36 IN_PROC_BROWSER_TEST_F(ImageTransportFactoryBrowserTest,
37 MAYBE_TestLostContext) {
38 // This test doesn't make sense in software compositing mode.
39 if (!GpuDataManager::GetInstance()->CanUseGpuBrowserCompositor())
40 return;
42 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
44 scoped_refptr<OwnedMailbox> mailbox =
45 new OwnedMailbox(factory->GetGLHelper());
46 EXPECT_FALSE(mailbox->mailbox().IsZero());
48 MockImageTransportFactoryObserver observer;
49 factory->AddObserver(&observer);
51 base::RunLoop run_loop;
52 EXPECT_CALL(observer, OnLostResources())
53 .WillOnce(testing::InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
55 ui::ContextFactory* context_factory = factory->GetContextFactory();
56 gpu::gles2::GLES2Interface* gl =
57 context_factory->SharedMainThreadContextProvider()->ContextGL();
58 gl->LoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
59 GL_INNOCENT_CONTEXT_RESET_ARB);
61 // We have to flush to make sure that the client side gets a chance to notice
62 // the context is gone.
63 gl->Flush();
65 run_loop.Run();
66 EXPECT_TRUE(mailbox->mailbox().IsZero());
68 factory->RemoveObserver(&observer);
71 class ImageTransportFactoryTearDownBrowserTest : public ContentBrowserTest {
72 public:
73 ImageTransportFactoryTearDownBrowserTest() {}
75 void TearDown() override {
76 if (mailbox_.get())
77 EXPECT_TRUE(mailbox_->mailbox().IsZero());
78 ContentBrowserTest::TearDown();
81 protected:
82 scoped_refptr<OwnedMailbox> mailbox_;
85 // This crashes on Mac. ImageTransportFactory is NULL unless
86 // --enable-delegated-renderer is passed, and after that, we'd need to spawn a
87 // renderer and get a frame before we create a browser compositor, necessary for
88 // the GLHelper to not be NULL.
89 // http://crbug.com/335083
90 #if defined(OS_MACOSX)
91 #define MAYBE_LoseOnTearDown DISABLED_LoseOnTearDown
92 #else
93 #define MAYBE_LoseOnTearDown LoseOnTearDown
94 #endif
95 // Checks that upon destruction of the ImageTransportFactory, the observer is
96 // called and the created resources are reset.
97 IN_PROC_BROWSER_TEST_F(ImageTransportFactoryTearDownBrowserTest,
98 MAYBE_LoseOnTearDown) {
99 // This test doesn't make sense in software compositing mode.
100 if (!GpuDataManager::GetInstance()->CanUseGpuBrowserCompositor())
101 return;
102 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
103 GLHelper* helper = factory->GetGLHelper();
104 ASSERT_TRUE(helper);
105 mailbox_ = new OwnedMailbox(helper);
106 EXPECT_FALSE(mailbox_->mailbox().IsZero());
109 } // anonymous namespace
110 } // namespace content