| Index: chrome/browser/net/pref_proxy_config_service.cc
|
| diff --git a/chrome/browser/net/pref_proxy_config_service.cc b/chrome/browser/net/pref_proxy_config_service.cc
|
| index 10ae74bcf051865345eed98f63b2d97285a5b09e..9643f4e76020bcc01a40f744e9e331379251c9e7 100644
|
| --- a/chrome/browser/net/pref_proxy_config_service.cc
|
| +++ b/chrome/browser/net/pref_proxy_config_service.cc
|
| @@ -8,38 +8,12 @@
|
| #include "chrome/browser/browser_thread.h"
|
| #include "chrome/browser/prefs/pref_service.h"
|
| #include "chrome/browser/prefs/pref_set_observer.h"
|
| +#include "chrome/browser/prefs/proxy_prefs.h"
|
| #include "chrome/common/notification_details.h"
|
| #include "chrome/common/notification_source.h"
|
| #include "chrome/common/notification_type.h"
|
| #include "chrome/common/pref_names.h"
|
|
|
| -namespace {
|
| -
|
| -const bool kProxyPrefDefaultBoolean = false;
|
| -const char kProxyPrefDefaultString[] = "";
|
| -
|
| -// Determines if a value of a proxy pref is set to its default. Default values
|
| -// have a special role in the proxy pref system, because if all of the proxy
|
| -// prefs are set to their defaults, then the system proxy settings are applied.
|
| -// TODO(gfeher): Proxy preferences should be refactored to avoid the need
|
| -// for such solutions. See crbug.com/65732
|
| -bool IsDefaultValue(const Value* value) {
|
| - bool b = false;
|
| - std::string s;
|
| - if (value->IsType(Value::TYPE_BOOLEAN) &&
|
| - value->GetAsBoolean(&b)) {
|
| - return b == kProxyPrefDefaultBoolean;
|
| - } else if (value->IsType(Value::TYPE_STRING) &&
|
| - value->GetAsString(&s)) {
|
| - return s == kProxyPrefDefaultString;
|
| - } else {
|
| - NOTREACHED() << "Invalid type for a proxy preference.";
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| PrefProxyConfigTracker::PrefProxyConfigTracker(PrefService* pref_service)
|
| : pref_service_(pref_service) {
|
| valid_ = ReadPrefConfig(&pref_config_);
|
| @@ -112,65 +86,47 @@ bool PrefProxyConfigTracker::ReadPrefConfig(net::ProxyConfig* config) {
|
| // Clear the configuration.
|
| *config = net::ProxyConfig();
|
|
|
| - // Scan for all "enable" type proxy switches.
|
| - static const char* proxy_prefs[] = {
|
| - prefs::kProxyPacUrl,
|
| - prefs::kProxyServer,
|
| - prefs::kProxyBypassList,
|
| - prefs::kProxyAutoDetect
|
| - };
|
| -
|
| - // Check whether the preference system holds a valid proxy configuration. Note
|
| - // that preferences coming from a lower-priority source than the user settings
|
| - // are ignored. That's because chrome treats the system settings as the
|
| - // default values, which should apply if there's no explicit value forced by
|
| - // policy or the user.
|
| - // Preferences that are set to their default values are also ignored,
|
| - // regardless of their controlling source. This is because 'use system proxy
|
| - // settings' is currently encoded by all the preferences being set to their
|
| - // defaults. This will change when crbug.com/65732 is addressed.
|
| - bool found_enable_proxy_pref = false;
|
| - for (size_t i = 0; i < arraysize(proxy_prefs); i++) {
|
| - const PrefService::Preference* pref =
|
| - pref_service_->FindPreference(proxy_prefs[i]);
|
| - DCHECK(pref);
|
| - if (pref && (!pref->IsUserModifiable() || pref->HasUserSetting()) &&
|
| - !IsDefaultValue(pref->GetValue())) {
|
| - found_enable_proxy_pref = true;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if (!found_enable_proxy_pref &&
|
| - !pref_service_->GetBoolean(prefs::kNoProxyServer)) {
|
| + ProxyPrefs::ProxyServerMode mode;
|
| + if (!ProxyPrefs::IntToMode(
|
| + pref_service_->GetInteger(prefs::kProxyServerMode),
|
| + &mode)) {
|
| + // Fall back to system settings if the mode preference is invalid.
|
| return false;
|
| }
|
|
|
| - if (pref_service_->GetBoolean(prefs::kNoProxyServer)) {
|
| - // Ignore all the other proxy config preferences if the use of a proxy
|
| - // has been explicitly disabled.
|
| - return true;
|
| - }
|
| -
|
| - if (pref_service_->HasPrefPath(prefs::kProxyServer)) {
|
| - std::string proxy_server = pref_service_->GetString(prefs::kProxyServer);
|
| - config->proxy_rules().ParseFromString(proxy_server);
|
| - }
|
| -
|
| - if (pref_service_->HasPrefPath(prefs::kProxyPacUrl)) {
|
| - std::string proxy_pac = pref_service_->GetString(prefs::kProxyPacUrl);
|
| - config->set_pac_url(GURL(proxy_pac));
|
| + switch (mode) {
|
| + case ProxyPrefs::SYSTEM:
|
| + // Use system settings.
|
| + return false;
|
| + case ProxyPrefs::DISABLED:
|
| + // Ignore all the other proxy config preferences if the use of a proxy
|
| + // has been explicitly disabled.
|
| + return true;
|
| + case ProxyPrefs::MANUAL: // fall through
|
| + case ProxyPrefs::AUTO_DETECT:
|
| + if (pref_service_->HasPrefPath(prefs::kProxyServer)) {
|
| + std::string proxy_server =
|
| + pref_service_->GetString(prefs::kProxyServer);
|
| + config->proxy_rules().ParseFromString(proxy_server);
|
| + }
|
| +
|
| + if (pref_service_->HasPrefPath(prefs::kProxyPacUrl)) {
|
| + std::string proxy_pac = pref_service_->GetString(prefs::kProxyPacUrl);
|
| + config->set_pac_url(GURL(proxy_pac));
|
| + }
|
| +
|
| + config->set_auto_detect(mode == ProxyPrefs::AUTO_DETECT);
|
| +
|
| + if (pref_service_->HasPrefPath(prefs::kProxyBypassList)) {
|
| + std::string proxy_bypass =
|
| + pref_service_->GetString(prefs::kProxyBypassList);
|
| + config->proxy_rules().bypass_rules.ParseFromString(proxy_bypass);
|
| + }
|
| + return true;
|
| + default:
|
| + NOTREACHED() << "Unknown proxy mode.";
|
| + return false;
|
| }
|
| -
|
| - config->set_auto_detect(pref_service_->GetBoolean(prefs::kProxyAutoDetect));
|
| -
|
| - if (pref_service_->HasPrefPath(prefs::kProxyBypassList)) {
|
| - std::string proxy_bypass =
|
| - pref_service_->GetString(prefs::kProxyBypassList);
|
| - config->proxy_rules().bypass_rules.ParseFromString(proxy_bypass);
|
| - }
|
| -
|
| - return true;
|
| }
|
|
|
| PrefProxyConfigService::PrefProxyConfigService(
|
| @@ -258,14 +214,9 @@ void PrefProxyConfigService::RegisterObservers() {
|
| // static
|
| void PrefProxyConfigService::RegisterUserPrefs(
|
| PrefService* pref_service) {
|
| - pref_service->RegisterBooleanPref(prefs::kNoProxyServer,
|
| - kProxyPrefDefaultBoolean);
|
| - pref_service->RegisterBooleanPref(prefs::kProxyAutoDetect,
|
| - kProxyPrefDefaultBoolean);
|
| - pref_service->RegisterStringPref(prefs::kProxyServer,
|
| - kProxyPrefDefaultString);
|
| - pref_service->RegisterStringPref(prefs::kProxyPacUrl,
|
| - kProxyPrefDefaultString);
|
| - pref_service->RegisterStringPref(prefs::kProxyBypassList,
|
| - kProxyPrefDefaultString);
|
| + pref_service->RegisterIntegerPref(prefs::kProxyServerMode,
|
| + ProxyPrefs::SYSTEM);
|
| + pref_service->RegisterStringPref(prefs::kProxyServer, "");
|
| + pref_service->RegisterStringPref(prefs::kProxyPacUrl, "");
|
| + pref_service->RegisterStringPref(prefs::kProxyBypassList, "");
|
| }
|
|
|