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

Unified Diff: chrome/browser/chromeos/proxy_config_service_impl.cc

Issue 6549007: Make CrOS proxy configuration write prefs directly. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove default request context proxy config service patch. Created 9 years, 10 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/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

Powered by Google App Engine
This is Rietveld 408576698