io_thread.h revision 731df977c0511bca2206b5f333555b1205ff1f43
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_IO_THREAD_H_ 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_IO_THREAD_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <set> 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/ref_counted.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/scoped_ptr.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process_sub_thread.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/chrome_network_delegate.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/net/predictor_common.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/network_change_notifier.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ChromeNetLog; 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ListValue; 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass URLRequestContext; 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chrome_browser_net { 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ConnectInterceptor; 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Predictor; 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace chrome_browser_net 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net { 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass DnsRRResolver; 30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass HostResolver; 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HttpAuthHandlerFactory; 32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ProxyScriptFetcher; 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass URLSecurityManager; 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace net 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass IOThread : public BrowserProcessSubThread { 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct Globals { 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Globals(); 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~Globals(); 41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<ChromeNetLog> net_log; 43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_ptr<net::HostResolver> host_resolver; 44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_ptr<net::DnsRRResolver> dnsrr_resolver; 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory; 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<net::URLSecurityManager> url_security_manager; 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ChromeNetworkDelegate network_delegate; 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IOThread(); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~IOThread(); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Can only be called on the IO thread. 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Globals* globals(); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Initializes the network predictor, which induces DNS pre-resolution and/or 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TCP/IP preconnections. |prefetching_enabled| indicates whether or not DNS 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // prefetching should be enabled, and |preconnect_enabled| controls whether 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TCP/IP preconnection is enabled. This should be called by the UI thread. 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // It will post a task to the IO thread to perform the actual initialization. 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void InitNetworkPredictor(bool prefetching_enabled, 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::TimeDelta max_dns_queue_delay, 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t max_concurrent, 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const chrome_common_net::UrlList& startup_urls, 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ListValue* referral_list, 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool preconnect_enabled); 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Handles changing to On The Record mode. Posts a task for this onto the 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // IOThread's message loop. 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ChangedToOnTheRecord(); 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Creates a ProxyScriptFetcherImpl which will be automatically aborted 74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // during shutdown. 75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // This is used to avoid cycles between the ProxyScriptFetcher and the 76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // URLRequestContext that owns it (indirectly via the ProxyService). 77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::ProxyScriptFetcher* CreateAndRegisterProxyScriptFetcher( 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick URLRequestContext* url_request_context); 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Init(); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void CleanUp(); 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void CleanUpAfterMessageLoopDestruction(); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick class ManagedProxyScriptFetcher; 87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick typedef std::set<ManagedProxyScriptFetcher*> ProxyScriptFetchers; 88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::HttpAuthHandlerFactory* CreateDefaultAuthHandlerFactory( 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::HostResolver* resolver); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void InitNetworkPredictorOnIOThread( 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool prefetching_enabled, 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::TimeDelta max_dns_queue_delay, 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t max_concurrent, 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const chrome_common_net::UrlList& startup_urls, 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ListValue* referral_list, 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool preconnect_enabled); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ChangedToOnTheRecordOnIOThread(); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These member variables are basically global, but their lifetimes are tied 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to the IOThread. IOThread owns them all, despite not using scoped_ptr. 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This is because the destructor of IOThread runs on the wrong thread. All 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // member variables should be deleted in CleanUp(), except ChromeNetLog 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // which is deleted later in CleanUpAfterMessageLoopDestruction(). 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These member variables are initialized in Init() and do not change for the 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // lifetime of the IO thread. 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Globals* globals_; 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This variable is only meaningful during shutdown. It is used to defer 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // deletion of the NetLog to CleanUpAfterMessageLoopDestruction() even 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // though |globals_| is reset by CleanUp(). 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<ChromeNetLog> deferred_net_log_to_delete_; 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Observer that logs network changes to the ChromeNetLog. 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<net::NetworkChangeNotifier::Observer> network_change_observer_; 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These member variables are initialized by a task posted to the IO thread, 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // which gets posted by calling certain member functions of IOThread. 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Note: we user explicit pointers rather than smart pointers to be more 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // explicit about destruction order, and ensure that there is no chance that 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // these observers would be used accidentally after we have begun to tear 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // down. 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chrome_browser_net::ConnectInterceptor* speculative_interceptor_; 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chrome_browser_net::Predictor* predictor_; 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // List of live ProxyScriptFetchers. 133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ProxyScriptFetchers fetchers_; 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(IOThread); 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_IO_THREAD_H_ 139