| 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/fileapi/Blob.h" | 7 #include "core/fileapi/Blob.h" |
| 8 #include "platform/CrossThreadFunctional.h" | 8 #include "platform/CrossThreadFunctional.h" |
| 9 #include "platform/Histogram.h" |
| 9 #include "platform/graphics/ImageBuffer.h" | 10 #include "platform/graphics/ImageBuffer.h" |
| 10 #include "platform/image-encoders/JPEGImageEncoder.h" | 11 #include "platform/image-encoders/JPEGImageEncoder.h" |
| 11 #include "platform/image-encoders/PNGImageEncoder.h" | 12 #include "platform/image-encoders/PNGImageEncoder.h" |
| 12 #include "platform/threading/BackgroundTaskRunner.h" | 13 #include "platform/threading/BackgroundTaskRunner.h" |
| 13 #include "public/platform/Platform.h" | 14 #include "public/platform/Platform.h" |
| 14 #include "public/platform/WebScheduler.h" | 15 #include "public/platform/WebScheduler.h" |
| 15 #include "public/platform/WebTaskRunner.h" | 16 #include "public/platform/WebTaskRunner.h" |
| 16 #include "public/platform/WebThread.h" | 17 #include "public/platform/WebThread.h" |
| 17 #include "public/platform/WebTraceLocation.h" | 18 #include "public/platform/WebTraceLocation.h" |
| 18 #include "wtf/CurrentTime.h" | 19 #include "wtf/CurrentTime.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 } else if (mimeType == "image/webp") { | 73 } else if (mimeType == "image/webp") { |
| 73 mimeTypeEnum = CanvasAsyncBlobCreator::MimeTypeWebp; | 74 mimeTypeEnum = CanvasAsyncBlobCreator::MimeTypeWebp; |
| 74 } else { | 75 } else { |
| 75 mimeTypeEnum = CanvasAsyncBlobCreator::NumberOfMimeTypeSupported; | 76 mimeTypeEnum = CanvasAsyncBlobCreator::NumberOfMimeTypeSupported; |
| 76 } | 77 } |
| 77 return mimeTypeEnum; | 78 return mimeTypeEnum; |
| 78 } | 79 } |
| 79 | 80 |
| 80 } // anonymous namespace | 81 } // anonymous namespace |
| 81 | 82 |
| 82 CanvasAsyncBlobCreator* CanvasAsyncBlobCreator::create(DOMUint8ClampedArray* unp
remultipliedRGBAImageData, const String& mimeType, const IntSize& size, BlobCall
back* callback) | 83 CanvasAsyncBlobCreator* CanvasAsyncBlobCreator::create(DOMUint8ClampedArray* unp
remultipliedRGBAImageData, const String& mimeType, const IntSize& size, BlobCall
back* callback, double startTime) |
| 83 { | 84 { |
| 84 return new CanvasAsyncBlobCreator(unpremultipliedRGBAImageData, convertMimeT
ypeStringToEnum(mimeType), size, callback); | 85 return new CanvasAsyncBlobCreator(unpremultipliedRGBAImageData, convertMimeT
ypeStringToEnum(mimeType), size, callback, startTime); |
| 85 } | 86 } |
| 86 | 87 |
| 87 CanvasAsyncBlobCreator::CanvasAsyncBlobCreator(DOMUint8ClampedArray* data, MimeT
ype mimeType, const IntSize& size, BlobCallback* callback) | 88 CanvasAsyncBlobCreator::CanvasAsyncBlobCreator(DOMUint8ClampedArray* data, MimeT
ype mimeType, const IntSize& size, BlobCallback* callback, double startTime) |
| 88 : m_data(data) | 89 : m_data(data) |
| 89 , m_size(size) | 90 , m_size(size) |
| 90 , m_mimeType(mimeType) | 91 , m_mimeType(mimeType) |
| 91 , m_callback(callback) | 92 , m_callback(callback) |
| 93 , m_startTime(startTime) |
| 94 , m_elapsedTime(0) |
| 92 { | 95 { |
| 93 ASSERT(m_data->length() == (unsigned) (size.height() * size.width() * 4)); | 96 ASSERT(m_data->length() == (unsigned) (size.height() * size.width() * 4)); |
| 94 m_encodedImage = wrapUnique(new Vector<unsigned char>()); | 97 m_encodedImage = wrapUnique(new Vector<unsigned char>()); |
| 95 m_pixelRowStride = size.width() * NumChannelsPng; | 98 m_pixelRowStride = size.width() * NumChannelsPng; |
| 96 m_idleTaskStatus = IdleTaskNotSupported; | 99 m_idleTaskStatus = IdleTaskNotSupported; |
| 97 m_numRowsCompleted = 0; | 100 m_numRowsCompleted = 0; |
| 98 } | 101 } |
| 99 | 102 |
| 100 CanvasAsyncBlobCreator::~CanvasAsyncBlobCreator() | 103 CanvasAsyncBlobCreator::~CanvasAsyncBlobCreator() |
| 101 { | 104 { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 129 // There's no risk of concurrency as both tasks are on main thread. | 132 // There's no risk of concurrency as both tasks are on main thread. |
| 130 this->postDelayedTaskToMainThread(BLINK_FROM_HERE, WTF::bind(&CanvasAsyn
cBlobCreator::idleTaskStartTimeoutEvent, wrapPersistent(this), quality), IdleTas
kStartTimeoutDelay); | 133 this->postDelayedTaskToMainThread(BLINK_FROM_HERE, WTF::bind(&CanvasAsyn
cBlobCreator::idleTaskStartTimeoutEvent, wrapPersistent(this), quality), IdleTas
kStartTimeoutDelay); |
| 131 } else if (m_mimeType == MimeTypeWebp) { | 134 } else if (m_mimeType == MimeTypeWebp) { |
| 132 BackgroundTaskRunner::TaskSize taskSize = (m_size.height() * m_size.widt
h() >= LongTaskImageSizeThreshold) ? BackgroundTaskRunner::TaskSizeLongRunningTa
sk : BackgroundTaskRunner::TaskSizeShortRunningTask; | 135 BackgroundTaskRunner::TaskSize taskSize = (m_size.height() * m_size.widt
h() >= LongTaskImageSizeThreshold) ? BackgroundTaskRunner::TaskSizeLongRunningTa
sk : BackgroundTaskRunner::TaskSizeShortRunningTask; |
| 133 BackgroundTaskRunner::postOnBackgroundThread(BLINK_FROM_HERE, crossThrea
dBind(&CanvasAsyncBlobCreator::encodeImageOnEncoderThread, wrapCrossThreadPersis
tent(this), quality), taskSize); | 136 BackgroundTaskRunner::postOnBackgroundThread(BLINK_FROM_HERE, crossThrea
dBind(&CanvasAsyncBlobCreator::encodeImageOnEncoderThread, wrapCrossThreadPersis
tent(this), quality), taskSize); |
| 134 } | 137 } |
| 135 } | 138 } |
| 136 | 139 |
| 137 void CanvasAsyncBlobCreator::scheduleInitiateJpegEncoding(const double& quality) | 140 void CanvasAsyncBlobCreator::scheduleInitiateJpegEncoding(const double& quality) |
| 138 { | 141 { |
| 142 m_scheduleInitiateStartTime = WTF::monotonicallyIncreasingTime(); |
| 139 Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE
, WTF::bind(&CanvasAsyncBlobCreator::initiateJpegEncoding, wrapPersistent(this),
quality)); | 143 Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE
, WTF::bind(&CanvasAsyncBlobCreator::initiateJpegEncoding, wrapPersistent(this),
quality)); |
| 140 } | 144 } |
| 141 | 145 |
| 142 void CanvasAsyncBlobCreator::initiateJpegEncoding(const double& quality, double
deadlineSeconds) | 146 void CanvasAsyncBlobCreator::initiateJpegEncoding(const double& quality, double
deadlineSeconds) |
| 143 { | 147 { |
| 144 ASSERT(isMainThread()); | 148 ASSERT(isMainThread()); |
| 149 DEFINE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGInitiateEncodingCounter,
("Blink.Canvas.ToBlob.InitiateEncodingDelay.JPEG", 0, 10000000, 50)); |
| 150 toBlobJPEGInitiateEncodingCounter.count((WTF::monotonicallyIncreasingTime()
- m_scheduleInitiateStartTime) * 1000000.0); |
| 145 if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { | 151 if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { |
| 146 return; | 152 return; |
| 147 } | 153 } |
| 148 | 154 |
| 149 ASSERT(m_idleTaskStatus == IdleTaskNotStarted); | 155 ASSERT(m_idleTaskStatus == IdleTaskNotStarted); |
| 150 m_idleTaskStatus = IdleTaskStarted; | 156 m_idleTaskStatus = IdleTaskStarted; |
| 151 | 157 |
| 152 if (!initializeJpegStruct(quality)) { | 158 if (!initializeJpegStruct(quality)) { |
| 153 m_idleTaskStatus = IdleTaskFailed; | 159 m_idleTaskStatus = IdleTaskFailed; |
| 154 return; | 160 return; |
| 155 } | 161 } |
| 156 this->idleEncodeRowsJpeg(deadlineSeconds); | 162 this->idleEncodeRowsJpeg(deadlineSeconds); |
| 157 } | 163 } |
| 158 | 164 |
| 159 void CanvasAsyncBlobCreator::scheduleInitiatePngEncoding() | 165 void CanvasAsyncBlobCreator::scheduleInitiatePngEncoding() |
| 160 { | 166 { |
| 167 m_scheduleInitiateStartTime = WTF::monotonicallyIncreasingTime(); |
| 161 Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE
, WTF::bind(&CanvasAsyncBlobCreator::initiatePngEncoding, wrapPersistent(this)))
; | 168 Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE
, WTF::bind(&CanvasAsyncBlobCreator::initiatePngEncoding, wrapPersistent(this)))
; |
| 162 } | 169 } |
| 163 | 170 |
| 164 void CanvasAsyncBlobCreator::initiatePngEncoding(double deadlineSeconds) | 171 void CanvasAsyncBlobCreator::initiatePngEncoding(double deadlineSeconds) |
| 165 { | 172 { |
| 166 ASSERT(isMainThread()); | 173 ASSERT(isMainThread()); |
| 174 DEFINE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGInitiateEncodingCounter,
("Blink.Canvas.ToBlob.InitiateEncodingDelay.PNG", 0, 10000000, 50)); |
| 175 toBlobPNGInitiateEncodingCounter.count((WTF::monotonicallyIncreasingTime() -
m_scheduleInitiateStartTime) * 1000000.0); |
| 167 if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { | 176 if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { |
| 168 return; | 177 return; |
| 169 } | 178 } |
| 170 | 179 |
| 171 ASSERT(m_idleTaskStatus == IdleTaskNotStarted); | 180 ASSERT(m_idleTaskStatus == IdleTaskNotStarted); |
| 172 m_idleTaskStatus = IdleTaskStarted; | 181 m_idleTaskStatus = IdleTaskStarted; |
| 173 | 182 |
| 174 if (!initializePngStruct()) { | 183 if (!initializePngStruct()) { |
| 175 m_idleTaskStatus = IdleTaskFailed; | 184 m_idleTaskStatus = IdleTaskFailed; |
| 176 return; | 185 return; |
| 177 } | 186 } |
| 178 this->idleEncodeRowsPng(deadlineSeconds); | 187 this->idleEncodeRowsPng(deadlineSeconds); |
| 179 } | 188 } |
| 180 | 189 |
| 181 void CanvasAsyncBlobCreator::idleEncodeRowsPng(double deadlineSeconds) | 190 void CanvasAsyncBlobCreator::idleEncodeRowsPng(double deadlineSeconds) |
| 182 { | 191 { |
| 183 ASSERT(isMainThread()); | 192 ASSERT(isMainThread()); |
| 184 if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { | 193 if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { |
| 185 return; | 194 return; |
| 186 } | 195 } |
| 187 | 196 |
| 197 double startTime = WTF::monotonicallyIncreasingTime(); |
| 188 unsigned char* inputPixels = m_data->data() + m_pixelRowStride * m_numRowsCo
mpleted; | 198 unsigned char* inputPixels = m_data->data() + m_pixelRowStride * m_numRowsCo
mpleted; |
| 189 for (int y = m_numRowsCompleted; y < m_size.height(); ++y) { | 199 for (int y = m_numRowsCompleted; y < m_size.height(); ++y) { |
| 190 if (isDeadlineNearOrPassed(deadlineSeconds)) { | 200 if (isDeadlineNearOrPassed(deadlineSeconds)) { |
| 191 m_numRowsCompleted = y; | 201 m_numRowsCompleted = y; |
| 202 m_elapsedTime += (WTF::monotonicallyIncreasingTime() - startTime); |
| 192 Platform::current()->currentThread()->scheduler()->postIdleTask(BLIN
K_FROM_HERE, WTF::bind(&CanvasAsyncBlobCreator::idleEncodeRowsPng, wrapPersisten
t(this))); | 203 Platform::current()->currentThread()->scheduler()->postIdleTask(BLIN
K_FROM_HERE, WTF::bind(&CanvasAsyncBlobCreator::idleEncodeRowsPng, wrapPersisten
t(this))); |
| 193 return; | 204 return; |
| 194 } | 205 } |
| 195 PNGImageEncoder::writeOneRowToPng(inputPixels, m_pngEncoderState.get()); | 206 PNGImageEncoder::writeOneRowToPng(inputPixels, m_pngEncoderState.get()); |
| 196 inputPixels += m_pixelRowStride; | 207 inputPixels += m_pixelRowStride; |
| 197 } | 208 } |
| 198 m_numRowsCompleted = m_size.height(); | 209 m_numRowsCompleted = m_size.height(); |
| 199 PNGImageEncoder::finalizePng(m_pngEncoderState.get()); | 210 PNGImageEncoder::finalizePng(m_pngEncoderState.get()); |
| 200 | 211 |
| 201 m_idleTaskStatus = IdleTaskCompleted; | 212 m_idleTaskStatus = IdleTaskCompleted; |
| 213 m_elapsedTime += (WTF::monotonicallyIncreasingTime() - startTime); |
| 214 DEFINE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGIdleEncodeCounter, ("Blin
k.Canvas.ToBlob.IdleEncodeDuration.PNG", 0, 10000000, 50)); |
| 215 toBlobPNGIdleEncodeCounter.count(m_elapsedTime * 1000000.0); |
| 202 | 216 |
| 203 if (isDeadlineNearOrPassed(deadlineSeconds)) { | 217 if (isDeadlineNearOrPassed(deadlineSeconds)) { |
| 204 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FR
OM_HERE, WTF::bind(&CanvasAsyncBlobCreator::createBlobAndInvokeCallback, wrapPer
sistent(this))); | 218 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FR
OM_HERE, WTF::bind(&CanvasAsyncBlobCreator::createBlobAndInvokeCallback, wrapPer
sistent(this))); |
| 205 } else { | 219 } else { |
| 206 this->createBlobAndInvokeCallback(); | 220 this->createBlobAndInvokeCallback(); |
| 207 } | 221 } |
| 208 } | 222 } |
| 209 | 223 |
| 210 void CanvasAsyncBlobCreator::idleEncodeRowsJpeg(double deadlineSeconds) | 224 void CanvasAsyncBlobCreator::idleEncodeRowsJpeg(double deadlineSeconds) |
| 211 { | 225 { |
| 212 ASSERT(isMainThread()); | 226 ASSERT(isMainThread()); |
| 213 if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { | 227 if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { |
| 214 return; | 228 return; |
| 215 } | 229 } |
| 216 | 230 |
| 231 double startTime = WTF::monotonicallyIncreasingTime(); |
| 217 m_numRowsCompleted = JPEGImageEncoder::progressiveEncodeRowsJpegHelper(m_jpe
gEncoderState.get(), m_data->data(), m_numRowsCompleted, SlackBeforeDeadline, de
adlineSeconds); | 232 m_numRowsCompleted = JPEGImageEncoder::progressiveEncodeRowsJpegHelper(m_jpe
gEncoderState.get(), m_data->data(), m_numRowsCompleted, SlackBeforeDeadline, de
adlineSeconds); |
| 233 m_elapsedTime += (WTF::monotonicallyIncreasingTime() - startTime); |
| 218 if (m_numRowsCompleted == m_size.height()) { | 234 if (m_numRowsCompleted == m_size.height()) { |
| 219 m_idleTaskStatus = IdleTaskCompleted; | 235 m_idleTaskStatus = IdleTaskCompleted; |
| 236 DEFINE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGIdleEncodeCounter, (
"Blink.Canvas.ToBlob.IdleEncodeDuration.JPEG", 0, 10000000, 50)); |
| 237 toBlobJPEGIdleEncodeCounter.count(m_elapsedTime * 1000000.0); |
| 220 if (isDeadlineNearOrPassed(deadlineSeconds)) { | 238 if (isDeadlineNearOrPassed(deadlineSeconds)) { |
| 221 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLIN
K_FROM_HERE, WTF::bind(&CanvasAsyncBlobCreator::createBlobAndInvokeCallback, wra
pPersistent(this))); | 239 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLIN
K_FROM_HERE, WTF::bind(&CanvasAsyncBlobCreator::createBlobAndInvokeCallback, wra
pPersistent(this))); |
| 222 } else { | 240 } else { |
| 223 this->createBlobAndInvokeCallback(); | 241 this->createBlobAndInvokeCallback(); |
| 224 } | 242 } |
| 225 } else if (m_numRowsCompleted == JPEGImageEncoder::ProgressiveEncodeFailed)
{ | 243 } else if (m_numRowsCompleted == JPEGImageEncoder::ProgressiveEncodeFailed)
{ |
| 226 m_idleTaskStatus = IdleTaskFailed; | 244 m_idleTaskStatus = IdleTaskFailed; |
| 227 this->createNullAndInvokeCallback(); | 245 this->createNullAndInvokeCallback(); |
| 228 } else { | 246 } else { |
| 229 Platform::current()->currentThread()->scheduler()->postIdleTask(BLINK_FR
OM_HERE, WTF::bind(&CanvasAsyncBlobCreator::idleEncodeRowsJpeg, wrapPersistent(t
his))); | 247 Platform::current()->currentThread()->scheduler()->postIdleTask(BLINK_FR
OM_HERE, WTF::bind(&CanvasAsyncBlobCreator::idleEncodeRowsJpeg, wrapPersistent(t
his))); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 253 // Continue encoding from the last completed row | 271 // Continue encoding from the last completed row |
| 254 if (JPEGImageEncoder::encodeWithPreInitializedState(std::move(m_jpegEncoderS
tate), m_data->data(), m_numRowsCompleted)) { | 272 if (JPEGImageEncoder::encodeWithPreInitializedState(std::move(m_jpegEncoderS
tate), m_data->data(), m_numRowsCompleted)) { |
| 255 this->createBlobAndInvokeCallback(); | 273 this->createBlobAndInvokeCallback(); |
| 256 } else { | 274 } else { |
| 257 this->createNullAndInvokeCallback(); | 275 this->createNullAndInvokeCallback(); |
| 258 } | 276 } |
| 259 | 277 |
| 260 this->signalAlternativeCodePathFinishedForTesting(); | 278 this->signalAlternativeCodePathFinishedForTesting(); |
| 261 } | 279 } |
| 262 | 280 |
| 281 void CanvasAsyncBlobCreator::recordIdleTaskStatusHistogram() |
| 282 { |
| 283 DEFINE_STATIC_LOCAL(EnumerationHistogram, toBlobIdleTaskStatus, ("Blink.Canv
as.ToBlob.IdleTaskStatus", IdleTaskCount)); |
| 284 toBlobIdleTaskStatus.count(m_idleTaskStatus); |
| 285 } |
| 286 |
| 263 void CanvasAsyncBlobCreator::createBlobAndInvokeCallback() | 287 void CanvasAsyncBlobCreator::createBlobAndInvokeCallback() |
| 264 { | 288 { |
| 265 ASSERT(isMainThread()); | 289 ASSERT(isMainThread()); |
| 290 recordIdleTaskStatusHistogram(); |
| 291 |
| 292 double elapsedTime = WTF::monotonicallyIncreasingTime() - m_startTime; |
| 293 if (m_mimeType == MimeTypePng) { |
| 294 DEFINE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGCounter, ("Blink.Canv
as.ToBlobDuration.PNG", 0, 10000000, 50)); |
| 295 toBlobPNGCounter.count(elapsedTime * 1000000.0); |
| 296 } else if (m_mimeType == MimeTypeJpeg) { |
| 297 DEFINE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGCounter, ("Blink.Can
vas.ToBlobDuration.JPEG", 0, 10000000, 50)); |
| 298 toBlobJPEGCounter.count(elapsedTime * 1000000.0); |
| 299 } else { |
| 300 DEFINE_STATIC_LOCAL(CustomCountHistogram, toBlobWEBPCounter, ("Blink.Can
vas.ToBlobDuration.WEBP", 0, 10000000, 50)); |
| 301 toBlobWEBPCounter.count(elapsedTime * 1000000.0); |
| 302 } |
| 266 Blob* resultBlob = Blob::create(m_encodedImage->data(), m_encodedImage->size
(), convertMimeTypeEnumToString(m_mimeType)); | 303 Blob* resultBlob = Blob::create(m_encodedImage->data(), m_encodedImage->size
(), convertMimeTypeEnumToString(m_mimeType)); |
| 267 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_H
ERE, WTF::bind(&BlobCallback::handleEvent, wrapPersistent(m_callback.get()), wra
pPersistent(resultBlob))); | 304 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_H
ERE, WTF::bind(&BlobCallback::handleEvent, wrapPersistent(m_callback.get()), wra
pPersistent(resultBlob))); |
| 268 // Avoid unwanted retention, see dispose(). | 305 // Avoid unwanted retention, see dispose(). |
| 269 dispose(); | 306 dispose(); |
| 270 } | 307 } |
| 271 | 308 |
| 272 void CanvasAsyncBlobCreator::createNullAndInvokeCallback() | 309 void CanvasAsyncBlobCreator::createNullAndInvokeCallback() |
| 273 { | 310 { |
| 274 ASSERT(isMainThread()); | 311 ASSERT(isMainThread()); |
| 312 recordIdleTaskStatusHistogram(); |
| 275 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_H
ERE, WTF::bind(&BlobCallback::handleEvent, wrapPersistent(m_callback.get()), nul
lptr)); | 313 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_H
ERE, WTF::bind(&BlobCallback::handleEvent, wrapPersistent(m_callback.get()), nul
lptr)); |
| 276 // Avoid unwanted retention, see dispose(). | 314 // Avoid unwanted retention, see dispose(). |
| 277 dispose(); | 315 dispose(); |
| 278 } | 316 } |
| 279 | 317 |
| 280 void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality) | 318 void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality) |
| 281 { | 319 { |
| 282 ASSERT(!isMainThread()); | 320 ASSERT(!isMainThread()); |
| 283 ASSERT(m_mimeType == MimeTypeWebp); | 321 ASSERT(m_mimeType == MimeTypeWebp); |
| 284 | 322 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 Platform::current()->mainThread()->getWebTaskRunner()->postTask(
BLINK_FROM_HERE, WTF::bind(&CanvasAsyncBlobCreator::encodeRowsJpegOnMainThread,
wrapPersistent(this))); | 373 Platform::current()->mainThread()->getWebTaskRunner()->postTask(
BLINK_FROM_HERE, WTF::bind(&CanvasAsyncBlobCreator::encodeRowsJpegOnMainThread,
wrapPersistent(this))); |
| 336 } else { | 374 } else { |
| 337 // Failing in initialization of jpeg struct | 375 // Failing in initialization of jpeg struct |
| 338 this->signalAlternativeCodePathFinishedForTesting(); | 376 this->signalAlternativeCodePathFinishedForTesting(); |
| 339 } | 377 } |
| 340 } | 378 } |
| 341 } else { | 379 } else { |
| 342 ASSERT(m_idleTaskStatus == IdleTaskFailed || m_idleTaskStatus == IdleTas
kCompleted); | 380 ASSERT(m_idleTaskStatus == IdleTaskFailed || m_idleTaskStatus == IdleTas
kCompleted); |
| 343 this->signalAlternativeCodePathFinishedForTesting(); | 381 this->signalAlternativeCodePathFinishedForTesting(); |
| 344 } | 382 } |
| 345 | |
| 346 } | 383 } |
| 347 | 384 |
| 348 void CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent() | 385 void CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent() |
| 349 { | 386 { |
| 350 ASSERT(m_idleTaskStatus != IdleTaskNotStarted); | 387 ASSERT(m_idleTaskStatus != IdleTaskNotStarted); |
| 351 | 388 |
| 352 if (m_idleTaskStatus == IdleTaskStarted) { | 389 if (m_idleTaskStatus == IdleTaskStarted) { |
| 353 // It has taken too long to complete for the idle task. | 390 // It has taken too long to complete for the idle task. |
| 354 m_idleTaskStatus = IdleTaskSwitchedToMainThreadTask; | 391 m_idleTaskStatus = IdleTaskSwitchedToMainThreadTask; |
| 355 signalTaskSwitchInCompleteTimeoutEventForTesting(); | 392 signalTaskSwitchInCompleteTimeoutEventForTesting(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 366 } | 403 } |
| 367 } | 404 } |
| 368 | 405 |
| 369 void CanvasAsyncBlobCreator::postDelayedTaskToMainThread(const WebTraceLocation&
location, std::unique_ptr<SameThreadClosure> task, double delayMs) | 406 void CanvasAsyncBlobCreator::postDelayedTaskToMainThread(const WebTraceLocation&
location, std::unique_ptr<SameThreadClosure> task, double delayMs) |
| 370 { | 407 { |
| 371 DCHECK(isMainThread()); | 408 DCHECK(isMainThread()); |
| 372 Platform::current()->mainThread()->getWebTaskRunner()->postDelayedTask(locat
ion, std::move(task), delayMs); | 409 Platform::current()->mainThread()->getWebTaskRunner()->postDelayedTask(locat
ion, std::move(task), delayMs); |
| 373 } | 410 } |
| 374 | 411 |
| 375 } // namespace blink | 412 } // namespace blink |
| OLD | NEW |