Index: chrome/renderer/page_load_histograms.cc |
diff --git a/chrome/renderer/page_load_histograms.cc b/chrome/renderer/page_load_histograms.cc |
index 8c3597c2e0b64946a1a88644cbfb3867e4b4235c..61d6f3757ca238328f4c7e86ab20d2e5c57f44bf 100644 |
--- a/chrome/renderer/page_load_histograms.cc |
+++ b/chrome/renderer/page_load_histograms.cc |
@@ -110,25 +110,38 @@ void PltHistogramWithGwsPreview(const char* name, |
// In addition to PLT_HISTOGRAM, add the *_DataReductionProxy variant |
// conditionally. This macro runs only in one thread. |
-#define PLT_HISTOGRAM_DRP(name, sample, data_reduction_proxy_was_used) \ |
+#define PLT_HISTOGRAM_DRP( \ |
+ name, sample, data_reduction_proxy_was_used, scheme_type) \ |
do { \ |
static base::HistogramBase* counter(NULL); \ |
static base::HistogramBase* drp_counter(NULL); \ |
+ static base::HistogramBase* https_drp_counter(NULL); \ |
if (!counter) { \ |
DCHECK(drp_counter == NULL); \ |
+ DCHECK(https_drp_counter == NULL); \ |
counter = base::Histogram::FactoryTimeGet( \ |
name, kPLTMin(), kPLTMax(), kPLTCount, \ |
base::Histogram::kUmaTargetedHistogramFlag); \ |
} \ |
counter->AddTime(sample); \ |
if (!data_reduction_proxy_was_used) break; \ |
- if (!drp_counter) { \ |
- drp_counter = base::Histogram::FactoryTimeGet( \ |
- std::string(name) + "_DataReductionProxy", \ |
- kPLTMin(), kPLTMax(), kPLTCount, \ |
- base::Histogram::kUmaTargetedHistogramFlag); \ |
+ if ((scheme_type & URLPattern::SCHEME_HTTPS) == 0) { \ |
+ if (!https_drp_counter) { \ |
+ https_drp_counter = base::Histogram::FactoryTimeGet( \ |
+ std::string(name) + "_DataReductionProxy", \ |
+ kPLTMin(), kPLTMax(), kPLTCount, \ |
+ base::Histogram::kUmaTargetedHistogramFlag); \ |
+ } \ |
+ https_drp_counter->AddTime(sample); \ |
+ } else { \ |
+ if (!drp_counter) { \ |
+ drp_counter = base::Histogram::FactoryTimeGet( \ |
+ std::string(name) + "_HTTPS_DataReductionProxy", \ |
+ kPLTMin(), kPLTMax(), kPLTCount, \ |
+ base::Histogram::kUmaTargetedHistogramFlag); \ |
+ } \ |
+ drp_counter->AddTime(sample); \ |
} \ |
- drp_counter->AddTime(sample); \ |
} while (0) |
// Returns the scheme type of the given URL if its type is one for which we |
@@ -156,31 +169,6 @@ bool ViaHeaderContains(WebFrame* frame, const std::string& via_value) { |
return std::find(values.begin(), values.end(), via_value) != values.end(); |
} |
-// Returns true if the data reduction proxy was used. Note, this function will |
-// produce a false positive if a page is fetched using SPDY and using a proxy, |
-// and the data reduction proxy's via value is added to the Via header. |
-// TODO(bengr): Plumb the hostname of the proxy and check if it matches |
-// |SPDY_PROXY_AUTH_ORIGIN|. |
-bool DataReductionProxyWasUsed(WebFrame* frame) { |
- DocumentState* document_state = |
- DocumentState::FromDataSource(frame->dataSource()); |
- if (!document_state->was_fetched_via_proxy()) |
- return false; |
- |
- std::string via_header = |
- base::UTF16ToUTF8(frame->dataSource()->response().httpHeaderField("Via")); |
- |
- if (via_header.empty()) |
- return false; |
- std::string headers = "HTTP/1.1 200 OK\nVia: " + via_header + "\n\n"; |
- // Produce raw headers, expected by the |HttpResponseHeaders| constructor. |
- std::replace(headers.begin(), headers.end(), '\n', '\0'); |
- scoped_refptr<net::HttpResponseHeaders> response_headers( |
- new net::HttpResponseHeaders(headers)); |
- return data_reduction_proxy::HasDataReductionProxyViaHeader( |
- response_headers.get(), NULL); |
-} |
- |
// 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 |
@@ -227,7 +215,8 @@ void DumpHistograms(const WebPerformance& performance, |
bool data_reduction_proxy_was_used, |
bool came_from_websearch, |
int websearch_chrome_joint_experiment_id, |
- bool is_preview) { |
+ 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 |
@@ -279,61 +268,80 @@ void DumpHistograms(const WebPerformance& performance, |
document_state->set_web_timing_histograms_recorded(true); |
if (!redirect_start.is_null() && !redirect_end.is_null()) { |
- PLT_HISTOGRAM_DRP("PLT.NT_Redirect", redirect_end - redirect_start, |
- data_reduction_proxy_was_used); |
+ PLT_HISTOGRAM_DRP("PLT.NT_Redirect", |
+ redirect_end - redirect_start, |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
PLT_HISTOGRAM_DRP( |
"PLT.NT_DelayBeforeFetchRedirect", |
(fetch_start - navigation_start) - (redirect_end - redirect_start), |
- data_reduction_proxy_was_used); |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
} else { |
PLT_HISTOGRAM_DRP("PLT.NT_DelayBeforeFetch", |
fetch_start - navigation_start, |
- data_reduction_proxy_was_used); |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
} |
PLT_HISTOGRAM_DRP("PLT.NT_DelayBeforeDomainLookup", |
domain_lookup_start - fetch_start, |
- data_reduction_proxy_was_used); |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
PLT_HISTOGRAM_DRP("PLT.NT_DomainLookup", |
domain_lookup_end - domain_lookup_start, |
- data_reduction_proxy_was_used); |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
PLT_HISTOGRAM_DRP("PLT.NT_DelayBeforeConnect", |
connect_start - domain_lookup_end, |
- data_reduction_proxy_was_used); |
- PLT_HISTOGRAM_DRP("PLT.NT_Connect", connect_end - connect_start, |
- data_reduction_proxy_was_used); |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
+ PLT_HISTOGRAM_DRP("PLT.NT_Connect", |
+ connect_end - connect_start, |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
PLT_HISTOGRAM_DRP("PLT.NT_DelayBeforeRequest", |
request_start - connect_end, |
- data_reduction_proxy_was_used); |
- PLT_HISTOGRAM_DRP("PLT.NT_Request", response_start - request_start, |
- data_reduction_proxy_was_used); |
- PLT_HISTOGRAM_DRP("PLT.NT_Response", response_end - response_start, |
- data_reduction_proxy_was_used); |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
+ PLT_HISTOGRAM_DRP("PLT.NT_Request", |
+ response_start - request_start, |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
+ PLT_HISTOGRAM_DRP("PLT.NT_Response", |
+ response_end - response_start, |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
if (!dom_loading.is_null()) { |
PLT_HISTOGRAM_DRP("PLT.NT_DelayBeforeDomLoading", |
dom_loading - response_start, |
- data_reduction_proxy_was_used); |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
} |
if (!dom_interactive.is_null() && !dom_loading.is_null()) { |
PLT_HISTOGRAM_DRP("PLT.NT_DomLoading", |
dom_interactive - dom_loading, |
- data_reduction_proxy_was_used); |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
} |
if (!dom_content_loaded_start.is_null() && !dom_interactive.is_null()) { |
PLT_HISTOGRAM_DRP("PLT.NT_DomInteractive", |
dom_content_loaded_start - dom_interactive, |
- data_reduction_proxy_was_used); |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
} |
if (!dom_content_loaded_start.is_null() && |
!dom_content_loaded_end.is_null() ) { |
PLT_HISTOGRAM_DRP("PLT.NT_DomContentLoaded", |
dom_content_loaded_end - dom_content_loaded_start, |
- data_reduction_proxy_was_used); |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
} |
if (!dom_content_loaded_end.is_null() && !load_event_start.is_null()) { |
PLT_HISTOGRAM_DRP("PLT.NT_DelayBeforeLoadEvent", |
load_event_start - dom_content_loaded_end, |
- data_reduction_proxy_was_used); |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
} |
// TODO(simonjam): There is no way to distinguish between abandonment and |
@@ -356,12 +364,21 @@ void DumpHistograms(const WebPerformance& performance, |
websearch_chrome_joint_experiment_id, |
is_preview); |
if (data_reduction_proxy_was_used) { |
- PLT_HISTOGRAM("PLT.PT_BeginToFinishDoc_DataReductionProxy", |
- load_event_start - begin); |
- PLT_HISTOGRAM("PLT.PT_CommitToFinishDoc_DataReductionProxy", |
- load_event_start - response_start); |
- PLT_HISTOGRAM("PLT.PT_RequestToFinishDoc_DataReductionProxy", |
- load_event_start - navigation_start); |
+ if ((scheme_type & URLPattern::SCHEME_HTTPS) == 0) { |
+ PLT_HISTOGRAM("PLT.PT_BeginToFinishDoc_DataReductionProxy", |
+ load_event_start - begin); |
+ PLT_HISTOGRAM("PLT.PT_CommitToFinishDoc_DataReductionProxy", |
+ load_event_start - response_start); |
+ PLT_HISTOGRAM("PLT.PT_RequestToFinishDoc_DataReductionProxy", |
+ load_event_start - navigation_start); |
+ } else { |
+ PLT_HISTOGRAM("PLT.PT_BeginToFinishDoc_HTTPS_DataReductionProxy", |
+ load_event_start - begin); |
+ PLT_HISTOGRAM("PLT.PT_CommitToFinishDoc_HTTPS_DataReductionProxy", |
+ load_event_start - response_start); |
+ PLT_HISTOGRAM("PLT.PT_RequestToFinishDoc_HTTPS_DataReductionProxy", |
+ load_event_start - navigation_start); |
+ } |
} |
} |
if (!load_event_end.is_null()) { |
@@ -386,14 +403,25 @@ void DumpHistograms(const WebPerformance& performance, |
websearch_chrome_joint_experiment_id, |
is_preview); |
if (data_reduction_proxy_was_used) { |
- PLT_HISTOGRAM("PLT.PT_BeginToFinish_DataReductionProxy", |
- load_event_end - begin); |
- PLT_HISTOGRAM("PLT.PT_CommitToFinish_DataReductionProxy", |
- load_event_end - response_start); |
- PLT_HISTOGRAM("PLT.PT_RequestToFinish_DataReductionProxy", |
- load_event_end - navigation_start); |
- PLT_HISTOGRAM("PLT.PT_StartToFinish_DataReductionProxy", |
- load_event_end - request_start); |
+ if ((scheme_type & URLPattern::SCHEME_HTTPS) == 0) { |
+ PLT_HISTOGRAM("PLT.PT_BeginToFinish_DataReductionProxy", |
+ load_event_end - begin); |
+ PLT_HISTOGRAM("PLT.PT_CommitToFinish_DataReductionProxy", |
+ load_event_end - response_start); |
+ PLT_HISTOGRAM("PLT.PT_RequestToFinish_DataReductionProxy", |
+ load_event_end - navigation_start); |
+ PLT_HISTOGRAM("PLT.PT_StartToFinish_DataReductionProxy", |
+ load_event_end - request_start); |
+ } else { |
+ PLT_HISTOGRAM("PLT.PT_BeginToFinish_HTTPS_DataReductionProxy", |
+ load_event_end - begin); |
+ PLT_HISTOGRAM("PLT.PT_CommitToFinish_HTTPS_DataReductionProxy", |
+ load_event_end - response_start); |
+ PLT_HISTOGRAM("PLT.PT_RequestToFinish_HTTPS_DataReductionProxy", |
+ load_event_end - navigation_start); |
+ PLT_HISTOGRAM("PLT.PT_StartToFinish_HTTPS_DataReductionProxy", |
+ load_event_end - request_start); |
+ } |
} |
} |
if (!load_event_start.is_null() && !load_event_end.is_null()) { |
@@ -401,11 +429,18 @@ void DumpHistograms(const WebPerformance& performance, |
load_event_end - load_event_start); |
PLT_HISTOGRAM_DRP("PLT.NT_LoadEvent", |
load_event_end - load_event_start, |
- data_reduction_proxy_was_used); |
+ data_reduction_proxy_was_used, |
+ scheme_type); |
- if (data_reduction_proxy_was_used) |
- PLT_HISTOGRAM("PLT.PT_FinishDocToFinish_DataReductionProxy", |
- load_event_end - load_event_start); |
+ if (data_reduction_proxy_was_used) { |
+ if ((scheme_type & URLPattern::SCHEME_HTTPS) == 0) { |
+ PLT_HISTOGRAM("PLT.PT_FinishDocToFinish_DataReductionProxy", |
+ load_event_end - load_event_start); |
+ } else { |
+ PLT_HISTOGRAM("PLT.PT_FinishDocToFinish_HTTPS_DataReductionProxy", |
+ load_event_end - load_event_start); |
+ } |
+ } |
} |
if (!dom_content_loaded_start.is_null()) { |
PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.PT_RequestToDomContentLoaded", |
@@ -413,9 +448,16 @@ void DumpHistograms(const WebPerformance& performance, |
came_from_websearch, |
websearch_chrome_joint_experiment_id, |
is_preview); |
- if (data_reduction_proxy_was_used) |
- PLT_HISTOGRAM("PLT.PT_RequestToDomContentLoaded_DataReductionProxy", |
- dom_content_loaded_start - navigation_start); |
+ if (data_reduction_proxy_was_used) { |
+ if ((scheme_type & URLPattern::SCHEME_HTTPS) == 0) { |
+ PLT_HISTOGRAM("PLT.PT_RequestToDomContentLoaded_DataReductionProxy", |
+ dom_content_loaded_start - navigation_start); |
+ } else { |
+ PLT_HISTOGRAM( |
+ "PLT.PT_RequestToDomContentLoaded_HTTPS_DataReductionProxy", |
+ dom_content_loaded_start - navigation_start); |
+ } |
+ } |
} |
PLT_HISTOGRAM_WITH_GWS_VARIANT("PLT.PT_BeginToCommit", |
response_start - begin, |
@@ -438,14 +480,25 @@ void DumpHistograms(const WebPerformance& performance, |
websearch_chrome_joint_experiment_id, |
is_preview); |
if (data_reduction_proxy_was_used) { |
- PLT_HISTOGRAM("PLT.PT_BeginToCommit_DataReductionProxy", |
- response_start - begin); |
- PLT_HISTOGRAM("PLT.PT_RequestToStart_DataReductionProxy", |
- request_start - navigation_start); |
- PLT_HISTOGRAM("PLT.PT_StartToCommit_DataReductionProxy", |
- response_start - request_start); |
- PLT_HISTOGRAM("PLT.PT_RequestToCommit_DataReductionProxy", |
- response_start - navigation_start); |
+ if ((scheme_type & URLPattern::SCHEME_HTTPS) == 0) { |
+ PLT_HISTOGRAM("PLT.PT_BeginToCommit_DataReductionProxy", |
+ response_start - begin); |
+ PLT_HISTOGRAM("PLT.PT_RequestToStart_DataReductionProxy", |
+ request_start - navigation_start); |
+ PLT_HISTOGRAM("PLT.PT_StartToCommit_DataReductionProxy", |
+ response_start - request_start); |
+ PLT_HISTOGRAM("PLT.PT_RequestToCommit_DataReductionProxy", |
+ response_start - navigation_start); |
+ } else { |
+ PLT_HISTOGRAM("PLT.PT_BeginToCommit_HTTPS_DataReductionProxy", |
+ response_start - begin); |
+ PLT_HISTOGRAM("PLT.PT_RequestToStart_HTTPS_DataReductionProxy", |
+ request_start - navigation_start); |
+ PLT_HISTOGRAM("PLT.PT_StartToCommit_HTTPS_DataReductionProxy", |
+ response_start - request_start); |
+ PLT_HISTOGRAM("PLT.PT_RequestToCommit_HTTPS_DataReductionProxy", |
+ response_start - navigation_start); |
+ } |
} |
} |
@@ -671,7 +724,11 @@ void DumpDeprecatedHistograms(const WebPerformance& performance, |
} // namespace |
PageLoadHistograms::PageLoadHistograms(content::RenderView* render_view) |
- : content::RenderViewObserver(render_view) { |
+ : content::RenderViewObserver(render_view), |
+ data_reduction_proxy_params_( |
+ data_reduction_proxy::DataReductionProxyParams::kAllowed | |
+ data_reduction_proxy::DataReductionProxyParams::kFallbackAllowed | |
+ data_reduction_proxy::DataReductionProxyParams::kAlternativeAllowed) { |
} |
void PageLoadHistograms::Dump(WebFrame* frame) { |
@@ -693,7 +750,9 @@ void PageLoadHistograms::Dump(WebFrame* frame) { |
DocumentState* document_state = |
DocumentState::FromDataSource(frame->dataSource()); |
- bool data_reduction_proxy_was_used = DataReductionProxyWasUsed(frame); |
+ bool data_reduction_proxy_was_used = |
+ data_reduction_proxy_params_.IsDataReductionProxy( |
+ document_state->proxy_server(), NULL); |
bool came_from_websearch = |
IsFromGoogleSearchResult(frame->document().url(), |
GURL(frame->document().referrer())); |
@@ -711,7 +770,8 @@ void PageLoadHistograms::Dump(WebFrame* frame) { |
data_reduction_proxy_was_used, |
came_from_websearch, |
websearch_chrome_joint_experiment_id, |
- is_preview); |
+ is_preview, |
+ scheme_type); |
// Old metrics based on the timing information stored in DocumentState. These |
// are deprecated and should go away. |