Bug 1391960 - Call FireDidTransactionCallback when exiting ReadbackSurface. r=jrmuizel
If we bailed out in ReadbackSurface function, we didn't call
FireDidTransactionCallback properly. Added ScopedFireTransactionCallback
struct to do this right.
MozReview-Commit-ID: DouTY0YVEhU
--- a/gfx/layers/CopyableCanvasRenderer.cpp
+++ b/gfx/layers/CopyableCanvasRenderer.cpp
@@ -107,17 +107,32 @@ CopyableCanvasRenderer::Destroy()
}
mCachedTempSurface = nullptr;
}
already_AddRefed<SourceSurface>
CopyableCanvasRenderer::ReadbackSurface()
{
- FirePreTransactionCallback();
+ struct ScopedFireTransactionCallback {
+ explicit ScopedFireTransactionCallback(CopyableCanvasRenderer* aRenderer)
+ : mRenderer(aRenderer)
+ {
+ mRenderer->FirePreTransactionCallback();
+ }
+
+ ~ScopedFireTransactionCallback()
+ {
+ mRenderer->FireDidTransactionCallback();
+ }
+
+ CopyableCanvasRenderer* mRenderer;
+ };
+
+ ScopedFireTransactionCallback callback(this);
if (mAsyncRenderer) {
MOZ_ASSERT(!mBufferProvider);
MOZ_ASSERT(!mGLContext);
return mAsyncRenderer->GetSurface();
}
if (!mGLContext) {
return nullptr;
@@ -156,18 +171,16 @@ CopyableCanvasRenderer::ReadbackSurface(
NS_WARNING("Failed to read back canvas surface.");
return nullptr;
}
if (needsPremult) {
gfxUtils::PremultiplyDataSurface(resultSurf, resultSurf);
}
MOZ_ASSERT(resultSurf);
- FireDidTransactionCallback();
-
return resultSurf.forget();
}
DataSourceSurface*
CopyableCanvasRenderer::GetTempSurface(const IntSize& aSize,
const SurfaceFormat aFormat)
{
if (!mCachedTempSurface ||