| Index: net/nqe/network_quality_estimator.cc | 
| diff --git a/net/nqe/network_quality_estimator.cc b/net/nqe/network_quality_estimator.cc | 
| index 6b9be0358afaf6c2a77bb6453f0048b6360bf7b3..6334c738cd02270e6e7a43dee1c2ef93de8dc64b 100644 | 
| --- a/net/nqe/network_quality_estimator.cc | 
| +++ b/net/nqe/network_quality_estimator.cc | 
| @@ -13,6 +13,7 @@ | 
| #include "base/bind_helpers.h" | 
| #include "base/location.h" | 
| #include "base/logging.h" | 
| +#include "base/memory/ptr_util.h" | 
| #include "base/metrics/histogram.h" | 
| #include "base/metrics/histogram_base.h" | 
| #include "base/metrics/histogram_macros.h" | 
| @@ -60,8 +61,7 @@ base::HistogramBase* GetHistogram(const std::string& statistic_name, | 
|  | 
| return base::Histogram::FactoryGet( | 
| "NQE." + statistic_name + | 
| -          nqe::internal::NetworkQualityEstimatorParams:: | 
| -              GetNameForConnectionType(type), | 
| +          NetworkQualityEstimatorParams::GetNameForConnectionType(type), | 
| kLowerLimit, max_limit, kBucketCount, | 
| base::HistogramBase::kUmaTargetedHistogramFlag); | 
| } | 
| @@ -211,25 +211,13 @@ void RecordEffectiveConnectionTypeAccuracy( | 
|  | 
| NetworkQualityEstimator::NetworkQualityEstimator( | 
| std::unique_ptr<ExternalEstimateProvider> external_estimates_provider, | 
| -    const std::map<std::string, std::string>& variation_params, | 
| -    NetLog* net_log) | 
| -    : NetworkQualityEstimator(std::move(external_estimates_provider), | 
| -                              variation_params, | 
| -                              false, | 
| -                              false, | 
| -                              net_log) {} | 
| - | 
| -NetworkQualityEstimator::NetworkQualityEstimator( | 
| -    std::unique_ptr<ExternalEstimateProvider> external_estimates_provider, | 
| -    const std::map<std::string, std::string>& variation_params, | 
| -    bool use_local_host_requests_for_tests, | 
| -    bool use_smaller_responses_for_tests, | 
| +    std::unique_ptr<NetworkQualityEstimatorParams> params, | 
| NetLog* net_log) | 
| : NetworkQualityEstimator( | 
| std::move(external_estimates_provider), | 
| -          variation_params, | 
| -          use_local_host_requests_for_tests, | 
| -          use_smaller_responses_for_tests, | 
| +          std::move(params), | 
| +          false, | 
| +          false, | 
| true, | 
| NetLogWithSource::Make( | 
| net_log, | 
| @@ -237,7 +225,7 @@ NetworkQualityEstimator::NetworkQualityEstimator( | 
|  | 
| NetworkQualityEstimator::NetworkQualityEstimator( | 
| std::unique_ptr<ExternalEstimateProvider> external_estimates_provider, | 
| -    const std::map<std::string, std::string>& variation_params, | 
| +    std::unique_ptr<NetworkQualityEstimatorParams> params, | 
| bool use_local_host_requests_for_tests, | 
| bool use_smaller_responses_for_tests, | 
| bool add_default_platform_observations, | 
| @@ -248,18 +236,18 @@ NetworkQualityEstimator::NetworkQualityEstimator( | 
| {"TransportRTTOrDownstreamThroughput", | 
| EffectiveConnectionTypeAlgorithm:: | 
| TRANSPORT_RTT_OR_DOWNSTREAM_THROUGHOUT}}), | 
| -      params_(variation_params), | 
| +      params_(std::move(params)), | 
| use_localhost_requests_(use_local_host_requests_for_tests), | 
| use_small_responses_(use_smaller_responses_for_tests), | 
| disable_offline_check_(false), | 
| add_default_platform_observations_(add_default_platform_observations), | 
| effective_connection_type_algorithm_( | 
| algorithm_name_to_enum_.find( | 
| -              params_.GetEffectiveConnectionTypeAlgorithm()) == | 
| +              params_->GetEffectiveConnectionTypeAlgorithm()) == | 
| algorithm_name_to_enum_.end() | 
| ? kDefaultEffectiveConnectionTypeAlgorithm | 
| : algorithm_name_to_enum_ | 
| -                    .find(params_.GetEffectiveConnectionTypeAlgorithm()) | 
| +                    .find(params_->GetEffectiveConnectionTypeAlgorithm()) | 
| ->second), | 
| tick_clock_(new base::DefaultTickClock()), | 
| last_connection_change_(tick_clock_->NowTicks()), | 
| @@ -267,10 +255,10 @@ NetworkQualityEstimator::NetworkQualityEstimator( | 
| NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN, | 
| std::string())), | 
| downstream_throughput_kbps_observations_( | 
| -          params_.weight_multiplier_per_second(), | 
| -          params_.weight_multiplier_per_dbm()), | 
| -      rtt_observations_(params_.weight_multiplier_per_second(), | 
| -                        params_.weight_multiplier_per_dbm()), | 
| +          params_->weight_multiplier_per_second(), | 
| +          params_->weight_multiplier_per_dbm()), | 
| +      rtt_observations_(params_->weight_multiplier_per_second(), | 
| +                        params_->weight_multiplier_per_dbm()), | 
| effective_connection_type_at_last_main_frame_( | 
| EFFECTIVE_CONNECTION_TYPE_UNKNOWN), | 
| external_estimate_provider_(std::move(external_estimates_provider)), | 
| @@ -319,14 +307,14 @@ NetworkQualityEstimator::NetworkQualityEstimator( | 
| AddDefaultEstimates(); | 
|  | 
| throughput_analyzer_.reset(new nqe::internal::ThroughputAnalyzer( | 
| -      ¶ms_, base::ThreadTaskRunnerHandle::Get(), | 
| +      params_.get(), base::ThreadTaskRunnerHandle::Get(), | 
| base::Bind(&NetworkQualityEstimator::OnNewThroughputObservationAvailable, | 
| base::Unretained(this)), | 
| use_localhost_requests_, use_smaller_responses_for_tests)); | 
|  | 
| watcher_factory_.reset(new nqe::internal::SocketWatcherFactory( | 
| base::ThreadTaskRunnerHandle::Get(), | 
| -      params_.min_socket_watcher_notification_interval(), | 
| +      params_->min_socket_watcher_notification_interval(), | 
| base::Bind(&NetworkQualityEstimator::OnUpdatedRTTAvailable, | 
| base::Unretained(this)), | 
| tick_clock_.get())); | 
| @@ -346,30 +334,30 @@ void NetworkQualityEstimator::AddDefaultEstimates() { | 
| if (!add_default_platform_observations_) | 
| return; | 
|  | 
| -  if (params_.DefaultObservation(current_network_id_.type).http_rtt() != | 
| +  if (params_->DefaultObservation(current_network_id_.type).http_rtt() != | 
| nqe::internal::InvalidRTT()) { | 
| RttObservation rtt_observation( | 
| -        params_.DefaultObservation(current_network_id_.type).http_rtt(), | 
| +        params_->DefaultObservation(current_network_id_.type).http_rtt(), | 
| tick_clock_->NowTicks(), INT32_MIN, | 
| NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_HTTP_FROM_PLATFORM); | 
| rtt_observations_.AddObservation(rtt_observation); | 
| NotifyObserversOfRTT(rtt_observation); | 
| } | 
|  | 
| -  if (params_.DefaultObservation(current_network_id_.type).transport_rtt() != | 
| +  if (params_->DefaultObservation(current_network_id_.type).transport_rtt() != | 
| nqe::internal::InvalidRTT()) { | 
| RttObservation rtt_observation( | 
| -        params_.DefaultObservation(current_network_id_.type).transport_rtt(), | 
| +        params_->DefaultObservation(current_network_id_.type).transport_rtt(), | 
| tick_clock_->NowTicks(), INT32_MIN, | 
| NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_TRANSPORT_FROM_PLATFORM); | 
| rtt_observations_.AddObservation(rtt_observation); | 
| NotifyObserversOfRTT(rtt_observation); | 
| } | 
|  | 
| -  if (params_.DefaultObservation(current_network_id_.type) | 
| +  if (params_->DefaultObservation(current_network_id_.type) | 
| .downstream_throughput_kbps() != nqe::internal::kInvalidThroughput) { | 
| ThroughputObservation throughput_observation( | 
| -        params_.DefaultObservation(current_network_id_.type) | 
| +        params_->DefaultObservation(current_network_id_.type) | 
| .downstream_throughput_kbps(), | 
| tick_clock_->NowTicks(), INT32_MIN, | 
| NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_HTTP_FROM_PLATFORM); | 
| @@ -614,7 +602,7 @@ void NetworkQualityEstimator::RecordCorrelationMetric(const URLRequest& request, | 
| // The histogram is recorded randomly to reduce overhead involved with sparse | 
| // histograms. Furthermore, recording the correlation on each request is | 
| // unnecessary. | 
| -  if (RandDouble() >= params_.correlation_uma_logging_probability()) | 
| +  if (RandDouble() >= params_->correlation_uma_logging_probability()) | 
| return; | 
|  | 
| if (request.response_info().was_cached || | 
| @@ -774,7 +762,7 @@ void NetworkQualityEstimator::ReportEffectiveConnectionTypeForTesting( | 
|  | 
| event_creator_.MaybeAddNetworkQualityChangedEventToNetLog( | 
| effective_connection_type_, | 
| -      params_.TypicalNetworkQuality(effective_connection_type)); | 
| +      params_->TypicalNetworkQuality(effective_connection_type)); | 
|  | 
| for (auto& observer : effective_connection_type_observer_list_) | 
| observer.OnEffectiveConnectionTypeChanged(effective_connection_type); | 
| @@ -833,7 +821,7 @@ void NetworkQualityEstimator::OnConnectionTypeChanged( | 
| rtt_observations_.Clear(); | 
|  | 
| #if defined(OS_ANDROID) | 
| -  if (params_.weight_multiplier_per_dbm() < 1.0 && | 
| +  if (params_->weight_multiplier_per_dbm() < 1.0 && | 
| NetworkChangeNotifier::IsConnectionCellular(current_network_id_.type)) { | 
| UMA_HISTOGRAM_BOOLEAN( | 
| "NQE.CellularSignalStrengthAvailable", | 
| @@ -895,7 +883,7 @@ void NetworkQualityEstimator::MaybeQueryExternalEstimateProvider() const { | 
|  | 
| void NetworkQualityEstimator::UpdateSignalStrength() { | 
| #if defined(OS_ANDROID) | 
| -  if (params_.weight_multiplier_per_dbm() >= 1.0 || | 
| +  if (params_->weight_multiplier_per_dbm() >= 1.0 || | 
| !NetworkChangeNotifier::IsConnectionCellular(current_network_id_.type) || | 
| !android::cellular_signal_strength::GetSignalStrengthDbm( | 
| &signal_strength_dbm_)) { | 
| @@ -1030,8 +1018,8 @@ void NetworkQualityEstimator::RecordMetricsOnMainFrameRequest() const { | 
| base::HistogramBase* effective_connection_type_histogram = | 
| base::Histogram::FactoryGet( | 
| std::string("NQE.MainFrame.EffectiveConnectionType.") + | 
| -              nqe::internal::NetworkQualityEstimatorParams:: | 
| -                  GetNameForConnectionType(current_network_id_.type), | 
| +              NetworkQualityEstimatorParams::GetNameForConnectionType( | 
| +                  current_network_id_.type), | 
| 0, EFFECTIVE_CONNECTION_TYPE_LAST, | 
| EFFECTIVE_CONNECTION_TYPE_LAST /* Number of buckets */, | 
| base::HistogramBase::kUmaTargetedHistogramFlag); | 
| @@ -1191,21 +1179,22 @@ NetworkQualityEstimator::GetRecentEffectiveConnectionTypeUsingMetrics( | 
| *transport_rtt = nqe::internal::InvalidRTT(); | 
| *downstream_throughput_kbps = nqe::internal::kInvalidThroughput; | 
|  | 
| -  if (params_.forced_effective_connection_type()) { | 
| +  if (params_->forced_effective_connection_type()) { | 
| *http_rtt = params_ | 
| -                    .TypicalNetworkQuality( | 
| -                        params_.forced_effective_connection_type().value()) | 
| +                    ->TypicalNetworkQuality( | 
| +                        params_->forced_effective_connection_type().value()) | 
| .http_rtt(); | 
| -    *transport_rtt = params_ | 
| -                         .TypicalNetworkQuality( | 
| -                             params_.forced_effective_connection_type().value()) | 
| -                         .transport_rtt(); | 
| +    *transport_rtt = | 
| +        params_ | 
| +            ->TypicalNetworkQuality( | 
| +                params_->forced_effective_connection_type().value()) | 
| +            .transport_rtt(); | 
| *downstream_throughput_kbps = | 
| params_ | 
| -            .TypicalNetworkQuality( | 
| -                params_.forced_effective_connection_type().value()) | 
| +            ->TypicalNetworkQuality( | 
| +                params_->forced_effective_connection_type().value()) | 
| .downstream_throughput_kbps(); | 
| -    return params_.forced_effective_connection_type().value(); | 
| +    return params_->forced_effective_connection_type().value(); | 
| } | 
|  | 
| // If the device is currently offline, then return | 
| @@ -1260,26 +1249,26 @@ NetworkQualityEstimator::GetRecentEffectiveConnectionTypeUsingMetrics( | 
| const bool estimated_http_rtt_is_higher_than_threshold = | 
| http_rtt_metric != NetworkQualityEstimator::MetricUsage::DO_NOT_USE && | 
| *http_rtt != nqe::internal::InvalidRTT() && | 
| -        params_.ConnectionThreshold(type).http_rtt() != | 
| +        params_->ConnectionThreshold(type).http_rtt() != | 
| nqe::internal::InvalidRTT() && | 
| -        *http_rtt >= params_.ConnectionThreshold(type).http_rtt(); | 
| +        *http_rtt >= params_->ConnectionThreshold(type).http_rtt(); | 
|  | 
| const bool estimated_transport_rtt_is_higher_than_threshold = | 
| transport_rtt_metric != | 
| NetworkQualityEstimator::MetricUsage::DO_NOT_USE && | 
| *transport_rtt != nqe::internal::InvalidRTT() && | 
| -        params_.ConnectionThreshold(type).transport_rtt() != | 
| +        params_->ConnectionThreshold(type).transport_rtt() != | 
| nqe::internal::InvalidRTT() && | 
| -        *transport_rtt >= params_.ConnectionThreshold(type).transport_rtt(); | 
| +        *transport_rtt >= params_->ConnectionThreshold(type).transport_rtt(); | 
|  | 
| const bool estimated_throughput_is_lower_than_threshold = | 
| downstream_throughput_kbps_metric != | 
| NetworkQualityEstimator::MetricUsage::DO_NOT_USE && | 
| *downstream_throughput_kbps != nqe::internal::kInvalidThroughput && | 
| -        params_.ConnectionThreshold(type).downstream_throughput_kbps() != | 
| +        params_->ConnectionThreshold(type).downstream_throughput_kbps() != | 
| nqe::internal::kInvalidThroughput && | 
| *downstream_throughput_kbps <= | 
| -            params_.ConnectionThreshold(type).downstream_throughput_kbps(); | 
| +            params_->ConnectionThreshold(type).downstream_throughput_kbps(); | 
|  | 
| if (estimated_http_rtt_is_higher_than_threshold || | 
| estimated_transport_rtt_is_higher_than_threshold || | 
| @@ -1469,7 +1458,7 @@ nqe::internal::NetworkID NetworkQualityEstimator::GetCurrentNetworkID() const { | 
| bool NetworkQualityEstimator::ReadCachedNetworkQualityEstimate() { | 
| DCHECK(thread_checker_.CalledOnValidThread()); | 
|  | 
| -  if (!params_.persistent_cache_reading_enabled()) | 
| +  if (!params_->persistent_cache_reading_enabled()) | 
| return false; | 
|  | 
| nqe::internal::CachedNetworkQuality cached_network_quality; | 
| @@ -1759,7 +1748,7 @@ void NetworkQualityEstimator::OnPrefsRead( | 
|  | 
| nqe::internal::CachedNetworkQuality cached_network_quality( | 
| base::TimeTicks::Now(), | 
| -        params_.TypicalNetworkQuality(effective_connection_type), | 
| +        params_->TypicalNetworkQuality(effective_connection_type), | 
| effective_connection_type); | 
|  | 
| network_quality_store_->Add(it.first, cached_network_quality); | 
| @@ -1772,7 +1761,7 @@ void NetworkQualityEstimator::MaybeUpdateNetworkQualityFromCache( | 
| const nqe::internal::CachedNetworkQuality& cached_network_quality) { | 
| DCHECK(thread_checker_.CalledOnValidThread()); | 
|  | 
| -  if (!params_.persistent_cache_reading_enabled()) | 
| +  if (!params_->persistent_cache_reading_enabled()) | 
| return; | 
| if (network_id != current_network_id_) | 
| return; | 
|  |