Chromium Code Reviews| Index: third_party/WebKit/Source/core/frame/FrameSerializer.cpp |
| diff --git a/third_party/WebKit/Source/core/frame/FrameSerializer.cpp b/third_party/WebKit/Source/core/frame/FrameSerializer.cpp |
| index 7f1d9e8a9f239a6ae96b80ea31edf54488fea56b..6c8fbdcdb7129b18eb78b3939dab61bf45516c1f 100644 |
| --- a/third_party/WebKit/Source/core/frame/FrameSerializer.cpp |
| +++ b/third_party/WebKit/Source/core/frame/FrameSerializer.cpp |
| @@ -59,6 +59,7 @@ |
| #include "core/html/ImageDocument.h" |
| #include "core/style/StyleFetchedImage.h" |
| #include "core/style/StyleImage.h" |
| +#include "platform/Histogram.h" |
| #include "platform/SerializedResource.h" |
| #include "platform/TraceEvent.h" |
| #include "platform/graphics/Image.h" |
| @@ -243,6 +244,7 @@ FrameSerializer::FrameSerializer( |
| Vector<SerializedResource>& resources, |
| Delegate& delegate) |
| : m_resources(&resources) |
| + , m_isSerializingCss(false) |
| , m_delegate(delegate) |
| { |
| } |
| @@ -261,14 +263,16 @@ void FrameSerializer::serializeFrame(const LocalFrame& frame) |
| return; |
| } |
| - TRACE_EVENT_BEGIN0("page-serialization", "FrameSerializer::serializeFrame HTML"); |
| HeapVector<Member<Node>> serializedNodes; |
| - SerializerMarkupAccumulator accumulator(m_delegate, document, serializedNodes); |
| - String text = serializeNodes<EditingStrategy>(accumulator, document, IncludeNode); |
| - |
| - CString frameHTML = document.encoding().encode(text, WTF::EntitiesForUnencodables); |
| - m_resources->append(SerializedResource(url, document.suggestedMIMEType(), SharedBuffer::create(frameHTML.data(), frameHTML.length()))); |
| - TRACE_EVENT_END0("page-serialization", "FrameSerializer::serializeFrame HTML"); |
| + { |
| + TRACE_EVENT0("page-serialization", "FrameSerializer::serializeFrame HTML"); |
| + SCOPED_BLINK_UMA_HISTOGRAM_TIMER("PageSerialization.HtmlSerializationTime"); |
| + SerializerMarkupAccumulator accumulator(m_delegate, document, serializedNodes); |
| + String text = serializeNodes<EditingStrategy>(accumulator, document, IncludeNode); |
| + |
| + CString frameHTML = document.encoding().encode(text, WTF::EntitiesForUnencodables); |
| + m_resources->append(SerializedResource(url, document.suggestedMIMEType(), SharedBuffer::create(frameHTML.data(), frameHTML.length()))); |
| + } |
| for (Node* node: serializedNodes) { |
| ASSERT(node); |
| @@ -312,6 +316,13 @@ void FrameSerializer::serializeCSSStyleSheet(CSSStyleSheet& styleSheet, const KU |
| { |
| TRACE_EVENT2("page-serialization", "FrameSerializer::serializeCSSStyleSheet", |
| "type", "CSS", "url", url.elidedString().utf8().data()); |
| + // Only report UMA metric if this is not a reentrant CSS serialization call. |
| + double cssStartTime = 0; |
| + if (!m_isSerializingCss) { |
| + m_isSerializingCss = true; |
| + cssStartTime = WTF::monotonicallyIncreasingTime(); |
| + } |
| + |
| StringBuilder cssText; |
| cssText.append("@charset \""); |
| cssText.append(styleSheet.contents()->charset().lower()); |
| @@ -338,6 +349,12 @@ void FrameSerializer::serializeCSSStyleSheet(CSSStyleSheet& styleSheet, const KU |
| m_resources->append(SerializedResource(url, String("text/css"), SharedBuffer::create(text.data(), text.length()))); |
| m_resourceURLs.add(url); |
| } |
| + |
| + if (cssStartTime != 0) { |
| + m_isSerializingCss = false; |
| + DEFINE_STATIC_LOCAL(CustomCountHistogram, cssHistogram, ("PageSerialization.CSSSerializationTime", 0, 10000000, 50)); |
| + cssHistogram.count(static_cast<int64_t>((WTF::monotonicallyIncreasingTime() - cssStartTime) * 1000000)); |
| + } |
| } |
| void FrameSerializer::serializeCSSRule(CSSRule* rule) |
| @@ -414,8 +431,17 @@ void FrameSerializer::addImageToResources(ImageResource* image, const KURL& url) |
| TRACE_EVENT2("page-serialization", "FrameSerializer::addImageToResources", |
| "type", "image", "url", url.elidedString().utf8().data()); |
| + double imageStartTime = WTF::monotonicallyIncreasingTime(); |
| + |
| RefPtr<const SharedBuffer> data = image->getImage()->data(); |
| addToResources(*image, data, url); |
| + |
| + // If we're already reporting time for CSS serialization don't report it for |
| + // this image to avoid reporting the same time twice. |
| + if (!m_isSerializingCss) { |
| + DEFINE_STATIC_LOCAL(CustomCountHistogram, imageHistogram, ("PageSerialization.ImageSerializationTime", 0, 10000000, 50)); |
| + imageHistogram.count(static_cast<int64_t>((WTF::monotonicallyIncreasingTime() - imageStartTime) * 1000000)); |
|
Ilya Sherman
2016/09/24 02:53:51
nit: Are there any utility functions in Blink that
carlosk
2016/09/27 21:07:29
I'm not very used to Blink's codebase but I think
Ilya Sherman
2016/09/28 00:42:15
Yep, it's a bit nicer this way -- thanks =)
|
| + } |
| } |
| void FrameSerializer::addFontToResources(FontResource* font) |