Index: chrome/browser/net/pref_proxy_config_service.cc |
=================================================================== |
--- chrome/browser/net/pref_proxy_config_service.cc (revision 103881) |
+++ chrome/browser/net/pref_proxy_config_service.cc (working copy) |
@@ -16,7 +16,10 @@ |
PrefProxyConfigTracker::PrefProxyConfigTracker(PrefService* pref_service) |
: pref_service_(pref_service) { |
- config_state_ = ReadPrefConfig(&pref_config_); |
+ ui_config_state_ = ReadPrefConfig(&ui_pref_config_, &ui_config_source_); |
+ io_config_state_ = ui_config_state_; |
+ io_pref_config_ = ui_pref_config_; |
+ io_config_source_ = ui_config_source_; |
proxy_prefs_observer_.reset( |
PrefSetObserver::CreateProxyPrefSetObserver(pref_service_, this)); |
} |
@@ -26,13 +29,27 @@ |
} |
PrefProxyConfigTracker::ConfigState |
- PrefProxyConfigTracker::GetProxyConfig(net::ProxyConfig* config) { |
+ PrefProxyConfigTracker::IOGetProxyConfig(net::ProxyConfig* config, |
+ ConfigSource* config_source) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- if (config_state_ != CONFIG_UNSET) |
- *config = pref_config_; |
- return config_state_; |
+ if (io_config_state_ != CONFIG_UNSET) { |
+ *config = io_pref_config_; |
+ *config_source = io_config_source_; |
+ } |
+ return io_config_state_; |
} |
+PrefProxyConfigTracker::ConfigState |
+ PrefProxyConfigTracker::UIGetProxyConfig(net::ProxyConfig* config, |
+ ConfigSource* config_source) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ if (ui_config_state_ != CONFIG_UNSET) { |
+ *config = ui_pref_config_; |
+ *config_source = ui_config_source_; |
+ } |
+ return ui_config_state_; |
+} |
+ |
void PrefProxyConfigTracker::DetachFromPrefService() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
// Stop notifications. |
@@ -59,12 +76,23 @@ |
if (type == chrome::NOTIFICATION_PREF_CHANGED && |
Source<PrefService>(source).ptr() == pref_service_) { |
net::ProxyConfig new_config; |
- ConfigState config_state = ReadPrefConfig(&new_config); |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableMethod(this, |
- &PrefProxyConfigTracker::InstallProxyConfig, |
- new_config, config_state)); |
+ ConfigSource config_source; |
+ ConfigState config_state = ReadPrefConfig(&new_config, &config_source); |
+ if (ui_config_state_ != config_state || |
+ (ui_config_state_ != CONFIG_UNSET && |
+ (ui_config_source_ != config_source || |
+ !ui_pref_config_.Equals(new_config)))) { |
+ ui_config_state_ = config_state; |
+ if (ui_config_state_ != CONFIG_UNSET) { |
+ ui_pref_config_ = new_config; |
+ ui_config_source_ = config_source; |
+ } |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ NewRunnableMethod(this, |
+ &PrefProxyConfigTracker::InstallProxyConfig, |
+ new_config, config_state, config_source)); |
+ } |
} else { |
NOTREACHED() << "Unexpected notification of type " << type; |
} |
@@ -72,23 +100,24 @@ |
void PrefProxyConfigTracker::InstallProxyConfig( |
const net::ProxyConfig& config, |
- PrefProxyConfigTracker::ConfigState config_state) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- if (config_state_ != config_state || |
- (config_state_ != CONFIG_UNSET && !pref_config_.Equals(config))) { |
- config_state_ = config_state; |
- if (config_state_ != CONFIG_UNSET) |
- pref_config_ = config; |
- FOR_EACH_OBSERVER(Observer, observers_, OnPrefProxyConfigChanged()); |
+ PrefProxyConfigTracker::ConfigState config_state, |
+ PrefProxyConfigTracker::ConfigSource config_source) { |
+ io_config_state_ = config_state; |
+ if (io_config_state_ != CONFIG_UNSET) { |
+ io_pref_config_ = config; |
+ io_config_source_ = config_source; |
} |
+ FOR_EACH_OBSERVER(Observer, observers_, OnPrefProxyConfigChanged()); |
} |
PrefProxyConfigTracker::ConfigState |
- PrefProxyConfigTracker::ReadPrefConfig(net::ProxyConfig* config) { |
+ PrefProxyConfigTracker::ReadPrefConfig(net::ProxyConfig* config, |
+ ConfigSource* config_source) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- // Clear the configuration. |
+ // Clear the configuration and source. |
*config = net::ProxyConfig(); |
+ *config_source = CONFIG_SOURCE_UNSET; |
const PrefService::Preference* pref = |
pref_service_->FindPreference(prefs::kProxy); |
@@ -99,8 +128,16 @@ |
ProxyConfigDictionary proxy_dict(dict); |
if (PrefConfigToNetConfig(proxy_dict, config)) { |
- return (!pref->IsUserModifiable() || pref->HasUserSetting()) ? |
- CONFIG_PRESENT : CONFIG_FALLBACK; |
+ if (!pref->IsUserModifiable() || pref->HasUserSetting()) { |
+ if (pref->IsManaged()) |
+ *config_source = CONFIG_SOURCE_POLICY; |
+ else if (pref->IsExtensionControlled()) |
+ *config_source = CONFIG_SOURCE_EXTENSION; |
+ return CONFIG_PRESENT; |
+ } else { |
+ *config_source = CONFIG_SOURCE_FALLBACK; |
+ return CONFIG_FALLBACK; |
+ } |
} |
return CONFIG_UNSET; |
@@ -167,6 +204,39 @@ |
return false; |
} |
+net::ProxyConfigService::ConfigAvailability |
+ ProxyConfigDecider::GetEffectiveProxyConfig( |
+ PrefProxyConfigTracker::ConfigState pref_state, |
+ const net::ProxyConfig& pref_config, |
+ PrefProxyConfigTracker::ConfigSource pref_source, |
+ net::ProxyConfigService::ConfigAvailability system_availability, |
+ const net::ProxyConfig& system_config, |
+ bool ignore_fallback_config, |
+ net::ProxyConfig* config, |
+ PrefProxyConfigTracker::ConfigSource* config_source) { |
+ *config_source = pref_source; |
+ |
+ if (pref_state == PrefProxyConfigTracker::CONFIG_PRESENT) { |
+ *config = pref_config; |
+ return net::ProxyConfigService::CONFIG_VALID; |
+ } |
+ |
+ // There's no system proxy config, fall back to prefs or default. |
+ if (system_availability == net::ProxyConfigService::CONFIG_UNSET) { |
+ if (pref_state == PrefProxyConfigTracker::CONFIG_FALLBACK && |
+ !ignore_fallback_config) { |
+ *config = pref_config; |
+ } else { |
+ *config = net::ProxyConfig::CreateDirect(); |
+ } |
+ return net::ProxyConfigService::CONFIG_VALID; |
+ } |
+ |
+ *config = system_config; |
+ *config_source = PrefProxyConfigTracker::CONFIG_SOURCE_SYSTEM; |
+ return system_availability; |
+} |
+ |
PrefProxyConfigService::PrefProxyConfigService( |
PrefProxyConfigTracker* tracker, |
net::ProxyConfigService* base_service) |
@@ -196,27 +266,22 @@ |
net::ProxyConfigService::ConfigAvailability |
PrefProxyConfigService::GetLatestProxyConfig(net::ProxyConfig* config) { |
RegisterObservers(); |
+ |
+ // Get prefs proxy config. |
net::ProxyConfig pref_config; |
- PrefProxyConfigTracker::ConfigState state = |
- pref_config_tracker_->GetProxyConfig(&pref_config); |
- if (state == PrefProxyConfigTracker::CONFIG_PRESENT) { |
- *config = pref_config; |
- return CONFIG_VALID; |
- } |
+ PrefProxyConfigTracker::ConfigSource pref_source; |
+ PrefProxyConfigTracker::ConfigState pref_state = |
+ pref_config_tracker_->IOGetProxyConfig(&pref_config, &pref_source); |
// Ask the base service. |
- ConfigAvailability available = base_service_->GetLatestProxyConfig(config); |
+ net::ProxyConfig system_config; |
+ ConfigAvailability system_availability = |
+ base_service_->GetLatestProxyConfig(&system_config); |
- // Base service doesn't have a configuration, fall back to prefs or default. |
- if (available == CONFIG_UNSET) { |
- if (state == PrefProxyConfigTracker::CONFIG_FALLBACK) |
- *config = pref_config; |
- else |
- *config = net::ProxyConfig::CreateDirect(); |
- return CONFIG_VALID; |
- } |
- |
- return available; |
+ PrefProxyConfigTracker::ConfigSource config_source; |
+ return GetEffectiveProxyConfig(pref_state, pref_config, pref_source, |
+ system_availability, system_config, false, |
+ config, &config_source); |
} |
void PrefProxyConfigService::OnLazyPoll() { |
@@ -232,7 +297,8 @@ |
// this case that proxy configuration takes precedence and the change event |
// from the delegate proxy service can be disregarded. |
net::ProxyConfig actual_config; |
- if (pref_config_tracker_->GetProxyConfig(&actual_config) != |
+ PrefProxyConfigTracker::ConfigSource config_source; |
+ if (pref_config_tracker_->IOGetProxyConfig(&actual_config, &config_source) != |
PrefProxyConfigTracker::CONFIG_PRESENT) { |
availability = GetLatestProxyConfig(&actual_config); |
FOR_EACH_OBSERVER(net::ProxyConfigService::Observer, observers_, |