summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/render_view.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer/render_view.cc')
-rw-r--r--chrome/renderer/render_view.cc717
1 files changed, 8 insertions, 709 deletions
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index b4f42cb..176b1ae 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -15,7 +15,6 @@
#include "base/callback.h"
#include "base/command_line.h"
#include "base/compiler_specific.h"
-#include "base/metrics/field_trial.h"
#include "base/metrics/histogram.h"
#include "base/path_service.h"
#include "base/process_util.h"
@@ -70,6 +69,7 @@
#include "chrome/renderer/navigation_state.h"
#include "chrome/renderer/notification_provider.h"
#include "chrome/renderer/page_click_tracker.h"
+#include "chrome/renderer/page_load_histograms.h"
#include "chrome/renderer/password_autocomplete_manager.h"
#include "chrome/renderer/plugin_channel_host.h"
#include "chrome/renderer/print_web_view_helper.h"
@@ -496,8 +496,6 @@ RenderView::RenderView(RenderThreadBase* render_thread,
has_document_tag_(false),
#endif
document_tag_(0),
- cross_origin_access_count_(0),
- same_origin_access_count_(0),
target_url_status_(TARGET_NONE),
spelling_panel_visible_(false),
view_type_(ViewType::INVALID),
@@ -2703,18 +2701,7 @@ void RenderView::willClose(WebFrame* frame) {
WebDataSource* ds = frame->dataSource();
NavigationState* navigation_state = NavigationState::FromDataSource(ds);
- if (!frame->parent()) {
- const GURL& url = frame->url();
- // Ensure state contains scheme.
- if (url.SchemeIs("http"))
- navigation_state->set_scheme_type(URLPattern::SCHEME_HTTP);
- else if (url.SchemeIs("https"))
- navigation_state->set_scheme_type(URLPattern::SCHEME_HTTPS);
-
- // Dump will only be provided when scheme is http or https.
- DumpLoadHistograms();
- }
-
+ page_load_histograms_.Dump(frame);
navigation_state->user_script_idle_scheduler()->Cancel();
// TODO(jhawkins): Remove once frameDetached is called by WebKit.
@@ -3626,10 +3613,7 @@ void RenderView::logCrossFramePropertyAccess(WebFrame* frame,
const WebString& property_name,
unsigned long long event_id) {
// TODO(johnnyg): track the individual properties and repeat event_ids.
- if (cross_origin)
- cross_origin_access_count_++;
- else
- same_origin_access_count_++;
+ page_load_histograms_.IncrementCrossFramePropertyAccess(cross_origin);
}
void RenderView::didChangeContentsSize(WebFrame* frame, const WebSize& size) {
@@ -4799,30 +4783,13 @@ void RenderView::OnClosePage(const ViewMsg_ClosePage_Params& params) {
// revisited to avoid having two ways to close a page. Having a single way
// to close that can run onunload is also useful for fixing
// http://b/issue?id=753080.
- WebFrame* main_frame = webview()->mainFrame();
- if (main_frame) {
- const GURL& url = main_frame->url();
- // TODO(davemoore) this code should be removed once willClose() gets
- // called when a page is destroyed. DumpLoadHistograms() is safe to call
- // multiple times for the same frame, but it will simplify things.
-
- // Ensure state contains scheme.
- NavigationState* navigation_state =
- NavigationState::FromDataSource(main_frame->dataSource());
- if (url.SchemeIs("http"))
- navigation_state->set_scheme_type(URLPattern::SCHEME_HTTP);
- else if (url.SchemeIs("https"))
- navigation_state->set_scheme_type(URLPattern::SCHEME_HTTPS);
-
- // Dump will only be provided when scheme is http or https.
- DumpLoadHistograms();
- }
+ // TODO(davemoore) This code should be removed once willClose() gets
+ // called when a page is destroyed. page_load_histograms_.Dump() is safe
+ // to call multiple times for the same frame, but it will simplify things.
+ page_load_histograms_.Dump(webview()->mainFrame());
+ page_load_histograms_.ResetCrossFramePropertyAccess();
webview()->dispatchUnloadEvent();
- // Reset stats
- cross_origin_access_count_ = 0;
- same_origin_access_count_ = 0;
-
// Just echo back the params in the ACK.
Send(new ViewHostMsg_ClosePage_ACK(routing_id_, params));
}
@@ -5097,674 +5064,6 @@ void RenderView::OnExtensionMessageInvoke(const std::string& extension_id,
extension_id, function_name, args, this, event_url);
}
-// Dump all load time histograms.
-//
-// The time points we keep are
-// request: time document was requested by user
-// start: time load of document started
-// commit: time load of document started
-// finish_document: main document loaded, before onload()
-// finish_all_loads: after onload() and all resources are loaded
-// first_paint: first paint performed
-// first_paint_after_load: first paint performed after load is finished
-// begin: request if it was user requested, start otherwise
-//
-// It's possible for the request time not to be set, if a client
-// redirect had been done (the user never requested the page)
-// Also, it's possible to load a page without ever laying it out
-// so first_paint and first_paint_after_load can be 0.
-void RenderView::DumpLoadHistograms() const {
- // Configuration for PLT related histograms.
- static const TimeDelta kPLTMin(TimeDelta::FromMilliseconds(10));
- static const TimeDelta kPLTMax(TimeDelta::FromMinutes(10));
- static const size_t kPLTCount(100);
- #define PLT_HISTOGRAM(name, sample) \
- UMA_HISTOGRAM_CUSTOM_TIMES(name, sample, kPLTMin, kPLTMax, kPLTCount);
-
- WebFrame* main_frame = webview()->mainFrame();
- NavigationState* navigation_state =
- NavigationState::FromDataSource(main_frame->dataSource());
-
- URLPattern::SchemeMasks scheme_type = navigation_state->scheme_type();
- if (scheme_type == 0)
- return;
- DCHECK(scheme_type == URLPattern::SCHEME_HTTP ||
- scheme_type == URLPattern::SCHEME_HTTPS);
-
- // If we've already dumped, do nothing.
- if (navigation_state->load_histograms_recorded())
- return;
-
- // Collect measurement times.
- Time start = navigation_state->start_load_time();
- if (start.is_null())
- return; // Probably very premature abandonment of page.
- Time commit = navigation_state->commit_load_time();
- if (commit.is_null())
- return; // Probably very premature abandonment of page.
-
- // We properly handle null values for the next 3 variables.
- Time request = navigation_state->request_time();
- Time first_paint = navigation_state->first_paint_time();
- Time first_paint_after_load = navigation_state->first_paint_after_load_time();
- Time finish_doc = navigation_state->finish_document_load_time();
- Time finish_all_loads = navigation_state->finish_load_time();
-
- // Handle case where user hits "stop" or "back" before loading completely.
- bool abandoned_page = finish_doc.is_null();
- if (abandoned_page) {
- finish_doc = Time::Now();
- navigation_state->set_finish_document_load_time(finish_doc);
- }
-
- // TODO(jar): We should really discriminate the definition of "abandon" more
- // finely. We should have:
- // abandon_before_document_loaded
- // abandon_before_onload_fired
-
- if (finish_all_loads.is_null()) {
- finish_all_loads = Time::Now();
- navigation_state->set_finish_load_time(finish_all_loads);
- } else {
- DCHECK(!abandoned_page); // How can the doc have finished but not the page?
- if (!abandoned_page)
- return; // Don't try to record a stat which is broken.
- }
-
- // 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;
-
- NavigationState::LoadType load_type = navigation_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 navigation_state, since all data is intact.
-
- // Aggregate PLT data across all link types.
- UMA_HISTOGRAM_ENUMERATION("PLT.Abandoned", abandoned_page ? 1 : 0, 2);
- UMA_HISTOGRAM_ENUMERATION("PLT.LoadType", load_type,
- NavigationState::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);
- if (!first_paint.is_null()) {
- DCHECK(begin <= first_paint);
- PLT_HISTOGRAM("PLT.BeginToFirstPaint", first_paint - begin);
- DCHECK(commit <= first_paint);
- PLT_HISTOGRAM("PLT.CommitToFirstPaint", first_paint - commit);
- }
- if (!first_paint_after_load.is_null()) {
- DCHECK(begin <= first_paint_after_load);
- PLT_HISTOGRAM("PLT.BeginToFirstPaintAfterLoad",
- first_paint_after_load - begin);
- DCHECK(commit <= first_paint_after_load);
- PLT_HISTOGRAM("PLT.CommitToFirstPaintAfterLoad",
- first_paint_after_load - commit);
- DCHECK(finish_all_loads <= first_paint_after_load);
- PLT_HISTOGRAM("PLT.FinishToFirstPaintAfterLoad",
- first_paint_after_load - finish_all_loads);
- }
- PLT_HISTOGRAM("PLT.BeginToFinishDoc", begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish", begin_to_finish_all_loads);
-
- // Load type related histograms.
- switch (load_type) {
- case NavigationState::UNDEFINED_LOAD:
- PLT_HISTOGRAM("PLT.BeginToFinishDoc_UndefLoad", begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish_UndefLoad", begin_to_finish_all_loads);
- break;
- case NavigationState::RELOAD:
- PLT_HISTOGRAM("PLT.BeginToFinishDoc_Reload", begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish_Reload", begin_to_finish_all_loads);
- break;
- case NavigationState::HISTORY_LOAD:
- PLT_HISTOGRAM("PLT.BeginToFinishDoc_HistoryLoad", begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish_HistoryLoad", begin_to_finish_all_loads);
- break;
- case NavigationState::NORMAL_LOAD:
- PLT_HISTOGRAM("PLT.BeginToFinishDoc_NormalLoad", begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish_NormalLoad", begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_NORMAL:
- PLT_HISTOGRAM("PLT.BeginToFinishDoc_LinkLoadNormal",
- begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish_LinkLoadNormal",
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_RELOAD:
- PLT_HISTOGRAM("PLT.BeginToFinishDoc_LinkLoadReload",
- begin_to_finish_doc);
- PLT_HISTOGRAM("PLT.BeginToFinish_LinkLoadReload",
- begin_to_finish_all_loads);
- break;
- case NavigationState::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 NavigationState::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;
- }
-
- // Histograms to determine if DNS prefetching has an impact on PLT.
- static bool use_dns_histogram(base::FieldTrialList::Find("DnsImpact") &&
- !base::FieldTrialList::Find("DnsImpact")->group_name().empty());
- if (use_dns_histogram) {
- UMA_HISTOGRAM_ENUMERATION(
- base::FieldTrial::MakeName("PLT.Abandoned", "DnsImpact"),
- abandoned_page ? 1 : 0, 2);
- UMA_HISTOGRAM_ENUMERATION(
- base::FieldTrial::MakeName("PLT.LoadType", "DnsImpact"),
- load_type, NavigationState::kLoadTypeMax);
- switch (load_type) {
- case NavigationState::NORMAL_LOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_NormalLoad", "DnsImpact"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_NORMAL:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadNormal", "DnsImpact"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_RELOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadReload", "DnsImpact"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_CACHE_STALE_OK:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadStaleOk", "DnsImpact"),
- begin_to_finish_all_loads);
- break;
- default:
- break;
- }
- }
-
- // Histograms to determine if content prefetching has an impact on PLT.
- static const bool prefetching_fieldtrial =
- base::FieldTrialList::Find("Prefetch") &&
- !base::FieldTrialList::Find("Prefetch")->group_name().empty();
- if (prefetching_fieldtrial) {
- if (navigation_state->was_prefetcher()) {
- PLT_HISTOGRAM(
- base::FieldTrial::MakeName("PLT.BeginToFinishDoc_ContentPrefetcher",
- "Prefetch"),
- begin_to_finish_doc);
- PLT_HISTOGRAM(
- base::FieldTrial::MakeName("PLT.BeginToFinish_ContentPrefetcher",
- "Prefetch"),
- begin_to_finish_all_loads);
- }
- if (navigation_state->was_referred_by_prefetcher()) {
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinishDoc_ContentPrefetcherReferrer",
- "Prefetch"),
- begin_to_finish_doc);
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_ContentPrefetcherReferrer",
- "Prefetch"),
- begin_to_finish_all_loads);
- }
- UMA_HISTOGRAM_ENUMERATION(
- base::FieldTrial::MakeName("PLT.Abandoned", "Prefetch"),
- abandoned_page ? 1 : 0, 2);
- PLT_HISTOGRAM(base::FieldTrial::MakeName("PLT.BeginToFinishDoc",
- "Prefetch"),
- begin_to_finish_doc);
- PLT_HISTOGRAM(base::FieldTrial::MakeName("PLT.BeginToFinish", "Prefetch"),
- begin_to_finish_all_loads);
- }
-
- // Histograms to determine if backup connection jobs have an impact on PLT.
- static const bool connect_backup_jobs_fieldtrial(
- base::FieldTrialList::Find("ConnnectBackupJobs") &&
- !base::FieldTrialList::Find("ConnnectBackupJobs")->group_name().empty());
- if (connect_backup_jobs_fieldtrial) {
- UMA_HISTOGRAM_ENUMERATION(
- base::FieldTrial::MakeName("PLT.Abandoned", "ConnnectBackupJobs"),
- abandoned_page ? 1 : 0, 2);
- UMA_HISTOGRAM_ENUMERATION(
- base::FieldTrial::MakeName("PLT.LoadType", "ConnnectBackupJobs"),
- load_type, NavigationState::kLoadTypeMax);
- switch (load_type) {
- case NavigationState::NORMAL_LOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_NormalLoad", "ConnnectBackupJobs"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_NORMAL:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadNormal", "ConnnectBackupJobs"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_RELOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadReload", "ConnnectBackupJobs"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_CACHE_STALE_OK:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadStaleOk", "ConnnectBackupJobs"),
- begin_to_finish_all_loads);
- break;
- default:
- break;
- }
- }
-
- // Histograms to determine if the number of connections has an
- // impact on PLT.
- // TODO(jar): Consider removing the per-link-type versions. We
- // really only need LINK_LOAD_NORMAL and NORMAL_LOAD.
- static bool use_connection_impact_histogram(
- base::FieldTrialList::Find("ConnCountImpact") &&
- !base::FieldTrialList::Find("ConnCountImpact")->group_name().empty());
- if (use_connection_impact_histogram) {
- UMA_HISTOGRAM_ENUMERATION(
- base::FieldTrial::MakeName("PLT.Abandoned", "ConnCountImpact"),
- abandoned_page ? 1 : 0, 2);
- switch (load_type) {
- case NavigationState::NORMAL_LOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_NormalLoad", "ConnCountImpact"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_NORMAL:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadNormal", "ConnCountImpact"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_RELOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadReload", "ConnCountImpact"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_CACHE_STALE_OK:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadStaleOk", "ConnCountImpact"),
- begin_to_finish_all_loads);
- break;
- default:
- break;
- }
- }
-
- // Histograms to determine effect of idle socket timeout.
- static bool use_idle_socket_timeout_histogram(
- base::FieldTrialList::Find("IdleSktToImpact") &&
- !base::FieldTrialList::Find("IdleSktToImpact")->group_name().empty());
- if (use_idle_socket_timeout_histogram) {
- UMA_HISTOGRAM_ENUMERATION(
- base::FieldTrial::MakeName("PLT.Abandoned", "IdleSktToImpact"),
- abandoned_page ? 1 : 0, 2);
- switch (load_type) {
- case NavigationState::NORMAL_LOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_NormalLoad", "IdleSktToImpact"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_NORMAL:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadNormal", "IdleSktToImpact"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_RELOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadReload", "IdleSktToImpact"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_CACHE_STALE_OK:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadStaleOk", "IdleSktToImpact"),
- begin_to_finish_all_loads);
- break;
- default:
- break;
- }
- }
-
- // Histograms to determine effect of number of connections per proxy.
- static bool use_proxy_connection_impact_histogram(
- base::FieldTrialList::Find("ProxyConnectionImpact") &&
- !base::FieldTrialList::Find("ProxyConnectionImpact")->
- group_name().empty());
- if (use_proxy_connection_impact_histogram) {
- UMA_HISTOGRAM_ENUMERATION(
- base::FieldTrial::MakeName("PLT.Abandoned", "ProxyConnectionImpact"),
- abandoned_page ? 1 : 0, 2);
- switch (load_type) {
- case NavigationState::NORMAL_LOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_NormalLoad", "ProxyConnectionImpact"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_NORMAL:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadNormal", "ProxyConnectionImpact"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_RELOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadReload", "ProxyConnectionImpact"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_CACHE_STALE_OK:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadStaleOk", "ProxyConnectionImpact"),
- begin_to_finish_all_loads);
- break;
- default:
- break;
- }
- }
-
- // Histograms to determine if SDCH has an impact.
- // TODO(jar): Consider removing per-link load types and the enumeration.
- static bool use_sdch_histogram(base::FieldTrialList::Find("GlobalSdch") &&
- !base::FieldTrialList::Find("GlobalSdch")->group_name().empty());
- if (use_sdch_histogram) {
- UMA_HISTOGRAM_ENUMERATION(
- base::FieldTrial::MakeName("PLT.LoadType", "GlobalSdch"),
- load_type, NavigationState::kLoadTypeMax);
- switch (load_type) {
- case NavigationState::NORMAL_LOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_NormalLoad", "GlobalSdch"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_NORMAL:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadNormal", "GlobalSdch"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_RELOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadReload", "GlobalSdch"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_CACHE_STALE_OK:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadStaleOk", "GlobalSdch"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_CACHE_ONLY:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadCacheOnly", "GlobalSdch"),
- begin_to_finish_all_loads);
- break;
- default:
- break;
- }
- }
-
- // Histograms to determine if cache size has an impact on PLT.
- static bool use_cache_histogram1(base::FieldTrialList::Find("CacheSize") &&
- !base::FieldTrialList::Find("CacheSize")->group_name().empty());
- if (use_cache_histogram1 &&
- NavigationState::LINK_LOAD_NORMAL <= load_type &&
- NavigationState::LINK_LOAD_CACHE_ONLY >= load_type) {
- // TODO(mbelshe): Do we really want BeginToFinishDoc here? It seems like
- // StartToFinish or BeginToFinish would be better.
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinishDoc_LinkLoad", "CacheSize"), begin_to_finish_doc);
- }
-
- // Histograms to determine if cache throttling has an impact on PLT.
- static bool use_cache_histogram2(
- base::FieldTrialList::Find("CacheThrottle") &&
- !base::FieldTrialList::Find("CacheThrottle")->group_name().empty());
- if (use_cache_histogram2) {
- UMA_HISTOGRAM_ENUMERATION(
- base::FieldTrial::MakeName("PLT.Abandoned", "CacheThrottle"),
- abandoned_page ? 1 : 0, 2);
- switch (load_type) {
- case NavigationState::RELOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_Reload", "CacheThrottle"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::HISTORY_LOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_HistoryLoad", "CacheThrottle"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::NORMAL_LOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_NormalLoad", "CacheThrottle"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_NORMAL:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadNormal", "CacheThrottle"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_RELOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadReload", "CacheThrottle"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_CACHE_STALE_OK:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadStaleOk", "CacheThrottle"),
- begin_to_finish_all_loads);
- break;
- case NavigationState::LINK_LOAD_CACHE_ONLY:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadCacheOnly", "CacheThrottle"),
- begin_to_finish_all_loads);
- break;
- default:
- break;
- }
- if (NavigationState::RELOAD <= load_type &&
- NavigationState::LINK_LOAD_CACHE_ONLY >= load_type) {
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish", "CacheThrottle"),
- begin_to_finish_all_loads);
- }
- }
-
- // For the SPDY field trials, we need to verify that the page loaded was
- // the type we requested:
- // if we asked for a SPDY request, we got a SPDY request
- // if we asked for a HTTP request, we got a HTTP request
- // Due to spdy version mismatches, it is possible that we ask for SPDY
- // but didn't get SPDY.
- static bool use_spdy_histogram(base::FieldTrialList::Find("SpdyImpact") &&
- !base::FieldTrialList::Find("SpdyImpact")->group_name().empty());
- if (use_spdy_histogram) {
- // We take extra effort to only compute these once.
- static bool in_spdy_trial =
- base::FieldTrialList::Find("SpdyImpact")->group_name() ==
- "npn_with_spdy";
- static bool in_http_trial =
- base::FieldTrialList::Find("SpdyImpact")->group_name() ==
- "npn_with_http";
-
- bool spdy_trial_success = navigation_state->was_fetched_via_spdy() ?
- in_spdy_trial : in_http_trial;
- if (spdy_trial_success) {
- // Histograms to determine if SPDY has an impact for https traffic.
- // TODO(mbelshe): After we've seen the difference between BeginToFinish
- // and StartToFinish, consider removing one or the other.
- if (scheme_type == URLPattern::SCHEME_HTTPS &&
- navigation_state->was_npn_negotiated()) {
- UMA_HISTOGRAM_ENUMERATION(
- base::FieldTrial::MakeName("PLT.Abandoned", "SpdyImpact"),
- abandoned_page ? 1 : 0, 2);
- switch (load_type) {
- case NavigationState::LINK_LOAD_NORMAL:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_LinkLoadNormal_SpdyTrial", "SpdyImpact"),
- begin_to_finish_all_loads);
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.StartToFinish_LinkLoadNormal_SpdyTrial", "SpdyImpact"),
- start_to_finish_all_loads);
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.StartToCommit_LinkLoadNormal_SpdyTrial", "SpdyImpact"),
- start_to_commit);
- break;
- case NavigationState::NORMAL_LOAD:
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.BeginToFinish_NormalLoad_SpdyTrial", "SpdyImpact"),
- begin_to_finish_all_loads);
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.StartToFinish_NormalLoad_SpdyTrial", "SpdyImpact"),
- start_to_finish_all_loads);
- PLT_HISTOGRAM(base::FieldTrial::MakeName(
- "PLT.StartToCommit_NormalLoad_SpdyTrial", "SpdyImpact"),
- start_to_commit);
- break;
- default:
- break;
- }
- }
-
- // Histograms to compare the impact of alternate protocol over http
- // traffic: when spdy is used vs. when http is used.
- if (scheme_type == URLPattern::SCHEME_HTTP &&
- navigation_state->was_alternate_protocol_available()) {
- if (!navigation_state->was_npn_negotiated()) {
- // This means that even there is alternate protocols for npn_http or
- // npn_spdy, they are not taken (due to the base::FieldTrial).
- switch (load_type) {
- case NavigationState::LINK_LOAD_NORMAL:
- PLT_HISTOGRAM(
- "PLT.StartToFinish_LinkLoadNormal_AlternateProtocol_http",
- start_to_finish_all_loads);
- PLT_HISTOGRAM(
- "PLT.StartToCommit_LinkLoadNormal_AlternateProtocol_http",
- start_to_commit);
- break;
- case NavigationState::NORMAL_LOAD:
- PLT_HISTOGRAM(
- "PLT.StartToFinish_NormalLoad_AlternateProtocol_http",
- start_to_finish_all_loads);
- PLT_HISTOGRAM(
- "PLT.StartToCommit_NormalLoad_AlternateProtocol_http",
- start_to_commit);
- break;
- default:
- break;
- }
- } else if (navigation_state->was_fetched_via_spdy()) {
- switch (load_type) {
- case NavigationState::LINK_LOAD_NORMAL:
- PLT_HISTOGRAM(
- "PLT.StartToFinish_LinkLoadNormal_AlternateProtocol_spdy",
- start_to_finish_all_loads);
- PLT_HISTOGRAM(
- "PLT.StartToCommit_LinkLoadNormal_AlternateProtocol_spdy",
- start_to_commit);
- break;
- case NavigationState::NORMAL_LOAD:
- PLT_HISTOGRAM(
- "PLT.StartToFinish_NormalLoad_AlternateProtocol_spdy",
- start_to_finish_all_loads);
- PLT_HISTOGRAM(
- "PLT.StartToCommit_NormalLoad_AlternateProtocol_spdy",
- start_to_commit);
- break;
- default:
- break;
- }
- }
- }
- }
- }
-
- // Record page load time and abandonment rates for proxy cases.
- if (navigation_state->was_fetched_via_proxy()) {
- if (scheme_type == URLPattern::SCHEME_HTTPS) {
- PLT_HISTOGRAM("PLT.StartToFinish.Proxy.https", start_to_finish_all_loads);
- UMA_HISTOGRAM_ENUMERATION("PLT.Abandoned.Proxy.https",
- abandoned_page ? 1 : 0, 2);
- } else {
- DCHECK(scheme_type == URLPattern::SCHEME_HTTP);
- PLT_HISTOGRAM("PLT.StartToFinish.Proxy.http", start_to_finish_all_loads);
- UMA_HISTOGRAM_ENUMERATION("PLT.Abandoned.Proxy.http",
- abandoned_page ? 1 : 0, 2);
- }
- } else {
- if (scheme_type == URLPattern::SCHEME_HTTPS) {
- PLT_HISTOGRAM("PLT.StartToFinish.NoProxy.https",
- start_to_finish_all_loads);
- UMA_HISTOGRAM_ENUMERATION("PLT.Abandoned.NoProxy.https",
- abandoned_page ? 1 : 0, 2);
- } else {
- DCHECK(scheme_type == URLPattern::SCHEME_HTTP);
- PLT_HISTOGRAM("PLT.StartToFinish.NoProxy.http",
- start_to_finish_all_loads);
- UMA_HISTOGRAM_ENUMERATION("PLT.Abandoned.NoProxy.http",
- abandoned_page ? 1 : 0, 2);
- }
- }
-
- // Site isolation metrics.
- UMA_HISTOGRAM_COUNTS("SiteIsolation.PageLoadsWithCrossSiteFrameAccess",
- cross_origin_access_count_);
- UMA_HISTOGRAM_COUNTS("SiteIsolation.PageLoadsWithSameSiteFrameAccess",
- same_origin_access_count_);
-
- // TODO(jar): This is the ONLY call in this method that needed more than
- // navigation_state. This should be relocated, or changed, so that this
- // body can be made a method on NavigationStates, and run via its destructor.
- // Log some PLT data to the error log.
- LogNavigationState(navigation_state, main_frame->dataSource());
-
- navigation_state->set_load_histograms_recorded(true);
-
- // Since there are currently no guarantees that renderer histograms will be
- // sent to the browser, we initiate a PostTask here to be sure that we send
- // the histograms we generated. Without this call, pages that don't have an
- // on-close-handler might generate data that is lost when the renderer is
- // shutdown abruptly (perchance because the user closed the tab).
- // TODO(jar) BUG=33233: This needs to be moved to a PostDelayedTask, and it
- // should post when the onload is complete, so that it doesn't interfere with
- // the next load.
- if (RenderThread::current()) {
- RenderThread::current()->SendHistograms(
- chrome::kHistogramSynchronizerReservedSequenceNumber);
- }
-}
-
-void RenderView::LogNavigationState(const NavigationState* 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(state);
- DCHECK(ds);
- GURL url(ds->request().url());
- Time start = state->start_load_time();
- Time finish = state->finish_load_time();
- // TODO(mbelshe): should we log more stats?
- VLOG(1) << "PLT: " << (finish - start).InMilliseconds() << "ms "
- << url.spec();
-}
-
void RenderView::postAccessibilityNotification(
const WebAccessibilityObject& obj,
WebAccessibilityNotification notification) {