diff options
36 files changed, 165 insertions, 108 deletions
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc index 82e2f50..da4bb20 100644 --- a/chrome/browser/io_thread.cc +++ b/chrome/browser/io_thread.cc @@ -15,11 +15,13 @@ #include "net/base/host_cache.h" #include "net/base/host_resolver.h" #include "net/base/host_resolver_impl.h" +#include "net/base/network_change_notifier.h" #include "net/url_request/url_request.h" namespace { -net::HostResolver* CreateGlobalHostResolver() { +net::HostResolver* CreateGlobalHostResolver( + net::NetworkChangeNotifier* network_change_notifier) { net::HostResolver* global_host_resolver = NULL; const CommandLine& command_line = *CommandLine::ForCurrentProcess(); @@ -31,7 +33,8 @@ net::HostResolver* CreateGlobalHostResolver() { command_line.GetSwitchValueASCII(switches::kFixedHost); global_host_resolver = new net::FixedHostResolver(host); } else { - global_host_resolver = net::CreateSystemHostResolver(); + global_host_resolver = + net::CreateSystemHostResolver(network_change_notifier); if (command_line.HasSwitch(switches::kDisableIPv6)) global_host_resolver->SetDefaultAddressFamily(net::ADDRESS_FAMILY_IPV4); @@ -52,7 +55,7 @@ struct RunnableMethodTraits<IOThread> { IOThread::IOThread() : BrowserProcessSubThread(ChromeThread::IO), - host_resolver_(NULL), + globals_(NULL), prefetch_observer_(NULL), dns_master_(NULL) {} @@ -60,11 +63,12 @@ IOThread::~IOThread() { // We cannot rely on our base class to stop the thread since we want our // CleanUp function to run. Stop(); + DCHECK(!globals_); } -net::HostResolver* IOThread::host_resolver() { +IOThread::Globals* IOThread::globals() { DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); - return host_resolver_; + return globals_; } void IOThread::InitDnsMaster( @@ -95,9 +99,13 @@ void IOThread::ChangedToOnTheRecord() { void IOThread::Init() { BrowserProcessSubThread::Init(); - DCHECK(!host_resolver_); - host_resolver_ = CreateGlobalHostResolver(); - host_resolver_->AddRef(); + DCHECK(!globals_); + globals_ = new Globals; + + globals_->network_change_notifier.reset( + net::NetworkChangeNotifier::CreateDefaultNetworkChangeNotifier()); + globals_->host_resolver = + CreateGlobalHostResolver(globals_->network_change_notifier.get()); } void IOThread::CleanUp() { @@ -116,18 +124,16 @@ void IOThread::CleanUp() { // Not initialized in Init(). May not be initialized. if (prefetch_observer_) { - host_resolver_->RemoveObserver(prefetch_observer_); + globals_->host_resolver->RemoveObserver(prefetch_observer_); delete prefetch_observer_; prefetch_observer_ = NULL; } // TODO(eroman): temp hack for http://crbug.com/15513 - host_resolver_->Shutdown(); + globals_->host_resolver->Shutdown(); - // TODO(willchan): Stop reference counting HostResolver. It's owned by - // IOThread now. - host_resolver_->Release(); - host_resolver_ = NULL; + delete globals_; + globals_ = NULL; // URLFetcher and URLRequest instances must NOT outlive the IO thread. // @@ -157,12 +163,12 @@ void IOThread::InitDnsMasterOnIOThread( chrome_browser_net::EnableDnsPrefetch(prefetching_enabled); dns_master_ = new chrome_browser_net::DnsMaster( - host_resolver_, max_queue_delay, max_concurrent); + globals_->host_resolver, max_queue_delay, max_concurrent); dns_master_->AddRef(); DCHECK(!prefetch_observer_); prefetch_observer_ = chrome_browser_net::CreatePrefetchObserver(); - host_resolver_->AddObserver(prefetch_observer_); + globals_->host_resolver->AddObserver(prefetch_observer_); FinalizeDnsPrefetchInitialization( dns_master_, prefetch_observer_, hostnames_to_prefetch, referral_list); @@ -178,9 +184,9 @@ void IOThread::ChangedToOnTheRecordOnIOThread() { // Clear the host cache to avoid showing entries from the OTR session // in about:net-internals. - if (host_resolver_->IsHostResolverImpl()) { + if (globals_->host_resolver->IsHostResolverImpl()) { net::HostCache* host_cache = static_cast<net::HostResolverImpl*>( - host_resolver_)->cache(); + globals_->host_resolver.get())->cache(); if (host_cache) host_cache->clear(); } diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h index f93f748..373d118 100644 --- a/chrome/browser/io_thread.h +++ b/chrome/browser/io_thread.h @@ -6,6 +6,8 @@ #define CHROME_BROWSER_IO_THREAD_H_ #include "base/basictypes.h" +#include "base/ref_counted.h" +#include "base/scoped_ptr.h" #include "base/task.h" #include "chrome/browser/browser_process_sub_thread.h" #include "chrome/common/net/dns.h" @@ -17,13 +19,25 @@ namespace chrome_browser_net { class DnsMaster; } // namespace chrome_browser_net +namespace net { +class NetworkChangeNotifier; +} // namespace net + class IOThread : public BrowserProcessSubThread { public: + struct Globals { + scoped_ptr<net::NetworkChangeNotifier> network_change_notifier; + // TODO(willchan): Stop reference counting HostResolver. It's owned by + // IOThread now. + scoped_refptr<net::HostResolver> host_resolver; + }; + IOThread(); virtual ~IOThread(); - net::HostResolver* host_resolver(); + // Can only be called on the IO thread. + Globals* globals(); // Initializes the DnsMaster. |prefetching_enabled| indicates whether or // not dns prefetching should be enabled. This should be called by the UI @@ -56,10 +70,15 @@ class IOThread : public BrowserProcessSubThread { // These member variables are basically global, but their lifetimes are tied // to the IOThread. IOThread owns them all, despite not using scoped_ptr. // This is because the destructor of IOThread runs on the wrong thread. All - // member variables should be deleted in CleanUp(). Most of these will be - // initialized in Init(). + // member variables should be deleted in CleanUp(). + + // These member variables are initialized in Init() and do not change for the + // lifetime of the IO thread. + + Globals* globals_; - net::HostResolver* host_resolver_; + // These member variables are initialized by a task posted to the IO thread, + // which gets posted by calling certain member functions of IOThread. net::HostResolver::Observer* prefetch_observer_; chrome_browser_net::DnsMaster* dns_master_; diff --git a/chrome/browser/net/chrome_url_request_context.cc b/chrome/browser/net/chrome_url_request_context.cc index 8013800..a8349e8 100644 --- a/chrome/browser/net/chrome_url_request_context.cc +++ b/chrome/browser/net/chrome_url_request_context.cc @@ -141,7 +141,7 @@ ChromeURLRequestContext* FactoryForOriginal::Create() { ApplyProfileParametersToContext(context); // Global host resolver for the context. - context->set_host_resolver(io_thread()->host_resolver()); + context->set_host_resolver(io_thread()->globals()->host_resolver); const CommandLine& command_line = *CommandLine::ForCurrentProcess(); @@ -152,7 +152,8 @@ ChromeURLRequestContext* FactoryForOriginal::Create() { MessageLoop::current() /*io_loop*/)); net::HttpCache* cache = - new net::HttpCache(context->host_resolver(), + new net::HttpCache(io_thread()->globals()->network_change_notifier.get(), + context->host_resolver(), context->proxy_service(), context->ssl_config_service(), disk_cache_path_, cache_size_); @@ -262,7 +263,8 @@ ChromeURLRequestContext* FactoryForOffTheRecord::Create() { context->set_proxy_service(original_context->proxy_service()); net::HttpCache* cache = - new net::HttpCache(context->host_resolver(), context->proxy_service(), + new net::HttpCache(io_thread()->globals()->network_change_notifier.get(), + context->host_resolver(), context->proxy_service(), context->ssl_config_service(), 0); context->set_cookie_store(new net::CookieMonster); context->set_cookie_policy( @@ -371,10 +373,12 @@ ChromeURLRequestContext* FactoryForMedia::Create() { } else { // If original HttpCache doesn't exist, simply construct one with a whole // new set of network stack. - cache = new net::HttpCache(main_context->host_resolver(), - main_context->proxy_service(), - main_context->ssl_config_service(), - disk_cache_path_, cache_size_); + cache = new net::HttpCache( + io_thread()->globals()->network_change_notifier.get(), + main_context->host_resolver(), + main_context->proxy_service(), + main_context->ssl_config_service(), + disk_cache_path_, cache_size_); } if (CommandLine::ForCurrentProcess()->HasSwitch( diff --git a/chrome/browser/net/chrome_url_request_context.h b/chrome/browser/net/chrome_url_request_context.h index f52029e..99aed21 100644 --- a/chrome/browser/net/chrome_url_request_context.h +++ b/chrome/browser/net/chrome_url_request_context.h @@ -10,6 +10,7 @@ #include "net/base/cookie_policy.h" #include "chrome/browser/host_content_settings_map.h" #include "chrome/browser/host_zoom_map.h" +#include "chrome/browser/io_thread.h" #include "chrome/browser/privacy_blacklist/blacklist.h" #include "chrome/browser/net/chrome_cookie_policy.h" #include "chrome/browser/net/url_request_context_getter.h" @@ -28,7 +29,6 @@ class ProxyConfig; class ChromeURLRequestContext; class ChromeURLRequestContextFactory; -class IOThread; // Subclass of URLRequestContext which can be used to store extra information // for requests. diff --git a/chrome_frame/test/test_server_test.cc b/chrome_frame/test/test_server_test.cc index 4bd139e..902eb0c 100644 --- a/chrome_frame/test/test_server_test.cc +++ b/chrome_frame/test/test_server_test.cc @@ -60,12 +60,13 @@ class ScopedInternet { class URLRequestTestContext : public URLRequestContext { public: URLRequestTestContext() { - host_resolver_ = net::CreateSystemHostResolver(); + host_resolver_ = net::CreateSystemHostResolver(NULL); proxy_service_ = net::ProxyService::CreateNull(); ssl_config_service_ = new net::SSLConfigServiceDefaults; http_transaction_factory_ = new net::HttpCache( - net::HttpNetworkLayer::CreateFactory(host_resolver_, proxy_service_, + net::HttpNetworkLayer::CreateFactory(NULL, host_resolver_, + proxy_service_, ssl_config_service_), disk_cache::CreateInMemoryCacheBackend(0)); // In-memory cookie store. diff --git a/net/base/host_resolver.h b/net/base/host_resolver.h index 6ce3c67..32706a0 100644 --- a/net/base/host_resolver.h +++ b/net/base/host_resolver.h @@ -20,6 +20,7 @@ namespace net { class AddressList; class HostCache; class LoadLog; +class NetworkChangeNotifier; // This class represents the task of resolving hostnames (or IP address // literal) to an AddressList object. @@ -219,7 +220,10 @@ class SingleRequestHostResolver { // Creates a HostResolver implementation that queries the underlying system. // (Except if a unit-test has changed the global HostResolverProc using // ScopedHostResolverProc to intercept requests to the system). -HostResolver* CreateSystemHostResolver(); +// |network_change_notifier| must outlive HostResolver. It can optionally be +// NULL, in which case HostResolver will not respond to network changes. +HostResolver* CreateSystemHostResolver( + NetworkChangeNotifier* network_change_notifier); } // namespace net diff --git a/net/base/host_resolver_impl.cc b/net/base/host_resolver_impl.cc index b654ad3..94c3857 100644 --- a/net/base/host_resolver_impl.cc +++ b/net/base/host_resolver_impl.cc @@ -43,14 +43,15 @@ HostCache* CreateDefaultCache() { } // anonymous namespace -HostResolver* CreateSystemHostResolver() { +HostResolver* CreateSystemHostResolver( + NetworkChangeNotifier* network_change_notifier) { // Maximum of 50 concurrent threads. // TODO(eroman): Adjust this, do some A/B experiments. static const size_t kMaxJobs = 50u; // TODO(willchan): Pass in the NetworkChangeNotifier. HostResolverImpl* resolver = new HostResolverImpl( - NULL, CreateDefaultCache(), NULL, kMaxJobs); + NULL, CreateDefaultCache(), network_change_notifier, kMaxJobs); return resolver; } @@ -525,7 +526,7 @@ class HostResolverImpl::JobPool { HostResolverImpl::HostResolverImpl( HostResolverProc* resolver_proc, HostCache* cache, - const scoped_refptr<NetworkChangeNotifier>& network_change_notifier, + NetworkChangeNotifier* network_change_notifier, size_t max_jobs) : cache_(cache), max_jobs_(max_jobs), diff --git a/net/base/host_resolver_impl.h b/net/base/host_resolver_impl.h index f3684b8..feedc05 100644 --- a/net/base/host_resolver_impl.h +++ b/net/base/host_resolver_impl.h @@ -69,12 +69,13 @@ class HostResolverImpl : public HostResolver, // thread-safe since it is run from multiple worker threads. If // |resolver_proc| is NULL then the default host resolver procedure is // used (which is SystemHostResolverProc except if overridden). - // + // |notifier| must outlive HostResolverImpl. It can optionally be NULL, in + // which case HostResolverImpl will not respond to network changes. // |max_jobs| specifies the maximum number of threads that the host resolver // will use. Use SetPoolConstraints() to specify finer-grain settings. HostResolverImpl(HostResolverProc* resolver_proc, HostCache* cache, - const scoped_refptr<NetworkChangeNotifier>& notifier, + NetworkChangeNotifier* notifier, size_t max_jobs); // HostResolver methods: @@ -236,7 +237,7 @@ class HostResolverImpl : public HostResolver, // TODO(eroman): temp hack for http://crbug.com/15513 bool shutdown_; - const scoped_refptr<NetworkChangeNotifier> network_change_notifier_; + NetworkChangeNotifier* const network_change_notifier_; scoped_refptr<RequestsTrace> requests_trace_; diff --git a/net/base/host_resolver_impl_unittest.cc b/net/base/host_resolver_impl_unittest.cc index f3d350c..8ca58f0 100644 --- a/net/base/host_resolver_impl_unittest.cc +++ b/net/base/host_resolver_impl_unittest.cc @@ -978,11 +978,10 @@ TEST_F(HostResolverImplTest, CancellationObserver) { // Test that IP address changes flush the cache. TEST_F(HostResolverImplTest, FlushCacheOnIPAddressChange) { - scoped_refptr<MockNetworkChangeNotifier> mock_network_change_notifier( - new MockNetworkChangeNotifier); + MockNetworkChangeNotifier mock_network_change_notifier; scoped_refptr<HostResolver> host_resolver( new HostResolverImpl(NULL, CreateDefaultCache(), - mock_network_change_notifier, + &mock_network_change_notifier, kMaxJobs)); AddressList addrlist; @@ -1000,7 +999,7 @@ TEST_F(HostResolverImplTest, FlushCacheOnIPAddressChange) { ASSERT_EQ(OK, rv); // Should complete synchronously. // Flush cache by triggering an IP address change. - mock_network_change_notifier->NotifyIPAddressChange(); + mock_network_change_notifier.NotifyIPAddressChange(); // Resolve "host1" again -- this time it won't be served from cache, so it // will complete asynchronously. diff --git a/net/base/network_change_notifier.cc b/net/base/network_change_notifier.cc index 241f419..aeca2ab 100644 --- a/net/base/network_change_notifier.cc +++ b/net/base/network_change_notifier.cc @@ -15,8 +15,8 @@ namespace net { // static -scoped_refptr<NetworkChangeNotifier> - NetworkChangeNotifier::CreateDefaultNetworkChangeNotifier() { +NetworkChangeNotifier* +NetworkChangeNotifier::CreateDefaultNetworkChangeNotifier() { #if defined(OS_WIN) return new NetworkChangeNotifierWin(); #elif defined(OS_LINUX) diff --git a/net/base/network_change_notifier.h b/net/base/network_change_notifier.h index d66830a..67d57ff 100644 --- a/net/base/network_change_notifier.h +++ b/net/base/network_change_notifier.h @@ -6,13 +6,13 @@ #define NET_BASE_NETWORK_CHANGE_NOTIFIER_H_ #include "base/basictypes.h" -#include "base/ref_counted.h" +#include "base/non_thread_safe.h" namespace net { // NetworkChangeNotifier monitors the system for network changes, and notifies // observers on those events. -class NetworkChangeNotifier : public base::RefCounted<NetworkChangeNotifier> { +class NetworkChangeNotifier : public NonThreadSafe { public: class Observer { public: @@ -30,6 +30,7 @@ class NetworkChangeNotifier : public base::RefCounted<NetworkChangeNotifier> { }; NetworkChangeNotifier() {} + virtual ~NetworkChangeNotifier() {} // These functions add and remove observers to/from the NetworkChangeNotifier. // Each call to AddObserver() must be matched with a corresponding call to @@ -40,12 +41,7 @@ class NetworkChangeNotifier : public base::RefCounted<NetworkChangeNotifier> { virtual void RemoveObserver(Observer* observer) = 0; // This will create the platform specific default NetworkChangeNotifier. - static scoped_refptr<NetworkChangeNotifier> - CreateDefaultNetworkChangeNotifier(); - - protected: - friend class base::RefCounted<NetworkChangeNotifier>; - virtual ~NetworkChangeNotifier() {} + static NetworkChangeNotifier* CreateDefaultNetworkChangeNotifier(); private: DISALLOW_COPY_AND_ASSIGN(NetworkChangeNotifier); diff --git a/net/flip/flip_network_transaction_unittest.cc b/net/flip/flip_network_transaction_unittest.cc index 47c54c2..af6ca0e 100644 --- a/net/flip/flip_network_transaction_unittest.cc +++ b/net/flip/flip_network_transaction_unittest.cc @@ -71,7 +71,8 @@ ProxyService* CreateFixedProxyService(const std::string& proxy) { HttpNetworkSession* CreateSession(SessionDependencies* session_deps) { - return new HttpNetworkSession(session_deps->host_resolver, + return new HttpNetworkSession(NULL, + session_deps->host_resolver, session_deps->proxy_service, &session_deps->socket_factory, session_deps->ssl_config_service, diff --git a/net/flip/flip_stream_unittest.cc b/net/flip/flip_stream_unittest.cc index 643aa60..5b3064a 100644 --- a/net/flip/flip_stream_unittest.cc +++ b/net/flip/flip_stream_unittest.cc @@ -68,7 +68,8 @@ class SessionDependencies { }; HttpNetworkSession* CreateSession(SessionDependencies* session_deps) { - return new HttpNetworkSession(session_deps->host_resolver, + return new HttpNetworkSession(NULL, + session_deps->host_resolver, session_deps->proxy_service, &session_deps->socket_factory, session_deps->ssl_config_service, diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc index c99caca..b7989d1 100644 --- a/net/http/http_cache.cc +++ b/net/http/http_cache.cc @@ -124,7 +124,8 @@ class HttpCache::BackendCallback : public CallbackRunner<Tuple1<int> > { //----------------------------------------------------------------------------- -HttpCache::HttpCache(HostResolver* host_resolver, +HttpCache::HttpCache(NetworkChangeNotifier* network_change_notifier, + HostResolver* host_resolver, ProxyService* proxy_service, SSLConfigService* ssl_config_service, const FilePath& cache_dir, @@ -133,7 +134,8 @@ HttpCache::HttpCache(HostResolver* host_resolver, mode_(NORMAL), type_(DISK_CACHE), network_layer_(HttpNetworkLayer::CreateFactory( - host_resolver, proxy_service, ssl_config_service)), + network_change_notifier, host_resolver, proxy_service, + ssl_config_service)), ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), enable_range_support_(true), cache_size_(cache_size) { @@ -151,14 +153,16 @@ HttpCache::HttpCache(HttpNetworkSession* session, cache_size_(cache_size) { } -HttpCache::HttpCache(HostResolver* host_resolver, +HttpCache::HttpCache(NetworkChangeNotifier* network_change_notifier, + HostResolver* host_resolver, ProxyService* proxy_service, SSLConfigService* ssl_config_service, int cache_size) : mode_(NORMAL), type_(MEMORY_CACHE), network_layer_(HttpNetworkLayer::CreateFactory( - host_resolver, proxy_service, ssl_config_service)), + network_change_notifier, host_resolver, proxy_service, + ssl_config_service)), ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), enable_range_support_(true), cache_size_(cache_size) { diff --git a/net/http/http_cache.h b/net/http/http_cache.h index 90dac74..1985f9b 100644 --- a/net/http/http_cache.h +++ b/net/http/http_cache.h @@ -38,6 +38,7 @@ class HostResolver; class HttpNetworkSession; class HttpRequestInfo; class HttpResponseInfo; +class NetworkChangeNotifier; class ProxyService; class SSLConfigService; @@ -63,7 +64,8 @@ class HttpCache : public HttpTransactionFactory, // Initialize the cache from the directory where its data is stored. The // disk cache is initialized lazily (by CreateTransaction) in this case. If // |cache_size| is zero, a default value will be calculated automatically. - HttpCache(HostResolver* host_resolver, + HttpCache(NetworkChangeNotifier* network_change_notifier, + HostResolver* host_resolver, ProxyService* proxy_service, SSLConfigService* ssl_config_service, const FilePath& cache_dir, @@ -81,7 +83,8 @@ class HttpCache : public HttpTransactionFactory, // Initialize using an in-memory cache. The cache is initialized lazily // (by CreateTransaction) in this case. If |cache_size| is zero, a default // value will be calculated automatically. - HttpCache(HostResolver* host_resolver, + HttpCache(NetworkChangeNotifier* network_change_notifier, + HostResolver* host_resolver, ProxyService* proxy_service, SSLConfigService* ssl_config_service, int cache_size); diff --git a/net/http/http_network_layer.cc b/net/http/http_network_layer.cc index 72c377f..c8022b7 100644 --- a/net/http/http_network_layer.cc +++ b/net/http/http_network_layer.cc @@ -20,12 +20,14 @@ namespace net { // static HttpTransactionFactory* HttpNetworkLayer::CreateFactory( + NetworkChangeNotifier* network_change_notifier, HostResolver* host_resolver, ProxyService* proxy_service, SSLConfigService* ssl_config_service) { DCHECK(proxy_service); return new HttpNetworkLayer(ClientSocketFactory::GetDefaultFactory(), + network_change_notifier, host_resolver, proxy_service, ssl_config_service); } @@ -40,11 +42,14 @@ HttpTransactionFactory* HttpNetworkLayer::CreateFactory( //----------------------------------------------------------------------------- bool HttpNetworkLayer::force_flip_ = false; -HttpNetworkLayer::HttpNetworkLayer(ClientSocketFactory* socket_factory, - HostResolver* host_resolver, - ProxyService* proxy_service, - SSLConfigService* ssl_config_service) +HttpNetworkLayer::HttpNetworkLayer( + ClientSocketFactory* socket_factory, + NetworkChangeNotifier* network_change_notifier, + HostResolver* host_resolver, + ProxyService* proxy_service, + SSLConfigService* ssl_config_service) : socket_factory_(socket_factory), + network_change_notifier_(network_change_notifier), host_resolver_(host_resolver), proxy_service_(proxy_service), ssl_config_service_(ssl_config_service), @@ -57,6 +62,7 @@ HttpNetworkLayer::HttpNetworkLayer(ClientSocketFactory* socket_factory, HttpNetworkLayer::HttpNetworkLayer(HttpNetworkSession* session) : socket_factory_(ClientSocketFactory::GetDefaultFactory()), + network_change_notifier_(NULL), ssl_config_service_(NULL), session_(session), flip_session_pool_(session->flip_session_pool()), @@ -94,9 +100,10 @@ HttpNetworkSession* HttpNetworkLayer::GetSession() { DCHECK(proxy_service_); FlipSessionPool* flip_pool = new FlipSessionPool; session_ = new HttpNetworkSession( - host_resolver_, proxy_service_, socket_factory_, - ssl_config_service_, flip_pool); + network_change_notifier_, host_resolver_, proxy_service_, + socket_factory_, ssl_config_service_, flip_pool); // These were just temps for lazy-initializing HttpNetworkSession. + network_change_notifier_ = NULL; host_resolver_ = NULL; proxy_service_ = NULL; socket_factory_ = NULL; diff --git a/net/http/http_network_layer.h b/net/http/http_network_layer.h index 4dbf9a4..38c10c7 100644 --- a/net/http/http_network_layer.h +++ b/net/http/http_network_layer.h @@ -17,15 +17,17 @@ class ClientSocketFactory; class FlipSessionPool; class HostResolver; class HttpNetworkSession; +class NetworkChangeNotifier; class ProxyInfo; class ProxyService; class SSLConfigService; class HttpNetworkLayer : public HttpTransactionFactory { public: - // |socket_factory|, |proxy_service| and |host_resolver| must remain valid - // for the lifetime of HttpNetworkLayer. + // |socket_factory|, |network_change_notifier|, |proxy_service| and + // |host_resolver| must remain valid for the lifetime of HttpNetworkLayer. HttpNetworkLayer(ClientSocketFactory* socket_factory, + NetworkChangeNotifier* network_change_notifier, HostResolver* host_resolver, ProxyService* proxy_service, SSLConfigService* ssl_config_service); // Construct a HttpNetworkLayer with an existing HttpNetworkSession which @@ -36,6 +38,7 @@ class HttpNetworkLayer : public HttpTransactionFactory { // This function hides the details of how a network layer gets instantiated // and allows other implementations to be substituted. static HttpTransactionFactory* CreateFactory( + NetworkChangeNotifier* network_change_notifier, HostResolver* host_resolver, ProxyService* proxy_service, SSLConfigService* ssl_config_service); @@ -65,6 +68,8 @@ class HttpNetworkLayer : public HttpTransactionFactory { // The factory we will use to create network sockets. ClientSocketFactory* socket_factory_; + NetworkChangeNotifier* network_change_notifier_; + // The host resolver and proxy service that will be used when lazily // creating |session_|. scoped_refptr<HostResolver> host_resolver_; diff --git a/net/http/http_network_layer_unittest.cc b/net/http/http_network_layer_unittest.cc index d8240e1..1e75ece 100644 --- a/net/http/http_network_layer_unittest.cc +++ b/net/http/http_network_layer_unittest.cc @@ -16,7 +16,7 @@ class HttpNetworkLayerTest : public PlatformTest { TEST_F(HttpNetworkLayerTest, CreateAndDestroy) { net::HttpNetworkLayer factory( - NULL, new net::MockHostResolver, net::ProxyService::CreateNull(), + NULL, NULL, new net::MockHostResolver, net::ProxyService::CreateNull(), new net::SSLConfigServiceDefaults); scoped_ptr<net::HttpTransaction> trans; @@ -27,7 +27,7 @@ TEST_F(HttpNetworkLayerTest, CreateAndDestroy) { TEST_F(HttpNetworkLayerTest, Suspend) { net::HttpNetworkLayer factory( - NULL, new net::MockHostResolver, net::ProxyService::CreateNull(), + NULL, NULL, new net::MockHostResolver, net::ProxyService::CreateNull(), new net::SSLConfigServiceDefaults); scoped_ptr<net::HttpTransaction> trans; @@ -65,7 +65,8 @@ TEST_F(HttpNetworkLayerTest, GET) { net::StaticSocketDataProvider data(data_reads, data_writes); mock_socket_factory.AddSocketDataProvider(&data); - net::HttpNetworkLayer factory(&mock_socket_factory, new net::MockHostResolver, + net::HttpNetworkLayer factory(&mock_socket_factory, NULL, + new net::MockHostResolver, net::ProxyService::CreateNull(), new net::SSLConfigServiceDefaults); diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc index 150c6f0..9f4cba7 100644 --- a/net/http/http_network_session.cc +++ b/net/http/http_network_session.cc @@ -5,7 +5,6 @@ #include "net/http/http_network_session.h" #include "base/logging.h" -#include "net/base/network_change_notifier.h" #include "net/flip/flip_session_pool.h" namespace net { @@ -21,13 +20,13 @@ uint16 HttpNetworkSession::g_fixed_http_port = 0; uint16 HttpNetworkSession::g_fixed_https_port = 0; HttpNetworkSession::HttpNetworkSession( + NetworkChangeNotifier* network_change_notifier, HostResolver* host_resolver, ProxyService* proxy_service, ClientSocketFactory* client_socket_factory, SSLConfigService* ssl_config_service, FlipSessionPool* flip_session_pool) - : network_change_notifier_( - NetworkChangeNotifier::CreateDefaultNetworkChangeNotifier()), + : network_change_notifier_(network_change_notifier), tcp_socket_pool_(new TCPClientSocketPool( max_sockets_, max_sockets_per_group_, host_resolver, client_socket_factory, network_change_notifier_)), diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h index 684da16..32bcdee 100644 --- a/net/http/http_network_session.h +++ b/net/http/http_network_session.h @@ -17,11 +17,13 @@ namespace net { class ClientSocketFactory; class FlipSessionPool; +class NetworkChangeNotifier; // This class holds session objects used by HttpNetworkTransaction objects. class HttpNetworkSession : public base::RefCounted<HttpNetworkSession> { public: HttpNetworkSession( + NetworkChangeNotifier* network_change_notifier, HostResolver* host_resolver, ProxyService* proxy_service, ClientSocketFactory* client_socket_factory, @@ -75,7 +77,7 @@ class HttpNetworkSession : public base::RefCounted<HttpNetworkSession> { HttpAuthCache auth_cache_; SSLClientAuthCache ssl_client_auth_cache_; - const scoped_refptr<NetworkChangeNotifier> network_change_notifier_; + NetworkChangeNotifier* const network_change_notifier_; scoped_refptr<TCPClientSocketPool> tcp_socket_pool_; ClientSocketFactory* socket_factory_; scoped_refptr<HostResolver> host_resolver_; diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index 7be3390..9639457 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc @@ -72,7 +72,8 @@ ProxyService* CreateFixedProxyService(const std::string& proxy) { HttpNetworkSession* CreateSession(SessionDependencies* session_deps) { - return new HttpNetworkSession(session_deps->host_resolver, + return new HttpNetworkSession(NULL, + session_deps->host_resolver, session_deps->proxy_service, &session_deps->socket_factory, session_deps->ssl_config_service, diff --git a/net/proxy/proxy_script_fetcher_unittest.cc b/net/proxy/proxy_script_fetcher_unittest.cc index ff78e33..741e7d4 100644 --- a/net/proxy/proxy_script_fetcher_unittest.cc +++ b/net/proxy/proxy_script_fetcher_unittest.cc @@ -32,13 +32,13 @@ class RequestContext : public URLRequestContext { public: RequestContext() { net::ProxyConfig no_proxy; - host_resolver_ = net::CreateSystemHostResolver(); + host_resolver_ = net::CreateSystemHostResolver(NULL); proxy_service_ = net::ProxyService::CreateFixed(no_proxy); ssl_config_service_ = new net::SSLConfigServiceDefaults; http_transaction_factory_ = new net::HttpCache(net::HttpNetworkLayer::CreateFactory( - host_resolver_, proxy_service_, ssl_config_service_), + NULL, host_resolver_, proxy_service_, ssl_config_service_), disk_cache::CreateInMemoryCacheBackend(0)); } diff --git a/net/proxy/proxy_service.h b/net/proxy/proxy_service.h index 9a8a1eb..8614d555 100644 --- a/net/proxy/proxy_service.h +++ b/net/proxy/proxy_service.h @@ -306,7 +306,7 @@ class ProxyService : public base::RefCountedThreadSafe<ProxyService>, // The (possibly NULL) network change notifier that we use to decide when // to refetch PAC scripts or re-run WPAD. - scoped_refptr<NetworkChangeNotifier> network_change_notifier_; + NetworkChangeNotifier* const network_change_notifier_; DISALLOW_COPY_AND_ASSIGN(ProxyService); }; diff --git a/net/proxy/proxy_service_unittest.cc b/net/proxy/proxy_service_unittest.cc index 0a026a0..2e57e51 100644 --- a/net/proxy/proxy_service_unittest.cc +++ b/net/proxy/proxy_service_unittest.cc @@ -1791,11 +1791,10 @@ TEST(ProxyServiceTest, NetworkChangeTriggersPacRefetch) { MockAsyncProxyResolverExpectsBytes* resolver = new MockAsyncProxyResolverExpectsBytes; - scoped_refptr<MockNetworkChangeNotifier> network_change_notifier( - new MockNetworkChangeNotifier()); + MockNetworkChangeNotifier network_change_notifier; scoped_refptr<ProxyService> service( - new ProxyService(config_service, resolver, network_change_notifier)); + new ProxyService(config_service, resolver, &network_change_notifier)); MockProxyScriptFetcher* fetcher = new MockProxyScriptFetcher; service->SetProxyScriptFetcher(fetcher); @@ -1840,7 +1839,7 @@ TEST(ProxyServiceTest, NetworkChangeTriggersPacRefetch) { // going to return the same PAC URL as before, but this URL needs to be // refetched on the new network. - network_change_notifier->NotifyIPAddressChange(); + network_change_notifier.NotifyIPAddressChange(); // Start a second request. ProxyInfo info2; diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc index 24c2dc6..4a5c88c 100644 --- a/net/socket/client_socket_pool_base.cc +++ b/net/socket/client_socket_pool_base.cc @@ -96,7 +96,7 @@ ClientSocketPoolBaseHelper::ClientSocketPoolBaseHelper( base::TimeDelta unused_idle_socket_timeout, base::TimeDelta used_idle_socket_timeout, ConnectJobFactory* connect_job_factory, - const scoped_refptr<NetworkChangeNotifier>& network_change_notifier) + NetworkChangeNotifier* network_change_notifier) : idle_socket_count_(0), connecting_socket_count_(0), handed_out_socket_count_(0), diff --git a/net/socket/client_socket_pool_base.h b/net/socket/client_socket_pool_base.h index 8d3fba7..d4e9deb 100644 --- a/net/socket/client_socket_pool_base.h +++ b/net/socket/client_socket_pool_base.h @@ -168,7 +168,7 @@ class ClientSocketPoolBaseHelper base::TimeDelta unused_idle_socket_timeout, base::TimeDelta used_idle_socket_timeout, ConnectJobFactory* connect_job_factory, - const scoped_refptr<NetworkChangeNotifier>& network_change_notifier); + NetworkChangeNotifier* network_change_notifier); // See ClientSocketPool::RequestSocket for documentation on this function. // Note that |request| must be heap allocated. If ERR_IO_PENDING is returned, @@ -383,7 +383,7 @@ class ClientSocketPoolBaseHelper const scoped_ptr<ConnectJobFactory> connect_job_factory_; - const scoped_refptr<NetworkChangeNotifier> network_change_notifier_; + NetworkChangeNotifier* const network_change_notifier_; }; } // namespace internal @@ -443,7 +443,7 @@ class ClientSocketPoolBase { base::TimeDelta unused_idle_socket_timeout, base::TimeDelta used_idle_socket_timeout, ConnectJobFactory* connect_job_factory, - const scoped_refptr<NetworkChangeNotifier>& network_change_notifier) + NetworkChangeNotifier* network_change_notifier) : helper_(new internal::ClientSocketPoolBaseHelper( max_sockets, max_sockets_per_group, unused_idle_socket_timeout, used_idle_socket_timeout, diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc index a3556dc..f44f1ab 100644 --- a/net/socket/ssl_client_socket_unittest.cc +++ b/net/socket/ssl_client_socket_unittest.cc @@ -25,7 +25,7 @@ const net::SSLConfig kDefaultSSLConfig; class SSLClientSocketTest : public PlatformTest { public: SSLClientSocketTest() - : resolver_(net::CreateSystemHostResolver()), + : resolver_(net::CreateSystemHostResolver(NULL)), socket_factory_(net::ClientSocketFactory::GetDefaultFactory()) { } diff --git a/net/socket/ssl_test_util.cc b/net/socket/ssl_test_util.cc index 60b1f1f..941b693 100644 --- a/net/socket/ssl_test_util.cc +++ b/net/socket/ssl_test_util.cc @@ -309,7 +309,8 @@ bool TestServerLauncher::WaitToStart(const std::string& host_name, int port) { // Verify that the webserver is actually started. // Otherwise tests can fail if they run faster than Python can start. net::AddressList addr; - scoped_refptr<net::HostResolver> resolver(net::CreateSystemHostResolver()); + scoped_refptr<net::HostResolver> resolver( + net::CreateSystemHostResolver(NULL)); net::HostResolver::RequestInfo info(host_name, port); int rv = resolver->Resolve(info, &addr, NULL, NULL, NULL); if (rv != net::OK) diff --git a/net/socket/tcp_client_socket_pool.cc b/net/socket/tcp_client_socket_pool.cc index 823cce7..3ea6700 100644 --- a/net/socket/tcp_client_socket_pool.cc +++ b/net/socket/tcp_client_socket_pool.cc @@ -171,7 +171,7 @@ TCPClientSocketPool::TCPClientSocketPool( int max_sockets_per_group, HostResolver* host_resolver, ClientSocketFactory* client_socket_factory, - const scoped_refptr<NetworkChangeNotifier>& network_change_notifier) + NetworkChangeNotifier* network_change_notifier) : base_(max_sockets, max_sockets_per_group, base::TimeDelta::FromSeconds(kUnusedIdleSocketTimeout), base::TimeDelta::FromSeconds(kUsedIdleSocketTimeout), diff --git a/net/socket/tcp_client_socket_pool.h b/net/socket/tcp_client_socket_pool.h index 6e36ec3..fb1a93b 100644 --- a/net/socket/tcp_client_socket_pool.h +++ b/net/socket/tcp_client_socket_pool.h @@ -83,7 +83,7 @@ class TCPClientSocketPool : public ClientSocketPool { int max_sockets_per_group, HostResolver* host_resolver, ClientSocketFactory* client_socket_factory, - const scoped_refptr<NetworkChangeNotifier>& network_change_notifier); + NetworkChangeNotifier* network_change_notifier); // ClientSocketPool methods: diff --git a/net/socket/tcp_client_socket_pool_unittest.cc b/net/socket/tcp_client_socket_pool_unittest.cc index 95b37f1..719d280 100644 --- a/net/socket/tcp_client_socket_pool_unittest.cc +++ b/net/socket/tcp_client_socket_pool_unittest.cc @@ -207,12 +207,11 @@ class TCPClientSocketPoolTest : public ClientSocketPoolTest { TCPClientSocketPoolTest() : ignored_request_info_("ignored", 80), host_resolver_(new MockHostResolver), - notifier_(new MockNetworkChangeNotifier), pool_(new TCPClientSocketPool(kMaxSockets, kMaxSocketsPerGroup, host_resolver_, &client_socket_factory_, - notifier_)) { + ¬ifier_)) { } int StartRequest(const std::string& group_name, RequestPriority priority) { @@ -223,7 +222,7 @@ class TCPClientSocketPoolTest : public ClientSocketPoolTest { HostResolver::RequestInfo ignored_request_info_; scoped_refptr<MockHostResolver> host_resolver_; MockClientSocketFactory client_socket_factory_; - scoped_refptr<MockNetworkChangeNotifier> notifier_; + MockNetworkChangeNotifier notifier_; scoped_refptr<TCPClientSocketPool> pool_; }; @@ -623,7 +622,7 @@ TEST_F(TCPClientSocketPoolTest, ResetIdleSocketsOnIPAddressChange) { EXPECT_EQ(1, pool_->IdleSocketCount()); // After an IP address change, we should have 0 idle sockets. - notifier_->NotifyIPAddressChange(); + notifier_.NotifyIPAddressChange(); EXPECT_EQ(0, pool_->IdleSocketCount()); } diff --git a/net/socket/tcp_client_socket_unittest.cc b/net/socket/tcp_client_socket_unittest.cc index eebdc9f..e1e08ab 100644 --- a/net/socket/tcp_client_socket_unittest.cc +++ b/net/socket/tcp_client_socket_unittest.cc @@ -88,7 +88,7 @@ void TCPClientSocketTest::SetUp() { listen_port_ = port; AddressList addr; - scoped_refptr<HostResolver> resolver(CreateSystemHostResolver()); + scoped_refptr<HostResolver> resolver(CreateSystemHostResolver(NULL)); HostResolver::RequestInfo info("localhost", listen_port_); int rv = resolver->Resolve(info, &addr, NULL, NULL, NULL); CHECK(rv == OK); diff --git a/net/socket/tcp_pinger_unittest.cc b/net/socket/tcp_pinger_unittest.cc index 1714ebe..2cffa8a 100644 --- a/net/socket/tcp_pinger_unittest.cc +++ b/net/socket/tcp_pinger_unittest.cc @@ -65,7 +65,8 @@ void TCPPingerTest::SetUp() { TEST_F(TCPPingerTest, Ping) { net::AddressList addr; - scoped_refptr<net::HostResolver> resolver(net::CreateSystemHostResolver()); + scoped_refptr<net::HostResolver> resolver( + net::CreateSystemHostResolver(NULL)); net::HostResolver::RequestInfo info("localhost", listen_port_); int rv = resolver->Resolve(info, &addr, NULL, NULL, NULL); @@ -78,7 +79,8 @@ TEST_F(TCPPingerTest, Ping) { TEST_F(TCPPingerTest, PingFail) { net::AddressList addr; - scoped_refptr<net::HostResolver> resolver(net::CreateSystemHostResolver()); + scoped_refptr<net::HostResolver> resolver( + net::CreateSystemHostResolver(NULL)); // "Kill" "server" listen_sock_ = NULL; diff --git a/net/tools/fetch/fetch_client.cc b/net/tools/fetch/fetch_client.cc index 07be9c9..120b5ca 100644 --- a/net/tools/fetch/fetch_client.cc +++ b/net/tools/fetch/fetch_client.cc @@ -132,7 +132,7 @@ int main(int argc, char**argv) { MessageLoop loop(MessageLoop::TYPE_IO); scoped_refptr<net::HostResolver> host_resolver( - net::CreateSystemHostResolver()); + net::CreateSystemHostResolver(NULL)); scoped_refptr<net::ProxyService> proxy_service( net::ProxyService::CreateNull()); @@ -140,11 +140,11 @@ int main(int argc, char**argv) { net::SSLConfigService::CreateSystemSSLConfigService()); net::HttpTransactionFactory* factory = NULL; if (use_cache) { - factory = new net::HttpCache(host_resolver, proxy_service, + factory = new net::HttpCache(NULL, host_resolver, proxy_service, ssl_config_service, 0); } else { factory = new net::HttpNetworkLayer( - net::ClientSocketFactory::GetDefaultFactory(), host_resolver, + net::ClientSocketFactory::GetDefaultFactory(), NULL, host_resolver, proxy_service, ssl_config_service); } diff --git a/net/url_request/url_request_unittest.h b/net/url_request/url_request_unittest.h index e912ab9..6c1be78 100644 --- a/net/url_request/url_request_unittest.h +++ b/net/url_request/url_request_unittest.h @@ -126,13 +126,13 @@ class TestCookiePolicy : public net::CookiePolicy { class TestURLRequestContext : public URLRequestContext { public: TestURLRequestContext() { - host_resolver_ = net::CreateSystemHostResolver(); + host_resolver_ = net::CreateSystemHostResolver(NULL); proxy_service_ = net::ProxyService::CreateNull(); Init(); } explicit TestURLRequestContext(const std::string& proxy) { - host_resolver_ = net::CreateSystemHostResolver(); + host_resolver_ = net::CreateSystemHostResolver(NULL); net::ProxyConfig proxy_config; proxy_config.proxy_rules.ParseFromString(proxy); proxy_service_ = net::ProxyService::CreateFixed(proxy_config); @@ -155,7 +155,8 @@ class TestURLRequestContext : public URLRequestContext { ssl_config_service_ = new net::SSLConfigServiceDefaults; http_transaction_factory_ = new net::HttpCache( - net::HttpNetworkLayer::CreateFactory(host_resolver_, proxy_service_, + net::HttpNetworkLayer::CreateFactory(NULL, host_resolver_, + proxy_service_, ssl_config_service_), disk_cache::CreateInMemoryCacheBackend(0)); // In-memory cookie store. diff --git a/webkit/tools/test_shell/test_shell_request_context.cc b/webkit/tools/test_shell/test_shell_request_context.cc index 6ef9378..a770b28 100644 --- a/webkit/tools/test_shell/test_shell_request_context.cc +++ b/webkit/tools/test_shell/test_shell_request_context.cc @@ -55,17 +55,17 @@ void TestShellRequestContext::Init( scoped_ptr<net::ProxyConfigService> proxy_config_service( net::ProxyService::CreateSystemProxyConfigService(NULL, NULL)); #endif - host_resolver_ = net::CreateSystemHostResolver(); + host_resolver_ = net::CreateSystemHostResolver(NULL); proxy_service_ = net::ProxyService::Create(proxy_config_service.release(), false, NULL, NULL, NULL); ssl_config_service_ = net::SSLConfigService::CreateSystemSSLConfigService(); net::HttpCache *cache; if (cache_path.empty()) { - cache = new net::HttpCache(host_resolver_, proxy_service_, + cache = new net::HttpCache(NULL, host_resolver_, proxy_service_, ssl_config_service_, 0); } else { - cache = new net::HttpCache(host_resolver_, proxy_service_, + cache = new net::HttpCache(NULL, host_resolver_, proxy_service_, ssl_config_service_, cache_path, 0); } cache->set_mode(cache_mode); |