Index: net/proxy/proxy_config_service_mac.cc |
diff --git a/net/proxy/proxy_config_service_mac.cc b/net/proxy/proxy_config_service_mac.cc |
deleted file mode 100644 |
index 6d192538d6d5e4b65231bf24248d37b2d945383f..0000000000000000000000000000000000000000 |
--- a/net/proxy/proxy_config_service_mac.cc |
+++ /dev/null |
@@ -1,284 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/proxy/proxy_config_service_mac.h" |
- |
-#include <CoreFoundation/CoreFoundation.h> |
-#include <SystemConfiguration/SystemConfiguration.h> |
- |
-#include "base/bind.h" |
-#include "base/logging.h" |
-#include "base/mac/foundation_util.h" |
-#include "base/mac/scoped_cftyperef.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/strings/sys_string_conversions.h" |
-#include "net/base/net_errors.h" |
-#include "net/proxy/proxy_config.h" |
-#include "net/proxy/proxy_info.h" |
-#include "net/proxy/proxy_server.h" |
- |
-namespace net { |
- |
-namespace { |
- |
-// Utility function to pull out a boolean value from a dictionary and return it, |
-// returning a default value if the key is not present. |
-bool GetBoolFromDictionary(CFDictionaryRef dict, |
- CFStringRef key, |
- bool default_value) { |
- CFNumberRef number = base::mac::GetValueFromDictionary<CFNumberRef>(dict, |
- key); |
- if (!number) |
- return default_value; |
- |
- int int_value; |
- if (CFNumberGetValue(number, kCFNumberIntType, &int_value)) |
- return int_value; |
- else |
- return default_value; |
-} |
- |
-void GetCurrentProxyConfig(ProxyConfig* config) { |
- base::ScopedCFTypeRef<CFDictionaryRef> config_dict( |
- SCDynamicStoreCopyProxies(NULL)); |
- DCHECK(config_dict); |
- |
- // auto-detect |
- |
- // There appears to be no UI for this configuration option, and we're not sure |
- // if Apple's proxy code even takes it into account. But the constant is in |
- // the header file so we'll use it. |
- config->set_auto_detect( |
- GetBoolFromDictionary(config_dict.get(), |
- kSCPropNetProxiesProxyAutoDiscoveryEnable, |
- false)); |
- |
- // PAC file |
- |
- if (GetBoolFromDictionary(config_dict.get(), |
- kSCPropNetProxiesProxyAutoConfigEnable, |
- false)) { |
- CFStringRef pac_url_ref = base::mac::GetValueFromDictionary<CFStringRef>( |
- config_dict.get(), kSCPropNetProxiesProxyAutoConfigURLString); |
- if (pac_url_ref) |
- config->set_pac_url(GURL(base::SysCFStringRefToUTF8(pac_url_ref))); |
- } |
- |
- // proxies (for now ftp, http, https, and SOCKS) |
- |
- if (GetBoolFromDictionary(config_dict.get(), |
- kSCPropNetProxiesFTPEnable, |
- false)) { |
- ProxyServer proxy_server = |
- ProxyServer::FromDictionary(ProxyServer::SCHEME_HTTP, |
- config_dict.get(), |
- kSCPropNetProxiesFTPProxy, |
- kSCPropNetProxiesFTPPort); |
- if (proxy_server.is_valid()) { |
- config->proxy_rules().type = |
- ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME; |
- config->proxy_rules().proxies_for_ftp.SetSingleProxyServer(proxy_server); |
- } |
- } |
- if (GetBoolFromDictionary(config_dict.get(), |
- kSCPropNetProxiesHTTPEnable, |
- false)) { |
- ProxyServer proxy_server = |
- ProxyServer::FromDictionary(ProxyServer::SCHEME_HTTP, |
- config_dict.get(), |
- kSCPropNetProxiesHTTPProxy, |
- kSCPropNetProxiesHTTPPort); |
- if (proxy_server.is_valid()) { |
- config->proxy_rules().type = |
- ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME; |
- config->proxy_rules().proxies_for_http.SetSingleProxyServer(proxy_server); |
- } |
- } |
- if (GetBoolFromDictionary(config_dict.get(), |
- kSCPropNetProxiesHTTPSEnable, |
- false)) { |
- ProxyServer proxy_server = |
- ProxyServer::FromDictionary(ProxyServer::SCHEME_HTTP, |
- config_dict.get(), |
- kSCPropNetProxiesHTTPSProxy, |
- kSCPropNetProxiesHTTPSPort); |
- if (proxy_server.is_valid()) { |
- config->proxy_rules().type = |
- ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME; |
- config->proxy_rules().proxies_for_https. |
- SetSingleProxyServer(proxy_server); |
- } |
- } |
- if (GetBoolFromDictionary(config_dict.get(), |
- kSCPropNetProxiesSOCKSEnable, |
- false)) { |
- ProxyServer proxy_server = |
- ProxyServer::FromDictionary(ProxyServer::SCHEME_SOCKS5, |
- config_dict.get(), |
- kSCPropNetProxiesSOCKSProxy, |
- kSCPropNetProxiesSOCKSPort); |
- if (proxy_server.is_valid()) { |
- config->proxy_rules().type = |
- ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME; |
- config->proxy_rules().fallback_proxies.SetSingleProxyServer(proxy_server); |
- } |
- } |
- |
- // proxy bypass list |
- |
- CFArrayRef bypass_array_ref = base::mac::GetValueFromDictionary<CFArrayRef>( |
- config_dict.get(), kSCPropNetProxiesExceptionsList); |
- if (bypass_array_ref) { |
- CFIndex bypass_array_count = CFArrayGetCount(bypass_array_ref); |
- for (CFIndex i = 0; i < bypass_array_count; ++i) { |
- CFStringRef bypass_item_ref = base::mac::CFCast<CFStringRef>( |
- CFArrayGetValueAtIndex(bypass_array_ref, i)); |
- if (!bypass_item_ref) { |
- LOG(WARNING) << "Expected value for item " << i |
- << " in the kSCPropNetProxiesExceptionsList" |
- " to be a CFStringRef but it was not"; |
- |
- } else { |
- config->proxy_rules().bypass_rules.AddRuleFromString( |
- base::SysCFStringRefToUTF8(bypass_item_ref)); |
- } |
- } |
- } |
- |
- // proxy bypass boolean |
- |
- if (GetBoolFromDictionary(config_dict.get(), |
- kSCPropNetProxiesExcludeSimpleHostnames, |
- false)) { |
- config->proxy_rules().bypass_rules.AddRuleToBypassLocal(); |
- } |
- |
- // Source |
- config->set_source(PROXY_CONFIG_SOURCE_SYSTEM); |
-} |
- |
-} // namespace |
- |
-// Reference-counted helper for posting a task to |
-// ProxyConfigServiceMac::OnProxyConfigChanged between the notifier and IO |
-// thread. This helper object may outlive the ProxyConfigServiceMac. |
-class ProxyConfigServiceMac::Helper |
- : public base::RefCountedThreadSafe<ProxyConfigServiceMac::Helper> { |
- public: |
- explicit Helper(ProxyConfigServiceMac* parent) : parent_(parent) { |
- DCHECK(parent); |
- } |
- |
- // Called when the parent is destroyed. |
- void Orphan() { |
- parent_ = NULL; |
- } |
- |
- void OnProxyConfigChanged(const ProxyConfig& new_config) { |
- if (parent_) |
- parent_->OnProxyConfigChanged(new_config); |
- } |
- |
- private: |
- friend class base::RefCountedThreadSafe<Helper>; |
- ~Helper() {} |
- |
- ProxyConfigServiceMac* parent_; |
-}; |
- |
-void ProxyConfigServiceMac::Forwarder::SetDynamicStoreNotificationKeys( |
- SCDynamicStoreRef store) { |
- proxy_config_service_->SetDynamicStoreNotificationKeys(store); |
-} |
- |
-void ProxyConfigServiceMac::Forwarder::OnNetworkConfigChange( |
- CFArrayRef changed_keys) { |
- proxy_config_service_->OnNetworkConfigChange(changed_keys); |
-} |
- |
-ProxyConfigServiceMac::ProxyConfigServiceMac( |
- const scoped_refptr<base::SingleThreadTaskRunner>& io_thread_task_runner) |
- : forwarder_(this), |
- has_fetched_config_(false), |
- helper_(new Helper(this)), |
- io_thread_task_runner_(io_thread_task_runner) { |
- DCHECK(io_thread_task_runner_.get()); |
- config_watcher_.reset(new NetworkConfigWatcherMac(&forwarder_)); |
-} |
- |
-ProxyConfigServiceMac::~ProxyConfigServiceMac() { |
- DCHECK(io_thread_task_runner_->BelongsToCurrentThread()); |
- // Delete the config_watcher_ to ensure the notifier thread finishes before |
- // this object is destroyed. |
- config_watcher_.reset(); |
- helper_->Orphan(); |
-} |
- |
-void ProxyConfigServiceMac::AddObserver(Observer* observer) { |
- DCHECK(io_thread_task_runner_->BelongsToCurrentThread()); |
- observers_.AddObserver(observer); |
-} |
- |
-void ProxyConfigServiceMac::RemoveObserver(Observer* observer) { |
- DCHECK(io_thread_task_runner_->BelongsToCurrentThread()); |
- observers_.RemoveObserver(observer); |
-} |
- |
-net::ProxyConfigService::ConfigAvailability |
- ProxyConfigServiceMac::GetLatestProxyConfig(ProxyConfig* config) { |
- DCHECK(io_thread_task_runner_->BelongsToCurrentThread()); |
- |
- // Lazy-initialize by fetching the proxy setting from this thread. |
- if (!has_fetched_config_) { |
- GetCurrentProxyConfig(&last_config_fetched_); |
- has_fetched_config_ = true; |
- } |
- |
- *config = last_config_fetched_; |
- return has_fetched_config_ ? CONFIG_VALID : CONFIG_PENDING; |
-} |
- |
-void ProxyConfigServiceMac::SetDynamicStoreNotificationKeys( |
- SCDynamicStoreRef store) { |
- // Called on notifier thread. |
- |
- CFStringRef proxies_key = SCDynamicStoreKeyCreateProxies(NULL); |
- CFArrayRef key_array = CFArrayCreate( |
- NULL, (const void **)(&proxies_key), 1, &kCFTypeArrayCallBacks); |
- |
- bool ret = SCDynamicStoreSetNotificationKeys(store, key_array, NULL); |
- // TODO(willchan): Figure out a proper way to handle this rather than crash. |
- CHECK(ret); |
- |
- CFRelease(key_array); |
- CFRelease(proxies_key); |
-} |
- |
-void ProxyConfigServiceMac::OnNetworkConfigChange(CFArrayRef changed_keys) { |
- // Called on notifier thread. |
- |
- // Fetch the new system proxy configuration. |
- ProxyConfig new_config; |
- GetCurrentProxyConfig(&new_config); |
- |
- // Call OnProxyConfigChanged() on the IO thread to notify our observers. |
- io_thread_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&Helper::OnProxyConfigChanged, helper_.get(), new_config)); |
-} |
- |
-void ProxyConfigServiceMac::OnProxyConfigChanged( |
- const ProxyConfig& new_config) { |
- DCHECK(io_thread_task_runner_->BelongsToCurrentThread()); |
- |
- // Keep track of the last value we have seen. |
- has_fetched_config_ = true; |
- last_config_fetched_ = new_config; |
- |
- // Notify all the observers. |
- FOR_EACH_OBSERVER(Observer, observers_, |
- OnProxyConfigChanged(new_config, CONFIG_VALID)); |
-} |
- |
-} // namespace net |