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 b5c0d6c5d4cf0ffdbd6c1566015d246335348943..fefcc77121e57c0e17ef9d9c8d513cb0cf031837 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. |
@@ -9,9 +9,13 @@ |
#include "base/logging.h" |
#include "base/string_util.h" |
#include "base/task.h" |
+#include "chrome/browser/browser_process.h" |
#include "chrome/browser/browser_thread.h" |
#include "chrome/browser/chromeos/cros/cros_library.h" |
+#include "chrome/browser/prefs/pref_service.h" |
+#include "chrome/browser/prefs/proxy_config_dictionary.h" |
#include "chrome/common/json_value_serializer.h" |
+#include "chrome/common/pref_names.h" |
namespace chromeos { |
@@ -181,40 +185,55 @@ bool ProxyConfigServiceImpl::ProxyConfig::ManualProxy::Decode( |
//----------- ProxyConfigServiceImpl::ProxyConfig: public methods -------------- |
-void ProxyConfigServiceImpl::ProxyConfig::ToNetProxyConfig( |
- net::ProxyConfig* net_config) { |
+// static |
+void ProxyConfigServiceImpl::ProxyConfig::FormatProxySpec( |
+ std::string* spec, |
+ const std::string& scheme, |
+ const net::ProxyServer& server) { |
+ DCHECK(spec); |
+ |
+ if (!server.is_valid()) |
+ return; |
+ |
+ if (!spec->empty()) |
+ *spec += ";"; |
+ if (!scheme.empty()) { |
+ *spec += scheme; |
+ *spec += "="; |
+ } |
+ *spec += server.ToURI(); |
+} |
+ |
+DictionaryValue* |
+ ProxyConfigServiceImpl::ProxyConfig::ToProxyConfigDictionary() const { |
+ std::string proxy_spec; |
+ |
switch (mode) { |
case MODE_DIRECT: |
- *net_config = net::ProxyConfig::CreateDirect(); |
- break; |
+ return ProxyConfigDictionary::CreateDirect(); |
case MODE_AUTO_DETECT: |
- *net_config = net::ProxyConfig::CreateAutoDetect(); |
- break; |
+ return ProxyConfigDictionary::CreateAutoDetect(); |
case MODE_PAC_SCRIPT: |
- *net_config = net::ProxyConfig::CreateFromCustomPacURL( |
- automatic_proxy.pac_url); |
- break; |
+ return ProxyConfigDictionary::CreatePacScript( |
+ automatic_proxy.pac_url.spec()); |
case MODE_SINGLE_PROXY: |
- *net_config = net::ProxyConfig(); |
- net_config->proxy_rules().type = |
- net::ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY; |
- net_config->proxy_rules().single_proxy = single_proxy.server; |
- net_config->proxy_rules().bypass_rules = bypass_rules; |
- break; |
+ FormatProxySpec(&proxy_spec, "", single_proxy.server); |
+ return ProxyConfigDictionary::CreateFixedServers(proxy_spec, |
+ bypass_rules.ToString()); |
case MODE_PROXY_PER_SCHEME: |
- *net_config = net::ProxyConfig(); |
- net_config->proxy_rules().type = |
- net::ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME; |
- net_config->proxy_rules().proxy_for_http = http_proxy.server; |
- net_config->proxy_rules().proxy_for_https = https_proxy.server; |
- net_config->proxy_rules().proxy_for_ftp = ftp_proxy.server; |
- net_config->proxy_rules().fallback_proxy = socks_proxy.server; |
- net_config->proxy_rules().bypass_rules = bypass_rules; |
- break; |
+ proxy_spec.reserve(256); |
+ FormatProxySpec(&proxy_spec, "http", http_proxy.server); |
+ FormatProxySpec(&proxy_spec, "https", https_proxy.server); |
+ FormatProxySpec(&proxy_spec, "ftp", ftp_proxy.server); |
+ FormatProxySpec(&proxy_spec, "socks", socks_proxy.server); |
+ return ProxyConfigDictionary::CreateFixedServers(proxy_spec, |
+ bypass_rules.ToString()); |
default: |
NOTREACHED() << "Unrecognized proxy config mode"; |
break; |
} |
+ |
+ return NULL; |
} |
bool ProxyConfigServiceImpl::ProxyConfig::CanBeWrittenByUser( |
@@ -389,11 +408,14 @@ bool ProxyConfigServiceImpl::ProxyConfig::DecodeManualProxy( |
//------------------- ProxyConfigServiceImpl: public methods ------------------- |
-ProxyConfigServiceImpl::ProxyConfigServiceImpl() |
+ProxyConfigServiceImpl::ProxyConfigServiceImpl(PrefService* local_state) |
: can_post_task_(false), |
has_config_(false), |
persist_to_device_(true), |
- persist_to_device_pending_(false) { |
+ persist_to_device_pending_(false), |
+ local_state_(local_state) { |
+ DCHECK(local_state_); |
+ |
// Start async fetch of proxy config from settings persisted on device. |
// TODO(kuan): retrieve config from policy and owner and merge them |
bool use_default = true; |
@@ -409,49 +431,43 @@ ProxyConfigServiceImpl::ProxyConfigServiceImpl() |
} |
} |
if (use_default) |
- InitConfigToDefault(false); |
+ InitConfigToDefault(); |
can_post_task_ = true; |
} |
-ProxyConfigServiceImpl::ProxyConfigServiceImpl(const ProxyConfig& init_config) |
+ProxyConfigServiceImpl::ProxyConfigServiceImpl(PrefService* local_state, |
+ const ProxyConfig& init_config) |
: can_post_task_(true), |
has_config_(true), |
persist_to_device_(false), |
- persist_to_device_pending_(false) { |
+ persist_to_device_pending_(false), |
+ local_state_(local_state) { |
+ DCHECK(local_state_); |
reference_config_ = init_config; |
- // Update the IO-accessible copy in |cached_config_| as well. |
- cached_config_ = reference_config_; |
+ OnUISetProxyConfig(false); |
} |
ProxyConfigServiceImpl::~ProxyConfigServiceImpl() { |
} |
void ProxyConfigServiceImpl::UIGetProxyConfig(ProxyConfig* config) { |
- // Should be called from UI thread. |
- CheckCurrentlyOnUIThread(); |
// Simply returns the copy on the UI thread. |
*config = reference_config_; |
} |
bool ProxyConfigServiceImpl::UISetProxyConfigToDirect() { |
- // Should be called from UI thread. |
- CheckCurrentlyOnUIThread(); |
reference_config_.mode = ProxyConfig::MODE_DIRECT; |
OnUISetProxyConfig(persist_to_device_); |
return true; |
} |
bool ProxyConfigServiceImpl::UISetProxyConfigToAutoDetect() { |
- // Should be called from UI thread. |
- CheckCurrentlyOnUIThread(); |
reference_config_.mode = ProxyConfig::MODE_AUTO_DETECT; |
OnUISetProxyConfig(persist_to_device_); |
return true; |
} |
bool ProxyConfigServiceImpl::UISetProxyConfigToPACScript(const GURL& pac_url) { |
- // Should be called from UI thread. |
- CheckCurrentlyOnUIThread(); |
reference_config_.mode = ProxyConfig::MODE_PAC_SCRIPT; |
reference_config_.automatic_proxy.pac_url = pac_url; |
OnUISetProxyConfig(persist_to_device_); |
@@ -460,8 +476,6 @@ bool ProxyConfigServiceImpl::UISetProxyConfigToPACScript(const GURL& pac_url) { |
bool ProxyConfigServiceImpl::UISetProxyConfigToSingleProxy( |
const net::ProxyServer& server) { |
- // Should be called from UI thread. |
- CheckCurrentlyOnUIThread(); |
reference_config_.mode = ProxyConfig::MODE_SINGLE_PROXY; |
reference_config_.single_proxy.server = server; |
OnUISetProxyConfig(persist_to_device_); |
@@ -470,8 +484,6 @@ bool ProxyConfigServiceImpl::UISetProxyConfigToSingleProxy( |
bool ProxyConfigServiceImpl::UISetProxyConfigToProxyPerScheme( |
const std::string& scheme, const net::ProxyServer& server) { |
- // Should be called from UI thread. |
- CheckCurrentlyOnUIThread(); |
ProxyConfig::ManualProxy* proxy = reference_config_.MapSchemeToProxy(scheme); |
if (!proxy) { |
NOTREACHED() << "Cannot set proxy: invalid scheme [" << scheme << "]"; |
@@ -485,8 +497,6 @@ bool ProxyConfigServiceImpl::UISetProxyConfigToProxyPerScheme( |
bool ProxyConfigServiceImpl::UISetProxyConfigBypassRules( |
const net::ProxyBypassRules& bypass_rules) { |
- // Should be called from UI thread. |
- CheckCurrentlyOnUIThread(); |
DCHECK(reference_config_.mode == ProxyConfig::MODE_SINGLE_PROXY || |
reference_config_.mode == ProxyConfig::MODE_PROXY_PER_SCHEME); |
if (reference_config_.mode != ProxyConfig::MODE_SINGLE_PROXY && |
@@ -500,31 +510,6 @@ bool ProxyConfigServiceImpl::UISetProxyConfigBypassRules( |
return true; |
} |
-void ProxyConfigServiceImpl::AddObserver( |
- net::ProxyConfigService::Observer* observer) { |
- // Should be called from IO thread. |
- CheckCurrentlyOnIOThread(); |
- observers_.AddObserver(observer); |
-} |
- |
-void ProxyConfigServiceImpl::RemoveObserver( |
- net::ProxyConfigService::Observer* observer) { |
- // Should be called from IO thread. |
- CheckCurrentlyOnIOThread(); |
- observers_.RemoveObserver(observer); |
-} |
- |
-bool ProxyConfigServiceImpl::IOGetProxyConfig(net::ProxyConfig* net_config) { |
- // Should be called from IO thread. |
- CheckCurrentlyOnIOThread(); |
- if (has_config_) { |
- // Simply return the last cached proxy configuration. |
- cached_config_.ToNetProxyConfig(net_config); |
- return true; |
- } |
- return false; |
-} |
- |
void ProxyConfigServiceImpl::OnSettingsOpCompleted( |
SignedSettings::ReturnCode code, |
bool value) { |
@@ -546,28 +531,22 @@ void ProxyConfigServiceImpl::OnSettingsOpCompleted( |
OnUISetProxyConfig(false); |
} else { |
LOG(WARNING) << "Error deserializing device's proxy setting"; |
- InitConfigToDefault(true); |
+ InitConfigToDefault(); |
} |
} else { |
LOG(WARNING) << "Error retrieving proxy setting from device"; |
- InitConfigToDefault(true); |
+ InitConfigToDefault(); |
} |
retrieve_property_op_ = NULL; |
} |
//------------------ ProxyConfigServiceImpl: private methods ------------------- |
-void ProxyConfigServiceImpl::InitConfigToDefault(bool post_to_io_thread) { |
+void ProxyConfigServiceImpl::InitConfigToDefault() { |
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; |
- } |
+ OnUISetProxyConfig(false); |
} |
void ProxyConfigServiceImpl::PersistConfigToDevice() { |
@@ -585,14 +564,12 @@ 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; |
- } |
+ scoped_ptr<DictionaryValue> proxy_dict( |
+ reference_config_.ToProxyConfigDictionary()); |
+ if (proxy_dict.get()) |
+ local_state_->Set(prefs::kProxy, *proxy_dict); |
+ else |
+ local_state_->ClearPref(prefs::kProxy); |
if (persist_to_device && CrosLibrary::Get()->EnsureLoaded()) { |
if (store_property_op_) { |
@@ -604,25 +581,4 @@ 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) { |
- // This is called on the IO thread (posted from UI thread). |
- CheckCurrentlyOnIOThread(); |
- VLOG(1) << "Proxy configuration changed"; |
- has_config_ = true; |
- cached_config_ = new_config; |
- // 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)); |
-} |
- |
} // namespace chromeos |