Chromium Code Reviews| 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/Histogram.h" | |
| 8 #include "platform/ThreadSafeFunctional.h" | 9 #include "platform/ThreadSafeFunctional.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" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 71 } else if (mimeType == "image/webp") { | 72 } else if (mimeType == "image/webp") { |
| 72 mimeTypeEnum = CanvasAsyncBlobCreator::MimeTypeWebp; | 73 mimeTypeEnum = CanvasAsyncBlobCreator::MimeTypeWebp; |
| 73 } else { | 74 } else { |
| 74 mimeTypeEnum = CanvasAsyncBlobCreator::NumberOfMimeTypeSupported; | 75 mimeTypeEnum = CanvasAsyncBlobCreator::NumberOfMimeTypeSupported; |
| 75 } | 76 } |
| 76 return mimeTypeEnum; | 77 return mimeTypeEnum; |
| 77 } | 78 } |
| 78 | 79 |
| 79 } // anonymous namespace | 80 } // anonymous namespace |
| 80 | 81 |
| 81 CanvasAsyncBlobCreator* CanvasAsyncBlobCreator::create(DOMUint8ClampedArray* unp remultipliedRGBAImageData, const String& mimeType, const IntSize& size, BlobCall back* callback) | 82 CanvasAsyncBlobCreator* CanvasAsyncBlobCreator::create(DOMUint8ClampedArray* unp remultipliedRGBAImageData, const String& mimeType, const IntSize& size, BlobCall back* callback, double startTime) |
| 82 { | 83 { |
| 83 return new CanvasAsyncBlobCreator(unpremultipliedRGBAImageData, convertMimeT ypeStringToEnum(mimeType), size, callback); | 84 return new CanvasAsyncBlobCreator(unpremultipliedRGBAImageData, convertMimeT ypeStringToEnum(mimeType), size, callback, startTime); |
| 84 } | 85 } |
| 85 | 86 |
| 86 CanvasAsyncBlobCreator::CanvasAsyncBlobCreator(DOMUint8ClampedArray* data, MimeT ype mimeType, const IntSize& size, BlobCallback* callback) | 87 CanvasAsyncBlobCreator::CanvasAsyncBlobCreator(DOMUint8ClampedArray* data, MimeT ype mimeType, const IntSize& size, BlobCallback* callback, double startTime) |
| 87 : m_data(data) | 88 : m_data(data) |
| 88 , m_size(size) | 89 , m_size(size) |
| 89 , m_mimeType(mimeType) | 90 , m_mimeType(mimeType) |
| 90 , m_callback(callback) | 91 , m_callback(callback) |
| 92 , m_startTime(startTime) | |
| 91 { | 93 { |
| 92 ASSERT(m_data->length() == (unsigned) (size.height() * size.width() * 4)); | 94 ASSERT(m_data->length() == (unsigned) (size.height() * size.width() * 4)); |
| 93 m_encodedImage = adoptPtr(new Vector<unsigned char>()); | 95 m_encodedImage = adoptPtr(new Vector<unsigned char>()); |
| 94 m_pixelRowStride = size.width() * NumChannelsPng; | 96 m_pixelRowStride = size.width() * NumChannelsPng; |
| 95 m_idleTaskStatus = IdleTaskNotSupported; | 97 m_idleTaskStatus = IdleTaskNotSupported; |
| 96 m_numRowsCompleted = 0; | 98 m_numRowsCompleted = 0; |
| 97 } | 99 } |
| 98 | 100 |
| 99 CanvasAsyncBlobCreator::~CanvasAsyncBlobCreator() | 101 CanvasAsyncBlobCreator::~CanvasAsyncBlobCreator() |
| 100 { | 102 { |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 120 // There's no risk of concurrency as both tasks are on main thread. | 122 // There's no risk of concurrency as both tasks are on main thread. |
| 121 this->postDelayedTaskToMainThread(BLINK_FROM_HERE, bind(&CanvasAsyncBlob Creator::idleTaskStartTimeoutEvent, this, quality), IdleTaskStartTimeoutDelay); | 123 this->postDelayedTaskToMainThread(BLINK_FROM_HERE, bind(&CanvasAsyncBlob Creator::idleTaskStartTimeoutEvent, this, quality), IdleTaskStartTimeoutDelay); |
| 122 } else if (m_mimeType == MimeTypeWebp) { | 124 } else if (m_mimeType == MimeTypeWebp) { |
| 123 BackgroundTaskRunner::TaskSize taskSize = (m_size.height() * m_size.widt h() >= LongTaskImageSizeThreshold) ? BackgroundTaskRunner::TaskSizeLongRunningTa sk : BackgroundTaskRunner::TaskSizeShortRunningTask; | 125 BackgroundTaskRunner::TaskSize taskSize = (m_size.height() * m_size.widt h() >= LongTaskImageSizeThreshold) ? BackgroundTaskRunner::TaskSizeLongRunningTa sk : BackgroundTaskRunner::TaskSizeShortRunningTask; |
| 124 BackgroundTaskRunner::postOnBackgroundThread(BLINK_FROM_HERE, threadSafe Bind(&CanvasAsyncBlobCreator::encodeImageOnEncoderThread, wrapCrossThreadPersist ent(this), quality), taskSize); | 126 BackgroundTaskRunner::postOnBackgroundThread(BLINK_FROM_HERE, threadSafe Bind(&CanvasAsyncBlobCreator::encodeImageOnEncoderThread, wrapCrossThreadPersist ent(this), quality), taskSize); |
| 125 } | 127 } |
| 126 } | 128 } |
| 127 | 129 |
| 128 void CanvasAsyncBlobCreator::scheduleInitiateJpegEncoding(const double& quality) | 130 void CanvasAsyncBlobCreator::scheduleInitiateJpegEncoding(const double& quality) |
| 129 { | 131 { |
| 132 m_scheduleInitiateStartTime = WTF::monotonicallyIncreasingTime(); | |
| 130 Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE , bind<double>(&CanvasAsyncBlobCreator::initiateJpegEncoding, WeakPersistentThis Pointer<CanvasAsyncBlobCreator>(this), quality)); | 133 Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE , bind<double>(&CanvasAsyncBlobCreator::initiateJpegEncoding, WeakPersistentThis Pointer<CanvasAsyncBlobCreator>(this), quality)); |
| 131 } | 134 } |
| 132 | 135 |
| 133 void CanvasAsyncBlobCreator::initiateJpegEncoding(const double& quality, double deadlineSeconds) | 136 void CanvasAsyncBlobCreator::initiateJpegEncoding(const double& quality, double deadlineSeconds) |
| 134 { | 137 { |
| 135 ASSERT(isMainThread()); | 138 ASSERT(isMainThread()); |
| 139 m_initiateStartTime = WTF::monotonicallyIncreasingTime(); | |
| 140 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGInitiateEnco dingCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.InitiateEncodingDelay .JPEG", 0, 10000000, 50)); | |
| 141 toBlobJPEGInitiateEncodingCounter.count((m_initiateStartTime - m_scheduleIni tiateStartTime) * 1000000.0); | |
| 136 if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { | 142 if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { |
| 137 return; | 143 return; |
| 138 } | 144 } |
| 139 | 145 |
| 140 ASSERT(m_idleTaskStatus == IdleTaskNotStarted); | 146 ASSERT(m_idleTaskStatus == IdleTaskNotStarted); |
| 141 m_idleTaskStatus = IdleTaskStarted; | 147 m_idleTaskStatus = IdleTaskStarted; |
| 142 | 148 |
| 143 if (!initializeJpegStruct(quality)) { | 149 if (!initializeJpegStruct(quality)) { |
| 144 m_idleTaskStatus = IdleTaskFailed; | 150 m_idleTaskStatus = IdleTaskFailed; |
| 145 return; | 151 return; |
| 146 } | 152 } |
| 147 this->idleEncodeRowsJpeg(deadlineSeconds); | 153 this->idleEncodeRowsJpeg(deadlineSeconds); |
| 148 } | 154 } |
| 149 | 155 |
| 150 void CanvasAsyncBlobCreator::scheduleInitiatePngEncoding() | 156 void CanvasAsyncBlobCreator::scheduleInitiatePngEncoding() |
| 151 { | 157 { |
| 158 m_scheduleInitiateStartTime = WTF::monotonicallyIncreasingTime(); | |
| 152 Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE , bind<double>(&CanvasAsyncBlobCreator::initiatePngEncoding, WeakPersistentThisP ointer<CanvasAsyncBlobCreator>(this))); | 159 Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE , bind<double>(&CanvasAsyncBlobCreator::initiatePngEncoding, WeakPersistentThisP ointer<CanvasAsyncBlobCreator>(this))); |
| 153 } | 160 } |
| 154 | 161 |
| 155 void CanvasAsyncBlobCreator::initiatePngEncoding(double deadlineSeconds) | 162 void CanvasAsyncBlobCreator::initiatePngEncoding(double deadlineSeconds) |
| 156 { | 163 { |
| 157 ASSERT(isMainThread()); | 164 ASSERT(isMainThread()); |
| 165 m_initiateStartTime = WTF::monotonicallyIncreasingTime(); | |
| 166 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGInitiateEncod ingCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.InitiateEncodingDelay. PNG", 0, 10000000, 50)); | |
| 167 toBlobPNGInitiateEncodingCounter.count((m_initiateStartTime - m_scheduleInit iateStartTime) * 1000000.0); | |
| 158 if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { | 168 if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { |
| 159 return; | 169 return; |
| 160 } | 170 } |
| 161 | 171 |
| 162 ASSERT(m_idleTaskStatus == IdleTaskNotStarted); | 172 ASSERT(m_idleTaskStatus == IdleTaskNotStarted); |
| 163 m_idleTaskStatus = IdleTaskStarted; | 173 m_idleTaskStatus = IdleTaskStarted; |
| 164 | 174 |
| 165 if (!initializePngStruct()) { | 175 if (!initializePngStruct()) { |
| 166 m_idleTaskStatus = IdleTaskFailed; | 176 m_idleTaskStatus = IdleTaskFailed; |
| 167 return; | 177 return; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 185 } | 195 } |
| 186 PNGImageEncoder::writeOneRowToPng(inputPixels, m_pngEncoderState.get()); | 196 PNGImageEncoder::writeOneRowToPng(inputPixels, m_pngEncoderState.get()); |
| 187 inputPixels += m_pixelRowStride; | 197 inputPixels += m_pixelRowStride; |
| 188 } | 198 } |
| 189 m_numRowsCompleted = m_size.height(); | 199 m_numRowsCompleted = m_size.height(); |
| 190 PNGImageEncoder::finalizePng(m_pngEncoderState.get()); | 200 PNGImageEncoder::finalizePng(m_pngEncoderState.get()); |
| 191 | 201 |
| 192 m_idleTaskStatus = IdleTaskCompleted; | 202 m_idleTaskStatus = IdleTaskCompleted; |
| 193 | 203 |
| 194 if (isDeadlineNearOrPassed(deadlineSeconds)) { | 204 if (isDeadlineNearOrPassed(deadlineSeconds)) { |
| 205 double elapsedTime = WTF::monotonicallyIncreasingTime() - m_initiateStar tTime; | |
| 206 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGIdleEncod eCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.IdleEncodeDuration.PNG", 0, 10000000, 50)); | |
|
Justin Novosad
2016/06/13 21:21:35
This stat is not very useful the way it is current
| |
| 207 toBlobPNGIdleEncodeCounter.count(elapsedTime * 1000000.0); | |
|
xlai (Olivia)
2016/06/13 20:15:06
Move this whole block of code before this if-else
Justin Novosad
2016/06/13 21:21:35
actually, I was think more like doing "m_elapsedTi
xidachen
2016/06/22 14:01:25
Yes, that makes perfect sense.
| |
| 195 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FR OM_HERE, bind(&CanvasAsyncBlobCreator::createBlobAndInvokeCallback, this)); | 208 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FR OM_HERE, bind(&CanvasAsyncBlobCreator::createBlobAndInvokeCallback, this)); |
| 196 } else { | 209 } else { |
| 197 this->createBlobAndInvokeCallback(); | 210 this->createBlobAndInvokeCallback(); |
| 198 } | 211 } |
| 199 } | 212 } |
| 200 | 213 |
| 201 void CanvasAsyncBlobCreator::idleEncodeRowsJpeg(double deadlineSeconds) | 214 void CanvasAsyncBlobCreator::idleEncodeRowsJpeg(double deadlineSeconds) |
| 202 { | 215 { |
| 203 ASSERT(isMainThread()); | 216 ASSERT(isMainThread()); |
| 204 if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { | 217 if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { |
| 205 return; | 218 return; |
| 206 } | 219 } |
| 207 | 220 |
| 208 m_numRowsCompleted = JPEGImageEncoder::progressiveEncodeRowsJpegHelper(m_jpe gEncoderState.get(), m_data->data(), m_numRowsCompleted, SlackBeforeDeadline, de adlineSeconds); | 221 m_numRowsCompleted = JPEGImageEncoder::progressiveEncodeRowsJpegHelper(m_jpe gEncoderState.get(), m_data->data(), m_numRowsCompleted, SlackBeforeDeadline, de adlineSeconds); |
| 209 if (m_numRowsCompleted == m_size.height()) { | 222 if (m_numRowsCompleted == m_size.height()) { |
| 210 m_idleTaskStatus = IdleTaskCompleted; | 223 m_idleTaskStatus = IdleTaskCompleted; |
| 211 if (isDeadlineNearOrPassed(deadlineSeconds)) { | 224 if (isDeadlineNearOrPassed(deadlineSeconds)) { |
| 225 double elapsedTime = WTF::monotonicallyIncreasingTime() - m_initiate StartTime; | |
| 226 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGIdle EncodeCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.IdleEncodeDuration. JPEG", 0, 10000000, 50)); | |
| 227 toBlobJPEGIdleEncodeCounter.count(elapsedTime * 1000000.0); | |
|
xlai (Olivia)
2016/06/13 20:15:06
Move this whole block of code before this if-else
xidachen
2016/06/22 14:01:25
Using Justin's suggestion.
| |
| 212 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLIN K_FROM_HERE, bind(&CanvasAsyncBlobCreator::createBlobAndInvokeCallback, this)); | 228 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLIN K_FROM_HERE, bind(&CanvasAsyncBlobCreator::createBlobAndInvokeCallback, this)); |
| 213 } else { | 229 } else { |
| 214 this->createBlobAndInvokeCallback(); | 230 this->createBlobAndInvokeCallback(); |
| 215 } | 231 } |
| 216 } else if (m_numRowsCompleted == JPEGImageEncoder::ProgressiveEncodeFailed) { | 232 } else if (m_numRowsCompleted == JPEGImageEncoder::ProgressiveEncodeFailed) { |
| 217 m_idleTaskStatus = IdleTaskFailed; | 233 m_idleTaskStatus = IdleTaskFailed; |
| 218 this->createNullAndInvokeCallback(); | 234 this->createNullAndInvokeCallback(); |
| 219 } else { | 235 } else { |
| 220 Platform::current()->currentThread()->scheduler()->postIdleTask(BLINK_FR OM_HERE, bind<double>(&CanvasAsyncBlobCreator::idleEncodeRowsJpeg, this)); | 236 Platform::current()->currentThread()->scheduler()->postIdleTask(BLINK_FR OM_HERE, bind<double>(&CanvasAsyncBlobCreator::idleEncodeRowsJpeg, this)); |
| 221 } | 237 } |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 247 } else { | 263 } else { |
| 248 this->createNullAndInvokeCallback(); | 264 this->createNullAndInvokeCallback(); |
| 249 } | 265 } |
| 250 | 266 |
| 251 this->signalAlternativeCodePathFinishedForTesting(); | 267 this->signalAlternativeCodePathFinishedForTesting(); |
| 252 } | 268 } |
| 253 | 269 |
| 254 void CanvasAsyncBlobCreator::createBlobAndInvokeCallback() | 270 void CanvasAsyncBlobCreator::createBlobAndInvokeCallback() |
| 255 { | 271 { |
| 256 ASSERT(isMainThread()); | 272 ASSERT(isMainThread()); |
| 273 if (m_idleTaskStatus == IdleTaskNotSupported) { | |
| 274 DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, toBlobIdleNotSuppo rted, new EnumerationHistogram("Blink.Canvas.ToBlob.IdleTask.NotSupported", Idle TaskNotSupported)); | |
| 275 toBlobIdleNotSupported.count(m_idleTaskStatus); | |
| 276 } else if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { | |
| 277 DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, toBlobIdleSwitched ToMain, new EnumerationHistogram("Blink.Canvas.ToBlob.IdleTask.SwitchedToMain", IdleTaskNotSupported)); | |
|
xlai (Olivia)
2016/06/13 20:15:06
The enum type "SwitchedToMain" is misleading. We a
Justin Novosad
2016/06/13 21:21:35
Also, in the case where we switch to main, there a
xidachen
2016/06/22 14:01:25
This actually brings up another question: currentl
xidachen
2016/06/22 14:01:25
Done.
| |
| 278 toBlobIdleSwitchedToMain.count(m_idleTaskStatus); | |
| 279 } else if (m_idleTaskStatus == IdleTaskCompleted) { | |
| 280 DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, toBlobIdleTaskComp leted, new EnumerationHistogram("Blink.Canvas.ToBlob.IdleTask.Completed", IdleTa skNotSupported)); | |
| 281 toBlobIdleTaskCompleted.count(m_idleTaskStatus); | |
| 282 } | |
| 283 | |
| 284 double elapsedTime = WTF::monotonicallyIncreasingTime() - m_startTime; | |
| 285 if (m_mimeType == MimeTypePng) { | |
| 286 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGCounter, new CustomCountHistogram("Blink.Canvas.ToBlobDuration.PNG", 0, 10000000, 50)); | |
| 287 toBlobPNGCounter.count(elapsedTime * 1000000.0); | |
| 288 } else if (m_mimeType == MimeTypeJpeg) { | |
| 289 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGCounter, new CustomCountHistogram("Blink.Canvas.ToBlobDuration.JPEG", 0, 10000000, 50)); | |
| 290 toBlobJPEGCounter.count(elapsedTime * 1000000.0); | |
| 291 } else { | |
| 292 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobWEBPCounter, new CustomCountHistogram("Blink.Canvas.ToBlobDuration.WEBP", 0, 10000000, 50)); | |
| 293 toBlobWEBPCounter.count(elapsedTime * 1000000.0); | |
| 294 } | |
| 257 Blob* resultBlob = Blob::create(m_encodedImage->data(), m_encodedImage->size (), convertMimeTypeEnumToString(m_mimeType)); | 295 Blob* resultBlob = Blob::create(m_encodedImage->data(), m_encodedImage->size (), convertMimeTypeEnumToString(m_mimeType)); |
| 258 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_H ERE, bind(&BlobCallback::handleEvent, m_callback, resultBlob)); | 296 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_H ERE, bind(&BlobCallback::handleEvent, m_callback, resultBlob)); |
| 259 } | 297 } |
| 260 | 298 |
| 261 void CanvasAsyncBlobCreator::createNullAndInvokeCallback() | 299 void CanvasAsyncBlobCreator::createNullAndInvokeCallback() |
| 262 { | 300 { |
| 301 DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, toBlobFailed, new Enum erationHistogram("Blink.Canvas.ToBlob.IdleTask.Failed", IdleTaskNotSupported)); | |
| 302 toBlobFailed.count(m_idleTaskStatus); | |
| 263 ASSERT(isMainThread()); | 303 ASSERT(isMainThread()); |
| 264 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_H ERE, bind(&BlobCallback::handleEvent, m_callback, nullptr)); | 304 Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_H ERE, bind(&BlobCallback::handleEvent, m_callback, nullptr)); |
| 265 } | 305 } |
| 266 | 306 |
| 267 void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality) | 307 void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality) |
| 268 { | 308 { |
| 269 ASSERT(!isMainThread()); | 309 ASSERT(!isMainThread()); |
| 270 ASSERT(m_mimeType == MimeTypeWebp); | 310 ASSERT(m_mimeType == MimeTypeWebp); |
| 271 | 311 |
| 272 if (!ImageDataBuffer(m_size, m_data->data()).encodeImage("image/webp", quali ty, m_encodedImage.get())) { | 312 if (!ImageDataBuffer(m_size, m_data->data()).encodeImage("image/webp", quali ty, m_encodedImage.get())) { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 322 Platform::current()->mainThread()->getWebTaskRunner()->postTask( BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::encodeRowsJpegOnMainThread, this) ); | 362 Platform::current()->mainThread()->getWebTaskRunner()->postTask( BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::encodeRowsJpegOnMainThread, this) ); |
| 323 } else { | 363 } else { |
| 324 // Failing in initialization of jpeg struct | 364 // Failing in initialization of jpeg struct |
| 325 this->signalAlternativeCodePathFinishedForTesting(); | 365 this->signalAlternativeCodePathFinishedForTesting(); |
| 326 } | 366 } |
| 327 } | 367 } |
| 328 } else { | 368 } else { |
| 329 ASSERT(m_idleTaskStatus == IdleTaskFailed || m_idleTaskStatus == IdleTas kCompleted); | 369 ASSERT(m_idleTaskStatus == IdleTaskFailed || m_idleTaskStatus == IdleTas kCompleted); |
| 330 this->signalAlternativeCodePathFinishedForTesting(); | 370 this->signalAlternativeCodePathFinishedForTesting(); |
| 331 } | 371 } |
| 332 | |
| 333 } | 372 } |
| 334 | 373 |
| 335 void CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent() | 374 void CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent() |
| 336 { | 375 { |
| 337 ASSERT(m_idleTaskStatus != IdleTaskNotStarted); | 376 ASSERT(m_idleTaskStatus != IdleTaskNotStarted); |
| 338 | 377 |
| 339 if (m_idleTaskStatus == IdleTaskStarted) { | 378 if (m_idleTaskStatus == IdleTaskStarted) { |
| 340 // It has taken too long to complete for the idle task. | 379 // It has taken too long to complete for the idle task. |
| 341 m_idleTaskStatus = IdleTaskSwitchedToMainThreadTask; | 380 m_idleTaskStatus = IdleTaskSwitchedToMainThreadTask; |
| 342 signalTaskSwitchInCompleteTimeoutEventForTesting(); | 381 signalTaskSwitchInCompleteTimeoutEventForTesting(); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 353 } | 392 } |
| 354 } | 393 } |
| 355 | 394 |
| 356 void CanvasAsyncBlobCreator::postDelayedTaskToMainThread(const WebTraceLocation& location, std::unique_ptr<SameThreadClosure> task, double delayMs) | 395 void CanvasAsyncBlobCreator::postDelayedTaskToMainThread(const WebTraceLocation& location, std::unique_ptr<SameThreadClosure> task, double delayMs) |
| 357 { | 396 { |
| 358 DCHECK(isMainThread()); | 397 DCHECK(isMainThread()); |
| 359 Platform::current()->mainThread()->getWebTaskRunner()->postDelayedTask(locat ion, std::move(task), delayMs); | 398 Platform::current()->mainThread()->getWebTaskRunner()->postDelayedTask(locat ion, std::move(task), delayMs); |
| 360 } | 399 } |
| 361 | 400 |
| 362 } // namespace blink | 401 } // namespace blink |
| OLD | NEW |