Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(195)

Unified Diff: chrome/renderer/page_load_histograms.cc

Issue 2437863005: Remove PLT.* histograms. (Closed)
Patch Set: rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/renderer/page_load_histograms.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/renderer/page_load_histograms.cc
diff --git a/chrome/renderer/page_load_histograms.cc b/chrome/renderer/page_load_histograms.cc
deleted file mode 100644
index b7cbdff3890feff77172c60c9ee23d54e845f9c1..0000000000000000000000000000000000000000
--- a/chrome/renderer/page_load_histograms.cc
+++ /dev/null
@@ -1,630 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// TODO(bmcquade): delete this class in October 2016, as it is deprecated by the
-// new PageLoad.* UMA histograms.
-
-#include "chrome/renderer/page_load_histograms.h"
-
-#include <stddef.h>
-
-#include <memory>
-#include <string>
-
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/metrics/field_trial.h"
-#include "base/metrics/histogram.h"
-#include "base/metrics/persistent_histogram_allocator.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
-#include "chrome/common/chrome_switches.h"
-#include "chrome/renderer/searchbox/search_bouncer.h"
-#include "content/public/common/content_constants.h"
-#include "content/public/renderer/document_state.h"
-#include "content/public/renderer/render_frame.h"
-#include "content/public/renderer/render_thread.h"
-#include "content/public/renderer/render_view.h"
-#include "extensions/common/url_pattern.h"
-#include "net/base/url_util.h"
-#include "net/http/http_response_headers.h"
-#include "third_party/WebKit/public/platform/URLConversion.h"
-#include "third_party/WebKit/public/platform/WebURLRequest.h"
-#include "third_party/WebKit/public/platform/WebURLResponse.h"
-#include "third_party/WebKit/public/web/WebDocument.h"
-#include "third_party/WebKit/public/web/WebLocalFrame.h"
-#include "third_party/WebKit/public/web/WebPerformance.h"
-#include "third_party/WebKit/public/web/WebView.h"
-#include "url/gurl.h"
-
-#if defined(ENABLE_EXTENSIONS)
-#include "chrome/renderer/extensions/chrome_extensions_renderer_client.h"
-#include "extensions/renderer/dispatcher.h"
-#endif
-
-using blink::WebDataSource;
-using blink::WebLocalFrame;
-using blink::WebPerformance;
-using blink::WebString;
-using base::Time;
-using base::TimeDelta;
-using content::DocumentState;
-
-const size_t kPLTCount = 100;
-
-namespace {
-
-// ID indicating that no GWS-Chrome joint experiment is active.
-const int kNoExperiment = 0;
-
-// Max ID of GWS-Chrome joint experiment. If you change this value, please
-// update PLT_HISTOGRAM_WITH_GWS_VARIANT accordingly.
-const int kMaxExperimentID = 20;
-
-TimeDelta kPLTMin() {
- return TimeDelta::FromMilliseconds(10);
-}
-TimeDelta kPLTMax() {
- return TimeDelta::FromMinutes(10);
-}
-
-// This function corresponds to PLT_HISTOGRAM macro invocation without caching.
-// Use this for PLT histograms with dynamically generated names, which
-// otherwise can't use the caching PLT_HISTOGRAM macro without code duplication.
-void PltHistogramWithNoMacroCaching(const std::string& name,
- const TimeDelta& sample) {
- // The parameters should exacly match the parameters in
- // UMA_HISTOGRAM_CUSTOM_TIMES macro.
- base::HistogramBase* histogram_pointer = base::Histogram::FactoryTimeGet(
- name, kPLTMin(), kPLTMax(), kPLTCount,
- base::HistogramBase::kUmaTargetedHistogramFlag);
- histogram_pointer->AddTime(sample);
-}
-
-// This records UMA corresponding to the PLT_HISTOGRAM macro without caching.
-void PltHistogramWithGwsPreview(const char* name,
- const TimeDelta& sample,
- bool is_preview,
- int experiment_id) {
- std::string preview_suffix = is_preview ? "_Preview" : "_NoPreview";
- PltHistogramWithNoMacroCaching(name + preview_suffix, sample);
-
- if (experiment_id != kNoExperiment) {
- std::string name_with_experiment_id = base::StringPrintf(
- "%s%s_Experiment%d", name, preview_suffix.c_str(), experiment_id);
- PltHistogramWithNoMacroCaching(name_with_experiment_id, sample);
- }
-}
-
-#define PLT_HISTOGRAM(name, sample) \
- UMA_HISTOGRAM_CUSTOM_TIMES(name, sample, kPLTMin(), kPLTMax(), kPLTCount);
-
-#define PLT_HISTOGRAM_WITH_GWS_VARIANT( \
- name, sample, came_from_websearch, websearch_chrome_joint_experiment_id, \
- is_preview) { \
- PLT_HISTOGRAM(name, sample); \
- if (came_from_websearch) { \
- PLT_HISTOGRAM(base::StringPrintf("%s_FromGWS", name), sample) \
- if (websearch_chrome_joint_experiment_id != kNoExperiment) { \
- std::string name_with_experiment_id = base::StringPrintf( \
- "%s_FromGWS_Experiment%d", \
- name, websearch_chrome_joint_experiment_id); \
- PltHistogramWithNoMacroCaching(name_with_experiment_id, sample); \
- } \
- } \
- PltHistogramWithGwsPreview(name, sample, is_preview, \
- websearch_chrome_joint_experiment_id); \
-}
-
-// Returns the scheme type of the given URL if its type is one for which we
-// dump page load histograms. Otherwise returns NULL.
-URLPattern::SchemeMasks GetSupportedSchemeType(const GURL& url) {
- if (url.SchemeIs("http"))
- return URLPattern::SCHEME_HTTP;
- else if (url.SchemeIs("https"))
- return URLPattern::SCHEME_HTTPS;
- return static_cast<URLPattern::SchemeMasks>(0);
-}
-
-// Helper function to check for string in 'via' header. Returns true if
-// |via_value| is one of the values listed in the Via header.
-bool ViaHeaderContains(WebLocalFrame* frame, const std::string& via_value) {
- const char kViaHeaderName[] = "Via";
- std::vector<std::string> values;
- // Multiple via headers have already been coalesced and hence each value
- // separated by a comma corresponds to a proxy. The value added by a proxy is
- // not expected to contain any commas.
- // Example., Via: 1.0 Compression proxy, 1.1 Google Instant Proxy Preview
- values = base::SplitString(
- frame->dataSource()->response().httpHeaderField(kViaHeaderName).utf8(),
- ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
- return std::find(values.begin(), values.end(), via_value) != values.end();
-}
-
-// Returns true if the provided URL is a referrer string that came from
-// a Google Web Search results page. This is a little non-deterministic
-// because desktop and mobile websearch differ and sometimes just provide
-// http://www.google.com/ as the referrer. In the case of /url we can be sure
-// that it came from websearch but we will be generous and allow for cases
-// where a non-Google URL was provided a bare Google URL as a referrer.
-// The domain validation matches the code used by the prerenderer for similar
-// purposes.
-// TODO(pmeenan): Remove the fuzzy logic when the referrer is reliable
-bool IsFromGoogleSearchResult(const GURL& url, const GURL& referrer) {
- if (!base::StartsWith(referrer.host(), "www.google.",
- base::CompareCase::SENSITIVE))
- return false;
- if (base::StartsWith(referrer.path(), "/url",
- base::CompareCase::SENSITIVE))
- return true;
- bool is_possible_search_referrer =
- referrer.path().empty() || referrer.path() == "/" ||
- base::StartsWith(referrer.path(), "/search",
- base::CompareCase::SENSITIVE) ||
- base::StartsWith(referrer.path(), "/webhp",
- base::CompareCase::SENSITIVE);
- if (is_possible_search_referrer &&
- !base::StartsWith(url.host(), "www.google",
- base::CompareCase::SENSITIVE))
- return true;
- return false;
-}
-
-// Extracts a Google Web Search and Chrome joint experiment ID from a referrer
-// that came from a Google Web Search results page. An experiment ID is embedded
-// in a query string as a "gcjeid=" parameter value.
-int GetQueryStringBasedExperiment(const GURL& referrer) {
- std::string value;
- if (!net::GetValueForKeyInQuery(referrer, "gcjeid", &value))
- return kNoExperiment;
-
- int experiment_id;
- if (!base::StringToInt(value, &experiment_id))
- return kNoExperiment;
- if (0 < experiment_id && experiment_id <= kMaxExperimentID)
- return experiment_id;
- return kNoExperiment;
-}
-
-void DumpHistograms(const WebPerformance& performance,
- DocumentState* document_state,
- bool came_from_websearch,
- int websearch_chrome_joint_experiment_id,
- bool is_preview,
- URLPattern::SchemeMasks scheme_type) {
- // This function records new histograms based on the Navigation Timing
- // records. As such, the histograms should not depend on the deprecated timing
- // information collected in DocumentState. However, here for some reason we
- // check if document_state->request_time() is null. TODO(ppi): find out why
- // and remove DocumentState from the parameter list.
- Time request = document_state->request_time();
-
- Time navigation_start = Time::FromDoubleT(performance.navigationStart());
- Time request_start = Time::FromDoubleT(performance.requestStart());
- Time response_start = Time::FromDoubleT(performance.responseStart());
- Time dom_content_loaded_start =
- Time::FromDoubleT(performance.domContentLoadedEventStart());
- Time load_event_start = Time::FromDoubleT(performance.loadEventStart());
- Time load_event_end = Time::FromDoubleT(performance.loadEventEnd());
- Time begin = (request.is_null() ? navigation_start : request_start);
-
- DCHECK(!navigation_start.is_null());
-
- // It is possible for a document to have navigation_start time, but no
- // request_start. An example is doing a window.open, which synchronously
- // loads "about:blank", then using document.write add a meta http-equiv
- // refresh tag, which causes a navigation. In such case, we will arrive at
- // this function with no request/response timing data and identical load
- // start/end values. Avoid logging this case, as it doesn't add any
- // meaningful information to the histogram.
- if (request_start.is_null())
- return;
-
- // TODO(dominich): Investigate conditions under which |load_event_start| and
- // |load_event_end| may be NULL as in the non-PT_ case below. Examples in
- // http://crbug.com/112006.
- // DCHECK(!load_event_start.is_null());
- // DCHECK(!load_event_end.is_null());
-
- if (document_state->web_timing_histograms_recorded())
- return;
- document_state->set_web_timing_histograms_recorded(true);
-
- // TODO(simonjam): There is no way to distinguish between abandonment and
- // intentional Javascript navigation before the load event fires.
- // TODO(dominich): Load type breakdown
- if (!load_event_start.is_null()) {
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.PT_BeginToFinishDoc",
- load_event_start - begin,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.PT_CommitToFinishDoc",
- load_event_start - response_start,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.PT_RequestToFinishDoc",
- load_event_start - navigation_start,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
- }
- if (!load_event_end.is_null()) {
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.PT_BeginToFinish",
- load_event_end - begin,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.PT_CommitToFinish",
- load_event_end - response_start,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.PT_RequestToFinish",
- load_event_end - navigation_start,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.PT_StartToFinish",
- load_event_end - request_start,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
- }
- if (!load_event_start.is_null() && !load_event_end.is_null()) {
- PLT_HISTOGRAM("PLT.PT_FinishDocToFinish",
- load_event_end - load_event_start);
- }
- if (!dom_content_loaded_start.is_null()) {
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.PT_RequestToDomContentLoaded",
- dom_content_loaded_start - navigation_start,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
- }
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.PT_BeginToCommit",
- response_start - begin,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.PT_RequestToStart",
- request_start - navigation_start,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.PT_StartToCommit",
- response_start - request_start,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.PT_RequestToCommit",
- response_start - navigation_start,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
-}
-
-bool WasWebRequestUsedBySomeExtensions() {
-#if defined(ENABLE_EXTENSIONS)
- return ChromeExtensionsRendererClient::GetInstance()->extension_dispatcher()
- ->WasWebRequestUsedBySomeExtensions();
-#else
- return false;
-#endif
-}
-
-// These histograms are based on the timing information collected in
-// DocumentState. They should be transitioned to equivalents based on the
-// Navigation Timing records (see DumpPerformanceTiming()) or dropped if not
-// needed. Please do not add new metrics based on DocumentState.
-void DumpDeprecatedHistograms(const WebPerformance& performance,
- DocumentState* document_state,
- bool came_from_websearch,
- int websearch_chrome_joint_experiment_id,
- bool is_preview,
- URLPattern::SchemeMasks scheme_type) {
- // If we've already dumped, do nothing.
- // This simple bool works because we only dump for the main frame.
- if (document_state->load_histograms_recorded())
- return;
-
- // Abort if any of these is missing.
- Time start = document_state->start_load_time();
- Time commit = document_state->commit_load_time();
- Time navigation_start =
- Time::FromDoubleT(performance.navigationStart());
- if (start.is_null() || commit.is_null() || navigation_start.is_null())
- return;
-
- // We properly handle null values for the next 3 variables.
- Time request = document_state->request_time();
- Time first_paint = document_state->first_paint_time();
- Time first_paint_after_load = document_state->first_paint_after_load_time();
- Time finish_doc = document_state->finish_document_load_time();
- Time finish_all_loads = document_state->finish_load_time();
-
- // Handle case where user hits "stop" or "back" before loading completely.
- // Note that this makes abandoned page loads be recorded as if they were
- // completed, polluting the metrics with artifically short completion times.
- // We are not fixing this as these metrics are being dropped as deprecated.
- if (finish_doc.is_null()) {
- finish_doc = Time::Now();
- document_state->set_finish_document_load_time(finish_doc);
- }
- if (finish_all_loads.is_null()) {
- finish_all_loads = Time::Now();
- document_state->set_finish_load_time(finish_all_loads);
- }
-
- document_state->set_load_histograms_recorded(true);
-
- // Note: Client side redirects will have no request time.
- Time begin = request.is_null() ? start : request;
- TimeDelta begin_to_finish_doc = finish_doc - begin;
- TimeDelta begin_to_finish_all_loads = finish_all_loads - begin;
- TimeDelta start_to_finish_all_loads = finish_all_loads - start;
- TimeDelta start_to_commit = commit - start;
-
- DocumentState::LoadType load_type = document_state->load_type();
-
- // The above code sanitized all values of times, in preparation for creating
- // actual histograms. The remainder of this code could be run at destructor
- // time for the document_state, since all data is intact.
-
- // Aggregate PLT data across all link types.
- UMA_HISTOGRAM_ENUMERATION("PLT.LoadType", load_type,
- DocumentState::kLoadTypeMax);
- PLT_HISTOGRAM("PLT.StartToCommit", start_to_commit);
- PLT_HISTOGRAM("PLT.CommitToFinishDoc", finish_doc - commit);
- PLT_HISTOGRAM("PLT.FinishDocToFinish", finish_all_loads - finish_doc);
- PLT_HISTOGRAM("PLT.BeginToCommit", commit - begin);
- PLT_HISTOGRAM("PLT.StartToFinish", start_to_finish_all_loads);
- if (!request.is_null()) {
- PLT_HISTOGRAM("PLT.RequestToStart", start - request);
- PLT_HISTOGRAM("PLT.RequestToFinish", finish_all_loads - request);
- }
- PLT_HISTOGRAM("PLT.CommitToFinish", finish_all_loads - commit);
-
- std::unique_ptr<TimeDelta> begin_to_first_paint;
- std::unique_ptr<TimeDelta> commit_to_first_paint;
- if (!first_paint.is_null()) {
- // 'first_paint' can be before 'begin' for an unknown reason.
- // See bug http://crbug.com/125273 for details.
- if (begin <= first_paint) {
- begin_to_first_paint.reset(new TimeDelta(first_paint - begin));
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.BeginToFirstPaint",
- *begin_to_first_paint,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
- } else {
- // Track the frequency and magnitude of cases where first_paint precedes
- // begin. The current hypothesis is that this is due to using the
- // non-monotonic timer. If that's the case, we expect first_paint
- // preceding begin to be rare, and the delta between values to be close to
- // zero. This is a temporary addition that we will remove once we better
- // understand the frequency and magnitude of first_paint preceding begin.
- PLT_HISTOGRAM("PLT.BeginToFirstPaint_Negative", begin - first_paint);
- }
-
- // Conditional was previously a DCHECK. Changed due to multiple bot
- // failures, listed in crbug.com/383963
- if (commit <= first_paint) {
- commit_to_first_paint.reset(new TimeDelta(first_paint - commit));
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.CommitToFirstPaint",
- *commit_to_first_paint,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
- }
- }
- if (!first_paint_after_load.is_null()) {
- // 'first_paint_after_load' can be before 'begin' for an unknown reason.
- // See bug http://crbug.com/125273 for details.
- if (begin <= first_paint_after_load) {
- PLT_HISTOGRAM("PLT.BeginToFirstPaintAfterLoad",
- first_paint_after_load - begin);
- }
- // Both following conditionals were previously DCHECKs. Changed due to
- // multiple bot failures, listed in crbug.com/383963
- if (commit <= first_paint_after_load) {
- PLT_HISTOGRAM("PLT.CommitToFirstPaintAfterLoad",
- first_paint_after_load - commit);
- }
- if (finish_all_loads <= first_paint_after_load) {
- PLT_HISTOGRAM("PLT.FinishToFirstPaintAfterLoad",
- first_paint_after_load - finish_all_loads);
- }
- }
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.BeginToFinishDoc", begin_to_finish_doc,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
- PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.BeginToFinish", begin_to_finish_all_loads,
- came_from_websearch,
- websearch_chrome_joint_experiment_id,
- is_preview);
-
- // Load type related histograms.
- switch (load_type) {
- case DocumentState::UNDEFINED_LOAD:
- PLT_HISTOGRAM("PLT.BeginToFinishDoc_UndefLoad", begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish_UndefLoad", begin_to_finish_all_loads);
- break;
- case DocumentState::RELOAD:
- PLT_HISTOGRAM("PLT.BeginToFinishDoc_Reload", begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish_Reload", begin_to_finish_all_loads);
- break;
- case DocumentState::HISTORY_LOAD:
- PLT_HISTOGRAM("PLT.BeginToFinishDoc_HistoryLoad", begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish_HistoryLoad", begin_to_finish_all_loads);
- break;
- case DocumentState::NORMAL_LOAD:
- PLT_HISTOGRAM("PLT.BeginToFinishDoc_NormalLoad", begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish_NormalLoad", begin_to_finish_all_loads);
- break;
- case DocumentState::LINK_LOAD_NORMAL:
- PLT_HISTOGRAM("PLT.BeginToFinishDoc_LinkLoadNormal",
- begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish_LinkLoadNormal",
- begin_to_finish_all_loads);
- break;
- case DocumentState::LINK_LOAD_RELOAD:
- PLT_HISTOGRAM("PLT.BeginToFinishDoc_LinkLoadReload",
- begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish_LinkLoadReload",
- begin_to_finish_all_loads);
- break;
- case DocumentState::LINK_LOAD_CACHE_STALE_OK:
- PLT_HISTOGRAM("PLT.BeginToFinishDoc_LinkLoadStaleOk",
- begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish_LinkLoadStaleOk",
- begin_to_finish_all_loads);
- break;
- case DocumentState::LINK_LOAD_CACHE_ONLY:
- PLT_HISTOGRAM("PLT.BeginToFinishDoc_LinkLoadCacheOnly",
- begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish_LinkLoadCacheOnly",
- begin_to_finish_all_loads);
- break;
- default:
- break;
- }
-
- const bool use_webrequest_histogram = WasWebRequestUsedBySomeExtensions();
- if (use_webrequest_histogram) {
- switch (load_type) {
- case DocumentState::NORMAL_LOAD:
- PLT_HISTOGRAM(
- "PLT.BeginToFinish_NormalLoad_ExtensionWebRequest",
- begin_to_finish_all_loads);
- break;
- case DocumentState::LINK_LOAD_NORMAL:
- PLT_HISTOGRAM(
- "PLT.BeginToFinish_LinkLoadNormal_ExtensionWebRequest",
- begin_to_finish_all_loads);
- break;
- case DocumentState::LINK_LOAD_RELOAD:
- PLT_HISTOGRAM(
- "PLT.BeginToFinish_LinkLoadReload_ExtensionWebRequest",
- begin_to_finish_all_loads);
- break;
- case DocumentState::LINK_LOAD_CACHE_STALE_OK:
- PLT_HISTOGRAM(
- "PLT.BeginToFinish_LinkLoadStaleOk_ExtensionWebRequest",
- begin_to_finish_all_loads);
- break;
- default:
- break;
- }
- }
-}
-
-} // namespace
-
-PageLoadHistograms::PageLoadHistograms(content::RenderFrame* render_frame)
- : content::RenderFrameObserver(render_frame), helper_(this) {}
-
-PageLoadHistograms::~PageLoadHistograms() {
-}
-
-void PageLoadHistograms::Dump() {
- WebLocalFrame* frame = render_frame()->GetWebFrame();
-
- // We only dump histograms for main frames.
- // In the future, it may be interesting to tag subframes and dump them too.
- DCHECK(frame && !frame->parent());
-
- // Only dump for supported schemes.
- URLPattern::SchemeMasks scheme_type =
- GetSupportedSchemeType(frame->document().url());
- if (scheme_type == 0)
- return;
-
- // Don't dump stats for the NTP, as PageLoadHistograms should only be recorded
- // for pages visited due to an explicit user navigation.
- if (SearchBouncer::GetInstance()->IsNewTabPage(frame->document().url())) {
- return;
- }
-
- DocumentState* document_state =
- DocumentState::FromDataSource(frame->dataSource());
-
- bool came_from_websearch = IsFromGoogleSearchResult(
- frame->document().url(),
- blink::WebStringToGURL(frame->document().referrer()));
- int websearch_chrome_joint_experiment_id = kNoExperiment;
- bool is_preview = false;
- if (came_from_websearch) {
- websearch_chrome_joint_experiment_id = GetQueryStringBasedExperiment(
- blink::WebStringToGURL(frame->document().referrer()));
- is_preview = ViaHeaderContains(frame, "1.1 Google Instant Proxy Preview");
- }
-
- // Metrics based on the timing information recorded for the Navigation Timing
- // API - http://www.w3.org/TR/navigation-timing/.
- DumpHistograms(frame->performance(), document_state, came_from_websearch,
- websearch_chrome_joint_experiment_id, is_preview, scheme_type);
-
- // Old metrics based on the timing information stored in DocumentState. These
- // are deprecated and should go away.
- DumpDeprecatedHistograms(
- frame->performance(), document_state, came_from_websearch,
- websearch_chrome_joint_experiment_id, is_preview, scheme_type);
-
- // Log the PLT to the info log.
- LogPageLoadTime(document_state, frame->dataSource());
-
- // If persistent histograms are not enabled, initiate a PostTask here to be
- // sure that we send the histograms generated. Without this call, pages
- // that don't have an on-close-handler might generate data that is lost if
- // the renderer is shutdown abruptly (e.g. the user closed the tab).
- // TODO(bcwhite): Remove completely when persistence is on-by-default.
- if (!base::GlobalHistogramAllocator::Get()) {
- content::RenderThread::Get()->UpdateHistograms(
- content::kHistogramSynchronizerReservedSequenceNumber);
- }
-}
-
-void PageLoadHistograms::WillCommitProvisionalLoad() {
- Dump();
-}
-
-void PageLoadHistograms::LogPageLoadTime(const DocumentState* document_state,
- const WebDataSource* ds) const {
- // Because this function gets called on every page load,
- // take extra care to optimize it away if logging is turned off.
- if (logging::LOG_INFO < logging::GetMinLogLevel())
- return;
-
- DCHECK(document_state);
- DCHECK(ds);
- GURL url(ds->request().url());
- Time start = document_state->start_load_time();
- Time finish = document_state->finish_load_time();
- // TODO(mbelshe): should we log more stats?
- VLOG(1) << "PLT: " << (finish - start).InMilliseconds() << "ms "
- << url.spec();
-}
-
-void PageLoadHistograms::OnDestruct() {
- delete this;
-}
-
-PageLoadHistograms::Helper::Helper(PageLoadHistograms* histograms)
- : RenderViewObserver(histograms->render_frame()->GetRenderView()),
- histograms_(histograms) {
-}
-
-void PageLoadHistograms::Helper::ClosePage() {
- histograms_->Dump();
-}
-
-void PageLoadHistograms::Helper::OnDestruct() {
-}
« no previous file with comments | « chrome/renderer/page_load_histograms.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698