summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_proxy_api.cc
diff options
context:
space:
mode:
authorbattre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-09 14:52:17 +0000
committerbattre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-09 14:52:17 +0000
commitc2f23d014bb8f371cd7b454c09c3e0bf291620e8 (patch)
treea84c232915f9654969a913ad9a5926479448c846 /chrome/browser/extensions/extension_proxy_api.cc
parent559a9bd2ab0d32b79e1c938159d952b1b329b7ee (diff)
downloadchromium_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.cc115
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;
}