| 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 398282381f0344504a3e4eb9db881110d424e701..7394f6d36496b238811f066b45cade598be4f78a 100644
|
| --- a/content/browser/gpu/gpu_ipc_browsertests.cc
|
| +++ b/content/browser/gpu/gpu_ipc_browsertests.cc
|
| @@ -6,6 +6,7 @@
|
| #include "base/memory/ptr_util.h"
|
| #include "base/run_loop.h"
|
| #include "build/build_config.h"
|
| +#include "content/browser/compositor/image_transport_factory.h"
|
| #include "content/browser/gpu/browser_gpu_channel_host_factory.h"
|
| #include "content/browser/gpu/gpu_process_host_ui_shim.h"
|
| #include "content/common/gpu/client/context_provider_command_buffer.h"
|
| @@ -40,14 +41,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);
|
|
|
| @@ -55,10 +63,28 @@ class ContextTestBase : public content::ContentBrowserTest {
|
| content::BrowserGpuChannelHostFactory::instance();
|
| CHECK(factory);
|
| base::RunLoop run_loop;
|
| - factory->EstablishGpuChannel(run_loop.QuitClosure());
|
| + factory->EstablishGpuChannel(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));
|
| @@ -102,7 +128,6 @@ class BrowserGpuChannelHostFactoryTest : public ContentBrowserTest {
|
| // consistent codepath.
|
| if (!BrowserGpuChannelHostFactory::instance())
|
| BrowserGpuChannelHostFactory::Initialize(false);
|
| -
|
| CHECK(GetFactory());
|
|
|
| ContentBrowserTest::SetUpOnMainThread();
|
| @@ -119,27 +144,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(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
|
| @@ -166,7 +194,8 @@ IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest,
|
| MAYBE_EstablishAndTerminate) {
|
| DCHECK(!IsChannelEstablished());
|
| base::RunLoop run_loop;
|
| - GetFactory()->EstablishGpuChannel(run_loop.QuitClosure());
|
| + GetFactory()->EstablishGpuChannel(
|
| + base::Bind(&OnEstablishedGpuChannel, run_loop.QuitClosure(), nullptr));
|
| GetFactory()->Terminate();
|
|
|
| // The callback should still trigger.
|
| @@ -190,7 +219,8 @@ IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest,
|
| // Expect established callback immediately.
|
| bool event = false;
|
| GetFactory()->EstablishGpuChannel(
|
| - base::Bind(&BrowserGpuChannelHostFactoryTest::Signal, &event));
|
| + base::Bind(&BrowserGpuChannelHostFactoryTest::Signal,
|
| + base::Unretained(this), &event));
|
| EXPECT_TRUE(event);
|
| EXPECT_EQ(gpu_channel.get(), GetGpuChannel());
|
| }
|
| @@ -253,7 +283,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
|
|
|