| 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
|
|
|