Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/data_reduction_proxy_metric s_observer.h" | 5 #include "chrome/browser/page_load_metrics/observers/data_reduction_proxy_metric s_observer.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/optional.h" | 9 #include "base/optional.h" |
| 10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 31 bool ShouldRecordHistogram(const DataReductionProxyData* data, | 31 bool ShouldRecordHistogram(const DataReductionProxyData* data, |
| 32 const base::Optional<base::TimeDelta>& event, | 32 const base::Optional<base::TimeDelta>& event, |
| 33 const page_load_metrics::PageLoadExtraInfo& info) { | 33 const page_load_metrics::PageLoadExtraInfo& info) { |
| 34 return data && data->used_data_reduction_proxy() && | 34 return data && data->used_data_reduction_proxy() && |
| 35 WasStartedInForegroundOptionalEventInForeground(event, info); | 35 WasStartedInForegroundOptionalEventInForeground(event, info); |
| 36 } | 36 } |
| 37 | 37 |
| 38 // A macro is needed because PAGE_LOAD_HISTOGRAM creates a static instance of | 38 // A macro is needed because PAGE_LOAD_HISTOGRAM creates a static instance of |
| 39 // the histogram. A distinct histogram is needed for each place that calls | 39 // the histogram. A distinct histogram is needed for each place that calls |
| 40 // RECORD_HISTOGRAMS_FOR_SUFFIX. | 40 // RECORD_HISTOGRAMS_FOR_SUFFIX. |
| 41 #define RECORD_HISTOGRAMS_FOR_SUFFIX(data, event, info, histogram_suffix) \ | 41 #define RECORD_HISTOGRAMS_FOR_SUFFIX(data, event, value, info, \ |
|
tbansal1
2016/09/06 17:28:16
Why do you need to pass value?
RyanSturm
2016/09/06 17:47:23
parse_duration is the difference between two event
tbansal1
2016/09/06 19:44:43
Acked. Can you add a comment that event is time de
| |
| 42 histogram_suffix) \ | |
| 42 do { \ | 43 do { \ |
| 43 if (ShouldRecordHistogram(data.get(), event, info)) { \ | 44 if (ShouldRecordHistogram(data.get(), event, info)) { \ |
| 44 PAGE_LOAD_HISTOGRAM( \ | 45 PAGE_LOAD_HISTOGRAM( \ |
| 45 std::string(internal::kHistogramDataReductionProxyPrefix) \ | 46 std::string(internal::kHistogramDataReductionProxyPrefix) \ |
| 46 .append(histogram_suffix), \ | 47 .append(histogram_suffix), \ |
| 47 event.value()); \ | 48 value); \ |
| 48 if (data->lofi_requested()) { \ | 49 if (data->lofi_requested()) { \ |
| 49 PAGE_LOAD_HISTOGRAM( \ | 50 PAGE_LOAD_HISTOGRAM( \ |
| 50 std::string(internal::kHistogramDataReductionProxyLoFiOnPrefix) \ | 51 std::string(internal::kHistogramDataReductionProxyLoFiOnPrefix) \ |
| 51 .append(histogram_suffix), \ | 52 .append(histogram_suffix), \ |
| 52 event.value()); \ | 53 value); \ |
| 53 } \ | 54 } \ |
| 54 } \ | 55 } \ |
| 55 } while (false) | 56 } while (false) |
| 56 | 57 |
| 57 } // namespace | 58 } // namespace |
| 58 | 59 |
| 59 namespace internal { | 60 namespace internal { |
| 60 | 61 |
| 61 const char kHistogramDataReductionProxyPrefix[] = | 62 const char kHistogramDataReductionProxyPrefix[] = |
| 62 "PageLoad.Clients.DataReductionProxy."; | 63 "PageLoad.Clients.DataReductionProxy."; |
| 63 const char kHistogramDataReductionProxyLoFiOnPrefix[] = | 64 const char kHistogramDataReductionProxyLoFiOnPrefix[] = |
| 64 "PageLoad.Clients.DataReductionProxy.LoFiOn."; | 65 "PageLoad.Clients.DataReductionProxy.LoFiOn."; |
| 65 const char kHistogramDOMContentLoadedEventFiredSuffix[] = | 66 const char kHistogramDOMContentLoadedEventFiredSuffix[] = |
| 66 "DocumentTiming.NavigationToDOMContentLoadedEventFired"; | 67 "DocumentTiming.NavigationToDOMContentLoadedEventFired"; |
| 67 const char kHistogramFirstLayoutSuffix[] = | 68 const char kHistogramFirstLayoutSuffix[] = |
| 68 "DocumentTiming.NavigationToFirstLayout"; | 69 "DocumentTiming.NavigationToFirstLayout"; |
| 69 const char kHistogramLoadEventFiredSuffix[] = | 70 const char kHistogramLoadEventFiredSuffix[] = |
| 70 "DocumentTiming.NavigationToLoadEventFired"; | 71 "DocumentTiming.NavigationToLoadEventFired"; |
| 71 const char kHistogramFirstContentfulPaintSuffix[] = | 72 const char kHistogramFirstContentfulPaintSuffix[] = |
| 72 "PaintTiming.NavigationToFirstContentfulPaint"; | 73 "PaintTiming.NavigationToFirstContentfulPaint"; |
| 73 const char kHistogramFirstImagePaintSuffix[] = | 74 const char kHistogramFirstImagePaintSuffix[] = |
| 74 "PaintTiming.NavigationToFirstImagePaint"; | 75 "PaintTiming.NavigationToFirstImagePaint"; |
| 75 const char kHistogramFirstPaintSuffix[] = "PaintTiming.NavigationToFirstPaint"; | 76 const char kHistogramFirstPaintSuffix[] = "PaintTiming.NavigationToFirstPaint"; |
| 76 const char kHistogramFirstTextPaintSuffix[] = | 77 const char kHistogramFirstTextPaintSuffix[] = |
| 77 "PaintTiming.NavigationToFirstTextPaint"; | 78 "PaintTiming.NavigationToFirstTextPaint"; |
| 78 const char kHistogramParseStartSuffix[] = "ParseTiming.NavigationToParseStart"; | 79 const char kHistogramParseStartSuffix[] = "ParseTiming.NavigationToParseStart"; |
| 80 const char kHistogramParseBlockedOnScriptLoadSuffix[] = | |
| 81 "ParseTiming.ParseBlockedOnScriptLoad"; | |
| 82 const char kHistogramParseDurationSuffix[] = "ParseTiming.ParseDuration"; | |
| 79 | 83 |
| 80 } // namespace internal | 84 } // namespace internal |
| 81 | 85 |
| 82 DataReductionProxyMetricsObserver::DataReductionProxyMetricsObserver() | 86 DataReductionProxyMetricsObserver::DataReductionProxyMetricsObserver() |
| 83 : browser_context_(nullptr) {} | 87 : browser_context_(nullptr) {} |
| 84 | 88 |
| 85 DataReductionProxyMetricsObserver::~DataReductionProxyMetricsObserver() {} | 89 DataReductionProxyMetricsObserver::~DataReductionProxyMetricsObserver() {} |
| 86 | 90 |
| 87 // Check if the NavigationData indicates anything about the DataReductionProxy. | 91 // Check if the NavigationData indicates anything about the DataReductionProxy. |
| 88 void DataReductionProxyMetricsObserver::OnCommit( | 92 void DataReductionProxyMetricsObserver::OnCommit( |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 124 if (data_reduction_proxy::params::IsIncludedInHoldbackFieldTrial() || | 128 if (data_reduction_proxy::params::IsIncludedInHoldbackFieldTrial() || |
| 125 data_reduction_proxy::params::IsIncludedInTamperDetectionExperiment()) { | 129 data_reduction_proxy::params::IsIncludedInTamperDetectionExperiment()) { |
| 126 return; | 130 return; |
| 127 } | 131 } |
| 128 // Only consider timing events that happened before the first background | 132 // Only consider timing events that happened before the first background |
| 129 // event. | 133 // event. |
| 130 base::Optional<base::TimeDelta> response_start; | 134 base::Optional<base::TimeDelta> response_start; |
| 131 base::Optional<base::TimeDelta> load_event_start; | 135 base::Optional<base::TimeDelta> load_event_start; |
| 132 base::Optional<base::TimeDelta> first_image_paint; | 136 base::Optional<base::TimeDelta> first_image_paint; |
| 133 base::Optional<base::TimeDelta> first_contentful_paint; | 137 base::Optional<base::TimeDelta> first_contentful_paint; |
| 138 base::Optional<base::TimeDelta> parse_blocked_on_script_load_duration; | |
| 139 base::Optional<base::TimeDelta> parse_stop; | |
| 134 if (WasStartedInForegroundOptionalEventInForeground(timing.response_start, | 140 if (WasStartedInForegroundOptionalEventInForeground(timing.response_start, |
| 135 info)) { | 141 info)) { |
| 136 response_start = timing.response_start; | 142 response_start = timing.response_start; |
| 137 } | 143 } |
| 138 if (WasStartedInForegroundOptionalEventInForeground(timing.load_event_start, | 144 if (WasStartedInForegroundOptionalEventInForeground(timing.load_event_start, |
| 139 info)) { | 145 info)) { |
| 140 load_event_start = timing.load_event_start; | 146 load_event_start = timing.load_event_start; |
| 141 } | 147 } |
| 142 if (WasStartedInForegroundOptionalEventInForeground(timing.first_image_paint, | 148 if (WasStartedInForegroundOptionalEventInForeground(timing.first_image_paint, |
| 143 info)) { | 149 info)) { |
| 144 first_image_paint = timing.first_image_paint; | 150 first_image_paint = timing.first_image_paint; |
| 145 } | 151 } |
| 146 if (WasStartedInForegroundOptionalEventInForeground( | 152 if (WasStartedInForegroundOptionalEventInForeground( |
| 147 timing.first_contentful_paint, info)) { | 153 timing.first_contentful_paint, info)) { |
| 148 first_contentful_paint = timing.first_contentful_paint; | 154 first_contentful_paint = timing.first_contentful_paint; |
| 149 } | 155 } |
| 156 if (WasStartedInForegroundOptionalEventInForeground( | |
| 157 timing.parse_blocked_on_script_load_duration, info)) { | |
| 158 parse_blocked_on_script_load_duration = | |
| 159 timing.parse_blocked_on_script_load_duration; | |
| 160 } | |
| 161 if (WasStartedInForegroundOptionalEventInForeground(timing.parse_stop, | |
| 162 info)) { | |
| 163 parse_stop = timing.parse_stop; | |
| 164 } | |
| 165 | |
| 150 DataReductionProxyPageLoadTiming data_reduction_proxy_timing( | 166 DataReductionProxyPageLoadTiming data_reduction_proxy_timing( |
| 151 timing.navigation_start, response_start, load_event_start, | 167 timing.navigation_start, response_start, load_event_start, |
| 152 first_image_paint, first_contentful_paint); | 168 first_image_paint, first_contentful_paint, |
| 169 parse_blocked_on_script_load_duration, parse_stop); | |
| 153 GetPingbackClient()->SendPingback(*data_, data_reduction_proxy_timing); | 170 GetPingbackClient()->SendPingback(*data_, data_reduction_proxy_timing); |
| 154 } | 171 } |
| 155 | 172 |
| 156 void DataReductionProxyMetricsObserver::OnDomContentLoadedEventStart( | 173 void DataReductionProxyMetricsObserver::OnDomContentLoadedEventStart( |
| 157 const page_load_metrics::PageLoadTiming& timing, | 174 const page_load_metrics::PageLoadTiming& timing, |
| 158 const page_load_metrics::PageLoadExtraInfo& info) { | 175 const page_load_metrics::PageLoadExtraInfo& info) { |
| 159 RECORD_HISTOGRAMS_FOR_SUFFIX( | 176 RECORD_HISTOGRAMS_FOR_SUFFIX( |
| 160 data_, timing.dom_content_loaded_event_start, info, | 177 data_, timing.dom_content_loaded_event_start, |
| 178 timing.dom_content_loaded_event_start.value(), info, | |
| 161 internal::kHistogramDOMContentLoadedEventFiredSuffix); | 179 internal::kHistogramDOMContentLoadedEventFiredSuffix); |
| 162 } | 180 } |
| 163 | 181 |
| 164 void DataReductionProxyMetricsObserver::OnLoadEventStart( | 182 void DataReductionProxyMetricsObserver::OnLoadEventStart( |
| 165 const page_load_metrics::PageLoadTiming& timing, | 183 const page_load_metrics::PageLoadTiming& timing, |
| 166 const page_load_metrics::PageLoadExtraInfo& info) { | 184 const page_load_metrics::PageLoadExtraInfo& info) { |
| 167 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.load_event_start, info, | 185 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.load_event_start, |
| 186 timing.load_event_start.value(), info, | |
| 168 internal::kHistogramLoadEventFiredSuffix); | 187 internal::kHistogramLoadEventFiredSuffix); |
| 169 } | 188 } |
| 170 | 189 |
| 171 void DataReductionProxyMetricsObserver::OnFirstLayout( | 190 void DataReductionProxyMetricsObserver::OnFirstLayout( |
| 172 const page_load_metrics::PageLoadTiming& timing, | 191 const page_load_metrics::PageLoadTiming& timing, |
| 173 const page_load_metrics::PageLoadExtraInfo& info) { | 192 const page_load_metrics::PageLoadExtraInfo& info) { |
| 174 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_layout, info, | 193 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_layout, |
| 194 timing.first_layout.value(), info, | |
| 175 internal::kHistogramFirstLayoutSuffix); | 195 internal::kHistogramFirstLayoutSuffix); |
| 176 } | 196 } |
| 177 | 197 |
| 178 void DataReductionProxyMetricsObserver::OnFirstPaint( | 198 void DataReductionProxyMetricsObserver::OnFirstPaint( |
| 179 const page_load_metrics::PageLoadTiming& timing, | 199 const page_load_metrics::PageLoadTiming& timing, |
| 180 const page_load_metrics::PageLoadExtraInfo& info) { | 200 const page_load_metrics::PageLoadExtraInfo& info) { |
| 181 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_paint, info, | 201 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_paint, |
| 202 timing.first_paint.value(), info, | |
| 182 internal::kHistogramFirstPaintSuffix); | 203 internal::kHistogramFirstPaintSuffix); |
| 183 } | 204 } |
| 184 | 205 |
| 185 void DataReductionProxyMetricsObserver::OnFirstTextPaint( | 206 void DataReductionProxyMetricsObserver::OnFirstTextPaint( |
| 186 const page_load_metrics::PageLoadTiming& timing, | 207 const page_load_metrics::PageLoadTiming& timing, |
| 187 const page_load_metrics::PageLoadExtraInfo& info) { | 208 const page_load_metrics::PageLoadExtraInfo& info) { |
| 188 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_text_paint, info, | 209 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_text_paint, |
| 210 timing.first_text_paint.value(), info, | |
| 189 internal::kHistogramFirstTextPaintSuffix); | 211 internal::kHistogramFirstTextPaintSuffix); |
| 190 } | 212 } |
| 191 | 213 |
| 192 void DataReductionProxyMetricsObserver::OnFirstImagePaint( | 214 void DataReductionProxyMetricsObserver::OnFirstImagePaint( |
| 193 const page_load_metrics::PageLoadTiming& timing, | 215 const page_load_metrics::PageLoadTiming& timing, |
| 194 const page_load_metrics::PageLoadExtraInfo& info) { | 216 const page_load_metrics::PageLoadExtraInfo& info) { |
| 195 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_image_paint, info, | 217 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_image_paint, |
| 218 timing.first_image_paint.value(), info, | |
| 196 internal::kHistogramFirstImagePaintSuffix); | 219 internal::kHistogramFirstImagePaintSuffix); |
| 197 } | 220 } |
| 198 | 221 |
| 199 void DataReductionProxyMetricsObserver::OnFirstContentfulPaint( | 222 void DataReductionProxyMetricsObserver::OnFirstContentfulPaint( |
| 200 const page_load_metrics::PageLoadTiming& timing, | 223 const page_load_metrics::PageLoadTiming& timing, |
| 201 const page_load_metrics::PageLoadExtraInfo& info) { | 224 const page_load_metrics::PageLoadExtraInfo& info) { |
| 202 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_contentful_paint, info, | 225 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.first_contentful_paint, |
| 226 timing.first_contentful_paint.value(), info, | |
| 203 internal::kHistogramFirstContentfulPaintSuffix); | 227 internal::kHistogramFirstContentfulPaintSuffix); |
| 204 } | 228 } |
| 205 | 229 |
| 206 void DataReductionProxyMetricsObserver::OnParseStart( | 230 void DataReductionProxyMetricsObserver::OnParseStart( |
| 207 const page_load_metrics::PageLoadTiming& timing, | 231 const page_load_metrics::PageLoadTiming& timing, |
| 208 const page_load_metrics::PageLoadExtraInfo& info) { | 232 const page_load_metrics::PageLoadExtraInfo& info) { |
| 209 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.parse_start, info, | 233 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.parse_start, |
| 234 timing.parse_start.value(), info, | |
| 210 internal::kHistogramParseStartSuffix); | 235 internal::kHistogramParseStartSuffix); |
| 211 } | 236 } |
| 212 | 237 |
| 238 void DataReductionProxyMetricsObserver::OnParseStop( | |
| 239 const page_load_metrics::PageLoadTiming& timing, | |
| 240 const page_load_metrics::PageLoadExtraInfo& info) { | |
| 241 base::TimeDelta parse_duration = | |
| 242 timing.parse_stop.value() - timing.parse_start.value(); | |
| 243 RECORD_HISTOGRAMS_FOR_SUFFIX(data_, timing.parse_stop, parse_duration, info, | |
| 244 internal::kHistogramParseDurationSuffix); | |
| 245 RECORD_HISTOGRAMS_FOR_SUFFIX( | |
| 246 data_, timing.parse_blocked_on_script_load_duration, | |
| 247 timing.parse_blocked_on_script_load_duration.value(), info, | |
| 248 internal::kHistogramParseBlockedOnScriptLoadSuffix); | |
| 249 } | |
| 250 | |
| 213 DataReductionProxyPingbackClient* | 251 DataReductionProxyPingbackClient* |
| 214 DataReductionProxyMetricsObserver::GetPingbackClient() const { | 252 DataReductionProxyMetricsObserver::GetPingbackClient() const { |
| 215 return DataReductionProxyChromeSettingsFactory::GetForBrowserContext( | 253 return DataReductionProxyChromeSettingsFactory::GetForBrowserContext( |
| 216 browser_context_) | 254 browser_context_) |
| 217 ->data_reduction_proxy_service() | 255 ->data_reduction_proxy_service() |
| 218 ->pingback_client(); | 256 ->pingback_client(); |
| 219 } | 257 } |
| 220 | 258 |
| 221 } // namespace data_reduction_proxy | 259 } // namespace data_reduction_proxy |
| OLD | NEW |