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 "components/ukm/ukm_service.h" | 7 #include "components/ukm/ukm_service.h" |
8 #include "components/ukm/ukm_source.h" | 8 #include "components/ukm/ukm_source.h" |
9 | 9 |
10 // static | 10 // static |
11 std::unique_ptr<page_load_metrics::PageLoadMetricsObserver> | 11 std::unique_ptr<page_load_metrics::PageLoadMetricsObserver> |
12 UkmPageLoadMetricsObserver::CreateIfNeeded() { | 12 UkmPageLoadMetricsObserver::CreateIfNeeded() { |
13 if (!g_browser_process->ukm_service()) { | 13 if (!g_browser_process->ukm_service()) { |
14 return nullptr; | 14 return nullptr; |
15 } | 15 } |
16 | 16 |
17 return base::MakeUnique<UkmPageLoadMetricsObserver>(); | 17 return base::MakeUnique<UkmPageLoadMetricsObserver>(); |
18 } | 18 } |
19 | 19 |
20 UkmPageLoadMetricsObserver::UkmPageLoadMetricsObserver() {} | 20 UkmPageLoadMetricsObserver::UkmPageLoadMetricsObserver() |
| 21 : source_(base::MakeUnique<ukm::UkmSource>()) {} |
| 22 |
| 23 UkmPageLoadMetricsObserver::~UkmPageLoadMetricsObserver() = default; |
21 | 24 |
22 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnStart( | 25 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnStart( |
23 content::NavigationHandle* navigation_handle, | 26 content::NavigationHandle* navigation_handle, |
24 const GURL& currently_committed_url, | 27 const GURL& currently_committed_url, |
25 bool started_in_foreground) { | 28 bool started_in_foreground) { |
| 29 source_->set_url(navigation_handle->GetURL()); |
| 30 navigation_start_ = navigation_handle->NavigationStart(); |
26 return started_in_foreground ? CONTINUE_OBSERVING : STOP_OBSERVING; | 31 return started_in_foreground ? CONTINUE_OBSERVING : STOP_OBSERVING; |
27 } | 32 } |
28 | 33 |
29 UkmPageLoadMetricsObserver::ObservePolicy | 34 UkmPageLoadMetricsObserver::ObservePolicy |
30 UkmPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground( | 35 UkmPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground( |
31 const page_load_metrics::PageLoadTiming& timing, | 36 const page_load_metrics::PageLoadTiming& timing, |
32 const page_load_metrics::PageLoadExtraInfo& info) { | 37 const page_load_metrics::PageLoadExtraInfo& info) { |
33 SendMetricsToUkm(timing, info); | 38 PopulateTiming(timing); |
| 39 PopulatePageLoadExtraInfo(info); |
| 40 |
| 41 // FlushMetricsOnAppEnterBackground may be invoked in cases where the page |
| 42 // load isn't 'done', but Chrome is being backgrounded and may be killed |
| 43 // without any subsequent noifications. In these cases, if we don't have an |
| 44 // end time already, we synthesize an end time using the current time. |
| 45 if (!source_->total_time()) |
| 46 source_->set_total_time(base::TimeTicks::Now() - navigation_start_); |
| 47 |
| 48 SendMetricsToUkm(); |
34 return STOP_OBSERVING; | 49 return STOP_OBSERVING; |
35 } | 50 } |
36 | 51 |
37 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnHidden( | 52 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnHidden( |
38 const page_load_metrics::PageLoadTiming& timing, | 53 const page_load_metrics::PageLoadTiming& timing, |
39 const page_load_metrics::PageLoadExtraInfo& info) { | 54 const page_load_metrics::PageLoadExtraInfo& info) { |
40 SendMetricsToUkm(timing, info); | 55 PopulateTiming(timing); |
| 56 PopulatePageLoadExtraInfo(info); |
| 57 SendMetricsToUkm(); |
41 return STOP_OBSERVING; | 58 return STOP_OBSERVING; |
42 } | 59 } |
43 | 60 |
| 61 void UkmPageLoadMetricsObserver::OnFailedProvisionalLoad( |
| 62 const page_load_metrics::FailedProvisionalLoadInfo& failed_load_info, |
| 63 const page_load_metrics::PageLoadExtraInfo& extra_info) { |
| 64 PopulatePageLoadExtraInfo(extra_info); |
| 65 SendMetricsToUkm(); |
| 66 } |
| 67 |
44 void UkmPageLoadMetricsObserver::OnComplete( | 68 void UkmPageLoadMetricsObserver::OnComplete( |
45 const page_load_metrics::PageLoadTiming& timing, | 69 const page_load_metrics::PageLoadTiming& timing, |
46 const page_load_metrics::PageLoadExtraInfo& info) { | 70 const page_load_metrics::PageLoadExtraInfo& info) { |
47 SendMetricsToUkm(timing, info); | 71 PopulateTiming(timing); |
| 72 PopulatePageLoadExtraInfo(info); |
| 73 SendMetricsToUkm(); |
48 } | 74 } |
49 | 75 |
50 void UkmPageLoadMetricsObserver::SendMetricsToUkm( | 76 void UkmPageLoadMetricsObserver::PopulateTiming( |
51 const page_load_metrics::PageLoadTiming& timing, | 77 const page_load_metrics::PageLoadTiming& timing) { |
| 78 if (timing.parse_start) |
| 79 source_->set_parse_start(timing.parse_start.value()); |
| 80 if (timing.first_contentful_paint) |
| 81 source_->set_first_contentful_paint(timing.first_contentful_paint.value()); |
| 82 if (timing.first_meaningful_paint) |
| 83 source_->set_first_meaningful_paint(timing.first_meaningful_paint.value()); |
| 84 } |
| 85 |
| 86 void UkmPageLoadMetricsObserver::PopulatePageLoadExtraInfo( |
52 const page_load_metrics::PageLoadExtraInfo& info) { | 87 const page_load_metrics::PageLoadExtraInfo& info) { |
53 if (!info.did_commit || !timing.first_contentful_paint) | 88 source_->set_url(info.url); |
54 return; | |
55 | 89 |
| 90 if (info.first_background_time) { |
| 91 source_->set_total_time(info.first_background_time.value()); |
| 92 } else if (info.page_end_time) { |
| 93 source_->set_total_time(info.page_end_time.value()); |
| 94 } |
| 95 } |
| 96 |
| 97 void UkmPageLoadMetricsObserver::SendMetricsToUkm() { |
56 ukm::UkmService* ukm_service = g_browser_process->ukm_service(); | 98 ukm::UkmService* ukm_service = g_browser_process->ukm_service(); |
57 DCHECK(ukm_service); | 99 DCHECK(ukm_service); |
58 | 100 ukm_service->RecordSource(std::move(source_)); |
59 std::unique_ptr<ukm::UkmSource> source = base::MakeUnique<ukm::UkmSource>(); | 101 source_.reset(); |
60 source->set_committed_url(info.url); | |
61 source->set_first_contentful_paint(timing.first_contentful_paint.value()); | |
62 | |
63 ukm_service->RecordSource(std::move(source)); | |
64 } | 102 } |
OLD | NEW |