Index: content/browser/gpu/gpu_ipc_browsertests.cc |
diff --git a/content/browser/gpu/gpu_ipc_browsertests.cc b/content/browser/gpu/gpu_ipc_browsertests.cc |
index 016e49169b5bd5058eef4dfbef3255e73d928633..64f56a55fbe46d60c59bca1e9aaa378d80e43cf1 100644 |
--- a/content/browser/gpu/gpu_ipc_browsertests.cc |
+++ b/content/browser/gpu/gpu_ipc_browsertests.cc |
@@ -44,14 +44,21 @@ scoped_refptr<content::ContextProviderCommandBuffer> CreateContext( |
nullptr, content::command_buffer_metrics::OFFSCREEN_CONTEXT_FOR_TESTING)); |
} |
-class ContextTestBase : public content::ContentBrowserTest { |
+void OnEstablishedGpuChannel( |
+ const base::Closure& quit_closure, |
+ scoped_refptr<gpu::GpuChannelHost>* retvalue, |
+ scoped_refptr<gpu::GpuChannelHost> established_host) { |
+ if (retvalue) |
+ *retvalue = std::move(established_host); |
+ quit_closure.Run(); |
+} |
+ |
+class EstablishGpuChannelHelper { |
public: |
- void SetUpOnMainThread() override { |
- // This may leave the provider_ null in some cases, so tests need to early |
- // out. |
- if (!content::BrowserGpuChannelHostFactory::CanUseForTesting()) |
- return; |
+ EstablishGpuChannelHelper() {} |
+ ~EstablishGpuChannelHelper() {} |
+ scoped_refptr<gpu::GpuChannelHost> EstablishGpuChannelSyncRunLoop() { |
if (!content::BrowserGpuChannelHostFactory::instance()) |
content::BrowserGpuChannelHostFactory::Initialize(true); |
@@ -59,10 +66,29 @@ class ContextTestBase : public content::ContentBrowserTest { |
content::BrowserGpuChannelHostFactory::instance(); |
CHECK(factory); |
base::RunLoop run_loop; |
- factory->EstablishGpuChannel(kInitCause, run_loop.QuitClosure()); |
+ factory->EstablishGpuChannel( |
+ kInitCause, base::Bind(&OnEstablishedGpuChannel, run_loop.QuitClosure(), |
+ &gpu_channel_host_)); |
run_loop.Run(); |
- scoped_refptr<gpu::GpuChannelHost> gpu_channel_host( |
- factory->GetGpuChannel()); |
+ return std::move(gpu_channel_host_); |
+ } |
+ |
+ private: |
+ scoped_refptr<gpu::GpuChannelHost> gpu_channel_host_; |
+ DISALLOW_COPY_AND_ASSIGN(EstablishGpuChannelHelper); |
+}; |
+ |
+class ContextTestBase : public content::ContentBrowserTest { |
+ public: |
+ void SetUpOnMainThread() override { |
+ // This may leave the provider_ null in some cases, so tests need to early |
+ // out. |
+ if (!content::BrowserGpuChannelHostFactory::CanUseForTesting()) |
+ return; |
+ |
+ EstablishGpuChannelHelper helper; |
+ scoped_refptr<gpu::GpuChannelHost> gpu_channel_host = |
+ helper.EstablishGpuChannelSyncRunLoop(); |
CHECK(gpu_channel_host); |
provider_ = CreateContext(std::move(gpu_channel_host)); |
@@ -123,27 +149,30 @@ class BrowserGpuChannelHostFactoryTest : public ContentBrowserTest { |
callback.Run(); |
} |
+ void Signal(bool* event, |
+ scoped_refptr<gpu::GpuChannelHost> gpu_channel_host) { |
+ CHECK_EQ(*event, false); |
+ *event = true; |
+ gpu_channel_host_ = std::move(gpu_channel_host); |
+ } |
+ |
protected: |
BrowserGpuChannelHostFactory* GetFactory() { |
return BrowserGpuChannelHostFactory::instance(); |
} |
bool IsChannelEstablished() { |
- return GetFactory()->GetGpuChannel() != NULL; |
+ return gpu_channel_host_ && !gpu_channel_host_->IsLost(); |
} |
void EstablishAndWait() { |
- base::RunLoop run_loop; |
- GetFactory()->EstablishGpuChannel(kInitCause, run_loop.QuitClosure()); |
- run_loop.Run(); |
+ EstablishGpuChannelHelper helper; |
+ gpu_channel_host_ = helper.EstablishGpuChannelSyncRunLoop(); |
} |
- gpu::GpuChannelHost* GetGpuChannel() { return GetFactory()->GetGpuChannel(); } |
+ gpu::GpuChannelHost* GetGpuChannel() { return gpu_channel_host_.get(); } |
- static void Signal(bool *event) { |
- CHECK_EQ(*event, false); |
- *event = true; |
- } |
+ scoped_refptr<gpu::GpuChannelHost> gpu_channel_host_; |
}; |
// Test fails on Chromeos + Mac, flaky on Windows because UI Compositor |
@@ -170,7 +199,9 @@ IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, |
MAYBE_EstablishAndTerminate) { |
DCHECK(!IsChannelEstablished()); |
base::RunLoop run_loop; |
- GetFactory()->EstablishGpuChannel(kInitCause, run_loop.QuitClosure()); |
+ GetFactory()->EstablishGpuChannel( |
+ kInitCause, |
+ base::Bind(&OnEstablishedGpuChannel, run_loop.QuitClosure(), nullptr)); |
GetFactory()->Terminate(); |
// The callback should still trigger. |
@@ -194,8 +225,8 @@ IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, |
// Expect established callback immediately. |
bool event = false; |
GetFactory()->EstablishGpuChannel( |
- kInitCause, |
- base::Bind(&BrowserGpuChannelHostFactoryTest::Signal, &event)); |
+ kInitCause, base::Bind(&BrowserGpuChannelHostFactoryTest::Signal, |
+ base::Unretained(this), &event)); |
EXPECT_TRUE(event); |
EXPECT_EQ(gpu_channel.get(), GetGpuChannel()); |
} |
@@ -258,7 +289,7 @@ IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, |
// Test fails on Chromeos + Mac, flaky on Windows because UI Compositor |
// establishes a GPU channel. |
#if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
-#define MAYBE_CrashAndRecover |
+#define MAYBE_CrashAndRecover CrashAndRecover |
#else |
#define MAYBE_CrashAndRecover DISABLED_CrashAndRecover |
#endif |