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

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

Issue 8102019: redesign and reimplement proxy config service and tracker, revise proxy ui on cros (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 2 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_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_,

Powered by Google App Engine
This is Rietveld 408576698