diff options
author | battre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-09 14:52:17 +0000 |
---|---|---|
committer | battre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-09 14:52:17 +0000 |
commit | c2f23d014bb8f371cd7b454c09c3e0bf291620e8 (patch) | |
tree | a84c232915f9654969a913ad9a5926479448c846 /chrome/browser/extensions/extension_proxy_api.cc | |
parent | 559a9bd2ab0d32b79e1c938159d952b1b329b7ee (diff) | |
download | chromium_src-c2f23d014bb8f371cd7b454c09c3e0bf291620e8.zip chromium_src-c2f23d014bb8f371cd7b454c09c3e0bf291620e8.tar.gz chromium_src-c2f23d014bb8f371cd7b454c09c3e0bf291620e8.tar.bz2 |
Make proxy settings one atomic dictionary in the PrefStores such that modifications are atomic.
BUG=67779,70904
TEST=none
Review URL: http://codereview.chromium.org/6240013
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@74284 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/extension_proxy_api.cc')
-rw-r--r-- | chrome/browser/extensions/extension_proxy_api.cc | 115 |
1 files changed, 66 insertions, 49 deletions
diff --git a/chrome/browser/extensions/extension_proxy_api.cc b/chrome/browser/extensions/extension_proxy_api.cc index 38095bf..a8852cc 100644 --- a/chrome/browser/extensions/extension_proxy_api.cc +++ b/chrome/browser/extensions/extension_proxy_api.cc @@ -7,7 +7,7 @@ #include "base/string_util.h" #include "base/stringprintf.h" #include "base/values.h" -#include "chrome/browser/prefs/proxy_prefs.h" +#include "chrome/browser/prefs/proxy_config_dictionary.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/common/pref_names.h" @@ -75,18 +75,72 @@ bool UseCustomProxySettingsFunction::RunImpl() { std::string proxy_mode; proxy_config->GetString("mode", &proxy_mode); + ProxyPrefs::ProxyMode mode_enum; + if (!ProxyPrefs::StringToProxyMode(proxy_mode, &mode_enum)) { + LOG(ERROR) << "Invalid mode for proxy settings: " << proxy_mode << ". " + << "Setting custom proxy settings failed."; + return false; + } DictionaryValue* pac_dict = NULL; proxy_config->GetDictionary("pacScript", &pac_dict); + std::string pac_url; + if (pac_dict && !pac_dict->GetString("url", &pac_url)) { + LOG(ERROR) << "'pacScript' requires a 'url' field. " + << "Setting custom proxy settings failed."; + return false; + } DictionaryValue* proxy_rules = NULL; proxy_config->GetDictionary("rules", &proxy_rules); + std::string proxy_rules_string; + if (proxy_rules && !GetProxyRules(proxy_rules, &proxy_rules_string)) { + LOG(ERROR) << "Invalid 'rules' specified. " + << "Setting custom proxy settings failed."; + return false; + } - // TODO(battre,gfeher): Make sure all the preferences get always - // overwritten. - return ApplyMode(proxy_mode, incognito) && - ApplyPacScript(pac_dict, incognito) && - ApplyProxyRules(proxy_rules, incognito); + // not supported, yet. + std::string bypass_list; + + DictionaryValue* result_proxy_config = NULL; + switch (mode_enum) { + case ProxyPrefs::MODE_DIRECT: + result_proxy_config = ProxyConfigDictionary::CreateDirect(); + break; + case ProxyPrefs::MODE_AUTO_DETECT: + result_proxy_config = ProxyConfigDictionary::CreateAutoDetect(); + break; + case ProxyPrefs::MODE_PAC_SCRIPT: { + if (!pac_dict) { + LOG(ERROR) << "Proxy mode 'pac_script' requires a 'pacScript' field. " + << "Setting custom proxy settings failed."; + return false; + } + result_proxy_config = ProxyConfigDictionary::CreatePacScript(pac_url); + break; + } + case ProxyPrefs::MODE_FIXED_SERVERS: { + if (!proxy_rules) { + LOG(ERROR) << "Proxy mode 'fixed_servers' requires a 'rules' field. " + << "Setting custom proxy settings failed."; + return false; + } + result_proxy_config = ProxyConfigDictionary::CreateFixedServers( + proxy_rules_string, bypass_list); + break; + } + case ProxyPrefs::MODE_SYSTEM: + result_proxy_config = ProxyConfigDictionary::CreateSystem(); + break; + case ProxyPrefs::kModeCount: + NOTREACHED(); + } + if (!result_proxy_config) + return false; + + ApplyPreference(prefs::kProxy, result_proxy_config, incognito); + return true; } bool UseCustomProxySettingsFunction::GetProxyServer( @@ -97,45 +151,11 @@ bool UseCustomProxySettingsFunction::GetProxyServer( return true; } -bool UseCustomProxySettingsFunction::ApplyMode(const std::string& mode, - bool incognito) { - // We take control of the mode preference even if none was specified, so that - // all proxy preferences are controlled by the same extension (if not by a - // higher-priority source). - bool result = true; - ProxyPrefs::ProxyMode mode_enum; - if (!ProxyPrefs::StringToProxyMode(mode, &mode_enum)) { - mode_enum = ProxyPrefs::MODE_SYSTEM; - LOG(WARNING) << "Invalid mode for proxy settings: " << mode; - result = false; - } - ApplyPreference( - prefs::kProxyMode, Value::CreateIntegerValue(mode_enum), incognito); - return result; -} - -bool UseCustomProxySettingsFunction::ApplyPacScript(DictionaryValue* pac_dict, - bool incognito) { - std::string pac_url; - if (pac_dict) - pac_dict->GetString("url", &pac_url); - - // We take control of the PAC preference even if none was specified, so that - // all proxy preferences are controlled by the same extension (if not by a - // higher-priority source). - ApplyPreference( - prefs::kProxyPacUrl, Value::CreateStringValue(pac_url), incognito); - return true; -} - -bool UseCustomProxySettingsFunction::ApplyProxyRules( +bool UseCustomProxySettingsFunction::GetProxyRules( DictionaryValue* proxy_rules, - bool incognito) { - if (!proxy_rules) { - ApplyPreference( - prefs::kProxyServer, Value::CreateStringValue(""), incognito); - return true; - } + std::string* out) { + if (!proxy_rules) + return false; // Local data into which the parameters will be parsed. has_proxy describes // whether a setting was found for the scheme; proxy_dict holds the @@ -189,8 +209,7 @@ bool UseCustomProxySettingsFunction::ApplyProxyRules( } } - ApplyPreference( - prefs::kProxyServer, Value::CreateStringValue(proxy_pref), incognito); + *out = proxy_pref; return true; } @@ -198,8 +217,6 @@ bool RemoveCustomProxySettingsFunction::RunImpl() { bool incognito = false; args_->GetBoolean(0, &incognito); - RemovePreference(prefs::kProxyMode, incognito); - RemovePreference(prefs::kProxyPacUrl, incognito); - RemovePreference(prefs::kProxyServer, incognito); + RemovePreference(prefs::kProxy, incognito); return true; } |