Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_obser ver.h" | 5 #include "chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_obser ver.h" |
| 6 #include "chrome/browser/browser_process.h" | 6 #include "chrome/browser/browser_process.h" |
| 7 #include "chrome/browser/page_load_metrics/page_load_metrics_util.h" | 7 #include "chrome/browser/page_load_metrics/page_load_metrics_util.h" |
| 8 #include "components/ukm/ukm_entry_builder.h" | 8 #include "components/ukm/ukm_entry_builder.h" |
| 9 #include "components/ukm/ukm_service.h" | 9 #include "components/ukm/ukm_service.h" |
| 10 | 10 |
| 11 namespace internal { | 11 namespace internal { |
| 12 | 12 |
| 13 const char kUkmPageLoadEventName[] = "PageLoad"; | 13 const char kUkmPageLoadEventName[] = "PageLoad"; |
| 14 const char kUkmParseStartName[] = "ParseTiming.ParseStart"; | |
| 15 const char kUkmDomContentLoadedName[] = | |
| 16 "DocumentTiming.NavigationToDOMContentLoadedEventFired"; | |
| 17 const char kUkmLoadEventName[] = "DocumentTiming.NavigationToLoadEventFired"; | |
| 14 const char kUkmFirstContentfulPaintName[] = | 18 const char kUkmFirstContentfulPaintName[] = |
| 15 "PaintTiming.NavigationToFirstContentfulPaint"; | 19 "PaintTiming.NavigationToFirstContentfulPaint"; |
| 20 const char kUkmFirstMeaningfulPaintName[] = | |
| 21 "Experimental.PaintTiming.NavigationToFirstMeaningfulPaint"; | |
| 22 const char kUkmForegroundDurationName[] = "PageTiming.ForegroundDuration"; | |
|
tdresser
2017/03/02 18:06:00
All of DocumentTiming, PageTiming, PaintTiming and
| |
| 16 | 23 |
| 17 } // namespace internal | 24 } // namespace internal |
| 18 | 25 |
| 19 // static | 26 // static |
| 20 std::unique_ptr<page_load_metrics::PageLoadMetricsObserver> | 27 std::unique_ptr<page_load_metrics::PageLoadMetricsObserver> |
| 21 UkmPageLoadMetricsObserver::CreateIfNeeded() { | 28 UkmPageLoadMetricsObserver::CreateIfNeeded() { |
| 22 if (!g_browser_process->ukm_service()) { | 29 if (!g_browser_process->ukm_service()) { |
| 23 return nullptr; | 30 return nullptr; |
| 24 } | 31 } |
| 25 | 32 |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 41 ukm::UkmService* ukm_service = g_browser_process->ukm_service(); | 48 ukm::UkmService* ukm_service = g_browser_process->ukm_service(); |
| 42 ukm_service->UpdateSourceURL(source_id_, navigation_handle->GetURL()); | 49 ukm_service->UpdateSourceURL(source_id_, navigation_handle->GetURL()); |
| 43 return CONTINUE_OBSERVING; | 50 return CONTINUE_OBSERVING; |
| 44 } | 51 } |
| 45 | 52 |
| 46 UkmPageLoadMetricsObserver::ObservePolicy | 53 UkmPageLoadMetricsObserver::ObservePolicy |
| 47 UkmPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground( | 54 UkmPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground( |
| 48 const page_load_metrics::PageLoadTiming& timing, | 55 const page_load_metrics::PageLoadTiming& timing, |
| 49 const page_load_metrics::PageLoadExtraInfo& info) { | 56 const page_load_metrics::PageLoadExtraInfo& info) { |
| 50 RecordTimingMetrics(timing); | 57 RecordTimingMetrics(timing); |
| 51 RecordPageLoadExtraInfoMetrics(info); | 58 RecordPageLoadExtraInfoMetrics(info, base::TimeTicks::Now()); |
| 52 return STOP_OBSERVING; | 59 return STOP_OBSERVING; |
| 53 } | 60 } |
| 54 | 61 |
| 55 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnHidden( | 62 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnHidden( |
| 56 const page_load_metrics::PageLoadTiming& timing, | 63 const page_load_metrics::PageLoadTiming& timing, |
| 57 const page_load_metrics::PageLoadExtraInfo& info) { | 64 const page_load_metrics::PageLoadExtraInfo& info) { |
| 58 RecordTimingMetrics(timing); | 65 RecordTimingMetrics(timing); |
| 59 RecordPageLoadExtraInfoMetrics(info); | 66 RecordPageLoadExtraInfoMetrics( |
| 67 info, base::TimeTicks() /* no app_background_time */); | |
| 60 return STOP_OBSERVING; | 68 return STOP_OBSERVING; |
| 61 } | 69 } |
| 62 | 70 |
| 63 void UkmPageLoadMetricsObserver::OnFailedProvisionalLoad( | 71 void UkmPageLoadMetricsObserver::OnFailedProvisionalLoad( |
| 64 const page_load_metrics::FailedProvisionalLoadInfo& failed_load_info, | 72 const page_load_metrics::FailedProvisionalLoadInfo& failed_load_info, |
| 65 const page_load_metrics::PageLoadExtraInfo& extra_info) { | 73 const page_load_metrics::PageLoadExtraInfo& extra_info) { |
| 66 RecordPageLoadExtraInfoMetrics(extra_info); | 74 RecordPageLoadExtraInfoMetrics( |
| 75 extra_info, base::TimeTicks() /* no app_background_time */); | |
| 67 } | 76 } |
| 68 | 77 |
| 69 void UkmPageLoadMetricsObserver::OnComplete( | 78 void UkmPageLoadMetricsObserver::OnComplete( |
| 70 const page_load_metrics::PageLoadTiming& timing, | 79 const page_load_metrics::PageLoadTiming& timing, |
| 71 const page_load_metrics::PageLoadExtraInfo& info) { | 80 const page_load_metrics::PageLoadExtraInfo& info) { |
| 72 RecordTimingMetrics(timing); | 81 RecordTimingMetrics(timing); |
| 73 RecordPageLoadExtraInfoMetrics(info); | 82 RecordPageLoadExtraInfoMetrics( |
| 83 info, base::TimeTicks() /* no app_background_time */); | |
| 74 } | 84 } |
| 75 | 85 |
| 76 void UkmPageLoadMetricsObserver::RecordTimingMetrics( | 86 void UkmPageLoadMetricsObserver::RecordTimingMetrics( |
| 77 const page_load_metrics::PageLoadTiming& timing) { | 87 const page_load_metrics::PageLoadTiming& timing) { |
| 78 if (!timing.first_contentful_paint) | |
| 79 return; | |
| 80 | |
| 81 ukm::UkmService* ukm_service = g_browser_process->ukm_service(); | 88 ukm::UkmService* ukm_service = g_browser_process->ukm_service(); |
| 82 std::unique_ptr<ukm::UkmEntryBuilder> builder = | 89 std::unique_ptr<ukm::UkmEntryBuilder> builder = |
| 83 ukm_service->GetEntryBuilder(source_id_, internal::kUkmPageLoadEventName); | 90 ukm_service->GetEntryBuilder(source_id_, internal::kUkmPageLoadEventName); |
| 84 builder->AddMetric(internal::kUkmFirstContentfulPaintName, | 91 if (timing.parse_start) { |
| 85 timing.first_contentful_paint.value().InMilliseconds()); | 92 builder->AddMetric(internal::kUkmParseStartName, |
| 93 timing.parse_start.value().InMilliseconds()); | |
| 94 } | |
| 95 if (timing.dom_content_loaded_event_start) { | |
| 96 builder->AddMetric( | |
| 97 internal::kUkmDomContentLoadedName, | |
| 98 timing.dom_content_loaded_event_start.value().InMilliseconds()); | |
| 99 } | |
| 100 if (timing.load_event_start) { | |
| 101 builder->AddMetric(internal::kUkmLoadEventName, | |
| 102 timing.load_event_start.value().InMilliseconds()); | |
| 103 } | |
| 104 if (timing.first_contentful_paint) { | |
| 105 builder->AddMetric(internal::kUkmFirstContentfulPaintName, | |
| 106 timing.first_contentful_paint.value().InMilliseconds()); | |
| 107 } | |
| 108 if (timing.first_meaningful_paint) { | |
| 109 builder->AddMetric(internal::kUkmFirstMeaningfulPaintName, | |
| 110 timing.first_meaningful_paint.value().InMilliseconds()); | |
| 111 } | |
| 86 } | 112 } |
| 87 | 113 |
| 88 void UkmPageLoadMetricsObserver::RecordPageLoadExtraInfoMetrics( | 114 void UkmPageLoadMetricsObserver::RecordPageLoadExtraInfoMetrics( |
| 89 const page_load_metrics::PageLoadExtraInfo& info) { | 115 const page_load_metrics::PageLoadExtraInfo& info, |
| 116 base::TimeTicks app_background_time) { | |
| 90 ukm::UkmService* ukm_service = g_browser_process->ukm_service(); | 117 ukm::UkmService* ukm_service = g_browser_process->ukm_service(); |
| 91 ukm_service->UpdateSourceURL(source_id_, info.url); | 118 ukm_service->UpdateSourceURL(source_id_, info.url); |
| 119 | |
| 120 base::Optional<base::TimeDelta> foreground_duration = | |
| 121 page_load_metrics::GetInitialForegroundDuration(info, | |
| 122 app_background_time); | |
| 123 if (foreground_duration) { | |
| 124 std::unique_ptr<ukm::UkmEntryBuilder> builder = | |
| 125 ukm_service->GetEntryBuilder(source_id_, | |
| 126 internal::kUkmPageLoadEventName); | |
| 127 builder->AddMetric(internal::kUkmForegroundDurationName, | |
| 128 foreground_duration.value().InMilliseconds()); | |
| 129 } | |
| 92 } | 130 } |
| OLD | NEW |