Index: third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
index a917430d263822706ba8eb916a46465db16dfaa2..87811008138cfca903ee94a1f0495dc086c33679 100644 |
--- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
@@ -100,6 +100,14 @@ CanvasAsyncBlobCreator::~CanvasAsyncBlobCreator() |
{ |
} |
+void CanvasAsyncBlobCreator::dispose() |
+{ |
+ // Eagerly let go of references to prevent retention of these |
+ // resources while any remaining posted tasks are queued. |
+ m_data.clear(); |
+ m_callback.clear(); |
+} |
+ |
void CanvasAsyncBlobCreator::scheduleAsyncBlobCreation(bool canUseIdlePeriodScheduling, const double& quality) |
{ |
ASSERT(isMainThread()); |
@@ -127,7 +135,7 @@ void CanvasAsyncBlobCreator::scheduleAsyncBlobCreation(bool canUseIdlePeriodSche |
void CanvasAsyncBlobCreator::scheduleInitiateJpegEncoding(const double& quality) |
{ |
- Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE, bind<double>(&CanvasAsyncBlobCreator::initiateJpegEncoding, WeakPersistentThisPointer<CanvasAsyncBlobCreator>(this), quality)); |
+ Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE, bind<double>(&CanvasAsyncBlobCreator::initiateJpegEncoding, this, quality)); |
} |
void CanvasAsyncBlobCreator::initiateJpegEncoding(const double& quality, double deadlineSeconds) |
@@ -149,7 +157,7 @@ void CanvasAsyncBlobCreator::initiateJpegEncoding(const double& quality, double |
void CanvasAsyncBlobCreator::scheduleInitiatePngEncoding() |
{ |
- Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE, bind<double>(&CanvasAsyncBlobCreator::initiatePngEncoding, WeakPersistentThisPointer<CanvasAsyncBlobCreator>(this))); |
+ Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE, bind<double>(&CanvasAsyncBlobCreator::initiatePngEncoding, this)); |
} |
void CanvasAsyncBlobCreator::initiatePngEncoding(double deadlineSeconds) |
@@ -256,12 +264,16 @@ void CanvasAsyncBlobCreator::createBlobAndInvokeCallback() |
ASSERT(isMainThread()); |
Blob* resultBlob = Blob::create(m_encodedImage->data(), m_encodedImage->size(), convertMimeTypeEnumToString(m_mimeType)); |
Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&BlobCallback::handleEvent, m_callback, resultBlob)); |
+ // Avoid unwanted retention, see dispose(). |
+ dispose(); |
} |
void CanvasAsyncBlobCreator::createNullAndInvokeCallback() |
{ |
ASSERT(isMainThread()); |
Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&BlobCallback::handleEvent, m_callback, nullptr)); |
+ // Avoid unwanted retention, see dispose(). |
+ dispose(); |
} |
void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality) |