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 |