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 a2258654313ad94f65350fda26b7e48f38c62b14..2b43599d5ec2cdf32815f444145cd0cc924a45a7 100644 |
--- a/third_party/WebKit/Source/core/frame/FrameSerializer.cpp |
+++ b/third_party/WebKit/Source/core/frame/FrameSerializer.cpp |
@@ -267,7 +267,14 @@ void SerializerMarkupAccumulator::AppendRewrittenAttribute( |
FrameSerializer::FrameSerializer(Deque<SerializedResource>& resources, |
Delegate& delegate) |
- : resources_(&resources), is_serializing_css_(false), delegate_(delegate) {} |
+ : resources_(&resources), |
+ is_serializing_css_(false), |
+ delegate_(delegate), |
+ total_image_count_(0), |
+ loaded_image_count_(0), |
+ total_css_count_(0), |
+ loaded_css_count_(0), |
+ should_collect_problem_metric_(false) {} |
void FrameSerializer::SerializeFrame(const LocalFrame& frame) { |
TRACE_EVENT0("page-serialization", "FrameSerializer::serializeFrame"); |
@@ -299,6 +306,8 @@ void FrameSerializer::SerializeFrame(const LocalFrame& frame) { |
SharedBuffer::Create(frame_html.data(), frame_html.length()))); |
} |
+ should_collect_problem_metric_ = |
+ delegate_.ShouldCollectProblemMetric() && frame.IsMainFrame(); |
for (Node* node : serialized_nodes) { |
DCHECK(node); |
if (!node->IsElementNode()) |
@@ -341,6 +350,36 @@ void FrameSerializer::SerializeFrame(const LocalFrame& frame) { |
SerializeCSSStyleSheet(*sheet, KURL()); |
} |
} |
+ if (should_collect_problem_metric_) { |
+ // Report detectors through UMA. |
+ // We're having exact 21 buckets for percentage because we want to have 5% |
+ // in each bucket to avoid potential spikes in the distribution. |
+ UMA_HISTOGRAM_COUNTS_100( |
+ "PageSerialization.ProblemDetection.TotalImageCount", |
+ static_cast<int64_t>(total_image_count_)); |
+ if (total_image_count_ > 0) { |
+ DCHECK_LE(loaded_image_count_, total_image_count_); |
+ DEFINE_STATIC_LOCAL( |
+ LinearHistogram, image_histogram, |
+ ("PageSerialization.ProblemDetection.LoadedImagePercentage", 1, 100, |
+ 21)); |
+ image_histogram.Count( |
+ static_cast<int64_t>(loaded_image_count_ * 100 / total_image_count_)); |
+ } |
+ |
+ UMA_HISTOGRAM_COUNTS_100("PageSerialization.ProblemDetection.TotalCSSCount", |
+ static_cast<int64_t>(total_css_count_)); |
+ if (total_css_count_ > 0) { |
+ DCHECK_LE(loaded_css_count_, total_css_count_); |
+ DEFINE_STATIC_LOCAL( |
+ LinearHistogram, css_histogram, |
+ ("PageSerialization.ProblemDetection.LoadedCSSPercentage", 1, 100, |
+ 21)); |
+ css_histogram.Count( |
+ static_cast<int64_t>(loaded_css_count_ * 100 / total_css_count_)); |
+ } |
+ should_collect_problem_metric_ = false; |
+ } |
} |
void FrameSerializer::SerializeCSSStyleSheet(CSSStyleSheet& style_sheet, |
@@ -354,6 +393,13 @@ void FrameSerializer::SerializeCSSStyleSheet(CSSStyleSheet& style_sheet, |
delegate_.ShouldSkipResourceWithURL(url))) { |
return; |
} |
+ if (!is_inline_css) |
+ resource_urls_.insert(url); |
+ if (should_collect_problem_metric_ && !is_inline_css) { |
+ total_css_count_++; |
+ if (style_sheet.LoadCompleted()) |
+ loaded_css_count_++; |
+ } |
TRACE_EVENT2("page-serialization", "FrameSerializer::serializeCSSStyleSheet", |
"type", "CSS", "url", url.ElidedString().Utf8().data()); |
@@ -390,7 +436,6 @@ void FrameSerializer::SerializeCSSStyleSheet(CSSStyleSheet& style_sheet, |
resources_->push_back( |
SerializedResource(url, String("text/css"), |
SharedBuffer::Create(text.data(), text.length()))); |
- resource_urls_.insert(url); |
} |
// Sub resources need to be serialized even if the CSS definition doesn't |
@@ -473,14 +518,19 @@ void FrameSerializer::AddToResources( |
} |
resources_->push_back(SerializedResource(url, mime_type, std::move(data))); |
- resource_urls_.insert(url); |
} |
void FrameSerializer::AddImageToResources(ImageResourceContent* image, |
const KURL& url) { |
- if (!image || !image->HasImage() || image->ErrorOccurred() || |
- !ShouldAddURL(url)) |
+ if (!ShouldAddURL(url)) |
return; |
+ resource_urls_.insert(url); |
+ if (should_collect_problem_metric_) |
+ total_image_count_++; |
+ if (!image || !image->HasImage() || image->ErrorOccurred()) |
+ return; |
+ if (should_collect_problem_metric_ && image->IsLoaded()) |
+ loaded_image_count_++; |
TRACE_EVENT2("page-serialization", "FrameSerializer::addImageToResources", |
"type", "image", "url", url.ElidedString().Utf8().data()); |
@@ -506,8 +556,10 @@ void FrameSerializer::AddImageToResources(ImageResourceContent* image, |
} |
void FrameSerializer::AddFontToResources(FontResource* font) { |
- if (!font || !font->IsLoaded() || !font->ResourceBuffer() || |
- !ShouldAddURL(font->Url())) |
+ if (!font || !ShouldAddURL(font->Url())) |
+ return; |
+ resource_urls_.insert(font->Url()); |
+ if (!font || !font->IsLoaded() || !font->ResourceBuffer()) |
return; |
RefPtr<const SharedBuffer> data(font->ResourceBuffer()); |