| 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_,
|
|
|