Index: third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
index 01136649524082b8b79b83dda662a2a4852c957e..32aa475cf162aa0828a5c3652916d23f8d0f32f8 100644 |
--- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
@@ -5,6 +5,7 @@ |
#include "core/html/canvas/CanvasAsyncBlobCreator.h" |
#include "core/fileapi/Blob.h" |
+#include "platform/Histogram.h" |
#include "platform/ThreadSafeFunctional.h" |
#include "platform/graphics/ImageBuffer.h" |
#include "platform/image-encoders/JPEGImageEncoder.h" |
@@ -94,6 +95,7 @@ CanvasAsyncBlobCreator::CanvasAsyncBlobCreator(DOMUint8ClampedArray* data, MimeT |
m_pixelRowStride = size.width() * NumChannelsPng; |
m_idleTaskStatus = IdleTaskNotSupported; |
m_numRowsCompleted = 0; |
+ m_startTime = WTF::monotonicallyIncreasingTime(); |
} |
CanvasAsyncBlobCreator::~CanvasAsyncBlobCreator() |
@@ -251,6 +253,24 @@ void CanvasAsyncBlobCreator::encodeRowsJpegOnMainThread() |
this->signalAlternativeCodePathFinishedForTesting(); |
} |
+void CanvasAsyncBlobCreator::recordElapsedTime() |
+{ |
+ double elapsedTime = WTF::monotonicallyIncreasingTime() - m_startTime; |
+ if (m_mimeType == MimeTypePng) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.PNG", 0, 10000000, 50)); |
+ toBlobPNGCounter.count(elapsedTime * 1000000.0); |
+ } else if (m_mimeType == MimeTypeJpeg) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.JPEG", 0, 10000000, 50)); |
+ toBlobJPEGCounter.count(elapsedTime * 1000000.0); |
+ } else if (m_mimeType == MimeTypeWebp) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobWEBPCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.WEBP", 0, 10000000, 50)); |
+ toBlobWEBPCounter.count(elapsedTime * 1000000.0); |
+ } else { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobUnknownCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.Unknown", 0, 10000000, 50)); |
+ toBlobUnknownCounter.count(elapsedTime * 1000000.0); |
+ } |
+} |
+ |
void CanvasAsyncBlobCreator::createBlobAndInvokeCallback() |
{ |
ASSERT(isMainThread()); |
@@ -260,6 +280,7 @@ void CanvasAsyncBlobCreator::createBlobAndInvokeCallback() |
// non-GC members to allow teardown of CanvasAsyncBlobCreator. |
m_data.clear(); |
m_callback.clear(); |
+ recordElapsedTime(); |
} |
void CanvasAsyncBlobCreator::createNullAndInvokeCallback() |
@@ -270,6 +291,7 @@ void CanvasAsyncBlobCreator::createNullAndInvokeCallback() |
// clear non-GC members to allow teardown of CanvasAsyncBlobCreator. |
m_data.clear(); |
m_callback.clear(); |
+ recordElapsedTime(); |
Justin Novosad
2016/06/06 15:16:03
The failure case should not be recording to the sa
|
} |
void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality) |
@@ -344,6 +366,9 @@ void CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent() |
{ |
ASSERT(m_idleTaskStatus != IdleTaskNotStarted); |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, idleTaskCompleteTimeoutDelayHistogram, new EnumerationHistogram("Canvas.ToBlob.IdleTaskCompleteTimeoutDelay", NumberOfMimeTypeSupported)); |
Justin Novosad
2016/06/06 15:16:03
This histogram does not provide very significant i
|
+ idleTaskCompleteTimeoutDelayHistogram.count(m_mimeType); |
+ |
if (m_idleTaskStatus == IdleTaskStarted) { |
// It has taken too long to complete for the idle task. |
m_idleTaskStatus = IdleTaskSwitchedToMainThreadTask; |