| Index: components/page_load_metrics/browser/metrics_web_contents_observer.cc
|
| 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 fdde938812b67c813317dfc9afa98533d253dd93..0f8ef911777a1eb93364d264ca519767e23a0413 100644
|
| --- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc
|
| +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
|
| @@ -60,9 +60,16 @@ base::Time WallTimeFromTimeTicks(base::TimeTicks time) {
|
| base::TimeDelta::FromMinutes(10), 100)
|
|
|
| PageLoadTracker::PageLoadTracker(bool in_foreground)
|
| - : has_commit_(false), started_in_foreground_(in_foreground) {}
|
| + : has_commit_(false), started_in_foreground_(in_foreground) {
|
| + RecordEvent(PAGE_LOAD_STARTED);
|
| +}
|
|
|
| PageLoadTracker::~PageLoadTracker() {
|
| + // Even a load that failed a provisional load should log
|
| + // that it aborted before first layout.
|
| + if (timing_.first_layout.is_zero())
|
| + RecordEvent(PAGE_LOAD_ABORTED_BEFORE_FIRST_LAYOUT);
|
| +
|
| if (has_commit_)
|
| RecordTimingHistograms();
|
| }
|
| @@ -128,11 +135,19 @@ void PageLoadTracker::RecordTimingHistograms() {
|
| if (timing_.first_layout < background_delta) {
|
| PAGE_LOAD_HISTOGRAM("PageLoad.Timing2.NavigationToFirstLayout",
|
| timing_.first_layout);
|
| + RecordEvent(PAGE_LOAD_SUCCESSFUL_FIRST_LAYOUT_FG);
|
| } else {
|
| PAGE_LOAD_HISTOGRAM("PageLoad.Timing2.NavigationToFirstLayout.BG",
|
| timing_.first_layout);
|
| + RecordEvent(PAGE_LOAD_SUCCESSFUL_FIRST_LAYOUT_BG);
|
| }
|
| }
|
| +
|
| +}
|
| +
|
| +void PageLoadTracker::RecordEvent(PageLoadEvent event) {
|
| + UMA_HISTOGRAM_ENUMERATION(
|
| + "PageLoad.EventCounts", event, PAGE_LOAD_LAST_ENTRY);
|
| }
|
|
|
| MetricsWebContentsObserver::MetricsWebContentsObserver(
|
| @@ -175,12 +190,16 @@ void MetricsWebContentsObserver::DidFinishNavigation(
|
| provisional_loads_.take_and_erase(navigation_handle));
|
| DCHECK(finished_nav);
|
|
|
| - // TODO(csharrison) handle the two error cases:
|
| - // 1. Error pages that replace the previous page.
|
| - // 2. Error pages that leave the user on the previous page.
|
| - // For now these cases will be ignored.
|
| - if (!navigation_handle->HasCommitted())
|
| + // Handle a pre-commit error here. Navigations that result in an error page
|
| + // will be ignored.
|
| + // TODO(csharrison) filter out error codes that shouldn't result in us logging
|
| + // an aborted provisional load.
|
| + if (!navigation_handle->HasCommitted()) {
|
| + finished_nav->RecordEvent(PAGE_LOAD_FAILED_PROVISIONAL);
|
| + if (navigation_handle->GetNetErrorCode() == net::ERR_ABORTED)
|
| + finished_nav->RecordEvent(PAGE_LOAD_ABORTED_PROVISIONAL);
|
| return;
|
| + }
|
|
|
| // Don't treat a same-page nav as a new page load.
|
| if (navigation_handle->IsSamePage())
|
|
|