Bug 1387994 - Ensure the draw target when initializing the canvas context. r=nical draft
authorEthan Lin <ethlin@mozilla.com>
Thu, 10 Aug 2017 15:04:42 +0800
changeset 650261 1f8720c986feacc6ff026092f7504fe0c35e039a
parent 650228 128a79130ecd6f277190d031a623f991c73c5272
child 727342 72e3bcbc8b8ea940f0c2646d45b24aff1add1db0
push id75317
push userbmo:ethlin@mozilla.com
push dateTue, 22 Aug 2017 03:58:20 +0000
reviewersnical
bugs1387994
milestone57.0a1
Bug 1387994 - Ensure the draw target when initializing the canvas context. r=nical MozReview-Commit-ID: DxqoywKaSbE
dom/canvas/CanvasRenderingContext2D.cpp
layout/generic/nsHTMLCanvasFrame.cpp
--- a/dom/canvas/CanvasRenderingContext2D.cpp
+++ b/dom/canvas/CanvasRenderingContext2D.cpp
@@ -6297,16 +6297,26 @@ CanvasRenderingContext2D::InitializeCanv
   CanvasInitializeData data;
   data.mSize = GetSize();
   data.mHasAlpha = !mOpaque;
   data.mPreTransCallback = CanvasRenderingContext2DUserData::PreTransactionCallback;
   data.mPreTransCallbackData = this;
   data.mDidTransCallback = CanvasRenderingContext2DUserData::DidTransactionCallback;
   data.mDidTransCallbackData = this;
 
+  if (!mBufferProvider) {
+    // Force the creation of a buffer provider.
+    EnsureTarget();
+    ReturnTarget();
+    if (!mBufferProvider) {
+      MarkContextClean();
+      return false;
+    }
+  }
+
   if (mIsSkiaGL) {
       GLuint skiaGLTex = SkiaGLTex();
       if (skiaGLTex) {
         SkiaGLGlue* glue = gfxPlatform::GetPlatform()->GetSkiaGLGlue();
         MOZ_ASSERT(glue);
         data.mGLContext = glue->GetGLContext();
         data.mFrontbufferGLTex = skiaGLTex;
       }
--- a/layout/generic/nsHTMLCanvasFrame.cpp
+++ b/layout/generic/nsHTMLCanvasFrame.cpp
@@ -135,17 +135,17 @@ public:
       case CanvasContextType::WebGL2:
       {
         bool isRecycled;
         RefPtr<WebRenderCanvasData> canvasData =
           aManager->CreateOrRecycleWebRenderUserData<WebRenderCanvasData>(this, &isRecycled);
         WebRenderCanvasRendererAsync* data =
           static_cast<WebRenderCanvasRendererAsync*>(canvasData->GetCanvasRenderer());
 
-        if (isRecycled) {
+        if (!isRecycled) {
           nsHTMLCanvasFrame* canvasFrame = static_cast<nsHTMLCanvasFrame*>(mFrame);
           if (!canvasFrame->InitializeCanvasRenderer(aDisplayListBuilder, data)) {
             return true;
           }
         }
 
         data->UpdateCompositableClient();