Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/proxy_config_service_impl.h" | 5 #include "chrome/browser/chromeos/proxy_config_service_impl.h" |
| 6 | 6 |
| 7 #include <ostream> | 7 #include <ostream> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| 11 #include "base/task.h" | 11 #include "base/task.h" |
| 12 #include "chrome/browser/chromeos/cros/cros_library.h" | 12 #include "chrome/browser/chromeos/cros/cros_library.h" |
| 13 #include "chrome/browser/chromeos/cros_settings_names.h" | 13 #include "chrome/browser/chromeos/cros_settings_names.h" |
| 14 #include "chrome/browser/policy/proto/chrome_device_policy.pb.h" | 14 #include "chrome/browser/policy/proto/chrome_device_policy.pb.h" |
| 15 #include "chrome/browser/prefs/pref_service.h" | |
| 15 #include "chrome/browser/prefs/proxy_config_dictionary.h" | 16 #include "chrome/browser/prefs/proxy_config_dictionary.h" |
| 16 #include "chrome/browser/prefs/proxy_prefs.h" | 17 #include "chrome/browser/prefs/proxy_prefs.h" |
| 18 #include "chrome/browser/profiles/profile_manager.h" | |
| 17 #include "content/browser/browser_thread.h" | 19 #include "content/browser/browser_thread.h" |
| 18 #include "content/common/json_value_serializer.h" | 20 #include "content/common/json_value_serializer.h" |
| 19 #include "grit/generated_resources.h" | 21 #include "grit/generated_resources.h" |
| 20 #include "ui/base/l10n/l10n_util.h" | 22 #include "ui/base/l10n/l10n_util.h" |
| 21 | 23 |
| 22 namespace em = enterprise_management; | 24 namespace em = enterprise_management; |
| 23 | 25 |
| 24 namespace chromeos { | 26 namespace chromeos { |
| 25 | 27 |
| 26 namespace { | 28 namespace { |
| 27 | 29 |
| 28 const char* SourceToString(ProxyConfigServiceImpl::ProxyConfig::Source source) { | 30 const char* SourceToString(PrefProxyConfigTracker::ConfigSource source) { |
| 29 switch (source) { | 31 switch (source) { |
| 30 case ProxyConfigServiceImpl::ProxyConfig::SOURCE_NONE: | 32 case PrefProxyConfigTracker::CONFIG_SOURCE_UNSET: |
| 31 return "SOURCE_NONE"; | 33 return "src: unset"; |
| 32 case ProxyConfigServiceImpl::ProxyConfig::SOURCE_POLICY: | 34 case PrefProxyConfigTracker::CONFIG_SOURCE_POLICY: |
| 33 return "SOURCE_POLICY"; | 35 return "src: policy"; |
| 34 case ProxyConfigServiceImpl::ProxyConfig::SOURCE_OWNER: | 36 case PrefProxyConfigTracker::CONFIG_SOURCE_EXTENSION: |
| 35 return "SOURCE_OWNER"; | 37 return "src: extension"; |
| 38 case PrefProxyConfigTracker::CONFIG_SOURCE_SYSTEM: | |
| 39 return "src: network"; // For ChromeOS, system is network. | |
| 40 case PrefProxyConfigTracker::CONFIG_SOURCE_FALLBACK: | |
| 41 return "src: recommended"; // Fallback is recommended. | |
| 36 } | 42 } |
| 37 NOTREACHED() << "Unrecognized source type"; | 43 NOTREACHED() << "Unrecognized source type"; |
| 38 return ""; | 44 return ""; |
| 39 } | 45 } |
| 40 | 46 |
| 47 // Only unblock if needed for debugging. | |
| 48 #if defined(NEED_DEBUG_LOG) | |
| 41 std::ostream& operator<<(std::ostream& out, | 49 std::ostream& operator<<(std::ostream& out, |
| 42 const ProxyConfigServiceImpl::ProxyConfig::ManualProxy& proxy) { | 50 const ProxyConfigServiceImpl::ProxyConfig::ManualProxy& proxy) { |
| 43 out << " " << SourceToString(proxy.source) << "\n" | 51 out << (proxy.server.is_valid() ? proxy.server.ToURI() : "") << "\n"; |
| 44 << " server: " << (proxy.server.is_valid() ? proxy.server.ToURI() : "") | |
| 45 << "\n"; | |
| 46 return out; | 52 return out; |
| 47 } | 53 } |
| 48 | 54 |
| 49 std::ostream& operator<<(std::ostream& out, | 55 std::ostream& operator<<(std::ostream& out, |
| 50 const ProxyConfigServiceImpl::ProxyConfig& config) { | 56 const ProxyConfigServiceImpl::ProxyConfig& config) { |
| 51 switch (config.mode) { | 57 switch (config.mode) { |
| 52 case ProxyConfigServiceImpl::ProxyConfig::MODE_DIRECT: | 58 case ProxyConfigServiceImpl::ProxyConfig::MODE_DIRECT: |
| 53 out << "Direct connection:\n " | 59 out << "Direct connection:\n " |
| 54 << SourceToString(config.automatic_proxy.source) << "\n"; | 60 << SourceToString(config.source) << "\n"; |
| 55 break; | 61 break; |
| 56 case ProxyConfigServiceImpl::ProxyConfig::MODE_AUTO_DETECT: | 62 case ProxyConfigServiceImpl::ProxyConfig::MODE_AUTO_DETECT: |
| 57 out << "Auto detection:\n " | 63 out << "Auto detection:\n " |
| 58 << SourceToString(config.automatic_proxy.source) << "\n"; | 64 << SourceToString(config.source) << "\n"; |
| 59 break; | 65 break; |
| 60 case ProxyConfigServiceImpl::ProxyConfig::MODE_PAC_SCRIPT: | 66 case ProxyConfigServiceImpl::ProxyConfig::MODE_PAC_SCRIPT: |
| 61 out << "Custom PAC script:\n " | 67 out << "Custom PAC script:\n " |
| 62 << SourceToString(config.automatic_proxy.source) | 68 << SourceToString(config.source) |
| 63 << "\n PAC: " << config.automatic_proxy.pac_url << "\n"; | 69 << "\n PAC: " << config.automatic_proxy.pac_url << "\n"; |
| 64 break; | 70 break; |
| 65 case ProxyConfigServiceImpl::ProxyConfig::MODE_SINGLE_PROXY: | 71 case ProxyConfigServiceImpl::ProxyConfig::MODE_SINGLE_PROXY: |
| 66 out << "Single proxy:\n" << config.single_proxy; | 72 out << "Single proxy:\n" |
| 73 << SourceToString(config.source) << "\n " << config.single_proxy; | |
| 67 break; | 74 break; |
| 68 case ProxyConfigServiceImpl::ProxyConfig::MODE_PROXY_PER_SCHEME: | 75 case ProxyConfigServiceImpl::ProxyConfig::MODE_PROXY_PER_SCHEME: |
| 69 out << "HTTP proxy: " << config.http_proxy; | 76 out << "Manual proxies:\n" |
| 70 out << "HTTPS proxy: " << config.https_proxy; | 77 << SourceToString(config.source) << "\n" |
| 71 out << "FTP proxy: " << config.ftp_proxy; | 78 << " HTTP: " << config.http_proxy |
| 72 out << "SOCKS proxy: " << config.socks_proxy; | 79 << " HTTPS: " << config.https_proxy |
| 80 << " FTP: " << config.ftp_proxy | |
| 81 << " SOCKS: " << config.socks_proxy; | |
| 73 break; | 82 break; |
| 74 default: | 83 default: |
| 75 NOTREACHED() << "Unrecognized proxy config mode"; | 84 NOTREACHED() << "Unrecognized proxy config mode"; |
| 76 break; | 85 break; |
| 77 } | 86 } |
| 78 if (config.mode == ProxyConfigServiceImpl::ProxyConfig::MODE_SINGLE_PROXY || | 87 if (config.mode == ProxyConfigServiceImpl::ProxyConfig::MODE_SINGLE_PROXY || |
| 79 config.mode == | 88 config.mode == |
| 80 ProxyConfigServiceImpl::ProxyConfig::MODE_PROXY_PER_SCHEME) { | 89 ProxyConfigServiceImpl::ProxyConfig::MODE_PROXY_PER_SCHEME) { |
| 81 out << "Bypass list: "; | 90 out << "Bypass list: "; |
| 82 if (config.bypass_rules.rules().empty()) { | 91 if (config.bypass_rules.rules().empty()) { |
| 83 out << "[None]"; | 92 out << "[None]"; |
| 84 } else { | 93 } else { |
| 85 const net::ProxyBypassRules& bypass_rules = config.bypass_rules; | 94 const net::ProxyBypassRules& bypass_rules = config.bypass_rules; |
| 86 net::ProxyBypassRules::RuleList::const_iterator it; | 95 net::ProxyBypassRules::RuleList::const_iterator it; |
| 87 for (it = bypass_rules.rules().begin(); | 96 for (it = bypass_rules.rules().begin(); |
| 88 it != bypass_rules.rules().end(); ++it) { | 97 it != bypass_rules.rules().end(); ++it) { |
| 89 out << "\n " << (*it)->ToString(); | 98 out << "\n " << (*it)->ToString(); |
| 90 } | 99 } |
| 91 } | 100 } |
| 92 } | 101 } |
| 93 return out; | 102 return out; |
| 94 } | 103 } |
| 95 | 104 |
| 96 std::string ProxyConfigToString( | 105 std::string ProxyConfigToString( |
| 97 const ProxyConfigServiceImpl::ProxyConfig& proxy_config) { | 106 const ProxyConfigServiceImpl::ProxyConfig& proxy_config) { |
| 98 std::ostringstream stream; | 107 std::ostringstream stream; |
| 99 stream << proxy_config; | 108 stream << proxy_config; |
| 100 return stream.str(); | 109 return stream.str(); |
| 101 } | 110 } |
| 111 #endif // defined(NEED_DEBUG_LOG) | |
| 102 | 112 |
| 103 } // namespace | 113 } // namespace |
| 104 | 114 |
| 105 //---------- ProxyConfigServiceImpl::ProxyConfig::Setting methods -------------- | |
| 106 | |
| 107 bool ProxyConfigServiceImpl::ProxyConfig::Setting::CanBeWrittenByUser( | |
| 108 bool user_is_owner) { | |
| 109 // Setting can only be written by user if user is owner and setting is not | |
| 110 // from policy. | |
| 111 return user_is_owner && source != ProxyConfig::SOURCE_POLICY; | |
| 112 } | |
| 113 | |
| 114 //----------- ProxyConfigServiceImpl::ProxyConfig: public methods -------------- | 115 //----------- ProxyConfigServiceImpl::ProxyConfig: public methods -------------- |
| 115 | 116 |
| 116 ProxyConfigServiceImpl::ProxyConfig::ProxyConfig() : mode(MODE_DIRECT) {} | 117 ProxyConfigServiceImpl::ProxyConfig::ProxyConfig() |
| 118 : mode(MODE_DIRECT), | |
| 119 source(PrefProxyConfigTracker::CONFIG_SOURCE_UNSET), | |
| 120 user_modifiable(true) {} | |
| 117 | 121 |
| 118 ProxyConfigServiceImpl::ProxyConfig::~ProxyConfig() {} | 122 ProxyConfigServiceImpl::ProxyConfig::~ProxyConfig() {} |
| 119 | 123 |
| 120 void ProxyConfigServiceImpl::ProxyConfig::ToNetProxyConfig( | 124 void ProxyConfigServiceImpl::ProxyConfig::ToNetProxyConfig( |
| 121 net::ProxyConfig* net_config) { | 125 net::ProxyConfig* net_config) { |
| 122 switch (mode) { | 126 switch (mode) { |
| 123 case MODE_DIRECT: | 127 case MODE_DIRECT: |
| 124 *net_config = net::ProxyConfig::CreateDirect(); | 128 *net_config = net::ProxyConfig::CreateDirect(); |
| 125 break; | 129 break; |
| 126 case MODE_AUTO_DETECT: | 130 case MODE_AUTO_DETECT: |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 146 net_config->proxy_rules().proxy_for_ftp = ftp_proxy.server; | 150 net_config->proxy_rules().proxy_for_ftp = ftp_proxy.server; |
| 147 net_config->proxy_rules().fallback_proxy = socks_proxy.server; | 151 net_config->proxy_rules().fallback_proxy = socks_proxy.server; |
| 148 net_config->proxy_rules().bypass_rules = bypass_rules; | 152 net_config->proxy_rules().bypass_rules = bypass_rules; |
| 149 break; | 153 break; |
| 150 default: | 154 default: |
| 151 NOTREACHED() << "Unrecognized proxy config mode"; | 155 NOTREACHED() << "Unrecognized proxy config mode"; |
| 152 break; | 156 break; |
| 153 } | 157 } |
| 154 } | 158 } |
| 155 | 159 |
| 156 bool ProxyConfigServiceImpl::ProxyConfig::CanBeWrittenByUser( | 160 bool ProxyConfigServiceImpl::ProxyConfig::FromNetProxyConfig( |
| 157 bool user_is_owner, const std::string& scheme) { | 161 const net::ProxyConfig& net_config) { |
| 158 // Setting can only be written by user if user is owner and setting is not | 162 const net::ProxyConfig::ProxyRules& rules = net_config.proxy_rules(); |
| 159 // from policy. | 163 switch (rules.type) { |
| 160 Setting* setting = NULL; | 164 case net::ProxyConfig::ProxyRules::TYPE_NO_RULES: |
| 161 switch (mode) { | 165 if (!net_config.HasAutomaticSettings()) { |
| 162 case MODE_DIRECT: | 166 mode = ProxyConfig::MODE_DIRECT; |
| 163 case MODE_AUTO_DETECT: | 167 } else if (net_config.auto_detect()) { |
| 164 case MODE_PAC_SCRIPT: | 168 mode = ProxyConfig::MODE_AUTO_DETECT; |
| 165 setting = &automatic_proxy; | 169 } else if (net_config.has_pac_url()) { |
| 166 break; | 170 mode = ProxyConfig::MODE_PAC_SCRIPT; |
| 167 case MODE_SINGLE_PROXY: | 171 automatic_proxy.pac_url = net_config.pac_url(); |
| 168 setting = &single_proxy; | 172 } else { |
| 169 break; | 173 return false; |
| 170 case MODE_PROXY_PER_SCHEME: | 174 } |
| 171 setting = MapSchemeToProxy(scheme); | 175 return true; |
| 172 break; | 176 case net::ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY: |
| 177 if (!rules.single_proxy.is_valid()) | |
| 178 return false; | |
| 179 mode = MODE_SINGLE_PROXY; | |
| 180 single_proxy.server = rules.single_proxy; | |
| 181 bypass_rules = rules.bypass_rules; | |
| 182 return true; | |
| 183 case net::ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME: | |
| 184 // Make sure we have valid server for at least one of the protocols. | |
| 185 if (!rules.proxy_for_http.is_valid() && | |
| 186 !rules.proxy_for_https.is_valid() && | |
| 187 !rules.proxy_for_ftp.is_valid() && | |
| 188 !rules.fallback_proxy.is_valid()) { | |
| 189 return false; | |
| 190 } | |
| 191 mode = MODE_PROXY_PER_SCHEME; | |
| 192 if (rules.proxy_for_http.is_valid()) | |
| 193 http_proxy.server = rules.proxy_for_http; | |
| 194 if (rules.proxy_for_https.is_valid()) | |
| 195 https_proxy.server = rules.proxy_for_https; | |
| 196 if (rules.proxy_for_ftp.is_valid()) | |
| 197 ftp_proxy.server = rules.proxy_for_ftp; | |
| 198 if (rules.fallback_proxy.is_valid()) | |
| 199 socks_proxy.server = rules.fallback_proxy; | |
| 200 bypass_rules = rules.bypass_rules; | |
| 201 return true; | |
| 173 default: | 202 default: |
| 203 NOTREACHED() << "Unrecognized proxy config mode"; | |
| 174 break; | 204 break; |
| 175 } | 205 } |
| 176 if (!setting) { | 206 return false; |
| 177 NOTREACHED() << "Unrecognized proxy config mode"; | |
| 178 return false; | |
| 179 } | |
| 180 return setting->CanBeWrittenByUser(user_is_owner); | |
| 181 } | 207 } |
| 182 | 208 |
| 183 ProxyConfigServiceImpl::ProxyConfig::ManualProxy* | 209 ProxyConfigServiceImpl::ProxyConfig::ManualProxy* |
| 184 ProxyConfigServiceImpl::ProxyConfig::MapSchemeToProxy( | 210 ProxyConfigServiceImpl::ProxyConfig::MapSchemeToProxy( |
| 185 const std::string& scheme) { | 211 const std::string& scheme) { |
| 186 if (scheme == "http") | 212 if (scheme == "http") |
| 187 return &http_proxy; | 213 return &http_proxy; |
| 188 if (scheme == "https") | 214 if (scheme == "https") |
| 189 return &https_proxy; | 215 return &https_proxy; |
| 190 if (scheme == "ftp") | 216 if (scheme == "ftp") |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 266 JSONStringValueSerializer serializer(input); | 292 JSONStringValueSerializer serializer(input); |
| 267 scoped_ptr<Value> value(serializer.Deserialize(NULL, NULL)); | 293 scoped_ptr<Value> value(serializer.Deserialize(NULL, NULL)); |
| 268 if (!value.get() || value->GetType() != Value::TYPE_DICTIONARY) | 294 if (!value.get() || value->GetType() != Value::TYPE_DICTIONARY) |
| 269 return false; | 295 return false; |
| 270 DictionaryValue* proxy_dict = static_cast<DictionaryValue*>(value.get()); | 296 DictionaryValue* proxy_dict = static_cast<DictionaryValue*>(value.get()); |
| 271 return FromPrefProxyConfig(proxy_dict); | 297 return FromPrefProxyConfig(proxy_dict); |
| 272 } | 298 } |
| 273 | 299 |
| 274 bool ProxyConfigServiceImpl::ProxyConfig::Equals( | 300 bool ProxyConfigServiceImpl::ProxyConfig::Equals( |
| 275 const ProxyConfig& other) const { | 301 const ProxyConfig& other) const { |
| 302 // Intentionally ignore source which is only used for ui purposes and has no | |
|
Mattias Nissler (ping if slow)
2011/10/07 13:32:10
s/ui/UI/
kuan
2011/10/18 16:25:35
Done.
| |
| 303 // impact on proxy backend. | |
| 276 if (mode != other.mode) | 304 if (mode != other.mode) |
| 277 return false; | 305 return false; |
| 278 switch (mode) { | 306 switch (mode) { |
| 279 case MODE_DIRECT: | 307 case MODE_DIRECT: |
| 280 case MODE_AUTO_DETECT: | 308 case MODE_AUTO_DETECT: |
| 281 return true; | 309 return true; |
| 282 case MODE_PAC_SCRIPT: | 310 case MODE_PAC_SCRIPT: |
| 283 return automatic_proxy.pac_url == other.automatic_proxy.pac_url; | 311 return automatic_proxy.pac_url == other.automatic_proxy.pac_url; |
| 284 case MODE_SINGLE_PROXY: | 312 case MODE_SINGLE_PROXY: |
| 285 return single_proxy.server == other.single_proxy.server && | 313 return single_proxy.server == other.single_proxy.server && |
| 286 bypass_rules.Equals(other.bypass_rules); | 314 bypass_rules.Equals(other.bypass_rules); |
| 287 case MODE_PROXY_PER_SCHEME: | 315 case MODE_PROXY_PER_SCHEME: |
| 288 return http_proxy.server == other.http_proxy.server && | 316 return http_proxy.server == other.http_proxy.server && |
| 289 https_proxy.server == other.https_proxy.server && | 317 https_proxy.server == other.https_proxy.server && |
| 290 ftp_proxy.server == other.ftp_proxy.server && | 318 ftp_proxy.server == other.ftp_proxy.server && |
| 291 socks_proxy.server == other.socks_proxy.server && | 319 socks_proxy.server == other.socks_proxy.server && |
| 292 bypass_rules.Equals(other.bypass_rules); | 320 bypass_rules.Equals(other.bypass_rules); |
| 293 default: { | 321 default: { |
| 294 NOTREACHED() << "Unrecognized proxy config mode"; | 322 NOTREACHED() << "Unrecognized proxy config mode"; |
| 295 break; | 323 break; |
| 296 } | 324 } |
| 297 } | 325 } |
| 298 return false; | 326 return false; |
| 299 } | 327 } |
| 300 | 328 |
| 301 std::string ProxyConfigServiceImpl::ProxyConfig::ToString() const { | |
| 302 return ProxyConfigToString(*this); | |
| 303 } | |
| 304 | |
| 305 //----------- ProxyConfigServiceImpl::ProxyConfig: private methods ------------- | 329 //----------- ProxyConfigServiceImpl::ProxyConfig: private methods ------------- |
| 306 | 330 |
| 307 // static | 331 // static |
| 308 void ProxyConfigServiceImpl::ProxyConfig::EncodeAndAppendProxyServer( | 332 void ProxyConfigServiceImpl::ProxyConfig::EncodeAndAppendProxyServer( |
| 309 const std::string& scheme, | 333 const std::string& scheme, |
| 310 const net::ProxyServer& server, | 334 const net::ProxyServer& server, |
| 311 std::string* spec) { | 335 std::string* spec) { |
| 312 if (!server.is_valid()) | 336 if (!server.is_valid()) |
| 313 return; | 337 return; |
| 314 | 338 |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 434 } | 458 } |
| 435 NOTREACHED() << "Unknown proxy mode, falling back to system settings."; | 459 NOTREACHED() << "Unknown proxy mode, falling back to system settings."; |
| 436 return false; | 460 return false; |
| 437 } | 461 } |
| 438 | 462 |
| 439 //------------------- ProxyConfigServiceImpl: public methods ------------------- | 463 //------------------- ProxyConfigServiceImpl: public methods ------------------- |
| 440 | 464 |
| 441 ProxyConfigServiceImpl::ProxyConfigServiceImpl() | 465 ProxyConfigServiceImpl::ProxyConfigServiceImpl() |
| 442 : testing_(false), | 466 : testing_(false), |
| 443 can_post_task_(false), | 467 can_post_task_(false), |
| 444 config_availability_(net::ProxyConfigService::CONFIG_UNSET), | 468 io_config_availability_(net::ProxyConfigService::CONFIG_UNSET), |
| 445 use_shared_proxies_(true) { | 469 use_shared_proxies_(true), |
| 470 current_ui_profile_(NULL) { | |
| 446 // Start async fetch of proxy config from settings persisted on device. | 471 // Start async fetch of proxy config from settings persisted on device. |
| 447 if (CrosLibrary::Get()->EnsureLoaded()) { | 472 if (CrosLibrary::Get()->EnsureLoaded()) { |
| 448 retrieve_property_op_ = SignedSettings::CreateRetrievePropertyOp( | 473 retrieve_property_op_ = SignedSettings::CreateRetrievePropertyOp( |
| 449 kSettingProxyEverywhere, this); | 474 kSettingProxyEverywhere, this); |
| 450 if (retrieve_property_op_) { | 475 if (retrieve_property_op_) { |
| 451 retrieve_property_op_->Execute(); | 476 retrieve_property_op_->Execute(); |
| 452 VLOG(1) << "Start retrieving proxy setting from device"; | 477 VLOG(1) << "Start retrieving proxy setting from device"; |
| 453 } else { | 478 } else { |
| 454 VLOG(1) << "Fail to retrieve proxy setting from device"; | 479 VLOG(1) << "Fail to retrieve proxy setting from device"; |
| 455 } | 480 } |
| 456 } | 481 } |
| 457 | 482 |
| 458 NetworkLibrary* network_lib = CrosLibrary::Get()->GetNetworkLibrary(); | 483 NetworkLibrary* network_lib = CrosLibrary::Get()->GetNetworkLibrary(); |
| 459 OnActiveNetworkChanged(network_lib, network_lib->active_network()); | 484 OnActiveNetworkChanged(network_lib, network_lib->active_network()); |
| 460 network_lib->AddNetworkManagerObserver(this); | 485 network_lib->AddNetworkManagerObserver(this); |
| 461 | 486 |
| 462 can_post_task_ = true; | 487 can_post_task_ = true; |
| 463 } | 488 } |
| 464 | 489 |
| 465 ProxyConfigServiceImpl::ProxyConfigServiceImpl(const ProxyConfig& init_config) | 490 ProxyConfigServiceImpl::ProxyConfigServiceImpl(const ProxyConfig& init_config) |
| 466 : testing_(false), | 491 : testing_(false), |
| 467 can_post_task_(true), | 492 can_post_task_(true), |
| 468 config_availability_(net::ProxyConfigService::CONFIG_VALID), | 493 io_config_availability_(net::ProxyConfigService::CONFIG_VALID), |
| 469 use_shared_proxies_(true) { | 494 use_shared_proxies_(true), |
| 495 current_ui_profile_(NULL) { | |
| 470 active_config_ = init_config; | 496 active_config_ = init_config; |
| 471 // Update the IO-accessible copy in |cached_config_| as well. | 497 // Update the IO-accessible copy in |io_config_| as well. |
| 472 cached_config_ = active_config_; | 498 io_config_ = active_config_; |
| 473 } | 499 } |
| 474 | 500 |
| 475 ProxyConfigServiceImpl::~ProxyConfigServiceImpl() { | 501 ProxyConfigServiceImpl::~ProxyConfigServiceImpl() { |
| 476 NetworkLibrary* netlib = CrosLibrary::Get()->GetNetworkLibrary(); | 502 NetworkLibrary* netlib = CrosLibrary::Get()->GetNetworkLibrary(); |
| 477 if (netlib) { | 503 if (netlib) { |
| 478 netlib->RemoveNetworkManagerObserver(this); | 504 netlib->RemoveNetworkManagerObserver(this); |
| 479 netlib->RemoveObserverForAllNetworks(this); | 505 netlib->RemoveObserverForAllNetworks(this); |
| 480 } | 506 } |
| 481 } | 507 } |
| 482 | 508 |
| 509 void ProxyConfigServiceImpl::UISetUseSharedProxies(bool use_shared) { | |
| 510 // Should be called from UI thread. | |
| 511 CheckCurrentlyOnUIThread(); | |
| 512 | |
| 513 if (use_shared_proxies_ == use_shared) { | |
| 514 VLOG(1) << "same use_shared_proxies = " << use_shared_proxies_; | |
| 515 return; | |
| 516 } | |
| 517 use_shared_proxies_ = use_shared; | |
| 518 VLOG(1) << "new use_shared_proxies = " << use_shared_proxies_; | |
| 519 // UISetUseSharedProxies is always called on login, so reset | |
| 520 // current_ui_profile_ to trigger pick up of new default profile. | |
| 521 // If this was called from user changing the setting, we'll set the new | |
| 522 // profile before showing proxy config of any network via | |
| 523 // UISetCurrentUserProfile. | |
| 524 current_ui_profile_ = NULL; | |
| 525 Network* network = NULL; | |
| 526 if (!active_network_.empty()) { | |
| 527 network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath( | |
| 528 active_network_); | |
| 529 if (!network) | |
| 530 LOG(WARNING) << "can't find requested network " << active_network_; | |
| 531 } | |
| 532 DetermineEffectiveConfig(network, true); | |
| 533 } | |
| 534 | |
| 535 void ProxyConfigServiceImpl::UISetCurrentUserProfile(Profile* profile) { | |
| 536 current_ui_profile_ = profile; | |
| 537 } | |
| 538 | |
| 539 void ProxyConfigServiceImpl::UISetCurrentNetwork( | |
| 540 const std::string& current_network) { | |
| 541 // Should be called from UI thread. | |
| 542 CheckCurrentlyOnUIThread(); | |
| 543 Network* network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath( | |
| 544 current_network); | |
| 545 if (!network) { | |
| 546 ResetUICache(); | |
| 547 LOG(ERROR) << "can't find requested network " << current_network; | |
| 548 return; | |
| 549 } | |
| 550 current_ui_network_ = current_network; | |
| 551 OnUISetCurrentNetwork(network); | |
| 552 } | |
| 553 | |
| 554 void ProxyConfigServiceImpl::UIMakeActiveNetworkCurrent() { | |
| 555 // Should be called from UI thread. | |
| 556 CheckCurrentlyOnUIThread(); | |
| 557 Network* network = NULL; | |
| 558 if (!testing_) { | |
| 559 network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath( | |
| 560 active_network_); | |
| 561 if (!network) { | |
| 562 ResetUICache(); | |
| 563 LOG(ERROR) << "can't find requested network " << active_network_; | |
| 564 return; | |
| 565 } | |
| 566 } | |
| 567 current_ui_network_ = active_network_; | |
| 568 OnUISetCurrentNetwork(network); | |
| 569 } | |
| 570 | |
| 483 void ProxyConfigServiceImpl::UIGetProxyConfig(ProxyConfig* config) { | 571 void ProxyConfigServiceImpl::UIGetProxyConfig(ProxyConfig* config) { |
| 484 // Should be called from UI thread. | 572 // Should be called from UI thread. |
| 485 CheckCurrentlyOnUIThread(); | 573 CheckCurrentlyOnUIThread(); |
| 486 // Simply returns the copy on the UI thread. | 574 // Simply returns the copy on the UI thread. |
| 487 *config = current_ui_config_; | 575 *config = current_ui_config_; |
| 488 } | 576 } |
| 489 | 577 |
| 490 bool ProxyConfigServiceImpl::UISetCurrentNetwork( | |
| 491 const std::string& current_network) { | |
| 492 // Should be called from UI thread. | |
| 493 CheckCurrentlyOnUIThread(); | |
| 494 if (current_ui_network_ == current_network) | |
| 495 return false; | |
| 496 Network* network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath( | |
| 497 current_network); | |
| 498 if (!network) { | |
| 499 LOG(ERROR) << "can't find requested network " << current_network; | |
| 500 return false; | |
| 501 } | |
| 502 current_ui_network_ = current_network; | |
| 503 current_ui_config_ = ProxyConfig(); | |
| 504 SetCurrentNetworkName(network); | |
| 505 if (!network->proxy_config().empty()) | |
| 506 current_ui_config_.DeserializeForNetwork(network->proxy_config()); | |
| 507 VLOG(1) << "current ui network: " | |
| 508 << (current_ui_network_name_.empty() ? | |
| 509 current_ui_network_ : current_ui_network_name_) | |
| 510 << ", proxy mode: " << current_ui_config_.mode; | |
| 511 return true; | |
| 512 } | |
| 513 | |
| 514 bool ProxyConfigServiceImpl::UIMakeActiveNetworkCurrent() { | |
| 515 // Should be called from UI thread. | |
| 516 CheckCurrentlyOnUIThread(); | |
| 517 if (current_ui_network_ == active_network_) | |
| 518 return false; | |
| 519 Network* network = NULL; | |
| 520 if (!testing_) { | |
| 521 network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath( | |
| 522 active_network_); | |
| 523 if (!network) { | |
| 524 LOG(ERROR) << "can't find requested network " << active_network_; | |
| 525 return false; | |
| 526 } | |
| 527 } | |
| 528 current_ui_network_ = active_network_; | |
| 529 current_ui_config_ = active_config_; | |
| 530 SetCurrentNetworkName(network); | |
| 531 VLOG(1) << "current ui network: " | |
| 532 << (current_ui_network_name_.empty() ? | |
| 533 current_ui_network_ : current_ui_network_name_) | |
| 534 << ", proxy mode: " << current_ui_config_.mode; | |
| 535 return true; | |
| 536 } | |
| 537 | |
| 538 void ProxyConfigServiceImpl::UISetUseSharedProxies(bool use_shared) { | |
| 539 // Should be called from UI thread. | |
| 540 CheckCurrentlyOnUIThread(); | |
| 541 | |
| 542 // Reset all UI-related variables so that the next opening of proxy | |
| 543 // configuration dialog of any network will trigger javascript reloading of | |
| 544 // (possibly) new proxy settings. | |
| 545 current_ui_network_.clear(); | |
| 546 current_ui_network_name_.clear(); | |
| 547 current_ui_config_ = ProxyConfig(); | |
| 548 | |
| 549 if (use_shared_proxies_ == use_shared) { | |
| 550 VLOG(1) << "same use_shared_proxies = " << use_shared_proxies_; | |
| 551 return; | |
| 552 } | |
| 553 use_shared_proxies_ = use_shared; | |
| 554 VLOG(1) << "new use_shared_proxies = " << use_shared_proxies_; | |
| 555 if (active_network_.empty()) | |
| 556 return; | |
| 557 Network* network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath( | |
| 558 active_network_); | |
| 559 if (!network) { | |
| 560 LOG(ERROR) << "can't find requested network " << active_network_; | |
| 561 return; | |
| 562 } | |
| 563 DetermineConfigFromNetwork(network); | |
| 564 } | |
| 565 | |
| 566 bool ProxyConfigServiceImpl::UISetProxyConfigToDirect() { | 578 bool ProxyConfigServiceImpl::UISetProxyConfigToDirect() { |
| 567 // Should be called from UI thread. | 579 // Should be called from UI thread. |
| 568 CheckCurrentlyOnUIThread(); | 580 CheckCurrentlyOnUIThread(); |
| 569 current_ui_config_.mode = ProxyConfig::MODE_DIRECT; | 581 current_ui_config_.mode = ProxyConfig::MODE_DIRECT; |
| 570 OnUISetProxyConfig(); | 582 OnUISetProxyConfig(); |
| 571 return true; | 583 return true; |
| 572 } | 584 } |
| 573 | 585 |
| 574 bool ProxyConfigServiceImpl::UISetProxyConfigToAutoDetect() { | 586 bool ProxyConfigServiceImpl::UISetProxyConfigToAutoDetect() { |
| 575 // Should be called from UI thread. | 587 // Should be called from UI thread. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 622 NOTREACHED(); | 634 NOTREACHED(); |
| 623 VLOG(1) << "Cannot set bypass rules for proxy mode [" | 635 VLOG(1) << "Cannot set bypass rules for proxy mode [" |
| 624 << current_ui_config_.mode << "]"; | 636 << current_ui_config_.mode << "]"; |
| 625 return false; | 637 return false; |
| 626 } | 638 } |
| 627 current_ui_config_.bypass_rules = bypass_rules; | 639 current_ui_config_.bypass_rules = bypass_rules; |
| 628 OnUISetProxyConfig(); | 640 OnUISetProxyConfig(); |
| 629 return true; | 641 return true; |
| 630 } | 642 } |
| 631 | 643 |
| 632 void ProxyConfigServiceImpl::AddObserver( | 644 void ProxyConfigServiceImpl::OnPrefProxyConfigChanged( |
| 633 net::ProxyConfigService::Observer* observer) { | 645 PrefProxyConfigTracker* in_tracker) { |
| 634 // Should be called from IO thread. | 646 scoped_refptr<PrefProxyConfigTracker> tracker(in_tracker); |
| 635 CheckCurrentlyOnIOThread(); | 647 // Make sure this runs on UI thread. |
| 636 observers_.AddObserver(observer); | 648 if (!BrowserThread::CurrentlyOn(BrowserThread::UI) && can_post_task_) { |
| 637 } | 649 // Posts a task to UI thread to handle prefs change. |
| 638 | 650 if (!BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
|
Mattias Nissler (ping if slow)
2011/10/07 13:32:10
Yikes. Another reason to pull out pref observing a
kuan
2011/10/18 16:25:35
This entire class has been redesigned and re-imple
| |
| 639 void ProxyConfigServiceImpl::RemoveObserver( | 651 NewRunnableMethod(this, |
| 640 net::ProxyConfigService::Observer* observer) { | 652 &ProxyConfigServiceImpl::OnPrefProxyConfigChanged, |
| 641 // Should be called from IO thread. | 653 tracker))) |
| 642 CheckCurrentlyOnIOThread(); | 654 VLOG(1) << "Couldn't post task to UI thread to handle prefs change"; |
| 643 observers_.RemoveObserver(observer); | 655 return; |
| 644 } | |
| 645 | |
| 646 net::ProxyConfigService::ConfigAvailability | |
| 647 ProxyConfigServiceImpl::IOGetProxyConfig(net::ProxyConfig* net_config) { | |
| 648 // Should be called from IO thread. | |
| 649 CheckCurrentlyOnIOThread(); | |
| 650 if (config_availability_ == net::ProxyConfigService::CONFIG_VALID) { | |
| 651 VLOG(1) << "returning proxy mode=" << cached_config_.mode; | |
| 652 cached_config_.ToNetProxyConfig(net_config); | |
| 653 } | 656 } |
| 654 return config_availability_; | 657 if (tracker != GetProxyConfigTracker()) { |
| 658 VLOG(1) << "ignoring prefs change from unexpected tracker"; | |
| 659 return; | |
| 660 } | |
| 661 VLOG(1) << "got prefs change"; | |
| 662 Network* network = NULL; | |
| 663 if (!active_network_.empty()) { | |
| 664 network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath( | |
| 665 active_network_); | |
| 666 if (!network) | |
| 667 LOG(ERROR) << "can't find requested network " << active_network_; | |
| 668 } | |
| 669 DetermineEffectiveConfig(network, true); | |
| 655 } | 670 } |
| 656 | 671 |
| 657 void ProxyConfigServiceImpl::OnSettingsOpCompleted( | 672 void ProxyConfigServiceImpl::OnSettingsOpCompleted( |
| 658 SignedSettings::ReturnCode code, | 673 SignedSettings::ReturnCode code, |
| 659 std::string value) { | 674 std::string value) { |
| 660 retrieve_property_op_ = NULL; | 675 retrieve_property_op_ = NULL; |
| 661 if (code != SignedSettings::SUCCESS) { | 676 if (code != SignedSettings::SUCCESS) { |
| 662 LOG(WARNING) << "Error retrieving proxy setting from device"; | 677 LOG(WARNING) << "Error retrieving proxy setting from device"; |
| 663 device_config_.clear(); | 678 device_config_.clear(); |
| 664 return; | 679 return; |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 690 return; | 705 return; |
| 691 VLOG(1) << "OnNetworkChanged: " | 706 VLOG(1) << "OnNetworkChanged: " |
| 692 << (network->name().empty() ? network->service_path() : | 707 << (network->name().empty() ? network->service_path() : |
| 693 network->name()) | 708 network->name()) |
| 694 << ", use-shared-proxies=" << use_shared_proxies_; | 709 << ", use-shared-proxies=" << use_shared_proxies_; |
| 695 // We only care about active network. | 710 // We only care about active network. |
| 696 if (network == network_lib->active_network()) | 711 if (network == network_lib->active_network()) |
| 697 OnActiveNetworkChanged(network_lib, network); | 712 OnActiveNetworkChanged(network_lib, network); |
| 698 } | 713 } |
| 699 | 714 |
| 715 void ProxyConfigServiceImpl::AddObserver( | |
| 716 net::ProxyConfigService::Observer* observer) { | |
| 717 // Should be called from IO thread. | |
| 718 CheckCurrentlyOnIOThread(); | |
| 719 observers_.AddObserver(observer); | |
| 720 } | |
| 721 | |
| 722 void ProxyConfigServiceImpl::RemoveObserver( | |
| 723 net::ProxyConfigService::Observer* observer) { | |
| 724 // Should be called from IO thread. | |
| 725 CheckCurrentlyOnIOThread(); | |
| 726 observers_.RemoveObserver(observer); | |
| 727 } | |
| 728 | |
| 729 net::ProxyConfigService::ConfigAvailability | |
| 730 ProxyConfigServiceImpl::IOGetProxyConfig(net::ProxyConfig* net_config) { | |
| 731 // Should be called from IO thread. | |
| 732 CheckCurrentlyOnIOThread(); | |
| 733 if (io_config_availability_ == net::ProxyConfigService::CONFIG_VALID) { | |
| 734 VLOG(1) << "returning proxy mode=" << io_config_.mode; | |
| 735 io_config_.ToNetProxyConfig(net_config); | |
| 736 } | |
| 737 return io_config_availability_; | |
| 738 } | |
| 739 | |
| 700 //------------------ ProxyConfigServiceImpl: private methods ------------------- | 740 //------------------ ProxyConfigServiceImpl: private methods ------------------- |
| 701 | 741 |
| 702 void ProxyConfigServiceImpl::OnUISetProxyConfig() { | 742 void ProxyConfigServiceImpl::OnUISetProxyConfig() { |
| 703 if (testing_) { | 743 if (testing_) { |
| 704 active_config_ = current_ui_config_; | 744 active_config_ = current_ui_config_; |
| 705 IOSetProxyConfig(active_config_, net::ProxyConfigService::CONFIG_VALID); | 745 IOSetProxyConfig(active_config_, net::ProxyConfigService::CONFIG_VALID); |
| 706 return; | 746 return; |
| 707 } | 747 } |
| 708 if (current_ui_network_.empty()) | 748 if (current_ui_network_.empty()) |
| 709 return; | 749 return; |
| 710 // Update config to flimflam. | 750 // Update config to flimflam. |
| 711 std::string value; | 751 std::string value; |
| 712 if (current_ui_config_.SerializeForNetwork(&value)) { | 752 if (current_ui_config_.SerializeForNetwork(&value)) { |
| 713 VLOG(1) << "set proxy (mode=" << current_ui_config_.mode | 753 VLOG(1) << "set proxy (mode=" << current_ui_config_.mode |
| 714 << ") for " << current_ui_network_; | 754 << ") for " << current_ui_network_; |
| 755 current_ui_config_.source = PrefProxyConfigTracker::CONFIG_SOURCE_SYSTEM; | |
| 715 SetProxyConfigForNetwork(current_ui_network_, value, false); | 756 SetProxyConfigForNetwork(current_ui_network_, value, false); |
| 716 } | 757 } |
| 717 } | 758 } |
| 718 | 759 |
| 719 void ProxyConfigServiceImpl::IOSetProxyConfig( | 760 void ProxyConfigServiceImpl::IOSetProxyConfig( |
| 720 const ProxyConfig& new_config, | 761 const ProxyConfig& new_config, |
| 721 net::ProxyConfigService::ConfigAvailability new_availability) { | 762 net::ProxyConfigService::ConfigAvailability new_availability) { |
| 722 if (!BrowserThread::CurrentlyOn(BrowserThread::IO) && can_post_task_) { | 763 if (!BrowserThread::CurrentlyOn(BrowserThread::IO) && can_post_task_) { |
| 723 // Posts a task to IO thread with the new config, so it can update | 764 // Posts a task to IO thread with the new config, so it can update |
| 724 // |cached_config_|. | 765 // |io_config_|. |
| 725 Task* task = NewRunnableMethod(this, | 766 if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 726 &ProxyConfigServiceImpl::IOSetProxyConfig, | 767 NewRunnableMethod(this, |
| 727 new_config, | 768 &ProxyConfigServiceImpl::IOSetProxyConfig, |
| 728 new_availability); | 769 new_config, |
| 729 if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, task)) | 770 new_availability))) |
| 730 VLOG(1) << "Couldn't post task to IO thread to set new proxy config"; | 771 VLOG(1) << "Couldn't post task to IO thread to set new proxy config"; |
| 731 return; | 772 return; |
| 732 } | 773 } |
| 733 | 774 |
| 734 // Now guaranteed to be on the correct thread. | 775 // Now guaranteed to be on the correct thread. |
| 735 | 776 |
| 736 if (config_availability_ == new_availability && | 777 if (io_config_availability_ == new_availability && |
| 737 cached_config_.Equals(new_config)) | 778 io_config_.Equals(new_config)) |
| 738 return; | 779 return; |
| 739 | 780 |
| 740 VLOG(1) << "Proxy changed: mode=" << new_config.mode | 781 VLOG(1) << "Proxy changed: mode=" << new_config.mode |
| 741 << ", avail=" << new_availability; | 782 << ", avail=" << new_availability; |
| 742 cached_config_ = new_config; | 783 io_config_ = new_config; |
| 743 config_availability_ = new_availability; | 784 io_config_availability_ = new_availability; |
| 744 // Notify observers of new proxy config. | 785 // Notify observers of new proxy config. |
| 745 net::ProxyConfig net_config; | 786 net::ProxyConfig net_config; |
| 746 cached_config_.ToNetProxyConfig(&net_config); | 787 io_config_.ToNetProxyConfig(&net_config); |
| 747 if (net_config.proxy_rules().type != | 788 if (net_config.proxy_rules().type != |
| 748 net::ProxyConfig::ProxyRules::TYPE_NO_RULES) { | 789 net::ProxyConfig::ProxyRules::TYPE_NO_RULES) { |
| 749 net_config.proxy_rules().bypass_rules.AddRuleToBypassLocal(); | 790 net_config.proxy_rules().bypass_rules.AddRuleToBypassLocal(); |
| 750 } | 791 } |
| 751 FOR_EACH_OBSERVER(net::ProxyConfigService::Observer, observers_, | 792 FOR_EACH_OBSERVER(net::ProxyConfigService::Observer, observers_, |
| 752 OnProxyConfigChanged(net_config, config_availability_)); | 793 OnProxyConfigChanged(net_config, io_config_availability_)); |
| 753 } | 794 } |
| 754 | 795 |
| 755 void ProxyConfigServiceImpl::OnActiveNetworkChanged(NetworkLibrary* network_lib, | 796 void ProxyConfigServiceImpl::OnActiveNetworkChanged(NetworkLibrary* network_lib, |
| 756 const Network* active_network) { | 797 const Network* active_network) { |
| 757 std::string new_network; | 798 std::string new_network; |
| 758 if (active_network) | 799 if (active_network) |
| 759 new_network = active_network->service_path(); | 800 new_network = active_network->service_path(); |
| 760 | 801 |
| 761 if (active_network_ == new_network) { // Same active network. | 802 if (active_network_ == new_network) { // Same active network. |
| 762 VLOG(1) << "same active network: " | 803 VLOG(1) << "same active network: " |
| 763 << (new_network.empty() ? "empty" : | 804 << (new_network.empty() ? "empty" : |
| 764 (active_network->name().empty() ? | 805 (active_network->name().empty() ? |
| 765 new_network : active_network->name())); | 806 new_network : active_network->name())); |
| 766 return; | 807 return; |
| 767 } | 808 } |
| 768 | 809 |
| 769 // If there was a previous active network, remove it as observer. | 810 // If there was a previous active network, remove it as observer. |
| 770 if (!active_network_.empty()) | 811 if (!active_network_.empty()) |
| 771 network_lib->RemoveNetworkObserver(active_network_, this); | 812 network_lib->RemoveNetworkObserver(active_network_, this); |
| 772 | 813 |
| 773 active_network_ = new_network; | 814 active_network_ = new_network; |
| 774 | 815 |
| 775 if (active_network_.empty()) { | 816 if (active_network_.empty()) { |
| 776 VLOG(1) << "new active network: empty"; | 817 VLOG(1) << "new active network: empty"; |
| 777 active_config_ = ProxyConfig(); | 818 DetermineEffectiveConfig(active_network, true); |
| 778 IOSetProxyConfig(active_config_, net::ProxyConfigService::CONFIG_UNSET); | |
| 779 return; | 819 return; |
| 780 } | 820 } |
| 781 | 821 |
| 782 VLOG(1) << "new active network: path=" << active_network->service_path() | 822 VLOG(1) << "new active network: path=" << active_network->service_path() |
| 783 << ", name=" << active_network->name() | 823 << ", name=" << active_network->name() |
| 784 << ", profile=" << active_network->profile_path() | 824 << ", profile=" << active_network->profile_path() |
| 785 << ", proxy=" << active_network->proxy_config(); | 825 << ", proxy=" << active_network->proxy_config(); |
| 786 | 826 |
| 787 // Register observer for new network. | 827 // Register observer for new network. |
| 788 network_lib->AddNetworkObserver(active_network_, this); | 828 network_lib->AddNetworkObserver(active_network_, this); |
| 789 | 829 |
| 790 // If necessary, migrate config to flimflam. | 830 // If necessary, migrate config to flimflam. |
| 791 if (active_network->proxy_config().empty() && !device_config_.empty()) { | 831 if (active_network->proxy_config().empty() && !device_config_.empty()) { |
| 792 VLOG(1) << "try migrating device config to " << active_network_; | 832 VLOG(1) << "try migrating device config to " << active_network_; |
| 793 SetProxyConfigForNetwork(active_network_, device_config_, true); | 833 SetProxyConfigForNetwork(active_network_, device_config_, true); |
| 794 } else { | 834 } else { |
| 795 DetermineConfigFromNetwork(active_network); | 835 // Otherwise, determine and activate possibly new effective proxy config. |
| 836 DetermineEffectiveConfig(active_network, true); | |
| 796 } | 837 } |
| 797 } | 838 } |
| 798 | 839 |
| 799 void ProxyConfigServiceImpl::SetProxyConfigForNetwork( | 840 void ProxyConfigServiceImpl::SetProxyConfigForNetwork( |
| 800 const std::string& network_path, const std::string& value, | 841 const std::string& network_path, const std::string& value, |
| 801 bool only_set_if_empty) { | 842 bool only_set_if_empty) { |
| 802 Network* network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath( | 843 Network* network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath( |
| 803 network_path); | 844 network_path); |
| 804 if (!network) { | 845 if (!network) { |
| 805 NOTREACHED() << "can't find requested network " << network_path; | 846 NOTREACHED() << "can't find requested network " << network_path; |
| 806 return; | 847 return; |
| 807 } | 848 } |
| 808 if (!only_set_if_empty || network->proxy_config().empty()) { | 849 if (!only_set_if_empty || network->proxy_config().empty()) { |
| 809 network->SetProxyConfig(value); | 850 network->SetProxyConfig(value); |
| 810 VLOG(1) << "set proxy for " | 851 VLOG(1) << "set proxy for " |
| 811 << (network->name().empty() ? network_path : network->name()) | 852 << (network->name().empty() ? network_path : network->name()) |
| 812 << ", value=" << value; | 853 << ", value=" << value; |
| 813 if (network_path == active_network_) | 854 if (network_path == active_network_) |
| 814 DetermineConfigFromNetwork(network); | 855 DetermineEffectiveConfig(network, true); |
| 815 } | 856 } |
| 816 } | 857 } |
| 817 | 858 |
| 818 void ProxyConfigServiceImpl::DetermineConfigFromNetwork( | 859 void ProxyConfigServiceImpl::DetermineEffectiveConfig(const Network* network, |
| 819 const Network* network) { | 860 bool activate) { |
| 820 active_config_ = ProxyConfig(); // Default is DIRECT mode (i.e. no proxy). | 861 // Get prefs proxy config. |
| 821 net::ProxyConfigService::ConfigAvailability available = | 862 net::ProxyConfig pref_config; |
| 863 PrefProxyConfigTracker::ConfigSource pref_source = | |
| 864 PrefProxyConfigTracker::CONFIG_SOURCE_UNSET; | |
| 865 PrefProxyConfigTracker::ConfigState pref_state = | |
| 866 GetProxyConfigTracker()->UIGetProxyConfig(&pref_config, &pref_source); | |
| 867 | |
| 868 // Get network proxy config if available. | |
| 869 net::ProxyConfig network_config; | |
| 870 net::ProxyConfigService::ConfigAvailability network_availability = | |
| 822 net::ProxyConfigService::CONFIG_UNSET; | 871 net::ProxyConfigService::CONFIG_UNSET; |
| 823 // If network is shared but user doesn't use shared proxies, use direct mode. | 872 bool ignore_proxy = activate; |
| 824 if (network->profile_type() == PROFILE_SHARED && !use_shared_proxies_) { | 873 if (network) { |
| 825 VLOG(1) << "shared network and !use_shared_proxies, using direct"; | 874 // If we're activating proxy, ignore proxy if necessary; |
| 826 available = net::ProxyConfigService::CONFIG_VALID; | 875 // otherwise, for ui, get actual proxy to show user. |
| 827 } else if (!network->proxy_config().empty() && | 876 ignore_proxy = activate ? IgnoreProxy(network) : false; |
| 828 active_config_.DeserializeForNetwork(network->proxy_config())) { | 877 // If network is shared but use-shared-proxies is off, use direct mode. |
| 829 // Network is private or shared with user using shared proxies. | 878 if (ignore_proxy) { |
| 830 VLOG(1) << "using network proxy: " << network->proxy_config(); | 879 VLOG(1) << "shared network and !use_shared_proxies, using direct"; |
| 831 available = net::ProxyConfigService::CONFIG_VALID; | 880 network_availability = net::ProxyConfigService::CONFIG_VALID; |
| 881 } else if (!network->proxy_config().empty()) { | |
| 882 // Network is private or shared with user using shared proxies. | |
| 883 JSONStringValueSerializer serializer(network->proxy_config()); | |
| 884 scoped_ptr<Value> value(serializer.Deserialize(NULL, NULL)); | |
| 885 if (value.get() && value->GetType() == Value::TYPE_DICTIONARY) { | |
| 886 DictionaryValue* dict = static_cast<DictionaryValue*>(value.get()); | |
| 887 ProxyConfigDictionary proxy_dict(dict); | |
| 888 if (PrefProxyConfigTracker::PrefConfigToNetConfig(proxy_dict, | |
| 889 &network_config)) { | |
| 890 VLOG(1) << "using network proxy: " << network->proxy_config(); | |
| 891 network_availability = net::ProxyConfigService::CONFIG_VALID; | |
| 892 } | |
| 893 } | |
| 894 } | |
| 832 } | 895 } |
| 833 IOSetProxyConfig(active_config_, available); | 896 |
| 897 // Determine effective proxy config, either from prefs or network. | |
| 898 net::ProxyConfig effective_config; | |
| 899 PrefProxyConfigTracker::ConfigSource effective_config_source; | |
| 900 net::ProxyConfigService::ConfigAvailability effective_availability = | |
| 901 GetEffectiveProxyConfig(pref_state, pref_config, pref_source, | |
| 902 network_availability, network_config, | |
| 903 ignore_proxy, | |
| 904 &effective_config, &effective_config_source); | |
| 905 | |
| 906 // Store effective config into the config indicated by |activate|. | |
| 907 ProxyConfig* config_to_set = activate ? &active_config_ : ¤t_ui_config_; | |
| 908 *config_to_set = ProxyConfig(); // Reset to default i.e. DIRECT (no proxy). | |
| 909 config_to_set->FromNetProxyConfig(effective_config); | |
| 910 config_to_set->source = effective_config_source; | |
| 911 if (pref_state == PrefProxyConfigTracker::CONFIG_PRESENT) | |
| 912 config_to_set->user_modifiable = false; | |
| 913 else | |
| 914 config_to_set->user_modifiable = !network || !IgnoreProxy(network); | |
| 915 | |
| 916 // If necessary, cache effective config in IO thread and activate it. | |
| 917 if (activate) | |
| 918 IOSetProxyConfig(*config_to_set, effective_availability); | |
| 834 } | 919 } |
| 835 | 920 |
| 836 void ProxyConfigServiceImpl::SetCurrentNetworkName(const Network* network) { | 921 void ProxyConfigServiceImpl::OnUISetCurrentNetwork(const Network* network) { |
| 837 if (!network) { | 922 if (!network) { |
| 838 if (testing_) | 923 if (testing_) { |
| 924 current_ui_config_ = active_config_; | |
| 839 current_ui_network_name_ = "test"; | 925 current_ui_network_name_ = "test"; |
| 926 } | |
| 840 return; | 927 return; |
| 841 } | 928 } |
| 842 if (network->name().empty() && network->type() == chromeos::TYPE_ETHERNET) { | 929 if (network->name().empty() && network->type() == chromeos::TYPE_ETHERNET) { |
| 843 current_ui_network_name_ = l10n_util::GetStringUTF8( | 930 current_ui_network_name_ = l10n_util::GetStringUTF8( |
| 844 IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET); | 931 IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET); |
| 845 } else { | 932 } else { |
| 846 current_ui_network_name_ = network->name(); | 933 current_ui_network_name_ = network->name(); |
| 847 } | 934 } |
| 935 DetermineEffectiveConfig(network, false); | |
| 936 VLOG(1) << "current ui network: " | |
| 937 << (current_ui_network_name_.empty() ? | |
| 938 current_ui_network_ : current_ui_network_name_) | |
| 939 << ", proxy mode: " << current_ui_config_.mode | |
| 940 << ", " << SourceToString(current_ui_config_.source) | |
| 941 << ", modifiable:" << current_ui_config_.user_modifiable; | |
| 942 } | |
| 943 | |
| 944 void ProxyConfigServiceImpl::ResetUICache() { | |
| 945 current_ui_network_.clear(); | |
| 946 current_ui_network_name_.clear(); | |
| 947 current_ui_config_ = ProxyConfig(); | |
| 948 } | |
| 949 | |
| 950 PrefProxyConfigTracker* ProxyConfigServiceImpl::GetProxyConfigTracker() { | |
| 951 Profile* profile = current_ui_profile_ ? current_ui_profile_ : | |
| 952 ProfileManager::GetDefaultProfile(); | |
| 953 return profile->GetProxyConfigTracker(); | |
| 848 } | 954 } |
| 849 | 955 |
| 850 void ProxyConfigServiceImpl::CheckCurrentlyOnIOThread() { | 956 void ProxyConfigServiceImpl::CheckCurrentlyOnIOThread() { |
| 851 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 957 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 852 } | 958 } |
| 853 | 959 |
| 854 void ProxyConfigServiceImpl::CheckCurrentlyOnUIThread() { | 960 void ProxyConfigServiceImpl::CheckCurrentlyOnUIThread() { |
| 855 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 961 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 856 } | 962 } |
| 857 | 963 |
| 858 } // namespace chromeos | 964 } // namespace chromeos |
| OLD | NEW |