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

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

Issue 2039673002: Track performance of toBlob and its complete timeout delay (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 6 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/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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698