Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Side by Side Diff: third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp

Issue 2716853002: (WIP) Worker: Merge ParentFrameTaskRunners into TaskRunnerHelper
Patch Set: WIP Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698