summaryrefslogtreecommitdiffstats
path: root/components/page_load_metrics
diff options
context:
space:
mode:
authorksakamoto <ksakamoto@chromium.org>2015-10-06 21:27:31 -0700
committerCommit bot <commit-bot@chromium.org>2015-10-07 04:28:13 +0000
commitdcc645d4800a86840a2a84ec1cf37019d7736d81 (patch)
tree7c6d432c5e789c061c30c1b0dafc2395612f8cb2 /components/page_load_metrics
parent9c26dc00c7fcd248973c4250c543be3071ff9637 (diff)
downloadchromium_src-dcc645d4800a86840a2a84ec1cf37019d7736d81.zip
chromium_src-dcc645d4800a86840a2a84ec1cf37019d7736d81.tar.gz
chromium_src-dcc645d4800a86840a2a84ec1cf37019d7736d81.tar.bz2
Add "time to first text paint" to PageLoadMetrics system
This adds PageLoad.Timing2.NavigationToFirstTextPaint(.BG) UMA histogram which measures the time between navigation start to first non-blank text paint. BUG=520410 CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel Review URL: https://codereview.chromium.org/1376643002 Cr-Commit-Position: refs/heads/master@{#352770}
Diffstat (limited to 'components/page_load_metrics')
-rw-r--r--components/page_load_metrics/browser/metrics_web_contents_observer.cc10
-rw-r--r--components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc22
-rw-r--r--components/page_load_metrics/common/page_load_metrics_messages.h1
-rw-r--r--components/page_load_metrics/common/page_load_timing.cc6
-rw-r--r--components/page_load_metrics/common/page_load_timing.h3
-rw-r--r--components/page_load_metrics/renderer/metrics_render_frame_observer.cc1
6 files changed, 40 insertions, 3 deletions
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.cc b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
index df37a05..2961f1e 100644
--- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc
+++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
@@ -146,7 +146,15 @@ void PageLoadTracker::RecordTimingHistograms() {
RecordEvent(PAGE_LOAD_SUCCESSFUL_FIRST_LAYOUT_BACKGROUND);
}
}
-
+ if (!timing_.first_text_paint.is_zero()) {
+ if (timing_.first_text_paint < background_delta) {
+ PAGE_LOAD_HISTOGRAM("PageLoad.Timing2.NavigationToFirstTextPaint",
+ timing_.first_text_paint);
+ } else {
+ PAGE_LOAD_HISTOGRAM("PageLoad.Timing2.NavigationToFirstTextPaint.BG",
+ timing_.first_text_paint);
+ }
+ }
}
void PageLoadTracker::RecordEvent(PageLoadEvent event) {
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc b/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc
index 147f094..fd06574 100644
--- a/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc
+++ b/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc
@@ -24,6 +24,8 @@ const char kDefaultTestUrl2[] = "https://whatever.com";
const char kHistogramNameFirstLayout[] =
"PageLoad.Timing2.NavigationToFirstLayout";
+const char kHistogramNameFirstTextPaint[] =
+ "PageLoad.Timing2.NavigationToFirstTextPaint";
const char kHistogramNameDomContent[] =
"PageLoad.Timing2.NavigationToDOMContentLoadedEventFired";
const char kHistogramNameLoad[] =
@@ -31,6 +33,8 @@ const char kHistogramNameLoad[] =
const char kBGHistogramNameFirstLayout[] =
"PageLoad.Timing2.NavigationToFirstLayout.BG";
+const char kBGHistogramNameFirstTextPaint[] =
+ "PageLoad.Timing2.NavigationToFirstTextPaint.BG";
const char kBGHistogramNameDomContent[] =
"PageLoad.Timing2.NavigationToDOMContentLoadedEventFired.BG";
const char kBGHistogramNameLoad[] =
@@ -55,6 +59,7 @@ class MetricsWebContentsObserverTest
histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 0);
histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0);
histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 0);
+ histogram_tester_.ExpectTotalCount(kHistogramNameFirstTextPaint, 0);
}
protected:
@@ -141,6 +146,7 @@ TEST_F(MetricsWebContentsObserverTest, SamePageNoTriggerUntilTrueNavCommit) {
histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 1);
histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout,
first_layout.InMilliseconds(), 1);
+ histogram_tester_.ExpectTotalCount(kHistogramNameFirstTextPaint, 0);
}
TEST_F(MetricsWebContentsObserverTest, SingleMetricAfterCommit) {
@@ -168,12 +174,14 @@ TEST_F(MetricsWebContentsObserverTest, SingleMetricAfterCommit) {
histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 1);
histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout,
first_layout.InMilliseconds(), 1);
+ histogram_tester_.ExpectTotalCount(kHistogramNameFirstTextPaint, 0);
}
TEST_F(MetricsWebContentsObserverTest, MultipleMetricsAfterCommits) {
base::TimeDelta first_layout_1 = base::TimeDelta::FromMilliseconds(1);
base::TimeDelta first_layout_2 = base::TimeDelta::FromMilliseconds(20);
base::TimeDelta response = base::TimeDelta::FromMilliseconds(10);
+ base::TimeDelta first_text_paint = base::TimeDelta::FromMilliseconds(30);
base::TimeDelta dom_content = base::TimeDelta::FromMilliseconds(40);
base::TimeDelta load = base::TimeDelta::FromMilliseconds(100);
@@ -181,6 +189,7 @@ TEST_F(MetricsWebContentsObserverTest, MultipleMetricsAfterCommits) {
timing.navigation_start = base::Time::FromDoubleT(1);
timing.first_layout = first_layout_1;
timing.response_start = response;
+ timing.first_text_paint = first_text_paint;
timing.dom_content_loaded_event_start = dom_content;
timing.load_event_start = load;
@@ -212,6 +221,10 @@ TEST_F(MetricsWebContentsObserverTest, MultipleMetricsAfterCommits) {
histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout,
first_layout_2.InMilliseconds(), 1);
+ histogram_tester_.ExpectTotalCount(kHistogramNameFirstTextPaint, 1);
+ histogram_tester_.ExpectBucketCount(kHistogramNameFirstTextPaint,
+ first_text_paint.InMilliseconds(), 1);
+
histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 1);
histogram_tester_.ExpectBucketCount(kHistogramNameDomContent,
dom_content.InMilliseconds(), 1);
@@ -252,10 +265,12 @@ TEST_F(MetricsWebContentsObserverTest, BackgroundDifferentHistogram) {
histogram_tester_.ExpectTotalCount(kBGHistogramNameFirstLayout, 1);
histogram_tester_.ExpectBucketCount(kBGHistogramNameFirstLayout,
first_layout.InMilliseconds(), 1);
+ histogram_tester_.ExpectTotalCount(kBGHistogramNameFirstTextPaint, 0);
histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 0);
histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0);
histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 0);
+ histogram_tester_.ExpectTotalCount(kHistogramNameFirstTextPaint, 0);
}
TEST_F(MetricsWebContentsObserverTest, OnlyBackgroundLaterEvents) {
@@ -278,6 +293,7 @@ TEST_F(MetricsWebContentsObserverTest, OnlyBackgroundLaterEvents) {
observer_->WasHidden();
observer_->WasShown();
timing.first_layout = base::TimeDelta::FromSeconds(3);
+ timing.first_text_paint = base::TimeDelta::FromSeconds(4);
observer_->OnMessageReceived(
PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing),
web_contents()->GetMainFrame());
@@ -290,6 +306,10 @@ TEST_F(MetricsWebContentsObserverTest, OnlyBackgroundLaterEvents) {
histogram_tester_.ExpectTotalCount(kBGHistogramNameFirstLayout, 1);
histogram_tester_.ExpectBucketCount(kBGHistogramNameFirstLayout,
timing.first_layout.InMilliseconds(), 1);
+ histogram_tester_.ExpectTotalCount(kBGHistogramNameFirstTextPaint, 1);
+ histogram_tester_.ExpectBucketCount(kBGHistogramNameFirstTextPaint,
+ timing.first_text_paint.InMilliseconds(),
+ 1);
histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 1);
histogram_tester_.ExpectBucketCount(
@@ -297,6 +317,7 @@ TEST_F(MetricsWebContentsObserverTest, OnlyBackgroundLaterEvents) {
timing.dom_content_loaded_event_start.InMilliseconds(), 1);
histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0);
histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 0);
+ histogram_tester_.ExpectTotalCount(kHistogramNameFirstTextPaint, 0);
}
TEST_F(MetricsWebContentsObserverTest, DontBackgroundQuickerLoad) {
@@ -336,6 +357,7 @@ TEST_F(MetricsWebContentsObserverTest, DontBackgroundQuickerLoad) {
histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 1);
histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout,
first_layout.InMilliseconds(), 1);
+ histogram_tester_.ExpectTotalCount(kHistogramNameFirstTextPaint, 0);
}
TEST_F(MetricsWebContentsObserverTest, FailProvisionalLoad) {
diff --git a/components/page_load_metrics/common/page_load_metrics_messages.h b/components/page_load_metrics/common/page_load_metrics_messages.h
index 466e244..0ad0d67 100644
--- a/components/page_load_metrics/common/page_load_metrics_messages.h
+++ b/components/page_load_metrics/common/page_load_metrics_messages.h
@@ -18,6 +18,7 @@ IPC_STRUCT_TRAITS_BEGIN(page_load_metrics::PageLoadTiming)
IPC_STRUCT_TRAITS_MEMBER(dom_content_loaded_event_start)
IPC_STRUCT_TRAITS_MEMBER(load_event_start)
IPC_STRUCT_TRAITS_MEMBER(first_layout)
+ IPC_STRUCT_TRAITS_MEMBER(first_text_paint)
IPC_STRUCT_TRAITS_END()
// Sent from renderer to browser process when the PageLoadTiming for the
diff --git a/components/page_load_metrics/common/page_load_timing.cc b/components/page_load_metrics/common/page_load_timing.cc
index 781048e..0af13ea 100644
--- a/components/page_load_metrics/common/page_load_timing.cc
+++ b/components/page_load_metrics/common/page_load_timing.cc
@@ -16,13 +16,15 @@ bool PageLoadTiming::operator==(const PageLoadTiming& other) const {
dom_content_loaded_event_start ==
other.dom_content_loaded_event_start &&
load_event_start == other.load_event_start &&
- first_layout == other.first_layout;
+ first_layout == other.first_layout &&
+ first_text_paint == other.first_text_paint;
}
bool PageLoadTiming::IsEmpty() const {
return navigation_start.is_null() && response_start.is_zero() &&
dom_content_loaded_event_start.is_zero() &&
- load_event_start.is_zero() && first_layout.is_zero();
+ load_event_start.is_zero() && first_layout.is_zero() &&
+ first_text_paint.is_zero();
}
} // namespace page_load_metrics
diff --git a/components/page_load_metrics/common/page_load_timing.h b/components/page_load_metrics/common/page_load_timing.h
index 80a9701..f5a94ff 100644
--- a/components/page_load_metrics/common/page_load_timing.h
+++ b/components/page_load_metrics/common/page_load_timing.h
@@ -38,6 +38,9 @@ struct PageLoadTiming {
// Time when the first layout is completed.
base::TimeDelta first_layout;
+ // Time when the first non-blank text is painted.
+ base::TimeDelta first_text_paint;
+
// If you add additional members, also be sure to update operator==,
// page_load_metrics_messages.h, and IsEmpty().
};
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
index 7d06f9a..9d41dd3 100644
--- a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
+++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
@@ -112,6 +112,7 @@ PageLoadTiming MetricsRenderFrameObserver::GetTiming() const {
ClampDelta(perf.domContentLoadedEventStart(), start);
timing.load_event_start = ClampDelta(perf.loadEventStart(), start);
timing.first_layout = ClampDelta(perf.firstLayout(), start);
+ timing.first_text_paint = ClampDelta(perf.firstTextPaint(), start);
return timing;
}