| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/html/canvas/CanvasAsyncBlobCreator.h" | 5 #include "core/html/canvas/CanvasAsyncBlobCreator.h" |
| 6 | 6 |
| 7 #include "core/dom/DOMException.h" | 7 #include "core/dom/DOMException.h" |
| 8 #include "core/dom/Document.h" | 8 #include "core/dom/Document.h" |
| 9 #include "core/dom/TaskRunnerHelper.h" | 9 #include "core/dom/TaskRunnerHelper.h" |
| 10 #include "core/fileapi/Blob.h" | 10 #include "core/fileapi/Blob.h" |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 m_mimeType(mimeType), | 196 m_mimeType(mimeType), |
| 197 m_startTime(startTime), | 197 m_startTime(startTime), |
| 198 m_elapsedTime(0), | 198 m_elapsedTime(0), |
| 199 m_callback(callback), | 199 m_callback(callback), |
| 200 m_scriptPromiseResolver(resolver) { | 200 m_scriptPromiseResolver(resolver) { |
| 201 DCHECK(m_data->length() == (unsigned)(size.height() * size.width() * 4)); | 201 DCHECK(m_data->length() == (unsigned)(size.height() * size.width() * 4)); |
| 202 m_encodedImage = WTF::wrapUnique(new Vector<unsigned char>()); | 202 m_encodedImage = WTF::wrapUnique(new Vector<unsigned char>()); |
| 203 m_pixelRowStride = size.width() * NumChannelsPng; | 203 m_pixelRowStride = size.width() * NumChannelsPng; |
| 204 m_idleTaskStatus = IdleTaskNotSupported; | 204 m_idleTaskStatus = IdleTaskNotSupported; |
| 205 m_numRowsCompleted = 0; | 205 m_numRowsCompleted = 0; |
| 206 if (document) { | |
| 207 m_parentFrameTaskRunner = ParentFrameTaskRunners::create(document->frame()); | |
| 208 } | |
| 209 if (m_scriptPromiseResolver) { | 206 if (m_scriptPromiseResolver) { |
| 210 m_functionType = OffscreenCanvasToBlobPromise; | 207 m_functionType = OffscreenCanvasToBlobPromise; |
| 211 } else { | 208 } else { |
| 212 m_functionType = HTMLCanvasToBlobCallback; | 209 m_functionType = HTMLCanvasToBlobCallback; |
| 213 } | 210 } |
| 214 } | 211 } |
| 215 | 212 |
| 216 CanvasAsyncBlobCreator::~CanvasAsyncBlobCreator() {} | 213 CanvasAsyncBlobCreator::~CanvasAsyncBlobCreator() {} |
| 217 | 214 |
| 218 void CanvasAsyncBlobCreator::dispose() { | 215 void CanvasAsyncBlobCreator::dispose() { |
| 219 // Eagerly let go of references to prevent retention of these | 216 // Eagerly let go of references to prevent retention of these |
| 220 // resources while any remaining posted tasks are queued. | 217 // resources while any remaining posted tasks are queued. |
| 221 m_data.clear(); | 218 m_data.clear(); |
| 222 m_document.clear(); | 219 m_document.clear(); |
| 223 m_parentFrameTaskRunner.clear(); | |
| 224 m_callback.clear(); | 220 m_callback.clear(); |
| 225 m_scriptPromiseResolver.clear(); | 221 m_scriptPromiseResolver.clear(); |
| 226 } | 222 } |
| 227 | 223 |
| 228 void CanvasAsyncBlobCreator::scheduleAsyncBlobCreation(const double& quality) { | 224 void CanvasAsyncBlobCreator::scheduleAsyncBlobCreation(const double& quality) { |
| 229 if (m_mimeType == MimeTypeWebp) { | 225 if (m_mimeType == MimeTypeWebp) { |
| 230 if (!isMainThread()) { | 226 if (!isMainThread()) { |
| 231 DCHECK(m_functionType == OffscreenCanvasToBlobPromise); | 227 DCHECK(m_functionType == OffscreenCanvasToBlobPromise); |
| 232 // When OffscreenCanvas.convertToBlob() occurs on worker thread, | 228 // When OffscreenCanvas.convertToBlob() occurs on worker thread, |
| 233 // we do not need to use background task runner to reduce load on main. | 229 // we do not need to use background task runner to reduce load on main. |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 // Avoid unwanted retention, see dispose(). | 481 // Avoid unwanted retention, see dispose(). |
| 486 dispose(); | 482 dispose(); |
| 487 } | 483 } |
| 488 | 484 |
| 489 void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality) { | 485 void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality) { |
| 490 DCHECK(!isMainThread()); | 486 DCHECK(!isMainThread()); |
| 491 DCHECK(m_mimeType == MimeTypeWebp); | 487 DCHECK(m_mimeType == MimeTypeWebp); |
| 492 | 488 |
| 493 if (!ImageDataBuffer(m_size, m_data->data()) | 489 if (!ImageDataBuffer(m_size, m_data->data()) |
| 494 .encodeImage("image/webp", quality, m_encodedImage.get())) { | 490 .encodeImage("image/webp", quality, m_encodedImage.get())) { |
| 495 m_parentFrameTaskRunner->get(TaskType::CanvasBlobSerialization) | 491 FrameTaskRunnerHelper::get(TaskType::CanvasBlobSerialization, |
| 492 m_document.get()) |
| 496 ->postTask( | 493 ->postTask( |
| 497 BLINK_FROM_HERE, | 494 BLINK_FROM_HERE, |
| 498 crossThreadBind(&CanvasAsyncBlobCreator::createNullAndReturnResult, | 495 crossThreadBind(&CanvasAsyncBlobCreator::createNullAndReturnResult, |
| 499 wrapCrossThreadPersistent(this))); | 496 wrapCrossThreadPersistent(this))); |
| 500 return; | 497 return; |
| 501 } | 498 } |
| 502 | 499 |
| 503 m_parentFrameTaskRunner->get(TaskType::CanvasBlobSerialization) | 500 FrameTaskRunnerHelper::get(TaskType::CanvasBlobSerialization, |
| 501 m_document.get()) |
| 504 ->postTask( | 502 ->postTask( |
| 505 BLINK_FROM_HERE, | 503 BLINK_FROM_HERE, |
| 506 crossThreadBind(&CanvasAsyncBlobCreator::createBlobAndReturnResult, | 504 crossThreadBind(&CanvasAsyncBlobCreator::createBlobAndReturnResult, |
| 507 wrapCrossThreadPersistent(this))); | 505 wrapCrossThreadPersistent(this))); |
| 508 } | 506 } |
| 509 | 507 |
| 510 bool CanvasAsyncBlobCreator::initializePngStruct() { | 508 bool CanvasAsyncBlobCreator::initializePngStruct() { |
| 511 m_pngEncoderState = | 509 m_pngEncoderState = |
| 512 PNGImageEncoderState::create(m_size, m_encodedImage.get()); | 510 PNGImageEncoderState::create(m_size, m_encodedImage.get()); |
| 513 if (!m_pngEncoderState) { | 511 if (!m_pngEncoderState) { |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 611 std::unique_ptr<WTF::Closure> task, | 609 std::unique_ptr<WTF::Closure> task, |
| 612 double delayMs) { | 610 double delayMs) { |
| 613 TaskRunnerHelper::get(TaskType::CanvasBlobSerialization, m_document) | 611 TaskRunnerHelper::get(TaskType::CanvasBlobSerialization, m_document) |
| 614 ->postDelayedTask(location, std::move(task), delayMs); | 612 ->postDelayedTask(location, std::move(task), delayMs); |
| 615 } | 613 } |
| 616 | 614 |
| 617 DEFINE_TRACE(CanvasAsyncBlobCreator) { | 615 DEFINE_TRACE(CanvasAsyncBlobCreator) { |
| 618 visitor->trace(m_document); | 616 visitor->trace(m_document); |
| 619 visitor->trace(m_data); | 617 visitor->trace(m_data); |
| 620 visitor->trace(m_callback); | 618 visitor->trace(m_callback); |
| 621 visitor->trace(m_parentFrameTaskRunner); | |
| 622 visitor->trace(m_scriptPromiseResolver); | 619 visitor->trace(m_scriptPromiseResolver); |
| 623 } | 620 } |
| 624 | 621 |
| 625 } // namespace blink | 622 } // namespace blink |
| OLD | NEW |