1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_IO_THREAD_H_
6 #define CHROME_BROWSER_IO_THREAD_H_
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "base/memory/ref_counted.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/memory/weak_ptr.h"
16 #include "base/prefs/pref_member.h"
17 #include "chrome/browser/net/ssl_config_service_manager.h"
18 #include "content/public/browser/browser_thread.h"
19 #include "content/public/browser/browser_thread_delegate.h"
20 #include "net/base/network_change_notifier.h"
21 #include "net/http/http_network_session.h"
22 #include "net/socket/next_proto.h"
26 class PrefProxyConfigTracker
;
28 class PrefRegistrySimple
;
29 class SystemURLRequestContextGetter
;
31 namespace chrome_browser_net
{
32 class DnsProbeService
;
33 class HttpPipeliningCompatibilityClient
;
37 namespace extensions
{
38 class EventRouterForwarder
;
45 class FtpTransactionFactory
;
46 class HostMappingRules
;
48 class HttpAuthHandlerFactory
;
49 class HttpServerProperties
;
50 class HttpTransactionFactory
;
51 class HttpUserAgentSettings
;
52 class NetworkDelegate
;
53 class NetworkTimeNotifier
;
54 class ServerBoundCertService
;
55 class ProxyConfigService
;
58 class SSLConfigService
;
59 class TransportSecurityState
;
60 class URLRequestContext
;
61 class URLRequestContextGetter
;
62 class URLRequestJobFactory
;
63 class URLRequestThrottlerManager
;
64 class URLSecurityManager
;
71 // Contains state associated with, initialized and cleaned up on, and
72 // primarily used on, the IO thread.
74 // If you are looking to interact with the IO thread (e.g. post tasks
75 // to it or check if it is the current thread), see
76 // content::BrowserThread.
77 class IOThread
: public content::BrowserThreadDelegate
{
83 Optional() : set_(false) {}
89 void CopyToIfSet(T
* value
) {
100 class SystemRequestContextLeakChecker
{
102 explicit SystemRequestContextLeakChecker(Globals
* globals
);
103 ~SystemRequestContextLeakChecker();
106 Globals
* const globals_
;
112 // The "system" NetworkDelegate, used for Profile-agnostic network events.
113 scoped_ptr
<net::NetworkDelegate
> system_network_delegate
;
114 scoped_ptr
<net::HostResolver
> host_resolver
;
115 scoped_ptr
<net::CertVerifier
> cert_verifier
;
116 // The ServerBoundCertService must outlive the HttpTransactionFactory.
117 scoped_ptr
<net::ServerBoundCertService
> system_server_bound_cert_service
;
118 // This TransportSecurityState doesn't load or save any state. It's only
119 // used to enforce pinning for system requests and will only use built-in
121 scoped_ptr
<net::TransportSecurityState
> transport_security_state
;
122 scoped_ptr
<net::CTVerifier
> cert_transparency_verifier
;
123 scoped_refptr
<net::SSLConfigService
> ssl_config_service
;
124 scoped_ptr
<net::HttpAuthHandlerFactory
> http_auth_handler_factory
;
125 scoped_ptr
<net::HttpServerProperties
> http_server_properties
;
126 scoped_ptr
<net::ProxyService
> proxy_script_fetcher_proxy_service
;
127 scoped_ptr
<net::HttpTransactionFactory
>
128 proxy_script_fetcher_http_transaction_factory
;
129 scoped_ptr
<net::FtpTransactionFactory
>
130 proxy_script_fetcher_ftp_transaction_factory
;
131 scoped_ptr
<net::URLRequestJobFactory
>
132 proxy_script_fetcher_url_request_job_factory
;
133 scoped_ptr
<net::URLRequestThrottlerManager
> throttler_manager
;
134 scoped_ptr
<net::URLSecurityManager
> url_security_manager
;
135 // TODO(willchan): Remove proxy script fetcher context since it's not
136 // necessary now that I got rid of refcounting URLRequestContexts.
138 // The first URLRequestContext is |system_url_request_context|. We introduce
139 // |proxy_script_fetcher_context| for the second context. It has a direct
140 // ProxyService, since we always directly connect to fetch the PAC script.
141 scoped_ptr
<net::URLRequestContext
> proxy_script_fetcher_context
;
142 scoped_ptr
<net::ProxyService
> system_proxy_service
;
143 scoped_ptr
<net::HttpTransactionFactory
> system_http_transaction_factory
;
144 scoped_ptr
<net::URLRequestContext
> system_request_context
;
145 SystemRequestContextLeakChecker system_request_context_leak_checker
;
146 // |system_cookie_store| and |system_server_bound_cert_service| are shared
147 // between |proxy_script_fetcher_context| and |system_request_context|.
148 scoped_refptr
<net::CookieStore
> system_cookie_store
;
149 scoped_refptr
<extensions::EventRouterForwarder
>
150 extension_event_router_forwarder
;
151 scoped_ptr
<chrome_browser_net::HttpPipeliningCompatibilityClient
>
152 http_pipelining_compatibility_client
;
153 scoped_ptr
<chrome_browser_net::LoadTimeStats
> load_time_stats
;
154 scoped_ptr
<net::HostMappingRules
> host_mapping_rules
;
155 scoped_ptr
<net::HttpUserAgentSettings
> http_user_agent_settings
;
156 bool ignore_certificate_errors
;
157 bool http_pipelining_enabled
;
158 uint16 testing_fixed_http_port
;
159 uint16 testing_fixed_https_port
;
160 Optional
<size_t> initial_max_spdy_concurrent_streams
;
161 Optional
<size_t> max_spdy_concurrent_streams_limit
;
162 Optional
<bool> force_spdy_single_domain
;
163 Optional
<bool> enable_spdy_ip_pooling
;
164 Optional
<bool> enable_spdy_compression
;
165 Optional
<bool> enable_spdy_ping_based_connection_checking
;
166 Optional
<net::NextProto
> spdy_default_protocol
;
167 Optional
<string
> trusted_spdy_proxy
;
168 Optional
<bool> enable_quic
;
169 Optional
<bool> enable_quic_https
;
170 Optional
<size_t> quic_max_packet_length
;
171 Optional
<net::HostPortPair
> origin_to_force_quic_on
;
172 bool enable_user_alternate_protocol_ports
;
173 // NetErrorTabHelper uses |dns_probe_service| to send DNS probes when a
174 // main frame load fails with a DNS error in order to provide more useful
175 // information to the renderer so it can show a more specific error page.
176 scoped_ptr
<chrome_browser_net::DnsProbeService
> dns_probe_service
;
177 scoped_ptr
<net::NetworkTimeNotifier
> network_time_notifier
;
180 // |net_log| must either outlive the IOThread or be NULL.
181 IOThread(PrefService
* local_state
,
182 policy::PolicyService
* policy_service
,
183 ChromeNetLog
* net_log
,
184 extensions::EventRouterForwarder
* extension_event_router_forwarder
);
188 static void RegisterPrefs(PrefRegistrySimple
* registry
);
190 // Can only be called on the IO thread.
193 // Allows overriding Globals in tests where IOThread::Init() and
194 // IOThread::CleanUp() are not called. This allows for injecting mocks into
195 // IOThread global objects.
196 void SetGlobalsForTesting(Globals
* globals
);
198 ChromeNetLog
* net_log();
200 // Handles changing to On The Record mode, discarding confidential data.
201 void ChangedToOnTheRecord();
203 // Returns a getter for the URLRequestContext. Only called on the UI thread.
204 net::URLRequestContextGetter
* system_url_request_context_getter();
206 // Clears the host cache. Intended to be used to prevent exposing recently
207 // visited sites on about:net-internals/#dns and about:dns pages. Must be
208 // called on the IO thread.
209 void ClearHostCache();
211 void InitializeNetworkSessionParams(net::HttpNetworkSession::Params
* params
);
214 // Provide SystemURLRequestContextGetter with access to
215 // InitSystemRequestContext().
216 friend class SystemURLRequestContextGetter
;
218 // BrowserThreadDelegate implementation, runs on the IO thread.
219 // This handles initialization and destruction of state that must
220 // live on the IO thread.
221 virtual void Init() OVERRIDE
;
222 virtual void InitAsync() OVERRIDE
;
223 virtual void CleanUp() OVERRIDE
;
225 void InitializeNetworkOptions(const CommandLine
& parsed_command_line
);
227 // Enable SPDY with the given mode, which may contain the following:
229 // "off" : Disables SPDY support entirely.
230 // "ssl" : Forces SPDY for all HTTPS requests.
231 // "no-ssl" : Forces SPDY for all HTTP requests.
232 // "no-ping" : Disables SPDY ping connection testing.
233 // "exclude=<host>" : Disables SPDY support for the host <host>.
234 // "no-compress" : Disables SPDY header compression.
235 // "no-alt-protocols : Disables alternate protocol support.
236 // "force-alt-protocols : Forces an alternate protocol of SPDY/3
238 // "single-domain" : Forces all spdy traffic to a single domain.
239 // "init-max-streams=<limit>" : Specifies the maximum number of concurrent
240 // streams for a SPDY session, unless the
241 // specifies a different value via SETTINGS.
242 void EnableSpdy(const std::string
& mode
);
244 // Global state must be initialized on the IO thread, then this
245 // method must be invoked on the UI thread.
246 void InitSystemRequestContext();
248 // Lazy initialization of system request context for
249 // SystemURLRequestContextGetter. To be called on IO thread only
250 // after global state has been initialized on the IO thread, and
251 // SystemRequestContext state has been initialized on the UI thread.
252 void InitSystemRequestContextOnIOThread();
254 net::HttpAuthHandlerFactory
* CreateDefaultAuthHandlerFactory(
255 net::HostResolver
* resolver
);
257 // Returns an SSLConfigService instance.
258 net::SSLConfigService
* GetSSLConfigService();
260 void ChangedToOnTheRecordOnIOThread();
262 void UpdateDnsClientEnabled();
264 // Configures QUIC options based on the flags in |command_line| as
265 // well as the QUIC field trial group.
266 void ConfigureQuic(const CommandLine
& command_line
);
268 // Returns true if QUIC should be enabled, either as a result
269 // of a field trial or a command line flag.
270 bool ShouldEnableQuic(const CommandLine
& command_line
,
271 base::StringPiece quic_trial_group
);
273 // Returns true if HTTPS over QUIC should be enabled, either as a result
274 // of a field trial or a command line flag.
275 bool ShouldEnableQuicHttps(const CommandLine
& command_line
,
276 base::StringPiece quic_trial_group
);
278 // Returns the maximum length for QUIC packets, based on any flags in
279 // |command_line| or the field trial. Returns 0 if there is an error
280 // parsing any of the options, or if the default value should be used.
281 size_t GetQuicMaxPacketLength(const CommandLine
& command_line
,
282 base::StringPiece quic_trial_group
);
284 // The NetLog is owned by the browser process, to allow logging from other
285 // threads during shutdown, but is used most frequently on the IOThread.
286 ChromeNetLog
* net_log_
;
288 // The extensions::EventRouterForwarder allows for sending events to
289 // extensions from the IOThread.
290 extensions::EventRouterForwarder
* extension_event_router_forwarder_
;
292 // These member variables are basically global, but their lifetimes are tied
293 // to the IOThread. IOThread owns them all, despite not using scoped_ptr.
294 // This is because the destructor of IOThread runs on the wrong thread. All
295 // member variables should be deleted in CleanUp().
297 // These member variables are initialized in Init() and do not change for the
298 // lifetime of the IO thread.
302 // Observer that logs network changes to the ChromeNetLog.
303 class LoggingNetworkChangeObserver
;
304 scoped_ptr
<LoggingNetworkChangeObserver
> network_change_observer_
;
306 BooleanPrefMember system_enable_referrers_
;
308 BooleanPrefMember dns_client_enabled_
;
310 // Store HTTP Auth-related policies in this thread.
311 std::string auth_schemes_
;
312 bool negotiate_disable_cname_lookup_
;
313 bool negotiate_enable_port_
;
314 std::string auth_server_whitelist_
;
315 std::string auth_delegate_whitelist_
;
316 std::string gssapi_library_name_
;
317 std::vector
<GURL
> spdyproxy_auth_origins_
;
319 // This is an instance of the default SSLConfigServiceManager for the current
320 // platform and it gets SSL preferences from local_state object.
321 scoped_ptr
<SSLConfigServiceManager
> ssl_config_service_manager_
;
323 // These member variables are initialized by a task posted to the IO thread,
324 // which gets posted by calling certain member functions of IOThread.
325 scoped_ptr
<net::ProxyConfigService
> system_proxy_config_service_
;
327 scoped_ptr
<PrefProxyConfigTracker
> pref_proxy_config_tracker_
;
329 scoped_refptr
<net::URLRequestContextGetter
>
330 system_url_request_context_getter_
;
332 net::SdchManager
* sdch_manager_
;
334 // True if SPDY is disabled by policy.
335 bool is_spdy_disabled_by_policy_
;
337 base::WeakPtrFactory
<IOThread
> weak_factory_
;
339 DISALLOW_COPY_AND_ASSIGN(IOThread
);
342 #endif // CHROME_BROWSER_IO_THREAD_H_