Convert browser_tests to Swarming.
[chromium-blink-merge.git] / chrome / browser / io_thread.h
blob2406fe872aab32c593cd892d720a71d33188cf96
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_
8 #include <string>
9 #include <vector>
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 "base/strings/string_piece.h"
18 #include "base/time/time.h"
19 #include "chrome/browser/net/chrome_network_delegate.h"
20 #include "chrome/browser/net/ssl_config_service_manager.h"
21 #include "content/public/browser/browser_thread.h"
22 #include "content/public/browser/browser_thread_delegate.h"
23 #include "net/base/network_change_notifier.h"
24 #include "net/http/http_network_session.h"
25 #include "net/socket/next_proto.h"
27 class ChromeNetLog;
28 class PrefProxyConfigTracker;
29 class PrefService;
30 class PrefRegistrySimple;
31 class SystemURLRequestContextGetter;
33 namespace base {
34 class CommandLine;
37 namespace chrome_browser_net {
38 class DnsProbeService;
41 namespace extensions {
42 class EventRouterForwarder;
45 namespace net {
46 class CertPolicyEnforcer;
47 class CertVerifier;
48 class ChannelIDService;
49 class CookieStore;
50 class CTVerifier;
51 class FtpTransactionFactory;
52 class HostMappingRules;
53 class HostResolver;
54 class HttpAuthHandlerFactory;
55 class HttpServerProperties;
56 class HttpTransactionFactory;
57 class HttpUserAgentSettings;
58 class NetworkDelegate;
59 class NetworkQualityEstimator;
60 class ProxyConfigService;
61 class ProxyService;
62 class SSLConfigService;
63 class TransportSecurityState;
64 class URLRequestContext;
65 class URLRequestContextGetter;
66 class URLRequestJobFactory;
67 class URLRequestThrottlerManager;
68 class URLSecurityManager;
69 } // namespace net
71 namespace policy {
72 class PolicyService;
73 } // namespace policy
75 namespace test {
76 class IOThreadPeer;
77 } // namespace test
79 // Contains state associated with, initialized and cleaned up on, and
80 // primarily used on, the IO thread.
82 // If you are looking to interact with the IO thread (e.g. post tasks
83 // to it or check if it is the current thread), see
84 // content::BrowserThread.
85 class IOThread : public content::BrowserThreadDelegate {
86 public:
87 struct Globals {
88 template <typename T>
89 class Optional {
90 public:
91 Optional() : set_(false) {}
93 void set(T value) {
94 set_ = true;
95 value_ = value;
97 void CopyToIfSet(T* value) const {
98 if (set_) {
99 *value = value_;
103 private:
104 bool set_;
105 T value_;
108 class SystemRequestContextLeakChecker {
109 public:
110 explicit SystemRequestContextLeakChecker(Globals* globals);
111 ~SystemRequestContextLeakChecker();
113 private:
114 Globals* const globals_;
117 Globals();
118 ~Globals();
120 // The "system" NetworkDelegate, used for Profile-agnostic network events.
121 scoped_ptr<net::NetworkDelegate> system_network_delegate;
122 scoped_ptr<net::HostResolver> host_resolver;
123 scoped_ptr<net::CertVerifier> cert_verifier;
124 // The ChannelIDService must outlive the HttpTransactionFactory.
125 scoped_ptr<net::ChannelIDService> system_channel_id_service;
126 // This TransportSecurityState doesn't load or save any state. It's only
127 // used to enforce pinning for system requests and will only use built-in
128 // pins.
129 scoped_ptr<net::TransportSecurityState> transport_security_state;
130 scoped_ptr<net::CTVerifier> cert_transparency_verifier;
131 scoped_ptr<net::CertPolicyEnforcer> cert_policy_enforcer;
132 scoped_refptr<net::SSLConfigService> ssl_config_service;
133 scoped_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory;
134 scoped_ptr<net::HttpServerProperties> http_server_properties;
135 scoped_ptr<net::ProxyService> proxy_script_fetcher_proxy_service;
136 scoped_ptr<net::HttpTransactionFactory>
137 proxy_script_fetcher_http_transaction_factory;
138 scoped_ptr<net::FtpTransactionFactory>
139 proxy_script_fetcher_ftp_transaction_factory;
140 scoped_ptr<net::URLRequestJobFactory>
141 proxy_script_fetcher_url_request_job_factory;
142 scoped_ptr<net::URLRequestThrottlerManager> throttler_manager;
143 scoped_ptr<net::URLSecurityManager> url_security_manager;
144 // TODO(willchan): Remove proxy script fetcher context since it's not
145 // necessary now that I got rid of refcounting URLRequestContexts.
147 // The first URLRequestContext is |system_url_request_context|. We introduce
148 // |proxy_script_fetcher_context| for the second context. It has a direct
149 // ProxyService, since we always directly connect to fetch the PAC script.
150 scoped_ptr<net::URLRequestContext> proxy_script_fetcher_context;
151 scoped_ptr<net::ProxyService> system_proxy_service;
152 scoped_ptr<net::HttpTransactionFactory> system_http_transaction_factory;
153 scoped_ptr<net::URLRequestJobFactory> system_url_request_job_factory;
154 scoped_ptr<net::URLRequestContext> system_request_context;
155 SystemRequestContextLeakChecker system_request_context_leak_checker;
156 // |system_cookie_store| and |system_channel_id_service| are shared
157 // between |proxy_script_fetcher_context| and |system_request_context|.
158 scoped_refptr<net::CookieStore> system_cookie_store;
159 #if defined(ENABLE_EXTENSIONS)
160 scoped_refptr<extensions::EventRouterForwarder>
161 extension_event_router_forwarder;
162 #endif
163 scoped_ptr<net::HostMappingRules> host_mapping_rules;
164 scoped_ptr<net::HttpUserAgentSettings> http_user_agent_settings;
165 scoped_ptr<net::NetworkQualityEstimator> network_quality_estimator;
166 bool ignore_certificate_errors;
167 uint16 testing_fixed_http_port;
168 uint16 testing_fixed_https_port;
169 Optional<bool> enable_tcp_fast_open_for_ssl;
171 Optional<size_t> initial_max_spdy_concurrent_streams;
172 Optional<bool> enable_spdy_compression;
173 Optional<bool> enable_spdy_ping_based_connection_checking;
174 Optional<net::NextProto> spdy_default_protocol;
175 net::NextProtoVector next_protos;
176 Optional<std::string> trusted_spdy_proxy;
177 std::set<net::HostPortPair> forced_spdy_exclusions;
178 Optional<bool> use_alternate_protocols;
179 Optional<double> alternative_service_probability_threshold;
181 Optional<bool> enable_quic;
182 Optional<bool> disable_insecure_quic;
183 Optional<bool> enable_quic_for_proxies;
184 Optional<bool> enable_quic_port_selection;
185 Optional<bool> quic_always_require_handshake_confirmation;
186 Optional<bool> quic_disable_connection_pooling;
187 Optional<float> quic_load_server_info_timeout_srtt_multiplier;
188 Optional<bool> quic_enable_connection_racing;
189 Optional<bool> quic_enable_non_blocking_io;
190 Optional<bool> quic_disable_disk_cache;
191 Optional<bool> quic_prefer_aes;
192 Optional<int> quic_max_number_of_lossy_connections;
193 Optional<float> quic_packet_loss_threshold;
194 Optional<int> quic_socket_receive_buffer_size;
195 Optional<size_t> quic_max_packet_length;
196 net::QuicTagVector quic_connection_options;
197 Optional<std::string> quic_user_agent_id;
198 Optional<net::QuicVersionVector> quic_supported_versions;
199 Optional<net::HostPortPair> origin_to_force_quic_on;
200 bool enable_user_alternate_protocol_ports;
201 // NetErrorTabHelper uses |dns_probe_service| to send DNS probes when a
202 // main frame load fails with a DNS error in order to provide more useful
203 // information to the renderer so it can show a more specific error page.
204 scoped_ptr<chrome_browser_net::DnsProbeService> dns_probe_service;
207 // |net_log| must either outlive the IOThread or be NULL.
208 IOThread(PrefService* local_state,
209 policy::PolicyService* policy_service,
210 ChromeNetLog* net_log,
211 extensions::EventRouterForwarder* extension_event_router_forwarder);
213 ~IOThread() override;
215 static void RegisterPrefs(PrefRegistrySimple* registry);
217 // Can only be called on the IO thread.
218 Globals* globals();
220 // Allows overriding Globals in tests where IOThread::Init() and
221 // IOThread::CleanUp() are not called. This allows for injecting mocks into
222 // IOThread global objects.
223 void SetGlobalsForTesting(Globals* globals);
225 ChromeNetLog* net_log();
227 // Handles changing to On The Record mode, discarding confidential data.
228 void ChangedToOnTheRecord();
230 // Returns a getter for the URLRequestContext. Only called on the UI thread.
231 net::URLRequestContextGetter* system_url_request_context_getter();
233 // Clears the host cache. Intended to be used to prevent exposing recently
234 // visited sites on about:net-internals/#dns and about:dns pages. Must be
235 // called on the IO thread.
236 void ClearHostCache();
238 void InitializeNetworkSessionParams(net::HttpNetworkSession::Params* params);
240 base::TimeTicks creation_time() const;
242 // Returns true if QUIC should be enabled for data reduction proxy, either as
243 // a result of a field trial or a command line flag.
244 static bool ShouldEnableQuicForDataReductionProxy();
246 private:
247 // Map from name to value for all parameters associate with a field trial.
248 typedef std::map<std::string, std::string> VariationParameters;
250 // Provide SystemURLRequestContextGetter with access to
251 // InitSystemRequestContext().
252 friend class SystemURLRequestContextGetter;
254 friend class test::IOThreadPeer;
256 // BrowserThreadDelegate implementation, runs on the IO thread.
257 // This handles initialization and destruction of state that must
258 // live on the IO thread.
259 void Init() override;
260 void CleanUp() override;
262 // Initializes |params| based on the settings in |globals|.
263 static void InitializeNetworkSessionParamsFromGlobals(
264 const Globals& globals,
265 net::HttpNetworkSession::Params* params);
267 void InitializeNetworkOptions(const base::CommandLine& parsed_command_line);
269 // Sets up TCP FastOpen if enabled via field trials or via the command line.
270 void ConfigureTCPFastOpen(const base::CommandLine& command_line);
272 // Configures available SPDY protocol versions in |globals| based on the flags
273 // in |command_lin| as well as SPDY field trial group and parameters. Must be
274 // called after ConfigureQuicGlobals.
275 static void ConfigureSpdyGlobals(const base::CommandLine& command_line,
276 base::StringPiece quic_trial_group,
277 const VariationParameters& quic_trial_params,
278 Globals* globals);
280 // Global state must be initialized on the IO thread, then this
281 // method must be invoked on the UI thread.
282 void InitSystemRequestContext();
284 // Lazy initialization of system request context for
285 // SystemURLRequestContextGetter. To be called on IO thread only
286 // after global state has been initialized on the IO thread, and
287 // SystemRequestContext state has been initialized on the UI thread.
288 void InitSystemRequestContextOnIOThread();
290 net::HttpAuthHandlerFactory* CreateDefaultAuthHandlerFactory(
291 net::HostResolver* resolver);
293 // Returns an SSLConfigService instance.
294 net::SSLConfigService* GetSSLConfigService();
296 void ChangedToOnTheRecordOnIOThread();
298 void UpdateDnsClientEnabled();
300 // Configures QUIC options based on the flags in |command_line| as
301 // well as the QUIC field trial group.
302 void ConfigureQuic(const base::CommandLine& command_line);
304 extensions::EventRouterForwarder* extension_event_router_forwarder() {
305 #if defined(ENABLE_EXTENSIONS)
306 return extension_event_router_forwarder_;
307 #else
308 return NULL;
309 #endif
311 // Configures QUIC options in |globals| based on the flags in |command_line|
312 // as well as the QUIC field trial group and parameters. Must be called
313 // before ConfigureSpdyGlobals.
314 static void ConfigureQuicGlobals(
315 const base::CommandLine& command_line,
316 base::StringPiece quic_trial_group,
317 const VariationParameters& quic_trial_params,
318 bool quic_allowed_by_policy,
319 Globals* globals);
321 // Returns true if QUIC should be enabled, either as a result
322 // of a field trial or a command line flag.
323 static bool ShouldEnableQuic(
324 const base::CommandLine& command_line,
325 base::StringPiece quic_trial_group,
326 bool quic_allowed_by_policy);
328 // Returns true if QUIC should be enabled for proxies, either as a result
329 // of a field trial or a command line flag.
330 static bool ShouldEnableQuicForProxies(
331 const base::CommandLine& command_line,
332 base::StringPiece quic_trial_group,
333 bool quic_allowed_by_policy);
335 // Returns true if QUIC should be disabled for http:// URLs, as a result
336 // of a field trial.
337 static bool ShouldDisableInsecureQuic(
338 const VariationParameters& quic_trial_params);
340 // Returns true if the selection of the ephemeral port in bind() should be
341 // performed by Chromium, and false if the OS should select the port. The OS
342 // option is used to prevent Windows from posting a security security warning
343 // dialog.
344 static bool ShouldEnableQuicPortSelection(
345 const base::CommandLine& command_line);
347 // Returns true if QUIC should always require handshake confirmation during
348 // the QUIC handshake.
349 static bool ShouldQuicAlwaysRequireHandshakeConfirmation(
350 const VariationParameters& quic_trial_params);
352 // Returns true if QUIC should disable connection pooling.
353 static bool ShouldQuicDisableConnectionPooling(
354 const VariationParameters& quic_trial_params);
356 // Returns the ratio of time to load QUIC sever information from disk cache to
357 // 'smoothed RTT' based on field trial. Returns 0 if there is an error parsing
358 // the field trial params, or if the default value should be used.
359 static float GetQuicLoadServerInfoTimeoutSrttMultiplier(
360 const VariationParameters& quic_trial_params);
362 // Returns true if QUIC's connection racing should be enabled.
363 static bool ShouldQuicEnableConnectionRacing(
364 const VariationParameters& quic_trial_params);
366 // Returns true if QUIC's should use non-blocking IO.
367 static bool ShouldQuicEnableNonBlockingIO(
368 const VariationParameters& quic_trial_params);
370 // Returns true if QUIC shouldn't load QUIC server information from the disk
371 // cache.
372 static bool ShouldQuicDisableDiskCache(
373 const VariationParameters& quic_trial_params);
375 // Returns true if QUIC should prefer AES-GCN even without hardware support.
376 static bool ShouldQuicPreferAes(const VariationParameters& quic_trial_params);
378 // Returns the maximum number of QUIC connections with high packet loss in a
379 // row after which QUIC should be disabled. Returns 0 if the default value
380 // should be used.
381 static int GetQuicMaxNumberOfLossyConnections(
382 const VariationParameters& quic_trial_params);
384 // Returns the packet loss rate in fraction after which a QUIC connection is
385 // closed and is considered as a lossy connection. Returns 0 if the default
386 // value should be used.
387 static float GetQuicPacketLossThreshold(
388 const VariationParameters& quic_trial_params);
390 // Returns the size of the QUIC receive buffer to use, or 0 if
391 // the default should be used.
392 static int GetQuicSocketReceiveBufferSize(
393 const VariationParameters& quic_trial_params);
395 // Returns the maximum length for QUIC packets, based on any flags in
396 // |command_line| or the field trial. Returns 0 if there is an error
397 // parsing any of the options, or if the default value should be used.
398 static size_t GetQuicMaxPacketLength(
399 const base::CommandLine& command_line,
400 const VariationParameters& quic_trial_params);
402 // Returns the QUIC versions specified by any flags in |command_line|
403 // or |quic_trial_params|.
404 static net::QuicVersion GetQuicVersion(
405 const base::CommandLine& command_line,
406 const VariationParameters& quic_trial_params);
408 // Returns the QUIC version specified by |quic_version| or
409 // QUIC_VERSION_UNSUPPORTED if |quic_version| is invalid.
410 static net::QuicVersion ParseQuicVersion(const std::string& quic_version);
412 // Returns the QUIC connection options specified by any flags in
413 // |command_line| or |quic_trial_params|.
414 static net::QuicTagVector GetQuicConnectionOptions(
415 const base::CommandLine& command_line,
416 const VariationParameters& quic_trial_params);
418 // Returns the alternative service probability threshold specified by
419 // any flags in |command_line| or |quic_trial_params|.
420 static double GetAlternativeProtocolProbabilityThreshold(
421 const base::CommandLine& command_line,
422 const VariationParameters& quic_trial_params);
424 // The NetLog is owned by the browser process, to allow logging from other
425 // threads during shutdown, but is used most frequently on the IOThread.
426 ChromeNetLog* net_log_;
428 #if defined(ENABLE_EXTENSIONS)
429 // The extensions::EventRouterForwarder allows for sending events to
430 // extensions from the IOThread.
431 extensions::EventRouterForwarder* extension_event_router_forwarder_;
432 #endif
434 // These member variables are basically global, but their lifetimes are tied
435 // to the IOThread. IOThread owns them all, despite not using scoped_ptr.
436 // This is because the destructor of IOThread runs on the wrong thread. All
437 // member variables should be deleted in CleanUp().
439 // These member variables are initialized in Init() and do not change for the
440 // lifetime of the IO thread.
442 Globals* globals_;
444 // Observer that logs network changes to the ChromeNetLog.
445 class LoggingNetworkChangeObserver;
446 scoped_ptr<LoggingNetworkChangeObserver> network_change_observer_;
448 BooleanPrefMember system_enable_referrers_;
450 BooleanPrefMember dns_client_enabled_;
452 BooleanPrefMember quick_check_enabled_;
454 // Store HTTP Auth-related policies in this thread.
455 std::string auth_schemes_;
456 bool negotiate_disable_cname_lookup_;
457 bool negotiate_enable_port_;
458 std::string auth_server_whitelist_;
459 std::string auth_delegate_whitelist_;
460 std::string gssapi_library_name_;
462 // This is an instance of the default SSLConfigServiceManager for the current
463 // platform and it gets SSL preferences from local_state object.
464 scoped_ptr<SSLConfigServiceManager> ssl_config_service_manager_;
466 // These member variables are initialized by a task posted to the IO thread,
467 // which gets posted by calling certain member functions of IOThread.
468 scoped_ptr<net::ProxyConfigService> system_proxy_config_service_;
470 scoped_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_;
472 scoped_refptr<net::URLRequestContextGetter>
473 system_url_request_context_getter_;
475 // True if SPDY is disabled by policy.
476 bool is_spdy_disabled_by_policy_;
478 // True if QUIC is allowed by policy.
479 bool is_quic_allowed_by_policy_;
481 const base::TimeTicks creation_time_;
483 base::WeakPtrFactory<IOThread> weak_factory_;
485 DISALLOW_COPY_AND_ASSIGN(IOThread);
488 #endif // CHROME_BROWSER_IO_THREAD_H_