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 7cf1fdaf454d2dc6744af55e75924bde384aa464..6d7c97bc792f6226a2281c4ed28272348fc48765 100644 |
--- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
@@ -2,12 +2,11 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "CanvasAsyncBlobCreator.h" |
+#include "core/html/canvas/CanvasAsyncBlobCreator.h" |
#include "core/fileapi/Blob.h" |
#include "platform/ThreadSafeFunctional.h" |
#include "platform/graphics/ImageBuffer.h" |
-#include "platform/heap/Handle.h" |
#include "platform/image-encoders/skia/JPEGImageEncoder.h" |
#include "platform/image-encoders/skia/PNGImageEncoder.h" |
#include "platform/threading/BackgroundTaskRunner.h" |
@@ -60,9 +59,6 @@ void CanvasAsyncBlobCreator::scheduleAsyncBlobCreation(bool canUseIdlePeriodSche |
// TODO: async blob creation should be supported in worker_pool threads as well. but right now blink does not have that |
ASSERT(isMainThread()); |
- // Make self-reference to keep this object alive until the final task completes |
- m_keepAlive = this; |
- |
// At the time being, progressive encoding is only applicable to png image format, |
// and thus idle tasks scheduling can only be applied to png image format. |
// TODO(xlai): Progressive encoding on jpeg and webp image formats (crbug.com/571398, crbug.com/571399) |
@@ -82,7 +78,6 @@ void CanvasAsyncBlobCreator::initiateJpegEncoding(const double& quality) |
m_jpegEncoderState = JPEGImageEncoderState::create(m_size, quality, m_encodedImage.get()); |
if (!m_jpegEncoderState) { |
Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&BlobCallback::handleEvent, m_callback, nullptr)); |
- m_keepAlive.clear(); |
return; |
} |
BackgroundTaskRunner::TaskSize taskSize = (m_size.height() * m_size.width() >= LongTaskImageSizeThreshold) ? BackgroundTaskRunner::TaskSizeLongRunningTask : BackgroundTaskRunner::TaskSizeShortRunningTask; |
@@ -95,7 +90,6 @@ void CanvasAsyncBlobCreator::initiatePngEncoding(double deadlineSeconds) |
m_pngEncoderState = PNGImageEncoderState::create(m_size, m_encodedImage.get()); |
if (!m_pngEncoderState) { |
Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&BlobCallback::handleEvent, m_callback, nullptr)); |
- m_keepAlive.clear(); |
return; |
} |
@@ -124,11 +118,10 @@ void CanvasAsyncBlobCreator::idleEncodeRowsPng(double deadlineSeconds) |
m_numRowsCompleted = m_size.height(); |
PNGImageEncoder::finalizePng(m_pngEncoderState.get()); |
- if (isDeadlineNearOrPassed(deadlineSeconds)) { |
+ if (isDeadlineNearOrPassed(deadlineSeconds)) |
Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::createBlobAndCall, this)); |
- } else { |
+ else |
this->createBlobAndCall(); |
- } |
} |
void CanvasAsyncBlobCreator::createBlobAndCall() |
@@ -136,7 +129,6 @@ void CanvasAsyncBlobCreator::createBlobAndCall() |
ASSERT(isMainThread()); |
Blob* resultBlob = Blob::create(m_encodedImage->data(), m_encodedImage->size(), m_mimeType); |
Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&BlobCallback::handleEvent, m_callback, resultBlob)); |
- clearSelfReference(); // self-destruct once job is done. |
} |
void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality) |
@@ -144,39 +136,17 @@ void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality) |
ASSERT(!isMainThread()); |
bool success; |
- if (m_mimeType == "image/jpeg") { |
+ if (m_mimeType == "image/jpeg") |
success = JPEGImageEncoder::encodeWithPreInitializedState(m_jpegEncoderState.release(), m_data->data()); |
- } else { |
+ else |
success = ImageDataBuffer(m_size, m_data->data()).encodeImage(m_mimeType, quality, m_encodedImage.get()); |
- } |
if (!success) { |
- scheduleCreateNullptrAndCallOnMainThread(); |
+ Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&BlobCallback::handleEvent, m_callback.get(), nullptr)); |
return; |
} |
- scheduleCreateBlobAndCallOnMainThread(); |
-} |
- |
-void CanvasAsyncBlobCreator::clearSelfReference() |
-{ |
- // Some persistent members in CanvasAsyncBlobCreator can only be destroyed |
- // on the thread that creates them. In this case, it's the main thread. |
- ASSERT(isMainThread()); |
- m_keepAlive.clear(); |
-} |
- |
-void CanvasAsyncBlobCreator::scheduleCreateBlobAndCallOnMainThread() |
-{ |
- ASSERT(!isMainThread()); |
Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&CanvasAsyncBlobCreator::createBlobAndCall, AllowCrossThreadAccess(this))); |
} |
-void CanvasAsyncBlobCreator::scheduleCreateNullptrAndCallOnMainThread() |
-{ |
- ASSERT(!isMainThread()); |
- Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&BlobCallback::handleEvent, m_callback.get(), nullptr)); |
- Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&CanvasAsyncBlobCreator::clearSelfReference, AllowCrossThreadAccess(this))); |
-} |
- |
} // namespace blink |