Index: components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc |
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc |
index ff611f7f80a7ba10c00babf0390d47109a4d10a7..efc33daffdef93a6f052901fc146009e15314fe2 100644 |
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc |
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc |
@@ -16,6 +16,7 @@ |
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h" |
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_request_options.h" |
#include "components/data_reduction_proxy/core/common/data_reduction_proxy_event_creator.h" |
+#include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h" |
#include "net/base/load_flags.h" |
#include "net/http/http_response_headers.h" |
#include "net/proxy/proxy_info.h" |
@@ -90,6 +91,88 @@ void RecordContentLengthHistograms(bool lofi_low_header_added, |
received_content_length); |
} |
+// Following UMA is plotted to measure how frequently Lo-Fi state changes. |
+// Too frequent changes are undesirable. |
+void RecordAutoLoFiRequestHeaderStateChange(bool previous_header_low, |
+ bool current_header_low) { |
+ // Auto Lo-Fi request header state changes. |
+ // Possible Lo-Fi header directives are empty ("") and low ("q=low"). |
+ // This enum must remain synchronized with the enum of the same name in |
+ // metrics/histograms/histograms.xml. |
+ enum AutoLoFiRequestHeaderState { |
+ AUTO_LOFI_REQUEST_HEADER_STATE_EMPTY_TO_EMPTY = 0, |
+ AUTO_LOFI_REQUEST_HEADER_STATE_EMPTY_TO_LOW = 1, |
+ AUTO_LOFI_REQUEST_HEADER_STATE_LOW_TO_EMPTY = 2, |
+ AUTO_LOFI_REQUEST_HEADER_STATE_LOW_TO_LOW = 3, |
+ AUTO_LOFI_REQUEST_HEADER_STATE_INDEX_BOUNDARY |
+ }; |
+ |
+ AutoLoFiRequestHeaderState state; |
+ net::NetworkChangeNotifier::ConnectionType connection_type = |
+ net::NetworkChangeNotifier::GetConnectionType(); |
+ |
+ if (!previous_header_low) { |
+ if (current_header_low) |
+ state = AUTO_LOFI_REQUEST_HEADER_STATE_EMPTY_TO_LOW; |
+ else |
+ state = AUTO_LOFI_REQUEST_HEADER_STATE_EMPTY_TO_EMPTY; |
+ } else { |
+ if (current_header_low) { |
+ // Low to low in useful in checking how many consecutive page loads |
+ // are done with Lo-Fi enabled. |
+ state = AUTO_LOFI_REQUEST_HEADER_STATE_LOW_TO_LOW; |
+ } else { |
+ state = AUTO_LOFI_REQUEST_HEADER_STATE_LOW_TO_EMPTY; |
+ } |
+ } |
+ |
+ switch (connection_type) { |
+ case net::NetworkChangeNotifier::CONNECTION_UNKNOWN: |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "DataReductionProxy.AutoLoFiRequestHeaderState.Unknown", state, |
+ AUTO_LOFI_REQUEST_HEADER_STATE_INDEX_BOUNDARY); |
+ break; |
+ case net::NetworkChangeNotifier::CONNECTION_ETHERNET: |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "DataReductionProxy.AutoLoFiRequestHeaderState.Ethernet", state, |
+ AUTO_LOFI_REQUEST_HEADER_STATE_INDEX_BOUNDARY); |
+ break; |
+ case net::NetworkChangeNotifier::CONNECTION_WIFI: |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "DataReductionProxy.AutoLoFiRequestHeaderState.WiFi", state, |
+ AUTO_LOFI_REQUEST_HEADER_STATE_INDEX_BOUNDARY); |
+ break; |
+ case net::NetworkChangeNotifier::CONNECTION_2G: |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "DataReductionProxy.AutoLoFiRequestHeaderState.2G", state, |
+ AUTO_LOFI_REQUEST_HEADER_STATE_INDEX_BOUNDARY); |
+ break; |
+ case net::NetworkChangeNotifier::CONNECTION_3G: |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "DataReductionProxy.AutoLoFiRequestHeaderState.3G", state, |
+ AUTO_LOFI_REQUEST_HEADER_STATE_INDEX_BOUNDARY); |
+ break; |
+ case net::NetworkChangeNotifier::CONNECTION_4G: |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "DataReductionProxy.AutoLoFiRequestHeaderState.4G", state, |
+ AUTO_LOFI_REQUEST_HEADER_STATE_INDEX_BOUNDARY); |
+ break; |
+ case net::NetworkChangeNotifier::CONNECTION_NONE: |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "DataReductionProxy.AutoLoFiRequestHeaderState.None", state, |
+ AUTO_LOFI_REQUEST_HEADER_STATE_INDEX_BOUNDARY); |
+ break; |
+ case net::NetworkChangeNotifier::CONNECTION_BLUETOOTH: |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "DataReductionProxy.AutoLoFiRequestHeaderState.Bluetooth", state, |
+ AUTO_LOFI_REQUEST_HEADER_STATE_INDEX_BOUNDARY); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+} |
+ |
} // namespace |
namespace data_reduction_proxy { |
@@ -112,7 +195,8 @@ DataReductionProxyNetworkDelegate::DataReductionProxyNetworkDelegate( |
configurator_(configurator), |
experiments_stats_(experiments_stats), |
net_log_(net_log), |
- event_creator_(event_creator) { |
+ event_creator_(event_creator), |
+ previous_state_lofi_on_(false) { |
DCHECK(data_reduction_proxy_config_); |
DCHECK(data_reduction_proxy_request_options_); |
DCHECK(configurator_); |
@@ -175,19 +259,38 @@ void DataReductionProxyNetworkDelegate::OnBeforeSendProxyHeadersInternal( |
net::HttpRequestHeaders* headers) { |
DCHECK(data_reduction_proxy_config_); |
- // TODO(bengr): Investigate a better approach to update the network |
- // quality so that state of Lo-Fi is stored per page. |
net::NetworkQualityEstimator* network_quality_estimator = nullptr; |
if (request && request->context()) |
network_quality_estimator = request->context()->network_quality_estimator(); |
- if (request && ((request->load_flags() & net::LOAD_MAIN_FRAME) != 0)) { |
- data_reduction_proxy_config_->UpdateLoFiStatusOnMainFrameRequest( |
- ((request->load_flags() & net::LOAD_BYPASS_CACHE) != 0), |
- network_quality_estimator); |
+ // Some requests, such as pings, don't go through |
+ // RenderFrameImpl::WillSendRequest and get the LoFi state since they outlive |
+ // the parent document. Set LoFi off on these requests. |
+ if (request && request->lofi_state() == net::LOFI_DEFAULT && |
+ (request->load_flags() & net::LOAD_MAIN_FRAME) == 0) { |
+ request->set_lofi_state(net::LOFI_OFF); |
+ } |
+ |
+ if (request && request->lofi_state() == net::LOFI_DEFAULT) { |
+ request->set_lofi_state( |
+ data_reduction_proxy_config_->ShouldTurnOnLoFiOnMainFrameRequest( |
+ network_quality_estimator) |
+ ? net::LOFI_ON |
+ : net::LOFI_OFF); |
+ if (params::IsLoFiSlowConnectionsOnlyViaFlags() || |
+ data_reduction_proxy_config_->IsIncludedInLoFiEnabledFieldTrial()) { |
+ RecordAutoLoFiRequestHeaderStateChange( |
+ previous_state_lofi_on_, request->lofi_state() == net::LOFI_ON); |
+ } |
+ } |
+ |
+ if (request && (request->load_flags() & net::LOAD_MAIN_FRAME) != 0) { |
+ previous_state_lofi_on_ = request->lofi_state() == net::LOFI_ON; |
+ |
if (data_reduction_proxy_io_data_) { |
+ // TODO(megjablon): Need to switch to per page. |
data_reduction_proxy_io_data_->SetLoFiModeActiveOnMainFrame( |
- data_reduction_proxy_config_->ShouldUseLoFiHeaderForRequests()); |
+ request->lofi_state() == net::LOFI_ON); |
} |
} |
@@ -254,13 +357,11 @@ void DataReductionProxyNetworkDelegate::OnCompletedInternal( |
DCHECK(data_reduction_proxy_config_); |
- // TODO(bengr): Investigate a better approach to record the Lo-Fi |
- // histogram. State of Lo-Fi should be stored per page. |
RecordContentLengthHistograms( |
// |data_reduction_proxy_io_data_| can be NULL for Webview. |
data_reduction_proxy_io_data_ && |
data_reduction_proxy_io_data_->IsEnabled() && |
- data_reduction_proxy_config_->ShouldUseLoFiHeaderForRequests(), |
+ request->lofi_state() == net::LOFI_ON, |
received_content_length, original_content_length, freshness_lifetime); |
experiments_stats_->RecordBytes(request->request_time(), request_type, |
received_content_length, |