| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/prerender/prerender_histograms.h" | 5 #include "chrome/browser/prerender/prerender_histograms.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
| 12 #include "base/metrics/histogram_functions.h" |
| 12 #include "base/metrics/histogram_macros.h" | 13 #include "base/metrics/histogram_macros.h" |
| 13 #include "base/strings/stringprintf.h" | 14 #include "base/strings/stringprintf.h" |
| 14 #include "chrome/browser/prerender/prerender_manager.h" | 15 #include "chrome/browser/prerender/prerender_manager.h" |
| 15 #include "chrome/browser/prerender/prerender_util.h" | 16 #include "chrome/browser/prerender/prerender_util.h" |
| 16 #include "net/http/http_cache.h" | 17 #include "net/http/http_cache.h" |
| 17 | 18 |
| 18 namespace prerender { | 19 namespace prerender { |
| 19 | 20 |
| 20 namespace { | 21 namespace { |
| 21 | 22 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 | 107 |
| 107 // Dummy return value to make the compiler happy. | 108 // Dummy return value to make the compiler happy. |
| 108 NOTREACHED(); | 109 NOTREACHED(); |
| 109 return ComposeHistogramName("wash", name); | 110 return ComposeHistogramName("wash", name); |
| 110 } | 111 } |
| 111 | 112 |
| 112 bool OriginIsOmnibox(Origin origin) { | 113 bool OriginIsOmnibox(Origin origin) { |
| 113 return origin == ORIGIN_OMNIBOX; | 114 return origin == ORIGIN_OMNIBOX; |
| 114 } | 115 } |
| 115 | 116 |
| 117 const char* FirstContentfulPaintHiddenName(bool was_hidden) { |
| 118 return was_hidden ? ".Hidden" : ".Visible"; |
| 119 } |
| 120 |
| 116 } // namespace | 121 } // namespace |
| 117 | 122 |
| 118 // Helper macros for origin-based histogram reporting. All HISTOGRAM arguments | 123 // Helper macros for origin-based histogram reporting. All HISTOGRAM arguments |
| 119 // must be UMA_HISTOGRAM... macros that contain an argument "name" which these | 124 // must be UMA_HISTOGRAM... macros that contain an argument "name" which these |
| 120 // macros will eventually substitute for the actual name used. | 125 // macros will eventually substitute for the actual name used. |
| 121 #define PREFIXED_HISTOGRAM(histogram_name, origin, HISTOGRAM) \ | 126 #define PREFIXED_HISTOGRAM(histogram_name, origin, HISTOGRAM) \ |
| 122 PREFIXED_HISTOGRAM_INTERNAL(origin, IsOriginWash(), HISTOGRAM, histogram_name) | 127 PREFIXED_HISTOGRAM_INTERNAL(origin, IsOriginWash(), HISTOGRAM, histogram_name) |
| 123 | 128 |
| 124 #define PREFIXED_HISTOGRAM_ORIGIN_EXPERIMENT(histogram_name, origin, \ | 129 #define PREFIXED_HISTOGRAM_ORIGIN_EXPERIMENT(histogram_name, origin, \ |
| 125 HISTOGRAM) \ | 130 HISTOGRAM) \ |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 perceived_page_load_time); | 299 perceived_page_load_time); |
| 295 } else if (recorded_non_overlapping) { | 300 } else if (recorded_non_overlapping) { |
| 296 RECORD_PLT("PerceivedPLTFirstAfterMissNonOverlappingOnly", | 301 RECORD_PLT("PerceivedPLTFirstAfterMissNonOverlappingOnly", |
| 297 perceived_page_load_time); | 302 perceived_page_load_time); |
| 298 } | 303 } |
| 299 } | 304 } |
| 300 } | 305 } |
| 301 } | 306 } |
| 302 } | 307 } |
| 303 | 308 |
| 309 void PrerenderHistograms::RecordPerceivedFirstContentfulPaintStatus( |
| 310 Origin origin, |
| 311 bool successful, |
| 312 bool was_hidden) { |
| 313 base::UmaHistogramBoolean( |
| 314 GetHistogramName(origin, IsOriginWash(), "PerceivedTTFCPRecorded") + |
| 315 FirstContentfulPaintHiddenName(was_hidden), |
| 316 successful); |
| 317 } |
| 318 |
| 304 void PrerenderHistograms::RecordPageLoadTimeNotSwappedIn( | 319 void PrerenderHistograms::RecordPageLoadTimeNotSwappedIn( |
| 305 Origin origin, | 320 Origin origin, |
| 306 base::TimeDelta page_load_time, | 321 base::TimeDelta page_load_time, |
| 307 const GURL& url) const { | 322 const GURL& url) const { |
| 308 // If the URL to be prerendered is not a http[s] URL, or is a Google URL, | 323 // If the URL to be prerendered is not a http[s] URL, or is a Google URL, |
| 309 // do not record. | 324 // do not record. |
| 310 if (!url.SchemeIsHTTPOrHTTPS() || IsGoogleDomain(url)) | 325 if (!url.SchemeIsHTTPOrHTTPS() || IsGoogleDomain(url)) |
| 311 return; | 326 return; |
| 312 RECORD_PLT("PrerenderNotSwappedInPLT", page_load_time); | 327 RECORD_PLT("PrerenderNotSwappedInPLT", page_load_time); |
| 313 } | 328 } |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 436 DCHECK(thread_checker_.CalledOnValidThread()); | 451 DCHECK(thread_checker_.CalledOnValidThread()); |
| 437 | 452 |
| 438 const int kMaxRedirectCount = 10; | 453 const int kMaxRedirectCount = 10; |
| 439 std::string histogram_base_name = base::StringPrintf( | 454 std::string histogram_base_name = base::StringPrintf( |
| 440 "NoStatePrefetch%sResourceRedirects", is_main_resource ? "Main" : "Sub"); | 455 "NoStatePrefetch%sResourceRedirects", is_main_resource ? "Main" : "Sub"); |
| 441 std::string histogram_name = | 456 std::string histogram_name = |
| 442 GetHistogramName(origin, IsOriginWash(), histogram_base_name); | 457 GetHistogramName(origin, IsOriginWash(), histogram_base_name); |
| 443 RecordHistogramEnum(histogram_name, redirect_count, kMaxRedirectCount); | 458 RecordHistogramEnum(histogram_name, redirect_count, kMaxRedirectCount); |
| 444 } | 459 } |
| 445 | 460 |
| 446 void PrerenderHistograms::RecordFirstContentfulPaint( | 461 void PrerenderHistograms::RecordPrefetchFirstContentfulPaintTime( |
| 447 Origin origin, | 462 Origin origin, |
| 448 bool is_no_store, | 463 bool is_no_store, |
| 464 bool was_hidden, |
| 449 base::TimeDelta time, | 465 base::TimeDelta time, |
| 450 base::TimeDelta prefetch_age) { | 466 base::TimeDelta prefetch_age) { |
| 451 DCHECK(thread_checker_.CalledOnValidThread()); | 467 DCHECK(thread_checker_.CalledOnValidThread()); |
| 452 | 468 |
| 453 if (!prefetch_age.is_zero()) { | 469 if (!prefetch_age.is_zero()) { |
| 454 DCHECK_NE(origin, ORIGIN_NONE); | 470 DCHECK_NE(origin, ORIGIN_NONE); |
| 455 RecordHistogramTime(GetHistogramName(origin, IsOriginWash(), | 471 RecordHistogramTime( |
| 456 "Prerender.NoStatePrefetchAge"), | 472 GetHistogramName(origin, IsOriginWash(), "Prerender.PrefetchAge"), |
| 457 base::TimeDelta::FromMilliseconds(10), | 473 base::TimeDelta::FromMilliseconds(10), base::TimeDelta::FromMinutes(30), |
| 458 base::TimeDelta::FromMinutes(30), prefetch_age, 50); | 474 prefetch_age, 50); |
| 459 } | 475 } |
| 460 | 476 |
| 461 RecordHistogramTime(GetFirstContentfulPaintHistogramName( | 477 std::string histogram_base_name; |
| 462 origin, IsOriginWash(), is_no_store, prefetch_age), | 478 if (prefetch_age.is_zero()) { |
| 463 base::TimeDelta::FromMilliseconds(10), | 479 histogram_base_name = "PrefetchTTFCP.Reference"; |
| 480 } else { |
| 481 histogram_base_name = prefetch_age < base::TimeDelta::FromMinutes( |
| 482 net::HttpCache::kPrefetchReuseMins) |
| 483 ? "PrefetchTTFCP.Warm" |
| 484 : "PrefetchTTFCP.Cold"; |
| 485 } |
| 486 |
| 487 histogram_base_name += is_no_store ? ".NoStore" : ".Cacheable"; |
| 488 histogram_base_name += FirstContentfulPaintHiddenName(was_hidden); |
| 489 std::string histogram_name = |
| 490 GetHistogramName(origin, IsOriginWash(), histogram_base_name); |
| 491 |
| 492 RecordHistogramTime(histogram_name, base::TimeDelta::FromMilliseconds(10), |
| 464 base::TimeDelta::FromMinutes(2), time, 50); | 493 base::TimeDelta::FromMinutes(2), time, 50); |
| 465 } | 494 } |
| 466 | 495 |
| 467 bool PrerenderHistograms::IsOriginWash() const { | 496 bool PrerenderHistograms::IsOriginWash() const { |
| 468 if (!WithinWindow()) | 497 if (!WithinWindow()) |
| 469 return false; | 498 return false; |
| 470 return origin_wash_; | 499 return origin_wash_; |
| 471 } | 500 } |
| 472 | 501 |
| 473 // static | |
| 474 std::string PrerenderHistograms::GetFirstContentfulPaintHistogramName( | |
| 475 Origin origin, | |
| 476 bool is_wash, | |
| 477 bool is_no_store, | |
| 478 base::TimeDelta prefetch_age) { | |
| 479 std::string histogram_base_name; | |
| 480 if (prefetch_age.is_zero()) { | |
| 481 histogram_base_name = "NoStatePrefetchTTFCP.Reference"; | |
| 482 } else { | |
| 483 histogram_base_name = prefetch_age < base::TimeDelta::FromMinutes( | |
| 484 net::HttpCache::kPrefetchReuseMins) | |
| 485 ? "NoStatePrefetchTTFCP.Warm" | |
| 486 : "NoStatePrefetchTTFCP.Cold"; | |
| 487 } | |
| 488 | |
| 489 histogram_base_name += is_no_store ? ".NoStore" : ".Cacheable"; | |
| 490 return GetHistogramName(origin, is_wash, histogram_base_name); | |
| 491 } | |
| 492 | |
| 493 } // namespace prerender | 502 } // namespace prerender |
| OLD | NEW |