Chromium Code Reviews| Index: chrome/browser/chromeos/proxy_config_service_impl.cc |
| =================================================================== |
| --- chrome/browser/chromeos/proxy_config_service_impl.cc (revision 103881) |
| +++ chrome/browser/chromeos/proxy_config_service_impl.cc (working copy) |
| @@ -11,9 +11,13 @@ |
| #include "base/task.h" |
| #include "chrome/browser/chromeos/cros/cros_library.h" |
| #include "chrome/browser/chromeos/cros_settings_names.h" |
| +#include "chrome/browser/net/pref_proxy_config_service.h" |
| #include "chrome/browser/policy/proto/chrome_device_policy.pb.h" |
| +#include "chrome/browser/prefs/pref_service.h" |
| #include "chrome/browser/prefs/proxy_config_dictionary.h" |
| #include "chrome/browser/prefs/proxy_prefs.h" |
| +#include "chrome/browser/profiles/profile.h" |
| +#include "chrome/common/pref_names.h" |
| #include "content/browser/browser_thread.h" |
| #include "content/common/json_value_serializer.h" |
| #include "grit/generated_resources.h" |
| @@ -29,10 +33,20 @@ |
| switch (source) { |
| case ProxyConfigServiceImpl::ProxyConfig::SOURCE_NONE: |
| return "SOURCE_NONE"; |
| + case ProxyConfigServiceImpl::ProxyConfig::SOURCE_NONE_DISABLED: |
| + return "SOURCE_NONE_DISABLED"; |
| case ProxyConfigServiceImpl::ProxyConfig::SOURCE_POLICY: |
| return "SOURCE_POLICY"; |
| - case ProxyConfigServiceImpl::ProxyConfig::SOURCE_OWNER: |
| - return "SOURCE_OWNER"; |
| + case ProxyConfigServiceImpl::ProxyConfig::SOURCE_EXTENSION: |
| + return "SOURCE_EXTENSION"; |
| + case ProxyConfigServiceImpl::ProxyConfig::SOURCE_RECOMMENDED: |
| + return "SOURCE_RECOMMENDED"; |
| + case ProxyConfigServiceImpl::ProxyConfig::SOURCE_RECOMMENDED_DISABLED: |
| + return "SOURCE_RECOMMENDED_DISABLED"; |
| + case ProxyConfigServiceImpl::ProxyConfig::SOURCE_NETWORK: |
| + return "SOURCE_NETWORK"; |
| + case ProxyConfigServiceImpl::ProxyConfig::SOURCE_NETWORK_DISABLED: |
| + return "SOURCE_NETWORK_DISABLED"; |
| } |
| NOTREACHED() << "Unrecognized source type"; |
| return ""; |
| @@ -40,9 +54,7 @@ |
| std::ostream& operator<<(std::ostream& out, |
| const ProxyConfigServiceImpl::ProxyConfig::ManualProxy& proxy) { |
|
Mattias Nissler (ping if slow)
2011/10/05 10:18:36
indentation: parameters should line up (break afte
kuan
2011/10/07 00:30:41
i can't line them up, 'cos they won't fit, i belie
|
| - out << " " << SourceToString(proxy.source) << "\n" |
| - << " server: " << (proxy.server.is_valid() ? proxy.server.ToURI() : "") |
| - << "\n"; |
| + out << (proxy.server.is_valid() ? proxy.server.ToURI() : "") << "\n"; |
| return out; |
| } |
| @@ -51,25 +63,28 @@ |
| switch (config.mode) { |
| case ProxyConfigServiceImpl::ProxyConfig::MODE_DIRECT: |
| out << "Direct connection:\n " |
| - << SourceToString(config.automatic_proxy.source) << "\n"; |
| + << SourceToString(config.source) << "\n"; |
| break; |
| case ProxyConfigServiceImpl::ProxyConfig::MODE_AUTO_DETECT: |
| out << "Auto detection:\n " |
| - << SourceToString(config.automatic_proxy.source) << "\n"; |
| + << SourceToString(config.source) << "\n"; |
| break; |
| case ProxyConfigServiceImpl::ProxyConfig::MODE_PAC_SCRIPT: |
| out << "Custom PAC script:\n " |
| - << SourceToString(config.automatic_proxy.source) |
| + << SourceToString(config.source) |
| << "\n PAC: " << config.automatic_proxy.pac_url << "\n"; |
| break; |
| case ProxyConfigServiceImpl::ProxyConfig::MODE_SINGLE_PROXY: |
| - out << "Single proxy:\n" << config.single_proxy; |
| + out << "Single proxy:\n" |
| + << SourceToString(config.source) << "\n " << config.single_proxy; |
| break; |
| case ProxyConfigServiceImpl::ProxyConfig::MODE_PROXY_PER_SCHEME: |
| - out << "HTTP proxy: " << config.http_proxy; |
| - out << "HTTPS proxy: " << config.https_proxy; |
| - out << "FTP proxy: " << config.ftp_proxy; |
| - out << "SOCKS proxy: " << config.socks_proxy; |
| + out << "Manual proxies:\n" |
| + << SourceToString(config.source) << "\n" |
| + << " HTTP: " << config.http_proxy |
| + << " HTTPS: " << config.https_proxy |
| + << " FTP: " << config.ftp_proxy |
| + << " SOCKS: " << config.socks_proxy; |
| break; |
| default: |
| NOTREACHED() << "Unrecognized proxy config mode"; |
| @@ -102,18 +117,10 @@ |
| } // namespace |
| -//---------- ProxyConfigServiceImpl::ProxyConfig::Setting methods -------------- |
| - |
| -bool ProxyConfigServiceImpl::ProxyConfig::Setting::CanBeWrittenByUser( |
| - bool user_is_owner) { |
| - // Setting can only be written by user if user is owner and setting is not |
| - // from policy. |
| - return user_is_owner && source != ProxyConfig::SOURCE_POLICY; |
| -} |
| - |
| //----------- ProxyConfigServiceImpl::ProxyConfig: public methods -------------- |
| -ProxyConfigServiceImpl::ProxyConfig::ProxyConfig() : mode(MODE_DIRECT) {} |
| +ProxyConfigServiceImpl::ProxyConfig::ProxyConfig() |
| + : mode(MODE_DIRECT), source(SOURCE_NONE) {} |
| ProxyConfigServiceImpl::ProxyConfig::~ProxyConfig() {} |
| @@ -153,31 +160,53 @@ |
| } |
| } |
| -bool ProxyConfigServiceImpl::ProxyConfig::CanBeWrittenByUser( |
| - bool user_is_owner, const std::string& scheme) { |
| - // Setting can only be written by user if user is owner and setting is not |
| - // from policy. |
| - Setting* setting = NULL; |
| - switch (mode) { |
| - case MODE_DIRECT: |
| - case MODE_AUTO_DETECT: |
| - case MODE_PAC_SCRIPT: |
| - setting = &automatic_proxy; |
| - break; |
| - case MODE_SINGLE_PROXY: |
| - setting = &single_proxy; |
| - break; |
| - case MODE_PROXY_PER_SCHEME: |
| - setting = MapSchemeToProxy(scheme); |
| - break; |
| +bool ProxyConfigServiceImpl::ProxyConfig::FromNetProxyConfig( |
| + const net::ProxyConfig& net_config) { |
| + const net::ProxyConfig::ProxyRules& rules = net_config.proxy_rules(); |
| + switch (rules.type) { |
| + case net::ProxyConfig::ProxyRules::TYPE_NO_RULES: |
| + if (!net_config.HasAutomaticSettings()) { |
| + mode = ProxyConfig::MODE_DIRECT; |
| + } else if (net_config.auto_detect()) { |
| + mode = ProxyConfig::MODE_AUTO_DETECT; |
| + } else if (net_config.has_pac_url()) { |
| + mode = ProxyConfig::MODE_PAC_SCRIPT; |
| + automatic_proxy.pac_url = net_config.pac_url(); |
| + } else { |
| + return false; |
| + } |
| + return true; |
| + case net::ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY: |
| + if (!rules.single_proxy.is_valid()) |
| + return false; |
| + mode = MODE_SINGLE_PROXY; |
| + single_proxy.server = rules.single_proxy; |
| + bypass_rules = rules.bypass_rules; |
| + return true; |
| + case net::ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME: |
| + // Make sure we have valid server for at least one of the protocols. |
| + if (!rules.proxy_for_http.is_valid() && |
| + !rules.proxy_for_https.is_valid() && |
| + !rules.proxy_for_ftp.is_valid() && |
| + !rules.fallback_proxy.is_valid()) { |
| + return false; |
| + } |
| + mode = MODE_PROXY_PER_SCHEME; |
| + if (rules.proxy_for_http.is_valid()) |
| + http_proxy.server = rules.proxy_for_http; |
| + if (rules.proxy_for_https.is_valid()) |
| + https_proxy.server = rules.proxy_for_https; |
| + if (rules.proxy_for_ftp.is_valid()) |
| + ftp_proxy.server = rules.proxy_for_ftp; |
| + if (rules.fallback_proxy.is_valid()) |
| + socks_proxy.server = rules.fallback_proxy; |
| + bypass_rules = rules.bypass_rules; |
| + return true; |
| default: |
| + NOTREACHED() << "Unrecognized proxy config mode"; |
| break; |
| } |
| - if (!setting) { |
| - NOTREACHED() << "Unrecognized proxy config mode"; |
| - return false; |
| - } |
| - return setting->CanBeWrittenByUser(user_is_owner); |
| + return false; |
| } |
| ProxyConfigServiceImpl::ProxyConfig::ManualProxy* |
| @@ -273,6 +302,8 @@ |
| bool ProxyConfigServiceImpl::ProxyConfig::Equals( |
| const ProxyConfig& other) const { |
| + // Intentionally ignore source which is only used for ui purposes and has no |
| + // impact on proxy backend. |
| if (mode != other.mode) |
| return false; |
| switch (mode) { |
| @@ -487,65 +518,57 @@ |
| *config = current_ui_config_; |
| } |
| -bool ProxyConfigServiceImpl::UISetCurrentNetwork( |
| - const std::string& current_network) { |
| +void ProxyConfigServiceImpl::UISetCurrentNetworkWithProfile( |
| + const std::string& current_network, Profile* profile) { |
|
Mattias Nissler (ping if slow)
2011/10/05 10:18:36
nit: second parameter on next line.
kuan
2011/10/07 00:30:41
Done.
|
| // Should be called from UI thread. |
| CheckCurrentlyOnUIThread(); |
| - if (current_ui_network_ == current_network) |
| - return false; |
| Network* network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath( |
| current_network); |
| if (!network) { |
| + ResetUICache(); |
| LOG(ERROR) << "can't find requested network " << current_network; |
| - return false; |
| + return; |
| } |
| current_ui_network_ = current_network; |
| - current_ui_config_ = ProxyConfig(); |
| + DetermineUIConfig(profile, network); |
| SetCurrentNetworkName(network); |
| - if (!network->proxy_config().empty()) |
| - current_ui_config_.DeserializeForNetwork(network->proxy_config()); |
| VLOG(1) << "current ui network: " |
| << (current_ui_network_name_.empty() ? |
| current_ui_network_ : current_ui_network_name_) |
| - << ", proxy mode: " << current_ui_config_.mode; |
| - return true; |
| + << ", proxy mode: " << current_ui_config_.mode |
| + << ", " << SourceToString(current_ui_config_.source) |
| + << ", modifiable:" << current_ui_config_.IsUserModifiable(); |
| } |
| -bool ProxyConfigServiceImpl::UIMakeActiveNetworkCurrent() { |
| +void ProxyConfigServiceImpl::UIMakeActiveNetworkCurrentWithProfile( |
| + Profile* profile) { |
| // Should be called from UI thread. |
| CheckCurrentlyOnUIThread(); |
| - if (current_ui_network_ == active_network_) |
| - return false; |
| Network* network = NULL; |
| if (!testing_) { |
| network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath( |
| active_network_); |
| if (!network) { |
| + ResetUICache(); |
| LOG(ERROR) << "can't find requested network " << active_network_; |
| - return false; |
| + return; |
| } |
| } |
| current_ui_network_ = active_network_; |
| - current_ui_config_ = active_config_; |
| + DetermineUIConfig(profile, network); |
| SetCurrentNetworkName(network); |
| VLOG(1) << "current ui network: " |
| << (current_ui_network_name_.empty() ? |
| current_ui_network_ : current_ui_network_name_) |
| - << ", proxy mode: " << current_ui_config_.mode; |
| - return true; |
| + << ", proxy mode: " << current_ui_config_.mode |
| + << ", " << SourceToString(current_ui_config_.source) |
| + << ", modifiable:" << current_ui_config_.IsUserModifiable(); |
| } |
| void ProxyConfigServiceImpl::UISetUseSharedProxies(bool use_shared) { |
| // Should be called from UI thread. |
| CheckCurrentlyOnUIThread(); |
| - // Reset all UI-related variables so that the next opening of proxy |
| - // configuration dialog of any network will trigger javascript reloading of |
| - // (possibly) new proxy settings. |
| - current_ui_network_.clear(); |
| - current_ui_network_name_.clear(); |
| - current_ui_config_ = ProxyConfig(); |
| - |
| if (use_shared_proxies_ == use_shared) { |
| VLOG(1) << "same use_shared_proxies = " << use_shared_proxies_; |
| return; |
| @@ -712,6 +735,7 @@ |
| if (current_ui_config_.SerializeForNetwork(&value)) { |
| VLOG(1) << "set proxy (mode=" << current_ui_config_.mode |
| << ") for " << current_ui_network_; |
| + current_ui_config_.source = ProxyConfig::SOURCE_NETWORK; |
| SetProxyConfigForNetwork(current_ui_network_, value, false); |
| } |
| } |
| @@ -821,7 +845,7 @@ |
| net::ProxyConfigService::ConfigAvailability available = |
| net::ProxyConfigService::CONFIG_UNSET; |
| // If network is shared but user doesn't use shared proxies, use direct mode. |
| - if (network->profile_type() == PROFILE_SHARED && !use_shared_proxies_) { |
| + if (IgnoreProxy(network)) { |
| VLOG(1) << "shared network and !use_shared_proxies, using direct"; |
| available = net::ProxyConfigService::CONFIG_VALID; |
| } else if (!network->proxy_config().empty() && |
| @@ -833,6 +857,43 @@ |
| IOSetProxyConfig(active_config_, available); |
| } |
| +void ProxyConfigServiceImpl::DetermineUIConfig(Profile* profile, |
| + const Network* network) { |
|
Mattias Nissler (ping if slow)
2011/10/05 10:18:36
second parameter fits on previous line.
kuan
2011/10/07 00:30:41
it doesn't fit, i align it with 1st param.
On 201
|
| + if (!network) { |
| + if (testing_) |
| + current_ui_config_ = active_config_; |
| + return; |
| + } |
| + net::ProxyConfig pref_config; |
| + PrefProxyConfigTracker::ConfigState state = |
| + PrefProxyConfigTracker::CONFIG_UNSET; |
| + if (profile) |
| + state = profile->GetProxyConfigTracker()->UIGetProxyConfig(&pref_config); |
| + if (state == PrefProxyConfigTracker::CONFIG_PRESENT) { // Mandatory proxy. |
| + current_ui_config_.FromNetProxyConfig(pref_config); |
| + const PrefService::Preference* pref = profile->GetPrefs()->FindPreference( |
| + prefs::kProxy); |
| + current_ui_config_.source = pref && pref->IsManaged() ? |
| + ProxyConfig::SOURCE_POLICY : |
| + (pref && pref->IsExtensionControlled() ? |
| + ProxyConfig::SOURCE_EXTENSION : ProxyConfig::SOURCE_NONE_DISABLED); |
|
stevenjb
2011/10/05 00:22:57
nit: Maybe use an if / else if / else here instead
Mattias Nissler (ping if slow)
2011/10/05 10:18:36
You split the logic between PrefProxyConfigTracker
kuan
2011/10/07 00:30:41
Done.
|
| + } else if (!network->proxy_config().empty()) { // Network proxy. |
| + current_ui_config_.DeserializeForNetwork(network->proxy_config()); |
| + current_ui_config_.source = IgnoreProxy(network) ? |
| + ProxyConfig::SOURCE_NETWORK_DISABLED : ProxyConfig::SOURCE_NETWORK; |
|
stevenjb
2011/10/05 00:22:57
I really think
source = SOURCE_NETWORK
is_disa
Mattias Nissler (ping if slow)
2011/10/05 10:18:36
+1
kuan
2011/10/07 00:30:41
Done.
kuan
2011/10/07 00:30:41
Done.
|
| + } else if (state == PrefProxyConfigTracker::CONFIG_FALLBACK) { |
| + // Recommended proxy. |
| + current_ui_config_.FromNetProxyConfig(pref_config); |
| + current_ui_config_.source = IgnoreProxy(network) ? |
| + ProxyConfig::SOURCE_RECOMMENDED_DISABLED : |
| + ProxyConfig::SOURCE_RECOMMENDED; |
| + } else { // No proxy. |
| + current_ui_config_ = ProxyConfig(); |
| + current_ui_config_.source = IgnoreProxy(network) ? |
| + ProxyConfig::SOURCE_NONE_DISABLED : ProxyConfig::SOURCE_NONE; |
| + } |
| +} |
| + |
| void ProxyConfigServiceImpl::SetCurrentNetworkName(const Network* network) { |
| if (!network) { |
| if (testing_) |
| @@ -847,6 +908,12 @@ |
| } |
| } |
| +void ProxyConfigServiceImpl::ResetUICache() { |
| + current_ui_network_.clear(); |
| + current_ui_network_name_.clear(); |
| + current_ui_config_ = ProxyConfig(); |
| +} |
| + |
| void ProxyConfigServiceImpl::CheckCurrentlyOnIOThread() { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| } |