Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(472)

Unified Diff: chrome/browser/net/pref_proxy_config_tracker_impl.cc

Issue 1296663003: Componentize proxy code from chrome/browser/net (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: updating for win p/f Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/net/pref_proxy_config_tracker_impl.cc
diff --git a/chrome/browser/net/pref_proxy_config_tracker_impl.cc b/chrome/browser/net/pref_proxy_config_tracker_impl.cc
deleted file mode 100644
index 6de119ea7f9ca9223fe181e13166b5775ee8dceb..0000000000000000000000000000000000000000
--- a/chrome/browser/net/pref_proxy_config_tracker_impl.cc
+++ /dev/null
@@ -1,434 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/net/pref_proxy_config_tracker_impl.h"
-
-#include "base/bind.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/prefs/pref_registry_simple.h"
-#include "base/prefs/pref_service.h"
-#include "base/strings/string_util.h"
-#include "base/values.h"
-#include "chrome/browser/chrome_notification_types.h"
-#include "chrome/common/pref_names.h"
-#include "components/pref_registry/pref_registry_syncable.h"
-#include "components/proxy_config/proxy_config_dictionary.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/notification_details.h"
-#include "content/public/browser/notification_source.h"
-#include "net/proxy/proxy_list.h"
-#include "net/proxy/proxy_server.h"
-
-using content::BrowserThread;
-
-namespace {
-
-// Determine if |proxy| is of the form "*.googlezip.net".
-bool IsGooglezipDataReductionProxy(const net::ProxyServer& proxy) {
- return proxy.is_valid() && !proxy.is_direct() &&
- base::EndsWith(proxy.host_port_pair().host(), ".googlezip.net",
- base::CompareCase::SENSITIVE);
-}
-
-// Removes any Data Reduction Proxies like *.googlezip.net from |proxy_list|.
-// Returns the number of proxies that were removed from |proxy_list|.
-size_t RemoveGooglezipDataReductionProxiesFromList(net::ProxyList* proxy_list) {
- bool found_googlezip_proxy = false;
- for (const net::ProxyServer& proxy : proxy_list->GetAll()) {
- if (IsGooglezipDataReductionProxy(proxy)) {
- found_googlezip_proxy = true;
- break;
- }
- }
- if (!found_googlezip_proxy)
- return 0;
-
- size_t num_removed_proxies = 0;
- net::ProxyList replacement_list;
- for (const net::ProxyServer& proxy : proxy_list->GetAll()) {
- if (!IsGooglezipDataReductionProxy(proxy))
- replacement_list.AddProxyServer(proxy);
- else
- ++num_removed_proxies;
- }
-
- if (replacement_list.IsEmpty())
- replacement_list.AddProxyServer(net::ProxyServer::Direct());
- *proxy_list = replacement_list;
- return num_removed_proxies;
-}
-
-// Remove any Data Reduction Proxies like *.googlezip.net from |proxy_rules|.
-// This is to prevent a Data Reduction Proxy from being activated in an
-// unsupported way, such as from a proxy pref, which could cause Chrome to use
-// the Data Reduction Proxy without adding any of the necessary authentication
-// headers or applying the Data Reduction Proxy bypass logic. See
-// http://crbug.com/476610.
-// TODO(sclittle): This method should be removed once the UMA indicates that
-// *.googlezip.net proxies are no longer present in the |proxy_rules|.
-void RemoveGooglezipDataReductionProxies(
- net::ProxyConfig::ProxyRules* proxy_rules) {
- size_t num_removed_proxies =
- RemoveGooglezipDataReductionProxiesFromList(
- &proxy_rules->fallback_proxies) +
- RemoveGooglezipDataReductionProxiesFromList(
- &proxy_rules->proxies_for_ftp) +
- RemoveGooglezipDataReductionProxiesFromList(
- &proxy_rules->proxies_for_http) +
- RemoveGooglezipDataReductionProxiesFromList(
- &proxy_rules->proxies_for_https) +
- RemoveGooglezipDataReductionProxiesFromList(&proxy_rules->single_proxies);
-
- UMA_HISTOGRAM_COUNTS_100("Net.PrefProxyConfig.GooglezipProxyRemovalCount",
- num_removed_proxies);
-}
-
-} // namespace
-
-//============================= ChromeProxyConfigService =======================
-
-ChromeProxyConfigService::ChromeProxyConfigService(
- net::ProxyConfigService* base_service)
- : base_service_(base_service),
- pref_config_state_(ProxyPrefs::CONFIG_UNSET),
- pref_config_read_pending_(true),
- registered_observer_(false) {
-}
-
-ChromeProxyConfigService::~ChromeProxyConfigService() {
- if (registered_observer_ && base_service_.get())
- base_service_->RemoveObserver(this);
-}
-
-void ChromeProxyConfigService::AddObserver(
- net::ProxyConfigService::Observer* observer) {
- RegisterObserver();
- observers_.AddObserver(observer);
-}
-
-void ChromeProxyConfigService::RemoveObserver(
- net::ProxyConfigService::Observer* observer) {
- observers_.RemoveObserver(observer);
-}
-
-net::ProxyConfigService::ConfigAvailability
- ChromeProxyConfigService::GetLatestProxyConfig(net::ProxyConfig* config) {
- RegisterObserver();
-
- if (pref_config_read_pending_)
- return net::ProxyConfigService::CONFIG_PENDING;
-
- // Ask the base service if available.
- net::ProxyConfig system_config;
- ConfigAvailability system_availability =
- net::ProxyConfigService::CONFIG_UNSET;
- if (base_service_.get())
- system_availability = base_service_->GetLatestProxyConfig(&system_config);
-
- ProxyPrefs::ConfigState config_state;
- return PrefProxyConfigTrackerImpl::GetEffectiveProxyConfig(
- pref_config_state_, pref_config_,
- system_availability, system_config, false,
- &config_state, config);
-}
-
-void ChromeProxyConfigService::OnLazyPoll() {
- if (base_service_.get())
- base_service_->OnLazyPoll();
-}
-
-void ChromeProxyConfigService::UpdateProxyConfig(
- ProxyPrefs::ConfigState config_state,
- const net::ProxyConfig& config) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
- pref_config_read_pending_ = false;
- pref_config_state_ = config_state;
- pref_config_ = config;
-
- if (!observers_.might_have_observers())
- return;
-
- // Evaluate the proxy configuration. If GetLatestProxyConfig returns
- // CONFIG_PENDING, we are using the system proxy service, but it doesn't have
- // a valid configuration yet. Once it is ready, OnProxyConfigChanged() will be
- // called and broadcast the proxy configuration.
- // Note: If a switch between a preference proxy configuration and the system
- // proxy configuration occurs an unnecessary notification might get send if
- // the two configurations agree. This case should be rare however, so we don't
- // handle that case specially.
- net::ProxyConfig new_config;
- ConfigAvailability availability = GetLatestProxyConfig(&new_config);
- if (availability != CONFIG_PENDING) {
- FOR_EACH_OBSERVER(net::ProxyConfigService::Observer, observers_,
- OnProxyConfigChanged(new_config, availability));
- }
-}
-
-void ChromeProxyConfigService::OnProxyConfigChanged(
- const net::ProxyConfig& config,
- ConfigAvailability availability) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
- // Check whether there is a proxy configuration defined by preferences. In
- // this case that proxy configuration takes precedence and the change event
- // from the delegate proxy service can be disregarded.
- if (!PrefProxyConfigTrackerImpl::PrefPrecedes(pref_config_state_)) {
- net::ProxyConfig actual_config;
- availability = GetLatestProxyConfig(&actual_config);
- FOR_EACH_OBSERVER(net::ProxyConfigService::Observer, observers_,
- OnProxyConfigChanged(actual_config, availability));
- }
-}
-
-void ChromeProxyConfigService::RegisterObserver() {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (!registered_observer_ && base_service_.get()) {
- base_service_->AddObserver(this);
- registered_observer_ = true;
- }
-}
-
-//========================= PrefProxyConfigTrackerImpl =========================
-
-PrefProxyConfigTrackerImpl::PrefProxyConfigTrackerImpl(
- PrefService* pref_service)
- : pref_service_(pref_service),
- chrome_proxy_config_service_(NULL),
- update_pending_(true) {
- config_state_ = ReadPrefConfig(pref_service_, &pref_config_);
- proxy_prefs_.Init(pref_service);
- proxy_prefs_.Add(prefs::kProxy,
- base::Bind(&PrefProxyConfigTrackerImpl::OnProxyPrefChanged,
- base::Unretained(this)));
-}
-
-PrefProxyConfigTrackerImpl::~PrefProxyConfigTrackerImpl() {
- DCHECK(pref_service_ == NULL);
-}
-
-scoped_ptr<net::ProxyConfigService>
-PrefProxyConfigTrackerImpl::CreateTrackingProxyConfigService(
- scoped_ptr<net::ProxyConfigService> base_service) {
- chrome_proxy_config_service_ =
- new ChromeProxyConfigService(base_service.release());
- VLOG(1) << this << ": set chrome proxy config service to "
- << chrome_proxy_config_service_;
- if (chrome_proxy_config_service_ && update_pending_)
- OnProxyConfigChanged(config_state_, pref_config_);
-
- return scoped_ptr<net::ProxyConfigService>(chrome_proxy_config_service_);
-}
-
-void PrefProxyConfigTrackerImpl::DetachFromPrefService() {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- // Stop notifications.
- proxy_prefs_.RemoveAll();
- pref_service_ = NULL;
- chrome_proxy_config_service_ = NULL;
-}
-
-// static
-bool PrefProxyConfigTrackerImpl::PrefPrecedes(
- ProxyPrefs::ConfigState config_state) {
- return config_state == ProxyPrefs::CONFIG_POLICY ||
- config_state == ProxyPrefs::CONFIG_EXTENSION ||
- config_state == ProxyPrefs::CONFIG_OTHER_PRECEDE;
-}
-
-// static
-net::ProxyConfigService::ConfigAvailability
- PrefProxyConfigTrackerImpl::GetEffectiveProxyConfig(
- ProxyPrefs::ConfigState pref_state,
- const net::ProxyConfig& pref_config,
- net::ProxyConfigService::ConfigAvailability system_availability,
- const net::ProxyConfig& system_config,
- bool ignore_fallback_config,
- ProxyPrefs::ConfigState* effective_config_state,
- net::ProxyConfig* effective_config) {
- net::ProxyConfigService::ConfigAvailability rv;
- *effective_config_state = pref_state;
-
- if (PrefPrecedes(pref_state)) {
- *effective_config = pref_config;
- rv = net::ProxyConfigService::CONFIG_VALID;
- } else if (system_availability == net::ProxyConfigService::CONFIG_UNSET) {
- // If there's no system proxy config, fall back to prefs or default.
- if (pref_state == ProxyPrefs::CONFIG_FALLBACK && !ignore_fallback_config)
- *effective_config = pref_config;
- else
- *effective_config = net::ProxyConfig::CreateDirect();
- rv = net::ProxyConfigService::CONFIG_VALID;
- } else {
- *effective_config_state = ProxyPrefs::CONFIG_SYSTEM;
- *effective_config = system_config;
- rv = system_availability;
- }
-
- // Remove any Data Reduction Proxies like *.googlezip.net from the proxy
- // config rules, since specifying a DRP in the proxy rules is not a supported
- // means of activating the DRP, and could cause requests to be sent to the DRP
- // without the appropriate authentication headers and without using any of the
- // DRP bypass logic. This prevents the Data Reduction Proxy from being
- // improperly activated via the proxy pref.
- // TODO(sclittle): This is a temporary fix for http://crbug.com/476610, and
- // should be removed once that bug is fixed and verified.
- if (rv == net::ProxyConfigService::CONFIG_VALID)
- RemoveGooglezipDataReductionProxies(&effective_config->proxy_rules());
-
- return rv;
-}
-
-// static
-void PrefProxyConfigTrackerImpl::RegisterPrefs(PrefRegistrySimple* registry) {
- base::DictionaryValue* default_settings =
- ProxyConfigDictionary::CreateSystem();
- registry->RegisterDictionaryPref(prefs::kProxy, default_settings);
-}
-
-// static
-void PrefProxyConfigTrackerImpl::RegisterProfilePrefs(
- user_prefs::PrefRegistrySyncable* pref_service) {
- base::DictionaryValue* default_settings =
- ProxyConfigDictionary::CreateSystem();
- pref_service->RegisterDictionaryPref(prefs::kProxy, default_settings);
-}
-
-// static
-ProxyPrefs::ConfigState PrefProxyConfigTrackerImpl::ReadPrefConfig(
- const PrefService* pref_service,
- net::ProxyConfig* config) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
- // Clear the configuration and source.
- *config = net::ProxyConfig();
- ProxyPrefs::ConfigState config_state = ProxyPrefs::CONFIG_UNSET;
-
- const PrefService::Preference* pref =
- pref_service->FindPreference(prefs::kProxy);
- DCHECK(pref);
-
- const base::DictionaryValue* dict =
- pref_service->GetDictionary(prefs::kProxy);
- DCHECK(dict);
- ProxyConfigDictionary proxy_dict(dict);
-
- if (PrefConfigToNetConfig(proxy_dict, config)) {
- if (!pref->IsUserModifiable() || pref->HasUserSetting()) {
- if (pref->IsManaged())
- config_state = ProxyPrefs::CONFIG_POLICY;
- else if (pref->IsExtensionControlled())
- config_state = ProxyPrefs::CONFIG_EXTENSION;
- else
- config_state = ProxyPrefs::CONFIG_OTHER_PRECEDE;
- } else {
- config_state = ProxyPrefs::CONFIG_FALLBACK;
- }
- }
-
- return config_state;
-}
-
-ProxyPrefs::ConfigState PrefProxyConfigTrackerImpl::GetProxyConfig(
- net::ProxyConfig* config) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- if (config_state_ != ProxyPrefs::CONFIG_UNSET)
- *config = pref_config_;
- return config_state_;
-}
-
-void PrefProxyConfigTrackerImpl::OnProxyConfigChanged(
- ProxyPrefs::ConfigState config_state,
- const net::ProxyConfig& config) {
- if (!chrome_proxy_config_service_) {
- VLOG(1) << "No chrome proxy config service to push to UpdateProxyConfig";
- update_pending_ = true;
- return;
- }
- update_pending_ = !BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&ChromeProxyConfigService::UpdateProxyConfig,
- base::Unretained(chrome_proxy_config_service_),
- config_state, config));
- VLOG(1) << this << (update_pending_ ? ": Error" : ": Done")
- << " pushing proxy to UpdateProxyConfig";
-}
-
-bool PrefProxyConfigTrackerImpl::PrefConfigToNetConfig(
- const ProxyConfigDictionary& proxy_dict,
- net::ProxyConfig* config) {
- ProxyPrefs::ProxyMode mode;
- if (!proxy_dict.GetMode(&mode)) {
- // Fall back to system settings if the mode preference is invalid.
- return false;
- }
-
- switch (mode) {
- case ProxyPrefs::MODE_SYSTEM:
- // Use system settings.
- return false;
- case ProxyPrefs::MODE_DIRECT:
- // Ignore all the other proxy config preferences if the use of a proxy
- // has been explicitly disabled.
- return true;
- case ProxyPrefs::MODE_AUTO_DETECT:
- config->set_auto_detect(true);
- return true;
- case ProxyPrefs::MODE_PAC_SCRIPT: {
- std::string proxy_pac;
- if (!proxy_dict.GetPacUrl(&proxy_pac)) {
- LOG(ERROR) << "Proxy settings request PAC script but do not specify "
- << "its URL. Falling back to direct connection.";
- return true;
- }
- GURL proxy_pac_url(proxy_pac);
- if (!proxy_pac_url.is_valid()) {
- LOG(ERROR) << "Invalid proxy PAC url: " << proxy_pac;
- return true;
- }
- config->set_pac_url(proxy_pac_url);
- bool pac_mandatory = false;
- proxy_dict.GetPacMandatory(&pac_mandatory);
- config->set_pac_mandatory(pac_mandatory);
- return true;
- }
- case ProxyPrefs::MODE_FIXED_SERVERS: {
- std::string proxy_server;
- if (!proxy_dict.GetProxyServer(&proxy_server)) {
- LOG(ERROR) << "Proxy settings request fixed proxy servers but do not "
- << "specify their URLs. Falling back to direct connection.";
- return true;
- }
- config->proxy_rules().ParseFromString(proxy_server);
-
- std::string proxy_bypass;
- if (proxy_dict.GetBypassList(&proxy_bypass)) {
- config->proxy_rules().bypass_rules.ParseFromString(proxy_bypass);
- }
- return true;
- }
- case ProxyPrefs::kModeCount: {
- // Fall through to NOTREACHED().
- }
- }
- NOTREACHED() << "Unknown proxy mode, falling back to system settings.";
- return false;
-}
-
-void PrefProxyConfigTrackerImpl::OnProxyPrefChanged() {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- net::ProxyConfig new_config;
- ProxyPrefs::ConfigState config_state = ReadPrefConfig(pref_service_,
- &new_config);
- if (config_state_ != config_state ||
- (config_state_ != ProxyPrefs::CONFIG_UNSET &&
- !pref_config_.Equals(new_config))) {
- config_state_ = config_state;
- if (config_state_ != ProxyPrefs::CONFIG_UNSET)
- pref_config_ = new_config;
- update_pending_ = true;
- }
- if (update_pending_)
- OnProxyConfigChanged(config_state, new_config);
-}
« no previous file with comments | « chrome/browser/net/pref_proxy_config_tracker_impl.h ('k') | chrome/browser/net/pref_proxy_config_tracker_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698