Index: chrome/browser/chromeos/proxy_config_service_impl.cc |
diff --git a/chrome/browser/chromeos/proxy_config_service_impl.cc b/chrome/browser/chromeos/proxy_config_service_impl.cc |
index 5854bb19e70251dc28cd7d280bc6f3f70eeaee14..fdbfc204971c2db6904885fc32238f51cc0d6b6e 100644 |
--- a/chrome/browser/chromeos/proxy_config_service_impl.cc |
+++ b/chrome/browser/chromeos/proxy_config_service_impl.cc |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// 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. |
@@ -391,7 +391,7 @@ bool ProxyConfigServiceImpl::ProxyConfig::DecodeManualProxy( |
ProxyConfigServiceImpl::ProxyConfigServiceImpl() |
: can_post_task_(false), |
- has_config_(false), |
+ config_availability_(net::ProxyConfigService::CONFIG_PENDING), |
persist_to_device_(true), |
persist_to_device_pending_(false) { |
// Start async fetch of proxy config from settings persisted on device. |
@@ -409,13 +409,13 @@ ProxyConfigServiceImpl::ProxyConfigServiceImpl() |
} |
} |
if (use_default) |
- InitConfigToDefault(false); |
+ config_availability_ = net::ProxyConfigService::CONFIG_UNSET; |
can_post_task_ = true; |
} |
ProxyConfigServiceImpl::ProxyConfigServiceImpl(const ProxyConfig& init_config) |
: can_post_task_(true), |
- has_config_(true), |
+ config_availability_(net::ProxyConfigService::CONFIG_VALID), |
persist_to_device_(false), |
persist_to_device_pending_(false) { |
reference_config_ = init_config; |
@@ -514,15 +514,14 @@ void ProxyConfigServiceImpl::RemoveObserver( |
observers_.RemoveObserver(observer); |
} |
-bool ProxyConfigServiceImpl::IOGetProxyConfig(net::ProxyConfig* net_config) { |
+net::ProxyConfigService::ConfigAvailability |
+ ProxyConfigServiceImpl::IOGetProxyConfig(net::ProxyConfig* net_config) { |
// Should be called from IO thread. |
CheckCurrentlyOnIOThread(); |
- if (has_config_) { |
- // Simply return the last cached proxy configuration. |
+ if (config_availability_ == net::ProxyConfigService::CONFIG_VALID) |
cached_config_.ToNetProxyConfig(net_config); |
- return true; |
- } |
- return false; |
+ |
+ return config_availability_; |
} |
void ProxyConfigServiceImpl::OnSettingsOpCompleted( |
@@ -540,36 +539,26 @@ void ProxyConfigServiceImpl::OnSettingsOpCompleted( |
void ProxyConfigServiceImpl::OnSettingsOpCompleted( |
SignedSettings::ReturnCode code, |
std::string value) { |
+ retrieve_property_op_ = NULL; |
if (SignedSettings::SUCCESS == code) { |
VLOG(1) << "Retrieved proxy setting from device, value=[" << value << "]"; |
if (reference_config_.Deserialize(value)) { |
- OnUISetProxyConfig(false); |
+ IOSetProxyConfig(reference_config_, |
+ net::ProxyConfigService::CONFIG_VALID); |
+ return; |
} else { |
eroman
2011/03/26 00:50:30
nit: remove the "else" if you are going to return
|
LOG(WARNING) << "Error deserializing device's proxy setting"; |
- InitConfigToDefault(true); |
} |
} else { |
LOG(WARNING) << "Error retrieving proxy setting from device"; |
- InitConfigToDefault(true); |
} |
- retrieve_property_op_ = NULL; |
+ |
+ // Update the configuration state on the IO thread. |
+ IOSetProxyConfig(reference_config_, net::ProxyConfigService::CONFIG_UNSET); |
} |
//------------------ ProxyConfigServiceImpl: private methods ------------------- |
-void ProxyConfigServiceImpl::InitConfigToDefault(bool post_to_io_thread) { |
- VLOG(1) << "Using default proxy config: auto-detect"; |
- reference_config_.mode = ProxyConfig::MODE_AUTO_DETECT; |
- reference_config_.automatic_proxy.source = ProxyConfig::SOURCE_OWNER; |
- if (post_to_io_thread && can_post_task_) { |
- OnUISetProxyConfig(false); |
- } else { |
- // Update the IO-accessible copy in |cached_config_| as well. |
- cached_config_ = reference_config_; |
- has_config_ = true; |
- } |
-} |
- |
void ProxyConfigServiceImpl::PersistConfigToDevice() { |
DCHECK(!store_property_op_); |
persist_to_device_pending_ = false; |
@@ -585,15 +574,7 @@ void ProxyConfigServiceImpl::PersistConfigToDevice() { |
} |
void ProxyConfigServiceImpl::OnUISetProxyConfig(bool persist_to_device) { |
- // Posts a task to IO thread with the new config, so it can update |
- // |cached_config_|. |
- Task* task = NewRunnableMethod(this, |
- &ProxyConfigServiceImpl::IOSetProxyConfig, reference_config_); |
- if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, task)) { |
- VLOG(1) << "Couldn't post task to IO thread to set new proxy config"; |
- delete task; |
- } |
- |
+ IOSetProxyConfig(reference_config_, net::ProxyConfigService::CONFIG_VALID); |
if (persist_to_device && CrosLibrary::Get()->EnsureLoaded()) { |
if (store_property_op_) { |
persist_to_device_pending_ = true; |
@@ -604,25 +585,40 @@ void ProxyConfigServiceImpl::OnUISetProxyConfig(bool persist_to_device) { |
} |
} |
-void ProxyConfigServiceImpl::CheckCurrentlyOnIOThread() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
-} |
- |
-void ProxyConfigServiceImpl::CheckCurrentlyOnUIThread() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
-} |
+void ProxyConfigServiceImpl::IOSetProxyConfig( |
+ const ProxyConfig& new_config, |
+ net::ProxyConfigService::ConfigAvailability new_availability) { |
+ if (!BrowserThread::CurrentlyOn(BrowserThread::IO) && can_post_task_) { |
+ // Posts a task to IO thread with the new config, so it can update |
+ // |cached_config_|. |
+ Task* task = NewRunnableMethod(this, |
+ &ProxyConfigServiceImpl::IOSetProxyConfig, |
+ new_config, |
+ new_availability); |
+ if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, task)) { |
+ VLOG(1) << "Couldn't post task to IO thread to set new proxy config"; |
+ delete task; |
+ } |
+ return; |
+ } |
-void ProxyConfigServiceImpl::IOSetProxyConfig(const ProxyConfig& new_config) { |
- // This is called on the IO thread (posted from UI thread). |
- CheckCurrentlyOnIOThread(); |
+ // Now guaranteed to be on the correct thread. |
VLOG(1) << "Proxy configuration changed"; |
- has_config_ = true; |
cached_config_ = new_config; |
+ config_availability_ = new_availability; |
// Notify observers of new proxy config. |
net::ProxyConfig net_config; |
cached_config_.ToNetProxyConfig(&net_config); |
FOR_EACH_OBSERVER(net::ProxyConfigService::Observer, observers_, |
- OnProxyConfigChanged(net_config)); |
+ OnProxyConfigChanged(net_config, config_availability_)); |
+} |
+ |
+void ProxyConfigServiceImpl::CheckCurrentlyOnIOThread() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+} |
+ |
+void ProxyConfigServiceImpl::CheckCurrentlyOnUIThread() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
} |
} // namespace chromeos |