15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_IO_THREAD_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_IO_THREAD_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h"
1729b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch#include "base/strings/string_piece.h"
18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/time/time.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/net/chrome_network_delegate.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/ssl_config_service_manager.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread_delegate.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_network_session.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/socket/next_proto.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeNetLog;
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass PrefProxyConfigTracker;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefService;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefRegistrySimple;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SystemURLRequestContextGetter;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace base {
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class CommandLine;
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome_browser_net {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DnsProbeService;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace data_reduction_proxy {
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class DataReductionProxyAuthRequestHandler;
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass DataReductionProxyDelegate;
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class DataReductionProxyParams;
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EventRouterForwarder;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CertVerifier;
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ChannelIDService;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CookieStore;
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class CTVerifier;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FtpTransactionFactory;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostMappingRules;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostResolver;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpAuthHandlerFactory;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpServerProperties;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpTransactionFactory;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpUserAgentSettings;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkDelegate;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyConfigService;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyService;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLConfigService;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransportSecurityState;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContext;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContextGetter;
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class URLRequestJobFactory;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestThrottlerManager;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLSecurityManager;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace policy {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PolicyService;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace policy
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test {
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass IOThreadPeer;
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace test
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Contains state associated with, initialized and cleaned up on, and
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// primarily used on, the IO thread.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If you are looking to interact with the IO thread (e.g. post tasks
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to it or check if it is the current thread), see
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content::BrowserThread.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IOThread : public content::BrowserThreadDelegate {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Globals {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    template <typename T>
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class Optional {
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     public:
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Optional() : set_(false) {}
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      void set(T value) {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        set_ = true;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        value_ = value;
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      void CopyToIfSet(T* value) const {
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (set_) {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          *value = value_;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     private:
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool set_;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      T value_;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class SystemRequestContextLeakChecker {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     public:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      explicit SystemRequestContextLeakChecker(Globals* globals);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ~SystemRequestContextLeakChecker();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     private:
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Globals* const globals_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Globals();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~Globals();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The "system" NetworkDelegate, used for Profile-agnostic network events.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::NetworkDelegate> system_network_delegate;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::HostResolver> host_resolver;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::CertVerifier> cert_verifier;
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // The ChannelIDService must outlive the HttpTransactionFactory.
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    scoped_ptr<net::ChannelIDService> system_channel_id_service;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This TransportSecurityState doesn't load or save any state. It's only
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // used to enforce pinning for system requests and will only use built-in
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // pins.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::TransportSecurityState> transport_security_state;
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    scoped_ptr<net::CTVerifier> cert_transparency_verifier;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<net::SSLConfigService> ssl_config_service;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::HttpServerProperties> http_server_properties;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::ProxyService> proxy_script_fetcher_proxy_service;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::HttpTransactionFactory>
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proxy_script_fetcher_http_transaction_factory;
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<net::FtpTransactionFactory>
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        proxy_script_fetcher_ftp_transaction_factory;
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<net::URLRequestJobFactory>
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        proxy_script_fetcher_url_request_job_factory;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::URLRequestThrottlerManager> throttler_manager;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::URLSecurityManager> url_security_manager;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(willchan): Remove proxy script fetcher context since it's not
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // necessary now that I got rid of refcounting URLRequestContexts.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The first URLRequestContext is |system_url_request_context|. We introduce
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |proxy_script_fetcher_context| for the second context. It has a direct
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ProxyService, since we always directly connect to fetch the PAC script.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::URLRequestContext> proxy_script_fetcher_context;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::ProxyService> system_proxy_service;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::HttpTransactionFactory> system_http_transaction_factory;
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_ptr<net::URLRequestJobFactory> system_url_request_job_factory;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::URLRequestContext> system_request_context;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SystemRequestContextLeakChecker system_request_context_leak_checker;
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // |system_cookie_store| and |system_channel_id_service| are shared
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // between |proxy_script_fetcher_context| and |system_request_context|.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<net::CookieStore> system_cookie_store;
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<extensions::EventRouterForwarder>
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extension_event_router_forwarder;
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::HostMappingRules> host_mapping_rules;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::HttpUserAgentSettings> http_user_agent_settings;
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    bool enable_ssl_connect_job_waiting;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool ignore_certificate_errors;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint16 testing_fixed_http_port;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint16 testing_fixed_https_port;
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Optional<bool> enable_tcp_fast_open_for_ssl;
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Optional<size_t> initial_max_spdy_concurrent_streams;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Optional<bool> force_spdy_single_domain;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Optional<bool> enable_spdy_compression;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Optional<bool> enable_spdy_ping_based_connection_checking;
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Optional<net::NextProto> spdy_default_protocol;
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    net::NextProtoVector next_protos;
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Optional<string> trusted_spdy_proxy;
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Optional<bool> force_spdy_over_ssl;
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Optional<bool> force_spdy_always;
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::set<net::HostPortPair> forced_spdy_exclusions;
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Optional<bool> use_alternate_protocols;
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Optional<double> alternate_protocol_probability_threshold;
18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    Optional<bool> enable_websocket_over_spdy;
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Optional<bool> enable_quic;
1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    Optional<bool> enable_quic_time_based_loss_detection;
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Optional<bool> enable_quic_port_selection;
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Optional<bool> quic_always_require_handshake_confirmation;
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Optional<bool> quic_disable_connection_pooling;
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Optional<size_t> quic_max_packet_length;
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    net::QuicTagVector quic_connection_options;
19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    Optional<std::string> quic_user_agent_id;
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Optional<net::QuicVersionVector> quic_supported_versions;
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Optional<net::HostPortPair> origin_to_force_quic_on;
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool enable_user_alternate_protocol_ports;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // NetErrorTabHelper uses |dns_probe_service| to send DNS probes when a
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // main frame load fails with a DNS error in order to provide more useful
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // information to the renderer so it can show a more specific error page.
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<chrome_browser_net::DnsProbeService> dns_probe_service;
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<data_reduction_proxy::DataReductionProxyParams>
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        data_reduction_proxy_params;
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<data_reduction_proxy::DataReductionProxyAuthRequestHandler>
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        data_reduction_proxy_auth_request_handler;
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<data_reduction_proxy::DataReductionProxyDelegate>
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        data_reduction_proxy_delegate;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |net_log| must either outlive the IOThread or be NULL.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IOThread(PrefService* local_state,
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           policy::PolicyService* policy_service,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           ChromeNetLog* net_log,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           extensions::EventRouterForwarder* extension_event_router_forwarder);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~IOThread();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void RegisterPrefs(PrefRegistrySimple* registry);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can only be called on the IO thread.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Globals* globals();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Allows overriding Globals in tests where IOThread::Init() and
225a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // IOThread::CleanUp() are not called.  This allows for injecting mocks into
226a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // IOThread global objects.
227a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  void SetGlobalsForTesting(Globals* globals);
228a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeNetLog* net_log();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles changing to On The Record mode, discarding confidential data.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ChangedToOnTheRecord();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a getter for the URLRequestContext.  Only called on the UI thread.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequestContextGetter* system_url_request_context_getter();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears the host cache.  Intended to be used to prevent exposing recently
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // visited sites on about:net-internals/#dns and about:dns pages.  Must be
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called on the IO thread.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearHostCache();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void InitializeNetworkSessionParams(net::HttpNetworkSession::Params* params);
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
244e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  base::TimeTicks creation_time() const;
245e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Map from name to value for all parameters associate with a field trial.
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  typedef std::map<std::string, std::string> VariationParameters;
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Provide SystemURLRequestContextGetter with access to
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // InitSystemRequestContext().
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class SystemURLRequestContextGetter;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  friend class test::IOThreadPeer;
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowserThreadDelegate implementation, runs on the IO thread.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This handles initialization and destruction of state that must
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // live on the IO thread.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Init() OVERRIDE;
2607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void InitAsync() OVERRIDE;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CleanUp() OVERRIDE;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Initializes |params| based on the settings in |globals|.
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static void InitializeNetworkSessionParamsFromGlobals(
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const Globals& globals,
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      net::HttpNetworkSession::Params* params);
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void InitializeNetworkOptions(const base::CommandLine& parsed_command_line);
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Sets up TCP FastOpen if enabled via field trials or via the command line.
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ConfigureTCPFastOpen(const base::CommandLine& command_line);
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Enable SPDY with the given mode, which may contain the following:
2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  //
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   "off"                      : Disables SPDY support entirely.
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   "ssl"                      : Forces SPDY for all HTTPS requests.
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   "no-ssl"                   : Forces SPDY for all HTTP requests.
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   "no-ping"                  : Disables SPDY ping connection testing.
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   "exclude=<host>"           : Disables SPDY support for the host <host>.
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   "no-compress"              : Disables SPDY header compression.
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   "no-alt-protocols          : Disables alternate protocol support.
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  //   "force-alt-protocols       : Forces an alternate protocol of SPDY/3
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //                                on port 443.
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   "single-domain"            : Forces all spdy traffic to a single domain.
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   "init-max-streams=<limit>" : Specifies the maximum number of concurrent
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //                                streams for a SPDY session, unless the
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //                                specifies a different value via SETTINGS.
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void EnableSpdy(const std::string& mode);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Configures available SPDY protocol versions from the given trial.
291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Used only if no command-line configuration was present.
29229b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch  static void ConfigureSpdyFromTrial(base::StringPiece spdy_trial_group,
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     Globals* globals);
294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Global state must be initialized on the IO thread, then this
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // method must be invoked on the UI thread.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitSystemRequestContext();
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lazy initialization of system request context for
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SystemURLRequestContextGetter. To be called on IO thread only
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // after global state has been initialized on the IO thread, and
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SystemRequestContext state has been initialized on the UI thread.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitSystemRequestContextOnIOThread();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpAuthHandlerFactory* CreateDefaultAuthHandlerFactory(
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::HostResolver* resolver);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns an SSLConfigService instance.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::SSLConfigService* GetSSLConfigService();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ChangedToOnTheRecordOnIOThread();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateDnsClientEnabled();
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Configures QUIC options based on the flags in |command_line| as
316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // well as the QUIC field trial group.
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void ConfigureQuic(const base::CommandLine& command_line);
318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Set up data reduction proxy related objects on IO thread globals.
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SetupDataReductionProxy(ChromeNetworkDelegate* network_delegate);
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  extensions::EventRouterForwarder* extension_event_router_forwarder() {
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return extension_event_router_forwarder_;
3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return NULL;
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Configures QUIC options in |globals| based on the flags in |command_line|
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // as well as the QUIC field trial group and parameters.
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static void ConfigureQuicGlobals(
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::CommandLine& command_line,
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::StringPiece quic_trial_group,
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const VariationParameters& quic_trial_params,
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      Globals* globals);
336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Returns true if QUIC should be enabled, either as a result
338bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  // of a field trial or a command line flag.
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static bool ShouldEnableQuic(
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::CommandLine& command_line,
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::StringPiece quic_trial_group);
342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns true if the selection of the ephemeral port in bind() should be
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // performed by Chromium, and false if the OS should select the port.  The OS
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // option is used to prevent Windows from posting a security security warning
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // dialog.
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static bool ShouldEnableQuicPortSelection(
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::CommandLine& command_line);
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns true if QUIC packet pacing should be negotiated during the
351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // QUIC handshake.
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static bool ShouldEnableQuicPacing(
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::CommandLine& command_line,
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::StringPiece quic_trial_group,
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const VariationParameters& quic_trial_params);
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Returns true if QUIC time-base loss detection should be negotiated during
3585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // the QUIC handshake.
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static bool ShouldEnableQuicTimeBasedLossDetection(
3605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const base::CommandLine& command_line,
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::StringPiece quic_trial_group,
362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const VariationParameters& quic_trial_params);
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns true if QUIC should always require handshake confirmation during
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the QUIC handshake.
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static bool ShouldQuicAlwaysRequireHandshakeConfirmation(
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const VariationParameters& quic_trial_params);
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns true if QUIC should disable connection pooling.
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static bool ShouldQuicDisableConnectionPooling(
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const VariationParameters& quic_trial_params);
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Returns the maximum length for QUIC packets, based on any flags in
374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |command_line| or the field trial.  Returns 0 if there is an error
375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // parsing any of the options, or if the default value should be used.
376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static size_t GetQuicMaxPacketLength(
377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::CommandLine& command_line,
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::StringPiece quic_trial_group,
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const VariationParameters& quic_trial_params);
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Returns the QUIC versions specified by any flags in |command_line|
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // or |quic_trial_params|.
383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static net::QuicVersion GetQuicVersion(
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::CommandLine& command_line,
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const VariationParameters& quic_trial_params);
386bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Returns the QUIC version specified by |quic_version| or
388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // QUIC_VERSION_UNSUPPORTED if |quic_version| is invalid.
389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static net::QuicVersion ParseQuicVersion(const std::string& quic_version);
390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Returns the QUIC connection options specified by any flags in
392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |command_line| or |quic_trial_params|.
393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static net::QuicTagVector GetQuicConnectionOptions(
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::CommandLine& command_line,
395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const VariationParameters& quic_trial_params);
396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Returns the list of QUIC tags represented by the comma separated
398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // string in |connection_options|.
399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static net::QuicTagVector ParseQuicConnectionOptions(
400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const std::string& connection_options);
401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Returns the alternate protocol probability threshold specified by
403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // any flags in |command_line| or |quic_trial_params|.
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static double GetAlternateProtocolProbabilityThreshold(
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::CommandLine& command_line,
406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const VariationParameters& quic_trial_params);
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The NetLog is owned by the browser process, to allow logging from other
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // threads during shutdown, but is used most frequently on the IOThread.
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeNetLog* net_log_;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The extensions::EventRouterForwarder allows for sending events to
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extensions from the IOThread.
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::EventRouterForwarder* extension_event_router_forwarder_;
4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These member variables are basically global, but their lifetimes are tied
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the IOThread.  IOThread owns them all, despite not using scoped_ptr.
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is because the destructor of IOThread runs on the wrong thread.  All
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // member variables should be deleted in CleanUp().
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These member variables are initialized in Init() and do not change for the
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // lifetime of the IO thread.
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Globals* globals_;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observer that logs network changes to the ChromeNetLog.
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class LoggingNetworkChangeObserver;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LoggingNetworkChangeObserver> network_change_observer_;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BooleanPrefMember system_enable_referrers_;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BooleanPrefMember dns_client_enabled_;
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BooleanPrefMember quick_check_enabled_;
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Store HTTP Auth-related policies in this thread.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string auth_schemes_;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool negotiate_disable_cname_lookup_;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool negotiate_enable_port_;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string auth_server_whitelist_;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string auth_delegate_whitelist_;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string gssapi_library_name_;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is an instance of the default SSLConfigServiceManager for the current
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // platform and it gets SSL preferences from local_state object.
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SSLConfigServiceManager> ssl_config_service_manager_;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These member variables are initialized by a task posted to the IO thread,
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which gets posted by calling certain member functions of IOThread.
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::ProxyConfigService> system_proxy_config_service_;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
454ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::URLRequestContextGetter>
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      system_url_request_context_getter_;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if SPDY is disabled by policy.
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_spdy_disabled_by_policy_;
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  const base::TimeTicks creation_time_;
463e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WeakPtrFactory<IOThread> weak_factory_;
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IOThread);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_IO_THREAD_H_
470