blob: 180ae24951e3ab85ae859f564bca7bf4438d78a2 [file] [log] [blame]
[email protected]4617d2da2012-01-13 20:46:491// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]0ac83682010-01-22 17:46:272// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_IO_THREAD_H_
6#define CHROME_BROWSER_IO_THREAD_H_
7
[email protected]bcefe0f2010-11-10 16:19:108#include <string>
[email protected]c38831a12011-10-28 12:44:499
[email protected]0ac83682010-01-22 17:46:2710#include "base/basictypes.h"
[email protected]2e5b60a22011-11-28 15:56:4111#include "base/compiler_specific.h"
12#include "base/memory/ref_counted.h"
[email protected]3b63f8f42011-03-28 01:54:1513#include "base/memory/scoped_ptr.h"
[email protected]21ee224e2011-11-21 02:17:5314#include "base/memory/weak_ptr.h"
[email protected]c5aa8262012-08-21 11:19:5415#include "chrome/browser/api/prefs/pref_member.h"
[email protected]4d45a6de2011-05-13 05:20:1816#include "chrome/browser/net/ssl_config_service_manager.h"
[email protected]2e5b60a22011-11-28 15:56:4117#include "content/public/browser/browser_thread.h"
18#include "content/public/browser/browser_thread_delegate.h"
[email protected]58bc7042010-07-07 18:04:1419#include "net/base/network_change_notifier.h"
[email protected]0ac83682010-01-22 17:46:2720
[email protected]9e743cd2010-03-16 07:03:5321class ChromeNetLog;
[email protected]6f96cbcb2011-11-04 02:26:0722class PrefProxyConfigTrackerImpl;
[email protected]bcefe0f2010-11-10 16:19:1023class PrefService;
[email protected]db0e86dd2011-03-16 14:47:2124class SystemURLRequestContextGetter;
[email protected]0ac83682010-01-22 17:46:2725
[email protected]7613faae2012-04-18 01:01:1926namespace chrome_browser_net {
[email protected]7613faae2012-04-18 01:01:1927class HttpPipeliningCompatibilityClient;
[email protected]a9e0d1412012-08-20 22:13:0128class LoadTimeStats;
[email protected]7613faae2012-04-18 01:01:1929}
30
[email protected]5a38dfd2012-07-23 23:22:1031namespace extensions {
32class EventRouterForwarder;
33}
34
[email protected]d13c3272010-02-04 00:24:5135namespace net {
[email protected]822581d2010-12-16 17:27:1536class CertVerifier;
[email protected]273e37d2011-08-11 01:49:1237class CookieStore;
[email protected]933bc5c62011-04-12 19:08:0238class FtpTransactionFactory;
[email protected]c2dad292012-09-07 21:27:3539class HostMappingRules;
[email protected]1889dc1b2010-10-14 22:03:1340class HostResolver;
[email protected]fa55e192010-02-15 14:25:5041class HttpAuthHandlerFactory;
[email protected]17291a022011-10-10 07:32:5342class HttpServerProperties;
[email protected]52617df2010-12-24 07:30:0143class HttpTransactionFactory;
[email protected]0651b812011-02-24 00:22:5044class NetworkDelegate;
[email protected]9c4eff22012-03-20 22:42:2945class ServerBoundCertService;
[email protected]db0e86dd2011-03-16 14:47:2146class ProxyConfigService;
[email protected]2fb629202010-12-23 23:52:5747class ProxyService;
[email protected]3b543ab2011-09-17 21:47:0048class SdchManager;
[email protected]2fb629202010-12-23 23:52:5749class SSLConfigService;
[email protected]a2a41972011-12-07 17:47:2750class TransportSecurityState;
[email protected]27a112c2011-01-06 04:19:3051class URLRequestContext;
[email protected]abe2c032011-03-31 18:49:3452class URLRequestContextGetter;
[email protected]a73a2802012-05-02 19:20:1553class URLRequestThrottlerManager;
[email protected]b4955e7d2010-04-16 20:22:3054class URLSecurityManager;
[email protected]d13c3272010-02-04 00:24:5155} // namespace net
56
[email protected]2e5b60a22011-11-28 15:56:4157// Contains state associated with, initialized and cleaned up on, and
[email protected]dd483702011-12-02 14:47:4258// primarily used on, the IO thread.
[email protected]c92b8612011-12-13 22:18:5959//
60// If you are looking to interact with the IO thread (e.g. post tasks
61// to it or check if it is the current thread), see
62// content::BrowserThread.
[email protected]2e5b60a22011-11-28 15:56:4163class IOThread : public content::BrowserThreadDelegate {
[email protected]0ac83682010-01-22 17:46:2764 public:
[email protected]d13c3272010-02-04 00:24:5165 struct Globals {
[email protected]c93123fa2012-04-19 02:49:4866 class SystemRequestContextLeakChecker {
67 public:
68 explicit SystemRequestContextLeakChecker(Globals* globals);
69 ~SystemRequestContextLeakChecker();
70
71 private:
72 Globals* const globals_;
73 };
74
[email protected]1889dc1b2010-10-14 22:03:1375 Globals();
76 ~Globals();
77
[email protected]0651b812011-02-24 00:22:5078 // The "system" NetworkDelegate, used for Profile-agnostic network events.
79 scoped_ptr<net::NetworkDelegate> system_network_delegate;
[email protected]73c45322010-10-01 23:57:5480 scoped_ptr<net::HostResolver> host_resolver;
[email protected]822581d2010-12-16 17:27:1581 scoped_ptr<net::CertVerifier> cert_verifier;
[email protected]a2a41972011-12-07 17:47:2782 // This TransportSecurityState doesn't load or save any state. It's only
83 // used to enforce pinning for system requests and will only use built-in
84 // pins.
85 scoped_ptr<net::TransportSecurityState> transport_security_state;
[email protected]2fb629202010-12-23 23:52:5786 scoped_refptr<net::SSLConfigService> ssl_config_service;
[email protected]fa55e192010-02-15 14:25:5087 scoped_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory;
[email protected]17291a022011-10-10 07:32:5388 scoped_ptr<net::HttpServerProperties> http_server_properties;
[email protected]6104ea5d2011-04-27 21:37:1289 scoped_ptr<net::ProxyService> proxy_script_fetcher_proxy_service;
[email protected]52617df2010-12-24 07:30:0190 scoped_ptr<net::HttpTransactionFactory>
91 proxy_script_fetcher_http_transaction_factory;
[email protected]933bc5c62011-04-12 19:08:0292 scoped_ptr<net::FtpTransactionFactory>
93 proxy_script_fetcher_ftp_transaction_factory;
[email protected]a73a2802012-05-02 19:20:1594 scoped_ptr<net::URLRequestThrottlerManager> throttler_manager;
[email protected]b4955e7d2010-04-16 20:22:3095 scoped_ptr<net::URLSecurityManager> url_security_manager;
[email protected]ef2bf422012-05-11 03:27:0996 // TODO(willchan): Remove proxy script fetcher context since it's not
97 // necessary now that I got rid of refcounting URLRequestContexts.
98 //
[email protected]77feb462011-05-16 23:37:2599 // The first URLRequestContext is |system_url_request_context|. We introduce
100 // |proxy_script_fetcher_context| for the second context. It has a direct
101 // ProxyService, since we always directly connect to fetch the PAC script.
[email protected]ef2bf422012-05-11 03:27:09102 scoped_ptr<net::URLRequestContext> proxy_script_fetcher_context;
[email protected]6104ea5d2011-04-27 21:37:12103 scoped_ptr<net::ProxyService> system_proxy_service;
[email protected]db0e86dd2011-03-16 14:47:21104 scoped_ptr<net::HttpTransactionFactory> system_http_transaction_factory;
[email protected]933bc5c62011-04-12 19:08:02105 scoped_ptr<net::FtpTransactionFactory> system_ftp_transaction_factory;
[email protected]ef2bf422012-05-11 03:27:09106 scoped_ptr<net::URLRequestContext> system_request_context;
[email protected]c93123fa2012-04-19 02:49:48107 SystemRequestContextLeakChecker system_request_context_leak_checker;
[email protected]9c4eff22012-03-20 22:42:29108 // |system_cookie_store| and |system_server_bound_cert_service| are shared
[email protected]4617d2da2012-01-13 20:46:49109 // between |proxy_script_fetcher_context| and |system_request_context|.
[email protected]273e37d2011-08-11 01:49:12110 scoped_refptr<net::CookieStore> system_cookie_store;
[email protected]9c4eff22012-03-20 22:42:29111 scoped_ptr<net::ServerBoundCertService> system_server_bound_cert_service;
[email protected]5a38dfd2012-07-23 23:22:10112 scoped_refptr<extensions::EventRouterForwarder>
[email protected]3ce02412011-03-01 12:01:15113 extension_event_router_forwarder;
[email protected]7613faae2012-04-18 01:01:19114 scoped_ptr<chrome_browser_net::HttpPipeliningCompatibilityClient>
115 http_pipelining_compatibility_client;
[email protected]a9e0d1412012-08-20 22:13:01116 scoped_ptr<chrome_browser_net::LoadTimeStats> load_time_stats;
[email protected]c2dad292012-09-07 21:27:35117 scoped_ptr<net::HostMappingRules> host_mapping_rules;
118 bool ignore_certificate_errors;
119 bool http_pipelining_enabled;
120 uint16 testing_fixed_http_port;
121 uint16 testing_fixed_https_port;
[email protected]d13c3272010-02-04 00:24:51122 };
123
[email protected]b2fcd0e2010-12-01 15:19:40124 // |net_log| must either outlive the IOThread or be NULL.
[email protected]3ce02412011-03-01 12:01:15125 IOThread(PrefService* local_state,
126 ChromeNetLog* net_log,
[email protected]5a38dfd2012-07-23 23:22:10127 extensions::EventRouterForwarder* extension_event_router_forwarder);
[email protected]0ac83682010-01-22 17:46:27128
129 virtual ~IOThread();
130
[email protected]d13c3272010-02-04 00:24:51131 // Can only be called on the IO thread.
132 Globals* globals();
[email protected]0ac83682010-01-22 17:46:27133
[email protected]b2fcd0e2010-12-01 15:19:40134 ChromeNetLog* net_log();
135
[email protected]b09f76d62011-12-07 01:51:06136 // Handles changing to On The Record mode, discarding confidential data.
137 void ChangedToOnTheRecord();
138
[email protected]db0e86dd2011-03-16 14:47:21139 // Returns a getter for the URLRequestContext. Only called on the UI thread.
[email protected]abe2c032011-03-31 18:49:34140 net::URLRequestContextGetter* system_url_request_context_getter();
[email protected]db0e86dd2011-03-16 14:47:21141
[email protected]67372ecf2011-09-10 01:30:46142 // Clears the host cache. Intended to be used to prevent exposing recently
143 // visited sites on about:net-internals/#dns and about:dns pages. Must be
144 // called on the IO thread.
145 void ClearHostCache();
[email protected]d6f37fc2011-02-13 23:58:41146
[email protected]2e5b60a22011-11-28 15:56:41147 private:
148 // BrowserThreadDelegate implementation, runs on the IO thread.
149 // This handles initialization and destruction of state that must
150 // live on the IO thread.
[email protected]0d5c08e2011-11-21 16:51:06151 virtual void Init() OVERRIDE;
152 virtual void CleanUp() OVERRIDE;
[email protected]0ac83682010-01-22 17:46:27153
[email protected]db0e86dd2011-03-16 14:47:21154 // Provide SystemURLRequestContextGetter with access to
155 // InitSystemRequestContext().
156 friend class SystemURLRequestContextGetter;
157
[email protected]2e5b60a22011-11-28 15:56:41158 // Global state must be initialized on the IO thread, then this
159 // method must be invoked on the UI thread.
160 void InitSystemRequestContext();
161
162 // Lazy initialization of system request context for
163 // SystemURLRequestContextGetter. To be called on IO thread only
164 // after global state has been initialized on the IO thread, and
165 // SystemRequestContext state has been initialized on the UI thread.
166 void InitSystemRequestContextOnIOThread();
167
[email protected]bcefe0f2010-11-10 16:19:10168 static void RegisterPrefs(PrefService* local_state);
169
[email protected]65d34382010-07-01 18:12:26170 net::HttpAuthHandlerFactory* CreateDefaultAuthHandlerFactory(
171 net::HostResolver* resolver);
[email protected]eb3cac72010-02-26 21:07:45172
[email protected]4d45a6de2011-05-13 05:20:18173 // Returns an SSLConfigService instance.
174 net::SSLConfigService* GetSSLConfigService();
175
[email protected]b09f76d62011-12-07 01:51:06176 void ChangedToOnTheRecordOnIOThread();
177
[email protected]b2fcd0e2010-12-01 15:19:40178 // The NetLog is owned by the browser process, to allow logging from other
179 // threads during shutdown, but is used most frequently on the IOThread.
180 ChromeNetLog* net_log_;
181
[email protected]5a38dfd2012-07-23 23:22:10182 // The extensions::EventRouterForwarder allows for sending events to
183 // extensions from the IOThread.
184 extensions::EventRouterForwarder* extension_event_router_forwarder_;
[email protected]3ce02412011-03-01 12:01:15185
[email protected]0ac83682010-01-22 17:46:27186 // These member variables are basically global, but their lifetimes are tied
187 // to the IOThread. IOThread owns them all, despite not using scoped_ptr.
188 // This is because the destructor of IOThread runs on the wrong thread. All
[email protected]b2fcd0e2010-12-01 15:19:40189 // member variables should be deleted in CleanUp().
[email protected]0ac83682010-01-22 17:46:27190
[email protected]d13c3272010-02-04 00:24:51191 // These member variables are initialized in Init() and do not change for the
192 // lifetime of the IO thread.
193
194 Globals* globals_;
195
[email protected]58bc7042010-07-07 18:04:14196 // Observer that logs network changes to the ChromeNetLog.
[email protected]e0845d5f2012-05-29 00:11:41197 class LoggingNetworkChangeObserver;
198 scoped_ptr<LoggingNetworkChangeObserver> network_change_observer_;
[email protected]58bc7042010-07-07 18:04:14199
[email protected]0a8db0d2011-04-13 15:15:40200 BooleanPrefMember system_enable_referrers_;
201
[email protected]bcefe0f2010-11-10 16:19:10202 // Store HTTP Auth-related policies in this thread.
203 std::string auth_schemes_;
204 bool negotiate_disable_cname_lookup_;
205 bool negotiate_enable_port_;
206 std::string auth_server_whitelist_;
207 std::string auth_delegate_whitelist_;
[email protected]ac7f3fdb2010-11-12 12:47:05208 std::string gssapi_library_name_;
[email protected]bcefe0f2010-11-10 16:19:10209
[email protected]4d45a6de2011-05-13 05:20:18210 // This is an instance of the default SSLConfigServiceManager for the current
211 // platform and it gets SSL preferences from local_state object.
212 scoped_ptr<SSLConfigServiceManager> ssl_config_service_manager_;
213
[email protected]d13c3272010-02-04 00:24:51214 // These member variables are initialized by a task posted to the IO thread,
215 // which gets posted by calling certain member functions of IOThread.
[email protected]db0e86dd2011-03-16 14:47:21216 scoped_ptr<net::ProxyConfigService> system_proxy_config_service_;
217
[email protected]6f96cbcb2011-11-04 02:26:07218 scoped_ptr<PrefProxyConfigTrackerImpl> pref_proxy_config_tracker_;
[email protected]db0e86dd2011-03-16 14:47:21219
[email protected]abe2c032011-03-31 18:49:34220 scoped_refptr<net::URLRequestContextGetter>
221 system_url_request_context_getter_;
[email protected]db0e86dd2011-03-16 14:47:21222
[email protected]3b543ab2011-09-17 21:47:00223 net::SdchManager* sdch_manager_;
224
[email protected]21ee224e2011-11-21 02:17:53225 base::WeakPtrFactory<IOThread> weak_factory_;
[email protected]addb3242011-06-13 21:39:16226
[email protected]0ac83682010-01-22 17:46:27227 DISALLOW_COPY_AND_ASSIGN(IOThread);
228};
229
[email protected]fa55e192010-02-15 14:25:50230#endif // CHROME_BROWSER_IO_THREAD_H_