blob: ec09bd887bae4766021b95e8e1e5391999dbe5fc [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]0abb67122012-12-12 11:36:0515#include "base/prefs/public/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]f9cf5572012-12-04 15:52:0920#include "net/http/http_network_session.h"
21#include "net/socket/next_proto.h"
[email protected]0ac83682010-01-22 17:46:2722
[email protected]9e743cd2010-03-16 07:03:5323class ChromeNetLog;
[email protected]77305422012-11-29 16:51:3924class CommandLine;
[email protected]6f96cbcb2011-11-04 02:26:0725class PrefProxyConfigTrackerImpl;
[email protected]bcefe0f2010-11-10 16:19:1026class PrefService;
[email protected]5b199522012-12-22 17:24:4427class PrefServiceSimple;
[email protected]db0e86dd2011-03-16 14:47:2128class SystemURLRequestContextGetter;
[email protected]0ac83682010-01-22 17:46:2729
[email protected]7613faae2012-04-18 01:01:1930namespace chrome_browser_net {
[email protected]4588b3d2012-11-14 00:37:3831class DnsProbeService;
[email protected]7613faae2012-04-18 01:01:1932class HttpPipeliningCompatibilityClient;
[email protected]a9e0d1412012-08-20 22:13:0133class LoadTimeStats;
[email protected]7613faae2012-04-18 01:01:1934}
35
[email protected]5a38dfd2012-07-23 23:22:1036namespace extensions {
37class EventRouterForwarder;
38}
39
[email protected]d13c3272010-02-04 00:24:5140namespace net {
[email protected]822581d2010-12-16 17:27:1541class CertVerifier;
[email protected]273e37d2011-08-11 01:49:1242class CookieStore;
[email protected]933bc5c62011-04-12 19:08:0243class FtpTransactionFactory;
[email protected]c2dad292012-09-07 21:27:3544class HostMappingRules;
[email protected]1889dc1b2010-10-14 22:03:1345class HostResolver;
[email protected]fa55e192010-02-15 14:25:5046class HttpAuthHandlerFactory;
[email protected]17291a022011-10-10 07:32:5347class HttpServerProperties;
[email protected]52617df2010-12-24 07:30:0148class HttpTransactionFactory;
[email protected]ee4c30d2012-11-07 15:08:4349class HttpUserAgentSettings;
[email protected]0651b812011-02-24 00:22:5050class NetworkDelegate;
[email protected]9c4eff22012-03-20 22:42:2951class ServerBoundCertService;
[email protected]db0e86dd2011-03-16 14:47:2152class ProxyConfigService;
[email protected]2fb629202010-12-23 23:52:5753class ProxyService;
[email protected]3b543ab2011-09-17 21:47:0054class SdchManager;
[email protected]2fb629202010-12-23 23:52:5755class SSLConfigService;
[email protected]a2a41972011-12-07 17:47:2756class TransportSecurityState;
[email protected]27a112c2011-01-06 04:19:3057class URLRequestContext;
[email protected]abe2c032011-03-31 18:49:3458class URLRequestContextGetter;
[email protected]a73a2802012-05-02 19:20:1559class URLRequestThrottlerManager;
[email protected]b4955e7d2010-04-16 20:22:3060class URLSecurityManager;
[email protected]d13c3272010-02-04 00:24:5161} // namespace net
62
[email protected]77305422012-11-29 16:51:3963namespace policy {
64class PolicyService;
65} // namespace policy
66
[email protected]2e5b60a22011-11-28 15:56:4167// Contains state associated with, initialized and cleaned up on, and
[email protected]dd483702011-12-02 14:47:4268// primarily used on, the IO thread.
[email protected]c92b8612011-12-13 22:18:5969//
70// If you are looking to interact with the IO thread (e.g. post tasks
71// to it or check if it is the current thread), see
72// content::BrowserThread.
[email protected]2e5b60a22011-11-28 15:56:4173class IOThread : public content::BrowserThreadDelegate {
[email protected]0ac83682010-01-22 17:46:2774 public:
[email protected]d13c3272010-02-04 00:24:5175 struct Globals {
[email protected]f9cf5572012-12-04 15:52:0976 template <typename T>
77 class Optional {
78 public:
79 Optional() : set_(false) {}
80
81 void set(T value) {
82 set_ = true;
83 value_ = value;
84 }
85 void CopyToIfSet(T* value) {
86 if (set_) {
87 *value = value_;
88 }
89 }
90
91 private:
92 bool set_;
93 T value_;
94 };
95
[email protected]c93123fa2012-04-19 02:49:4896 class SystemRequestContextLeakChecker {
97 public:
98 explicit SystemRequestContextLeakChecker(Globals* globals);
99 ~SystemRequestContextLeakChecker();
100
101 private:
102 Globals* const globals_;
103 };
104
[email protected]1889dc1b2010-10-14 22:03:13105 Globals();
106 ~Globals();
107
[email protected]0651b812011-02-24 00:22:50108 // The "system" NetworkDelegate, used for Profile-agnostic network events.
109 scoped_ptr<net::NetworkDelegate> system_network_delegate;
[email protected]73c45322010-10-01 23:57:54110 scoped_ptr<net::HostResolver> host_resolver;
[email protected]822581d2010-12-16 17:27:15111 scoped_ptr<net::CertVerifier> cert_verifier;
[email protected]c934fdb72012-12-28 22:02:36112 // The ServerBoundCertService must outlive the HttpTransactionFactory.
113 scoped_ptr<net::ServerBoundCertService> system_server_bound_cert_service;
[email protected]a2a41972011-12-07 17:47:27114 // This TransportSecurityState doesn't load or save any state. It's only
115 // used to enforce pinning for system requests and will only use built-in
116 // pins.
117 scoped_ptr<net::TransportSecurityState> transport_security_state;
[email protected]2fb629202010-12-23 23:52:57118 scoped_refptr<net::SSLConfigService> ssl_config_service;
[email protected]fa55e192010-02-15 14:25:50119 scoped_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory;
[email protected]17291a022011-10-10 07:32:53120 scoped_ptr<net::HttpServerProperties> http_server_properties;
[email protected]6104ea5d2011-04-27 21:37:12121 scoped_ptr<net::ProxyService> proxy_script_fetcher_proxy_service;
[email protected]52617df2010-12-24 07:30:01122 scoped_ptr<net::HttpTransactionFactory>
123 proxy_script_fetcher_http_transaction_factory;
[email protected]933bc5c62011-04-12 19:08:02124 scoped_ptr<net::FtpTransactionFactory>
125 proxy_script_fetcher_ftp_transaction_factory;
[email protected]a73a2802012-05-02 19:20:15126 scoped_ptr<net::URLRequestThrottlerManager> throttler_manager;
[email protected]b4955e7d2010-04-16 20:22:30127 scoped_ptr<net::URLSecurityManager> url_security_manager;
[email protected]ef2bf422012-05-11 03:27:09128 // TODO(willchan): Remove proxy script fetcher context since it's not
129 // necessary now that I got rid of refcounting URLRequestContexts.
130 //
[email protected]77feb462011-05-16 23:37:25131 // The first URLRequestContext is |system_url_request_context|. We introduce
132 // |proxy_script_fetcher_context| for the second context. It has a direct
133 // ProxyService, since we always directly connect to fetch the PAC script.
[email protected]ef2bf422012-05-11 03:27:09134 scoped_ptr<net::URLRequestContext> proxy_script_fetcher_context;
[email protected]6104ea5d2011-04-27 21:37:12135 scoped_ptr<net::ProxyService> system_proxy_service;
[email protected]db0e86dd2011-03-16 14:47:21136 scoped_ptr<net::HttpTransactionFactory> system_http_transaction_factory;
[email protected]933bc5c62011-04-12 19:08:02137 scoped_ptr<net::FtpTransactionFactory> system_ftp_transaction_factory;
[email protected]ef2bf422012-05-11 03:27:09138 scoped_ptr<net::URLRequestContext> system_request_context;
[email protected]c93123fa2012-04-19 02:49:48139 SystemRequestContextLeakChecker system_request_context_leak_checker;
[email protected]9c4eff22012-03-20 22:42:29140 // |system_cookie_store| and |system_server_bound_cert_service| are shared
[email protected]4617d2da2012-01-13 20:46:49141 // between |proxy_script_fetcher_context| and |system_request_context|.
[email protected]273e37d2011-08-11 01:49:12142 scoped_refptr<net::CookieStore> system_cookie_store;
[email protected]5a38dfd2012-07-23 23:22:10143 scoped_refptr<extensions::EventRouterForwarder>
[email protected]3ce02412011-03-01 12:01:15144 extension_event_router_forwarder;
[email protected]7613faae2012-04-18 01:01:19145 scoped_ptr<chrome_browser_net::HttpPipeliningCompatibilityClient>
146 http_pipelining_compatibility_client;
[email protected]a9e0d1412012-08-20 22:13:01147 scoped_ptr<chrome_browser_net::LoadTimeStats> load_time_stats;
[email protected]c2dad292012-09-07 21:27:35148 scoped_ptr<net::HostMappingRules> host_mapping_rules;
[email protected]ee4c30d2012-11-07 15:08:43149 scoped_ptr<net::HttpUserAgentSettings> http_user_agent_settings;
[email protected]c2dad292012-09-07 21:27:35150 bool ignore_certificate_errors;
151 bool http_pipelining_enabled;
152 uint16 testing_fixed_http_port;
153 uint16 testing_fixed_https_port;
[email protected]f9cf5572012-12-04 15:52:09154 Optional<size_t> max_spdy_sessions_per_domain;
155 Optional<size_t> initial_max_spdy_concurrent_streams;
156 Optional<size_t> max_spdy_concurrent_streams_limit;
157 Optional<bool> force_spdy_single_domain;
158 Optional<bool> enable_spdy_ip_pooling;
159 Optional<bool> enable_spdy_credential_frames;
160 Optional<bool> enable_spdy_compression;
161 Optional<bool> enable_spdy_ping_based_connection_checking;
162 Optional<net::NextProto> spdy_default_protocol;
[email protected]f1e97e92012-12-16 04:53:25163 Optional<uint16> origin_port_to_force_quic_on;
[email protected]4588b3d2012-11-14 00:37:38164 // NetErrorTabHelper uses |dns_probe_service| to send DNS probes when a
165 // main frame load fails with a DNS error in order to provide more useful
166 // information to the renderer so it can show a more specific error page.
167 scoped_ptr<chrome_browser_net::DnsProbeService> dns_probe_service;
[email protected]d13c3272010-02-04 00:24:51168 };
169
[email protected]b2fcd0e2010-12-01 15:19:40170 // |net_log| must either outlive the IOThread or be NULL.
[email protected]5b199522012-12-22 17:24:44171 IOThread(PrefServiceSimple* local_state,
[email protected]77305422012-11-29 16:51:39172 policy::PolicyService* policy_service,
[email protected]3ce02412011-03-01 12:01:15173 ChromeNetLog* net_log,
[email protected]5a38dfd2012-07-23 23:22:10174 extensions::EventRouterForwarder* extension_event_router_forwarder);
[email protected]0ac83682010-01-22 17:46:27175
176 virtual ~IOThread();
177
[email protected]d13c3272010-02-04 00:24:51178 // Can only be called on the IO thread.
179 Globals* globals();
[email protected]0ac83682010-01-22 17:46:27180
[email protected]b2fcd0e2010-12-01 15:19:40181 ChromeNetLog* net_log();
182
[email protected]b09f76d62011-12-07 01:51:06183 // Handles changing to On The Record mode, discarding confidential data.
184 void ChangedToOnTheRecord();
185
[email protected]db0e86dd2011-03-16 14:47:21186 // Returns a getter for the URLRequestContext. Only called on the UI thread.
[email protected]abe2c032011-03-31 18:49:34187 net::URLRequestContextGetter* system_url_request_context_getter();
[email protected]db0e86dd2011-03-16 14:47:21188
[email protected]67372ecf2011-09-10 01:30:46189 // Clears the host cache. Intended to be used to prevent exposing recently
190 // visited sites on about:net-internals/#dns and about:dns pages. Must be
191 // called on the IO thread.
192 void ClearHostCache();
[email protected]d6f37fc2011-02-13 23:58:41193
[email protected]f9cf5572012-12-04 15:52:09194 void InitializeNetworkSessionParams(net::HttpNetworkSession::Params* params);
195
[email protected]2e5b60a22011-11-28 15:56:41196 private:
[email protected]77305422012-11-29 16:51:39197 // Provide SystemURLRequestContextGetter with access to
198 // InitSystemRequestContext().
199 friend class SystemURLRequestContextGetter;
200
[email protected]2e5b60a22011-11-28 15:56:41201 // BrowserThreadDelegate implementation, runs on the IO thread.
202 // This handles initialization and destruction of state that must
203 // live on the IO thread.
[email protected]0d5c08e2011-11-21 16:51:06204 virtual void Init() OVERRIDE;
205 virtual void CleanUp() OVERRIDE;
[email protected]0ac83682010-01-22 17:46:27206
[email protected]77305422012-11-29 16:51:39207 void InitializeNetworkOptions(const CommandLine& parsed_command_line);
[email protected]db0e86dd2011-03-16 14:47:21208
[email protected]443a30ed2012-11-30 02:56:46209 // Enable the SPDY protocol. If this function is not called, SPDY/3
210 // will be enabled.
211 // "off" : Disables SPDY support entirely.
212 // "ssl" : Forces SPDY for all HTTPS requests.
213 // "no-ssl" : Forces SPDY for all HTTP requests.
214 // "no-ping" : Disables SPDY ping connection testing.
215 // "exclude=<host>" : Disables SPDY support for the host <host>.
216 // "no-compress" : Disables SPDY header compression.
217 // "no-alt-protocols : Disables alternate protocol support.
218 // "force-alt-protocols : Forces an alternate protocol of SPDY/2
219 // on port 443.
220 // "single-domain" : Forces all spdy traffic to a single domain.
221 // "init-max-streams=<limit>" : Specifies the maximum number of concurrent
222 // streams for a SPDY session, unless the
223 // specifies a different value via SETTINGS.
224 void EnableSpdy(const std::string& mode);
225
[email protected]2e5b60a22011-11-28 15:56:41226 // Global state must be initialized on the IO thread, then this
227 // method must be invoked on the UI thread.
228 void InitSystemRequestContext();
229
230 // Lazy initialization of system request context for
231 // SystemURLRequestContextGetter. To be called on IO thread only
232 // after global state has been initialized on the IO thread, and
233 // SystemRequestContext state has been initialized on the UI thread.
234 void InitSystemRequestContextOnIOThread();
235
[email protected]5b199522012-12-22 17:24:44236 static void RegisterPrefs(PrefServiceSimple* local_state);
[email protected]bcefe0f2010-11-10 16:19:10237
[email protected]65d34382010-07-01 18:12:26238 net::HttpAuthHandlerFactory* CreateDefaultAuthHandlerFactory(
239 net::HostResolver* resolver);
[email protected]eb3cac72010-02-26 21:07:45240
[email protected]4d45a6de2011-05-13 05:20:18241 // Returns an SSLConfigService instance.
242 net::SSLConfigService* GetSSLConfigService();
243
[email protected]b09f76d62011-12-07 01:51:06244 void ChangedToOnTheRecordOnIOThread();
245
[email protected]fa4b6c32012-11-26 23:02:39246 void UpdateDnsClientEnabled();
247
[email protected]b2fcd0e2010-12-01 15:19:40248 // The NetLog is owned by the browser process, to allow logging from other
249 // threads during shutdown, but is used most frequently on the IOThread.
250 ChromeNetLog* net_log_;
251
[email protected]5a38dfd2012-07-23 23:22:10252 // The extensions::EventRouterForwarder allows for sending events to
253 // extensions from the IOThread.
254 extensions::EventRouterForwarder* extension_event_router_forwarder_;
[email protected]3ce02412011-03-01 12:01:15255
[email protected]0ac83682010-01-22 17:46:27256 // These member variables are basically global, but their lifetimes are tied
257 // to the IOThread. IOThread owns them all, despite not using scoped_ptr.
258 // This is because the destructor of IOThread runs on the wrong thread. All
[email protected]b2fcd0e2010-12-01 15:19:40259 // member variables should be deleted in CleanUp().
[email protected]0ac83682010-01-22 17:46:27260
[email protected]d13c3272010-02-04 00:24:51261 // These member variables are initialized in Init() and do not change for the
262 // lifetime of the IO thread.
263
264 Globals* globals_;
265
[email protected]58bc7042010-07-07 18:04:14266 // Observer that logs network changes to the ChromeNetLog.
[email protected]e0845d5f2012-05-29 00:11:41267 class LoggingNetworkChangeObserver;
268 scoped_ptr<LoggingNetworkChangeObserver> network_change_observer_;
[email protected]58bc7042010-07-07 18:04:14269
[email protected]0a8db0d2011-04-13 15:15:40270 BooleanPrefMember system_enable_referrers_;
271
[email protected]fa4b6c32012-11-26 23:02:39272 BooleanPrefMember dns_client_enabled_;
273
[email protected]bcefe0f2010-11-10 16:19:10274 // Store HTTP Auth-related policies in this thread.
275 std::string auth_schemes_;
276 bool negotiate_disable_cname_lookup_;
277 bool negotiate_enable_port_;
278 std::string auth_server_whitelist_;
279 std::string auth_delegate_whitelist_;
[email protected]ac7f3fdb2010-11-12 12:47:05280 std::string gssapi_library_name_;
[email protected]ec44ee02012-09-28 21:31:51281 std::string spdyproxy_origin_;
[email protected]bcefe0f2010-11-10 16:19:10282
[email protected]4d45a6de2011-05-13 05:20:18283 // This is an instance of the default SSLConfigServiceManager for the current
284 // platform and it gets SSL preferences from local_state object.
285 scoped_ptr<SSLConfigServiceManager> ssl_config_service_manager_;
286
[email protected]d13c3272010-02-04 00:24:51287 // These member variables are initialized by a task posted to the IO thread,
288 // which gets posted by calling certain member functions of IOThread.
[email protected]db0e86dd2011-03-16 14:47:21289 scoped_ptr<net::ProxyConfigService> system_proxy_config_service_;
290
[email protected]6f96cbcb2011-11-04 02:26:07291 scoped_ptr<PrefProxyConfigTrackerImpl> pref_proxy_config_tracker_;
[email protected]db0e86dd2011-03-16 14:47:21292
[email protected]abe2c032011-03-31 18:49:34293 scoped_refptr<net::URLRequestContextGetter>
294 system_url_request_context_getter_;
[email protected]db0e86dd2011-03-16 14:47:21295
[email protected]3b543ab2011-09-17 21:47:00296 net::SdchManager* sdch_manager_;
297
[email protected]77305422012-11-29 16:51:39298 // True if SPDY is disabled by policy.
299 bool is_spdy_disabled_by_policy_;
300
[email protected]21ee224e2011-11-21 02:17:53301 base::WeakPtrFactory<IOThread> weak_factory_;
[email protected]addb3242011-06-13 21:39:16302
[email protected]0ac83682010-01-22 17:46:27303 DISALLOW_COPY_AND_ASSIGN(IOThread);
304};
305
[email protected]fa55e192010-02-15 14:25:50306#endif // CHROME_BROWSER_IO_THREAD_H_