Home | History | Annotate | Download | only in browser
      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.
      4 
      5 #ifndef CHROME_BROWSER_IO_THREAD_H_
      6 #define CHROME_BROWSER_IO_THREAD_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     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"
     26 
     27 class ChromeNetLog;
     28 class PrefProxyConfigTracker;
     29 class PrefService;
     30 class PrefRegistrySimple;
     31 class SystemURLRequestContextGetter;
     32 
     33 namespace base {
     34 class CommandLine;
     35 }
     36 
     37 namespace chrome_browser_net {
     38 class DnsProbeService;
     39 }
     40 
     41 namespace data_reduction_proxy {
     42 class DataReductionProxyAuthRequestHandler;
     43 class DataReductionProxyDelegate;
     44 class DataReductionProxyParams;
     45 }
     46 
     47 namespace extensions {
     48 class EventRouterForwarder;
     49 }
     50 
     51 namespace net {
     52 class CertVerifier;
     53 class ChannelIDService;
     54 class CookieStore;
     55 class CTVerifier;
     56 class FtpTransactionFactory;
     57 class HostMappingRules;
     58 class HostResolver;
     59 class HttpAuthHandlerFactory;
     60 class HttpServerProperties;
     61 class HttpTransactionFactory;
     62 class HttpUserAgentSettings;
     63 class NetworkDelegate;
     64 class ProxyConfigService;
     65 class ProxyService;
     66 class SSLConfigService;
     67 class TransportSecurityState;
     68 class URLRequestContext;
     69 class URLRequestContextGetter;
     70 class URLRequestJobFactory;
     71 class URLRequestThrottlerManager;
     72 class URLSecurityManager;
     73 }  // namespace net
     74 
     75 namespace policy {
     76 class PolicyService;
     77 }  // namespace policy
     78 
     79 namespace test {
     80 class IOThreadPeer;
     81 }  // namespace test
     82 
     83 // Contains state associated with, initialized and cleaned up on, and
     84 // primarily used on, the IO thread.
     85 //
     86 // If you are looking to interact with the IO thread (e.g. post tasks
     87 // to it or check if it is the current thread), see
     88 // content::BrowserThread.
     89 class IOThread : public content::BrowserThreadDelegate {
     90  public:
     91   struct Globals {
     92     template <typename T>
     93     class Optional {
     94      public:
     95       Optional() : set_(false) {}
     96 
     97       void set(T value) {
     98         set_ = true;
     99         value_ = value;
    100       }
    101       void CopyToIfSet(T* value) const {
    102         if (set_) {
    103           *value = value_;
    104         }
    105       }
    106 
    107      private:
    108       bool set_;
    109       T value_;
    110     };
    111 
    112     class SystemRequestContextLeakChecker {
    113      public:
    114       explicit SystemRequestContextLeakChecker(Globals* globals);
    115       ~SystemRequestContextLeakChecker();
    116 
    117      private:
    118       Globals* const globals_;
    119     };
    120 
    121     Globals();
    122     ~Globals();
    123 
    124     // The "system" NetworkDelegate, used for Profile-agnostic network events.
    125     scoped_ptr<net::NetworkDelegate> system_network_delegate;
    126     scoped_ptr<net::HostResolver> host_resolver;
    127     scoped_ptr<net::CertVerifier> cert_verifier;
    128     // The ChannelIDService must outlive the HttpTransactionFactory.
    129     scoped_ptr<net::ChannelIDService> system_channel_id_service;
    130     // This TransportSecurityState doesn't load or save any state. It's only
    131     // used to enforce pinning for system requests and will only use built-in
    132     // pins.
    133     scoped_ptr<net::TransportSecurityState> transport_security_state;
    134     scoped_ptr<net::CTVerifier> cert_transparency_verifier;
    135     scoped_refptr<net::SSLConfigService> ssl_config_service;
    136     scoped_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory;
    137     scoped_ptr<net::HttpServerProperties> http_server_properties;
    138     scoped_ptr<net::ProxyService> proxy_script_fetcher_proxy_service;
    139     scoped_ptr<net::HttpTransactionFactory>
    140         proxy_script_fetcher_http_transaction_factory;
    141     scoped_ptr<net::FtpTransactionFactory>
    142         proxy_script_fetcher_ftp_transaction_factory;
    143     scoped_ptr<net::URLRequestJobFactory>
    144         proxy_script_fetcher_url_request_job_factory;
    145     scoped_ptr<net::URLRequestThrottlerManager> throttler_manager;
    146     scoped_ptr<net::URLSecurityManager> url_security_manager;
    147     // TODO(willchan): Remove proxy script fetcher context since it's not
    148     // necessary now that I got rid of refcounting URLRequestContexts.
    149     //
    150     // The first URLRequestContext is |system_url_request_context|. We introduce
    151     // |proxy_script_fetcher_context| for the second context. It has a direct
    152     // ProxyService, since we always directly connect to fetch the PAC script.
    153     scoped_ptr<net::URLRequestContext> proxy_script_fetcher_context;
    154     scoped_ptr<net::ProxyService> system_proxy_service;
    155     scoped_ptr<net::HttpTransactionFactory> system_http_transaction_factory;
    156     scoped_ptr<net::URLRequestJobFactory> system_url_request_job_factory;
    157     scoped_ptr<net::URLRequestContext> system_request_context;
    158     SystemRequestContextLeakChecker system_request_context_leak_checker;
    159     // |system_cookie_store| and |system_channel_id_service| are shared
    160     // between |proxy_script_fetcher_context| and |system_request_context|.
    161     scoped_refptr<net::CookieStore> system_cookie_store;
    162 #if defined(ENABLE_EXTENSIONS)
    163     scoped_refptr<extensions::EventRouterForwarder>
    164         extension_event_router_forwarder;
    165 #endif
    166     scoped_ptr<net::HostMappingRules> host_mapping_rules;
    167     scoped_ptr<net::HttpUserAgentSettings> http_user_agent_settings;
    168     bool enable_ssl_connect_job_waiting;
    169     bool ignore_certificate_errors;
    170     uint16 testing_fixed_http_port;
    171     uint16 testing_fixed_https_port;
    172     Optional<bool> enable_tcp_fast_open_for_ssl;
    173 
    174     Optional<size_t> initial_max_spdy_concurrent_streams;
    175     Optional<bool> force_spdy_single_domain;
    176     Optional<bool> enable_spdy_compression;
    177     Optional<bool> enable_spdy_ping_based_connection_checking;
    178     Optional<net::NextProto> spdy_default_protocol;
    179     net::NextProtoVector next_protos;
    180     Optional<string> trusted_spdy_proxy;
    181     Optional<bool> force_spdy_over_ssl;
    182     Optional<bool> force_spdy_always;
    183     std::set<net::HostPortPair> forced_spdy_exclusions;
    184     Optional<bool> use_alternate_protocols;
    185     Optional<double> alternate_protocol_probability_threshold;
    186     Optional<bool> enable_websocket_over_spdy;
    187 
    188     Optional<bool> enable_quic;
    189     Optional<bool> enable_quic_time_based_loss_detection;
    190     Optional<bool> enable_quic_port_selection;
    191     Optional<bool> quic_always_require_handshake_confirmation;
    192     Optional<bool> quic_disable_connection_pooling;
    193     Optional<size_t> quic_max_packet_length;
    194     net::QuicTagVector quic_connection_options;
    195     Optional<std::string> quic_user_agent_id;
    196     Optional<net::QuicVersionVector> quic_supported_versions;
    197     Optional<net::HostPortPair> origin_to_force_quic_on;
    198     bool enable_user_alternate_protocol_ports;
    199     // NetErrorTabHelper uses |dns_probe_service| to send DNS probes when a
    200     // main frame load fails with a DNS error in order to provide more useful
    201     // information to the renderer so it can show a more specific error page.
    202     scoped_ptr<chrome_browser_net::DnsProbeService> dns_probe_service;
    203     scoped_ptr<data_reduction_proxy::DataReductionProxyParams>
    204         data_reduction_proxy_params;
    205     scoped_ptr<data_reduction_proxy::DataReductionProxyAuthRequestHandler>
    206         data_reduction_proxy_auth_request_handler;
    207     scoped_ptr<data_reduction_proxy::DataReductionProxyDelegate>
    208         data_reduction_proxy_delegate;
    209   };
    210 
    211   // |net_log| must either outlive the IOThread or be NULL.
    212   IOThread(PrefService* local_state,
    213            policy::PolicyService* policy_service,
    214            ChromeNetLog* net_log,
    215            extensions::EventRouterForwarder* extension_event_router_forwarder);
    216 
    217   virtual ~IOThread();
    218 
    219   static void RegisterPrefs(PrefRegistrySimple* registry);
    220 
    221   // Can only be called on the IO thread.
    222   Globals* globals();
    223 
    224   // Allows overriding Globals in tests where IOThread::Init() and
    225   // IOThread::CleanUp() are not called.  This allows for injecting mocks into
    226   // IOThread global objects.
    227   void SetGlobalsForTesting(Globals* globals);
    228 
    229   ChromeNetLog* net_log();
    230 
    231   // Handles changing to On The Record mode, discarding confidential data.
    232   void ChangedToOnTheRecord();
    233 
    234   // Returns a getter for the URLRequestContext.  Only called on the UI thread.
    235   net::URLRequestContextGetter* system_url_request_context_getter();
    236 
    237   // Clears the host cache.  Intended to be used to prevent exposing recently
    238   // visited sites on about:net-internals/#dns and about:dns pages.  Must be
    239   // called on the IO thread.
    240   void ClearHostCache();
    241 
    242   void InitializeNetworkSessionParams(net::HttpNetworkSession::Params* params);
    243 
    244   base::TimeTicks creation_time() const;
    245 
    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;
    249 
    250   // Provide SystemURLRequestContextGetter with access to
    251   // InitSystemRequestContext().
    252   friend class SystemURLRequestContextGetter;
    253 
    254   friend class test::IOThreadPeer;
    255 
    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   virtual void Init() OVERRIDE;
    260   virtual void InitAsync() OVERRIDE;
    261   virtual void CleanUp() OVERRIDE;
    262 
    263   // Initializes |params| based on the settings in |globals|.
    264   static void InitializeNetworkSessionParamsFromGlobals(
    265       const Globals& globals,
    266       net::HttpNetworkSession::Params* params);
    267 
    268   void InitializeNetworkOptions(const base::CommandLine& parsed_command_line);
    269 
    270   // Sets up TCP FastOpen if enabled via field trials or via the command line.
    271   void ConfigureTCPFastOpen(const base::CommandLine& command_line);
    272 
    273   // Enable SPDY with the given mode, which may contain the following:
    274   //
    275   //   "off"                      : Disables SPDY support entirely.
    276   //   "ssl"                      : Forces SPDY for all HTTPS requests.
    277   //   "no-ssl"                   : Forces SPDY for all HTTP requests.
    278   //   "no-ping"                  : Disables SPDY ping connection testing.
    279   //   "exclude=<host>"           : Disables SPDY support for the host <host>.
    280   //   "no-compress"              : Disables SPDY header compression.
    281   //   "no-alt-protocols          : Disables alternate protocol support.
    282   //   "force-alt-protocols       : Forces an alternate protocol of SPDY/3
    283   //                                on port 443.
    284   //   "single-domain"            : Forces all spdy traffic to a single domain.
    285   //   "init-max-streams=<limit>" : Specifies the maximum number of concurrent
    286   //                                streams for a SPDY session, unless the
    287   //                                specifies a different value via SETTINGS.
    288   void EnableSpdy(const std::string& mode);
    289 
    290   // Configures available SPDY protocol versions from the given trial.
    291   // Used only if no command-line configuration was present.
    292   static void ConfigureSpdyFromTrial(base::StringPiece spdy_trial_group,
    293                                      Globals* globals);
    294 
    295   // Global state must be initialized on the IO thread, then this
    296   // method must be invoked on the UI thread.
    297   void InitSystemRequestContext();
    298 
    299   // Lazy initialization of system request context for
    300   // SystemURLRequestContextGetter. To be called on IO thread only
    301   // after global state has been initialized on the IO thread, and
    302   // SystemRequestContext state has been initialized on the UI thread.
    303   void InitSystemRequestContextOnIOThread();
    304 
    305   net::HttpAuthHandlerFactory* CreateDefaultAuthHandlerFactory(
    306       net::HostResolver* resolver);
    307 
    308   // Returns an SSLConfigService instance.
    309   net::SSLConfigService* GetSSLConfigService();
    310 
    311   void ChangedToOnTheRecordOnIOThread();
    312 
    313   void UpdateDnsClientEnabled();
    314 
    315   // Configures QUIC options based on the flags in |command_line| as
    316   // well as the QUIC field trial group.
    317   void ConfigureQuic(const base::CommandLine& command_line);
    318 
    319   // Set up data reduction proxy related objects on IO thread globals.
    320   void SetupDataReductionProxy(ChromeNetworkDelegate* network_delegate);
    321 
    322   extensions::EventRouterForwarder* extension_event_router_forwarder() {
    323 #if defined(ENABLE_EXTENSIONS)
    324     return extension_event_router_forwarder_;
    325 #else
    326     return NULL;
    327 #endif
    328   }
    329   // Configures QUIC options in |globals| based on the flags in |command_line|
    330   // as well as the QUIC field trial group and parameters.
    331   static void ConfigureQuicGlobals(
    332       const base::CommandLine& command_line,
    333       base::StringPiece quic_trial_group,
    334       const VariationParameters& quic_trial_params,
    335       Globals* globals);
    336 
    337   // Returns true if QUIC should be enabled, either as a result
    338   // of a field trial or a command line flag.
    339   static bool ShouldEnableQuic(
    340       const base::CommandLine& command_line,
    341       base::StringPiece quic_trial_group);
    342 
    343   // Returns true if the selection of the ephemeral port in bind() should be
    344   // performed by Chromium, and false if the OS should select the port.  The OS
    345   // option is used to prevent Windows from posting a security security warning
    346   // dialog.
    347   static bool ShouldEnableQuicPortSelection(
    348       const base::CommandLine& command_line);
    349 
    350   // Returns true if QUIC packet pacing should be negotiated during the
    351   // QUIC handshake.
    352   static bool ShouldEnableQuicPacing(
    353       const base::CommandLine& command_line,
    354       base::StringPiece quic_trial_group,
    355       const VariationParameters& quic_trial_params);
    356 
    357   // Returns true if QUIC time-base loss detection should be negotiated during
    358   // the QUIC handshake.
    359   static bool ShouldEnableQuicTimeBasedLossDetection(
    360       const base::CommandLine& command_line,
    361       base::StringPiece quic_trial_group,
    362       const VariationParameters& quic_trial_params);
    363 
    364   // Returns true if QUIC should always require handshake confirmation during
    365   // the QUIC handshake.
    366   static bool ShouldQuicAlwaysRequireHandshakeConfirmation(
    367       const VariationParameters& quic_trial_params);
    368 
    369   // Returns true if QUIC should disable connection pooling.
    370   static bool ShouldQuicDisableConnectionPooling(
    371       const VariationParameters& quic_trial_params);
    372 
    373   // Returns the maximum length for QUIC packets, based on any flags in
    374   // |command_line| or the field trial.  Returns 0 if there is an error
    375   // parsing any of the options, or if the default value should be used.
    376   static size_t GetQuicMaxPacketLength(
    377       const base::CommandLine& command_line,
    378       base::StringPiece quic_trial_group,
    379       const VariationParameters& quic_trial_params);
    380 
    381   // Returns the QUIC versions specified by any flags in |command_line|
    382   // or |quic_trial_params|.
    383   static net::QuicVersion GetQuicVersion(
    384       const base::CommandLine& command_line,
    385       const VariationParameters& quic_trial_params);
    386 
    387   // Returns the QUIC version specified by |quic_version| or
    388   // QUIC_VERSION_UNSUPPORTED if |quic_version| is invalid.
    389   static net::QuicVersion ParseQuicVersion(const std::string& quic_version);
    390 
    391   // Returns the QUIC connection options specified by any flags in
    392   // |command_line| or |quic_trial_params|.
    393   static net::QuicTagVector GetQuicConnectionOptions(
    394       const base::CommandLine& command_line,
    395       const VariationParameters& quic_trial_params);
    396 
    397   // Returns the list of QUIC tags represented by the comma separated
    398   // string in |connection_options|.
    399   static net::QuicTagVector ParseQuicConnectionOptions(
    400       const std::string& connection_options);
    401 
    402   // Returns the alternate protocol probability threshold specified by
    403   // any flags in |command_line| or |quic_trial_params|.
    404   static double GetAlternateProtocolProbabilityThreshold(
    405       const base::CommandLine& command_line,
    406       const VariationParameters& quic_trial_params);
    407 
    408   // The NetLog is owned by the browser process, to allow logging from other
    409   // threads during shutdown, but is used most frequently on the IOThread.
    410   ChromeNetLog* net_log_;
    411 
    412 #if defined(ENABLE_EXTENSIONS)
    413   // The extensions::EventRouterForwarder allows for sending events to
    414   // extensions from the IOThread.
    415   extensions::EventRouterForwarder* extension_event_router_forwarder_;
    416 #endif
    417 
    418   // These member variables are basically global, but their lifetimes are tied
    419   // to the IOThread.  IOThread owns them all, despite not using scoped_ptr.
    420   // This is because the destructor of IOThread runs on the wrong thread.  All
    421   // member variables should be deleted in CleanUp().
    422 
    423   // These member variables are initialized in Init() and do not change for the
    424   // lifetime of the IO thread.
    425 
    426   Globals* globals_;
    427 
    428   // Observer that logs network changes to the ChromeNetLog.
    429   class LoggingNetworkChangeObserver;
    430   scoped_ptr<LoggingNetworkChangeObserver> network_change_observer_;
    431 
    432   BooleanPrefMember system_enable_referrers_;
    433 
    434   BooleanPrefMember dns_client_enabled_;
    435 
    436   BooleanPrefMember quick_check_enabled_;
    437 
    438   // Store HTTP Auth-related policies in this thread.
    439   std::string auth_schemes_;
    440   bool negotiate_disable_cname_lookup_;
    441   bool negotiate_enable_port_;
    442   std::string auth_server_whitelist_;
    443   std::string auth_delegate_whitelist_;
    444   std::string gssapi_library_name_;
    445 
    446   // This is an instance of the default SSLConfigServiceManager for the current
    447   // platform and it gets SSL preferences from local_state object.
    448   scoped_ptr<SSLConfigServiceManager> ssl_config_service_manager_;
    449 
    450   // These member variables are initialized by a task posted to the IO thread,
    451   // which gets posted by calling certain member functions of IOThread.
    452   scoped_ptr<net::ProxyConfigService> system_proxy_config_service_;
    453 
    454   scoped_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_;
    455 
    456   scoped_refptr<net::URLRequestContextGetter>
    457       system_url_request_context_getter_;
    458 
    459   // True if SPDY is disabled by policy.
    460   bool is_spdy_disabled_by_policy_;
    461 
    462   const base::TimeTicks creation_time_;
    463 
    464   base::WeakPtrFactory<IOThread> weak_factory_;
    465 
    466   DISALLOW_COPY_AND_ASSIGN(IOThread);
    467 };
    468 
    469 #endif  // CHROME_BROWSER_IO_THREAD_H_
    470