| 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 7154c2eea99418188c12363a5cf57a685cc1a1ed..932375bc98ccd69d94c121ceb8dd5a3654af5ef2 100644 | 
| --- a/content/browser/gpu/gpu_ipc_browsertests.cc | 
| +++ b/content/browser/gpu/gpu_ipc_browsertests.cc | 
| @@ -13,6 +13,9 @@ | 
| #include "content/public/common/content_switches.h" | 
| #include "content/public/test/content_browser_test.h" | 
| #include "gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.h" | 
| +#include "third_party/skia/include/core/SkCanvas.h" | 
| +#include "third_party/skia/include/core/SkSurface.h" | 
| +#include "third_party/skia/include/gpu/GrContext.h" | 
| #include "ui/gl/gl_switches.h" | 
|  | 
| namespace { | 
| @@ -194,6 +197,50 @@ IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, | 
| } | 
| #endif | 
|  | 
| +// Test fails on Windows because GPU Channel set-up does not work. | 
| +#if !defined(OS_WIN) | 
| +#define MAYBE_GrContextKeepsGpuChannelAlive GrContextKeepsGpuChannelAlive | 
| +#else | 
| +#define MAYBE_GrContextKeepsGpuChannelAlive \ | 
| +    DISABLED_GrContextKeepsGpuChannelAlive | 
| +#endif | 
| +IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, | 
| +                       MAYBE_GrContextKeepsGpuChannelAlive) { | 
| +  // Test for crbug.com/551143 | 
| +  // This test verifies that holding a reference to the GrContext created by | 
| +  // a ContextProviderCommandBuffer will keep the gpu channel alive after the | 
| +  // provider has been destroyed. Without this behavior, user code would have | 
| +  // to be careful to destroy objects in the right order to avoid using freed | 
| +  // memory as a function pointer in the GrContext's GrGLInterface instance. | 
| +  DCHECK(!IsChannelEstablished()); | 
| +  EstablishAndWait(); | 
| + | 
| +  // Step 2: verify that holding onto the provider's GrContext will | 
| +  // retain the host after provider is destroyed. | 
| +  scoped_refptr<ContextProviderCommandBuffer> provider = | 
| +      ContextProviderCommandBuffer::Create(CreateContext(), | 
| +                                           OFFSCREEN_CONTEXT_FOR_TESTING); | 
| +  EXPECT_TRUE(provider->BindToCurrentThread()); | 
| + | 
| +  skia::RefPtr<GrContext> gr_context = skia::SharePtr(provider->GrContext()); | 
| +  provider = nullptr; | 
| + | 
| +  SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100); | 
| +  skia::RefPtr<SkSurface> surface = skia::AdoptRef(SkSurface::NewRenderTarget( | 
| +      gr_context.get(), SkSurface::kNo_Budgeted, info)); | 
| +  gr_context = nullptr; | 
| + | 
| +  // use the canvas after the provider and grcontext have been locally | 
| +  // unref'ed. This should work just fine thanks to SkSurface_Gpu ref'ing | 
| +  // the GrContext, which is ref'ing the GrGLInterfaceForWebGraphicsContext3D, | 
| +  // which owns the commandbuffer instance. | 
| +  SkPaint greenFillPaint; | 
| +  greenFillPaint.setColor(SK_ColorGREEN); | 
| +  greenFillPaint.setStyle(SkPaint::kFill_Style); | 
| +  // Passes by not crashing | 
| +  surface->getCanvas()->drawRect(SkRect::MakeWH(100, 100), greenFillPaint); | 
| +} | 
| + | 
| // Test fails on Chromeos + Mac, flaky on Windows because UI Compositor | 
| // establishes a GPU channel. | 
| #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 
|  |