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 |