Index: components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc |
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc |
index 4e507cb470024c05ac578d4ea35e9547fe0b9a71..f5e0733f0b81c3c50a60eecb371df4f808bb41a0 100644 |
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc |
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc |
@@ -24,6 +24,7 @@ |
#include "net/proxy/proxy_server.h" |
#include "net/url_request/url_fetcher.h" |
#include "net/url_request/url_fetcher_delegate.h" |
+#include "net/url_request/url_request.h" |
#include "net/url_request/url_request_context.h" |
#include "net/url_request/url_request_context_getter.h" |
#include "net/url_request/url_request_status.h" |
@@ -32,9 +33,6 @@ using base::FieldTrialList; |
namespace { |
-const char kEnabled[] = "Enabled"; |
-const char kControl[] = "Control"; |
- |
// Values of the UMA DataReductionProxy.NetworkChangeEvents histograms. |
// This enum must remain synchronized with the enum of the same |
// name in metrics/histograms/histograms.xml. |
@@ -79,10 +77,8 @@ bool FindProxyInList(const std::vector<net::ProxyServer>& proxy_list, |
// Following UMA is plotted to measure how frequently Lo-Fi state changes. |
// Too frequent changes are undesirable. |
-void RecordAutoLoFiRequestHeaderStateChange( |
- net::NetworkChangeNotifier::ConnectionType connection_type, |
- bool previous_header_low, |
- bool current_header_low) { |
+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 |
@@ -96,6 +92,9 @@ void RecordAutoLoFiRequestHeaderStateChange( |
}; |
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; |
@@ -239,13 +238,13 @@ DataReductionProxyConfig::DataReductionProxyConfig( |
auto_lofi_minimum_rtt_(base::TimeDelta::Max()), |
auto_lofi_maximum_kbps_(0), |
auto_lofi_hysteresis_(base::TimeDelta::Max()), |
- network_quality_last_updated_(base::TimeTicks()), |
+ network_quality_last_checked_(base::TimeTicks()), |
network_prohibitively_slow_(false), |
connection_type_(net::NetworkChangeNotifier::GetConnectionType()), |
- lofi_status_(LOFI_STATUS_TEMPORARILY_OFF), |
- last_main_frame_request_(base::TimeTicks::Now()), |
- network_quality_at_last_main_frame_request_( |
- NETWORK_QUALITY_AT_LAST_MAIN_FRAME_REQUEST_UNKNOWN) { |
+ lofi_off_(false), |
+ last_query_(base::TimeTicks::Now()), |
+ network_quality_at_last_query_(NETWORK_QUALITY_AT_LAST_QUERY_UNKNOWN), |
+ previous_state_lofi_on_(false) { |
DCHECK(configurator); |
DCHECK(event_creator); |
if (params::IsLoFiDisabledViaFlags()) |
@@ -392,8 +391,8 @@ bool DataReductionProxyConfig::AreProxiesBypassed( |
bool DataReductionProxyConfig::IsNetworkQualityProhibitivelySlow( |
const net::NetworkQualityEstimator* network_quality_estimator) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(IsIncludedInLoFiEnabledFieldTrial() || |
- IsIncludedInLoFiControlFieldTrial() || |
+ DCHECK(params::IsIncludedInLoFiEnabledFieldTrial() || |
+ params::IsIncludedInLoFiControlFieldTrial() || |
params::IsLoFiSlowConnectionsOnlyViaFlags()); |
if (!network_quality_estimator) |
@@ -426,21 +425,20 @@ bool DataReductionProxyConfig::IsNetworkQualityProhibitivelySlow( |
is_network_currently_slow = |
kbps < auto_lofi_maximum_kbps_ || rtt > auto_lofi_minimum_rtt_; |
- network_quality_at_last_main_frame_request_ = |
- is_network_currently_slow |
- ? NETWORK_QUALITY_AT_LAST_MAIN_FRAME_REQUEST_SLOW |
- : NETWORK_QUALITY_AT_LAST_MAIN_FRAME_REQUEST_NOT_SLOW; |
+ network_quality_at_last_query_ = |
+ is_network_currently_slow ? NETWORK_QUALITY_AT_LAST_QUERY_SLOW |
+ : NETWORK_QUALITY_AT_LAST_QUERY_NOT_SLOW; |
} |
// Return the cached entry if the last update was within the hysteresis |
// duration and if the connection type has not changed. |
- if (!network_type_changed && !network_quality_last_updated_.is_null() && |
- base::TimeTicks::Now() - network_quality_last_updated_ <= |
+ if (!network_type_changed && !network_quality_last_checked_.is_null() && |
+ base::TimeTicks::Now() - network_quality_last_checked_ <= |
auto_lofi_hysteresis_) { |
return network_prohibitively_slow_; |
} |
- network_quality_last_updated_ = base::TimeTicks::Now(); |
+ network_quality_last_checked_ = base::TimeTicks::Now(); |
if (!is_network_quality_available) |
return false; |
@@ -449,68 +447,6 @@ bool DataReductionProxyConfig::IsNetworkQualityProhibitivelySlow( |
return network_prohibitively_slow_; |
} |
-bool DataReductionProxyConfig::IsIncludedInLoFiEnabledFieldTrial() const { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- return FieldTrialList::FindFullName(params::GetLoFiFieldTrialName()) == |
- kEnabled; |
-} |
- |
-bool DataReductionProxyConfig::IsIncludedInLoFiControlFieldTrial() const { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- return FieldTrialList::FindFullName(params::GetLoFiFieldTrialName()) == |
- kControl; |
-} |
- |
-LoFiStatus DataReductionProxyConfig::GetLoFiStatus() const { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- return lofi_status_; |
-} |
- |
-// static |
-bool DataReductionProxyConfig::ShouldUseLoFiHeaderForRequests( |
- LoFiStatus lofi_status) { |
- switch (lofi_status) { |
- case LOFI_STATUS_OFF: |
- case LOFI_STATUS_TEMPORARILY_OFF: |
- case LOFI_STATUS_ACTIVE_CONTROL: |
- case LOFI_STATUS_INACTIVE_CONTROL: |
- case LOFI_STATUS_INACTIVE: |
- return false; |
- // Lo-Fi header can be used only if Lo-Fi is not temporarily off and either |
- // the user has enabled Lo-Fi through flags, or session is in Lo-Fi enabled |
- // group with network quality prohibitively slow. |
- case LOFI_STATUS_ACTIVE_FROM_FLAGS: |
- case LOFI_STATUS_ACTIVE: |
- return true; |
- default: |
- NOTREACHED() << lofi_status; |
- } |
- return false; |
-} |
- |
-bool DataReductionProxyConfig::ShouldUseLoFiHeaderForRequests() const { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- return ShouldUseLoFiHeaderForRequests(lofi_status_); |
-} |
- |
-bool DataReductionProxyConfig::IsInLoFiActiveControlExperiment() const { |
- switch (lofi_status_) { |
- case LOFI_STATUS_OFF: |
- case LOFI_STATUS_TEMPORARILY_OFF: |
- case LOFI_STATUS_INACTIVE_CONTROL: |
- case LOFI_STATUS_INACTIVE: |
- case LOFI_STATUS_ACTIVE_FROM_FLAGS: |
- case LOFI_STATUS_ACTIVE: |
- return false; |
- case LOFI_STATUS_ACTIVE_CONTROL: |
- DCHECK(IsIncludedInLoFiControlFieldTrial()); |
- return true; |
- default: |
- NOTREACHED() << lofi_status_; |
- } |
- return false; |
-} |
- |
void DataReductionProxyConfig::PopulateAutoLoFiParams() { |
std::string field_trial = params::GetLoFiFieldTrialName(); |
@@ -522,8 +458,8 @@ void DataReductionProxyConfig::PopulateAutoLoFiParams() { |
field_trial = params::GetLoFiFlagFieldTrialName(); |
} |
- if (!IsIncludedInLoFiControlFieldTrial() && |
- !IsIncludedInLoFiEnabledFieldTrial() && |
+ if (!params::IsIncludedInLoFiControlFieldTrial() && |
+ !params::IsIncludedInLoFiEnabledFieldTrial() && |
!params::IsLoFiSlowConnectionsOnlyViaFlags()) { |
return; |
} |
@@ -778,25 +714,25 @@ void DataReductionProxyConfig::SecureProxyCheck( |
void DataReductionProxyConfig::SetLoFiModeOff() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- lofi_status_ = LOFI_STATUS_OFF; |
+ lofi_off_ = true; |
} |
void DataReductionProxyConfig::RecordAutoLoFiAccuracyRate( |
const net::NetworkQualityEstimator* network_quality_estimator) const { |
DCHECK(thread_checker_.CalledOnValidThread()); |
DCHECK(network_quality_estimator); |
- DCHECK(IsIncludedInLoFiEnabledFieldTrial()); |
- DCHECK_NE(network_quality_at_last_main_frame_request_, |
- NETWORK_QUALITY_AT_LAST_MAIN_FRAME_REQUEST_UNKNOWN); |
+ DCHECK(params::IsIncludedInLoFiEnabledFieldTrial()); |
+ DCHECK_NE(network_quality_at_last_query_, |
+ NETWORK_QUALITY_AT_LAST_QUERY_UNKNOWN); |
base::TimeDelta rtt_since_last_page_load; |
if (!network_quality_estimator->GetRecentMedianRTT( |
- last_main_frame_request_, &rtt_since_last_page_load)) { |
+ last_query_, &rtt_since_last_page_load)) { |
return; |
} |
int32_t downstream_throughput_kbps; |
if (!network_quality_estimator->GetRecentMedianDownlinkThroughputKbps( |
- last_main_frame_request_, &downstream_throughput_kbps)) { |
+ last_query_, &downstream_throughput_kbps)) { |
return; |
} |
@@ -818,21 +754,19 @@ void DataReductionProxyConfig::RecordAutoLoFiAccuracyRate( |
AutoLoFiAccuracy accuracy = AUTO_LOFI_ACCURACY_INDEX_BOUNDARY; |
if (should_have_used_lofi) { |
- if (network_quality_at_last_main_frame_request_ == |
- NETWORK_QUALITY_AT_LAST_MAIN_FRAME_REQUEST_SLOW) { |
+ if (network_quality_at_last_query_ == NETWORK_QUALITY_AT_LAST_QUERY_SLOW) { |
accuracy = AUTO_LOFI_ACCURACY_ESTIMATED_SLOW_ACTUAL_SLOW; |
- } else if (network_quality_at_last_main_frame_request_ == |
- NETWORK_QUALITY_AT_LAST_MAIN_FRAME_REQUEST_NOT_SLOW) { |
+ } else if (network_quality_at_last_query_ == |
+ NETWORK_QUALITY_AT_LAST_QUERY_NOT_SLOW) { |
accuracy = AUTO_LOFI_ACCURACY_ESTIMATED_NOT_SLOW_ACTUAL_SLOW; |
} else { |
NOTREACHED(); |
} |
} else { |
- if (network_quality_at_last_main_frame_request_ == |
- NETWORK_QUALITY_AT_LAST_MAIN_FRAME_REQUEST_SLOW) { |
+ if (network_quality_at_last_query_ == NETWORK_QUALITY_AT_LAST_QUERY_SLOW) { |
accuracy = AUTO_LOFI_ACCURACY_ESTIMATED_SLOW_ACTUAL_NOT_SLOW; |
- } else if (network_quality_at_last_main_frame_request_ == |
- NETWORK_QUALITY_AT_LAST_MAIN_FRAME_REQUEST_NOT_SLOW) { |
+ } else if (network_quality_at_last_query_ == |
+ NETWORK_QUALITY_AT_LAST_QUERY_NOT_SLOW) { |
accuracy = AUTO_LOFI_ACCURACY_ESTIMATED_NOT_SLOW_ACTUAL_NOT_SLOW; |
} else { |
NOTREACHED(); |
@@ -878,8 +812,27 @@ void DataReductionProxyConfig::RecordAutoLoFiAccuracyRate( |
} |
} |
-void DataReductionProxyConfig::UpdateLoFiStatusOnMainFrameRequest( |
- bool user_temporarily_disabled_lofi, |
+bool DataReductionProxyConfig::ShouldEnableLoFiMode( |
+ const net::URLRequest& request) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ net::NetworkQualityEstimator* network_quality_estimator; |
+ network_quality_estimator = |
+ request.context() ? request.context()->network_quality_estimator() |
+ : nullptr; |
+ |
+ bool enable_lofi = ShouldEnableLoFiModeInternal(network_quality_estimator); |
+ |
+ if (params::IsLoFiSlowConnectionsOnlyViaFlags() || |
+ params::IsIncludedInLoFiEnabledFieldTrial()) { |
+ RecordAutoLoFiRequestHeaderStateChange(previous_state_lofi_on_, |
+ enable_lofi); |
+ previous_state_lofi_on_ = enable_lofi; |
+ } |
+ |
+ return enable_lofi; |
+} |
+ |
+bool DataReductionProxyConfig::ShouldEnableLoFiModeInternal( |
const net::NetworkQualityEstimator* network_quality_estimator) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
@@ -887,87 +840,36 @@ void DataReductionProxyConfig::UpdateLoFiStatusOnMainFrameRequest( |
// field trial, and the user has not enabled Lo-Fi on slow connections |
// via flags. |
if (network_quality_estimator && |
- network_quality_at_last_main_frame_request_ != |
- NETWORK_QUALITY_AT_LAST_MAIN_FRAME_REQUEST_UNKNOWN && |
- IsIncludedInLoFiEnabledFieldTrial() && |
+ network_quality_at_last_query_ != NETWORK_QUALITY_AT_LAST_QUERY_UNKNOWN && |
+ params::IsIncludedInLoFiEnabledFieldTrial() && |
!params::IsLoFiSlowConnectionsOnlyViaFlags()) { |
RecordAutoLoFiAccuracyRate(network_quality_estimator); |
} |
- last_main_frame_request_ = base::TimeTicks::Now(); |
- network_quality_at_last_main_frame_request_ = |
- NETWORK_QUALITY_AT_LAST_MAIN_FRAME_REQUEST_UNKNOWN; |
- |
- // If Lo-Fi has been permanently turned off, its status can't change. |
- if (lofi_status_ == LOFI_STATUS_OFF) |
- return; |
+ last_query_ = base::TimeTicks::Now(); |
+ network_quality_at_last_query_ = NETWORK_QUALITY_AT_LAST_QUERY_UNKNOWN; |
- // If the user has temporarily disabled Lo-Fi on a main frame request, it will |
- // remain disabled until next main frame request. |
- if (user_temporarily_disabled_lofi) { |
- switch (lofi_status_) { |
- // Turn off Lo-Fi temporarily (until next main frame request) if it was |
- // enabled from flags or because the session is in Lo-Fi enabled group. |
- case LOFI_STATUS_ACTIVE_FROM_FLAGS: |
- case LOFI_STATUS_ACTIVE: |
- case LOFI_STATUS_INACTIVE: |
- lofi_status_ = LOFI_STATUS_TEMPORARILY_OFF; |
- return; |
- // Lo-Fi is already temporarily off, so no need to change state. |
- case LOFI_STATUS_TEMPORARILY_OFF: |
- // If the current session does not have Lo-Fi switch, is not in Auto Lo-Fi |
- // enabled group and is in Auto Lo-Fi control group, then we do not need |
- // to temporarily disable Lo-Fi because it would never be used. |
- case LOFI_STATUS_ACTIVE_CONTROL: |
- case LOFI_STATUS_INACTIVE_CONTROL: |
- return; |
- |
- default: |
- NOTREACHED() << "Unexpected Lo-Fi status = " << lofi_status_; |
- } |
- } |
+ // If Lo-Fi has been turned off, its status can't change. |
+ if (lofi_off_) |
+ return false; |
- if (params::IsLoFiAlwaysOnViaFlags()) { |
- lofi_status_ = LOFI_STATUS_ACTIVE_FROM_FLAGS; |
- return; |
- } |
+ if (params::IsLoFiAlwaysOnViaFlags()) |
+ return true; |
if (params::IsLoFiCellularOnlyViaFlags()) { |
- if (net::NetworkChangeNotifier::IsConnectionCellular( |
- net::NetworkChangeNotifier::GetConnectionType())) { |
- lofi_status_ = LOFI_STATUS_ACTIVE_FROM_FLAGS; |
- return; |
- } |
- lofi_status_ = LOFI_STATUS_TEMPORARILY_OFF; |
- return; |
+ return net::NetworkChangeNotifier::IsConnectionCellular( |
+ net::NetworkChangeNotifier::GetConnectionType()); |
} |
- // Store the previous state of Lo-Fi, so that change in Lo-Fi status can be |
- // recorded properly. This is not needed for the control group, because it |
- // is only used to report changes in request headers, and the request headers |
- // are never modified in the control group. |
- LoFiStatus previous_lofi_status = lofi_status_; |
- |
if (params::IsLoFiSlowConnectionsOnlyViaFlags() || |
- IsIncludedInLoFiEnabledFieldTrial()) { |
- lofi_status_ = IsNetworkQualityProhibitivelySlow(network_quality_estimator) |
- ? LOFI_STATUS_ACTIVE |
- : LOFI_STATUS_INACTIVE; |
- RecordAutoLoFiRequestHeaderStateChange( |
- connection_type_, ShouldUseLoFiHeaderForRequests(previous_lofi_status), |
- ShouldUseLoFiHeaderForRequests(lofi_status_)); |
- return; |
- } |
- |
- if (IsIncludedInLoFiControlFieldTrial()) { |
- lofi_status_ = IsNetworkQualityProhibitivelySlow(network_quality_estimator) |
- ? LOFI_STATUS_ACTIVE_CONTROL |
- : LOFI_STATUS_INACTIVE_CONTROL; |
- return; |
+ params::IsIncludedInLoFiEnabledFieldTrial() || |
+ params::IsIncludedInLoFiControlFieldTrial()) { |
+ return IsNetworkQualityProhibitivelySlow(network_quality_estimator); |
} |
// If Lo-Fi is not enabled through command line and the user is not in |
- // Lo-Fi field trials, we set Lo-Fi to permanent off. |
- lofi_status_ = LOFI_STATUS_OFF; |
+ // Lo-Fi field trials, set Lo-Fi to off. |
+ lofi_off_ = true; |
+ return false; |
} |
void DataReductionProxyConfig::GetNetworkList( |