• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "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"
23 
24 class ChromeNetLog;
25 class CommandLine;
26 class PrefProxyConfigTracker;
27 class PrefService;
28 class PrefRegistrySimple;
29 class SystemURLRequestContextGetter;
30 
31 namespace chrome_browser_net {
32 class DnsProbeService;
33 class HttpPipeliningCompatibilityClient;
34 class LoadTimeStats;
35 }
36 
37 namespace extensions {
38 class EventRouterForwarder;
39 }
40 
41 namespace net {
42 class CertVerifier;
43 class CookieStore;
44 class CTVerifier;
45 class FtpTransactionFactory;
46 class HostMappingRules;
47 class HostResolver;
48 class HttpAuthHandlerFactory;
49 class HttpServerProperties;
50 class HttpTransactionFactory;
51 class HttpUserAgentSettings;
52 class NetworkDelegate;
53 class NetworkTimeNotifier;
54 class ServerBoundCertService;
55 class ProxyConfigService;
56 class ProxyService;
57 class SdchManager;
58 class SSLConfigService;
59 class TransportSecurityState;
60 class URLRequestContext;
61 class URLRequestContextGetter;
62 class URLRequestJobFactory;
63 class URLRequestThrottlerManager;
64 class URLSecurityManager;
65 }  // namespace net
66 
67 namespace policy {
68 class PolicyService;
69 }  // namespace policy
70 
71 // Contains state associated with, initialized and cleaned up on, and
72 // primarily used on, the IO thread.
73 //
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 {
78  public:
79   struct Globals {
80     template <typename T>
81     class Optional {
82      public:
OptionalGlobals83       Optional() : set_(false) {}
84 
setGlobals85       void set(T value) {
86         set_ = true;
87         value_ = value;
88       }
CopyToIfSetGlobals89       void CopyToIfSet(T* value) {
90         if (set_) {
91           *value = value_;
92         }
93       }
94 
95      private:
96       bool set_;
97       T value_;
98     };
99 
100     class SystemRequestContextLeakChecker {
101      public:
102       explicit SystemRequestContextLeakChecker(Globals* globals);
103       ~SystemRequestContextLeakChecker();
104 
105      private:
106       Globals* const globals_;
107     };
108 
109     Globals();
110     ~Globals();
111 
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
120     // pins.
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.
137     //
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;
178   };
179 
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);
185 
186   virtual ~IOThread();
187 
188   static void RegisterPrefs(PrefRegistrySimple* registry);
189 
190   // Can only be called on the IO thread.
191   Globals* globals();
192 
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);
197 
198   ChromeNetLog* net_log();
199 
200   // Handles changing to On The Record mode, discarding confidential data.
201   void ChangedToOnTheRecord();
202 
203   // Returns a getter for the URLRequestContext.  Only called on the UI thread.
204   net::URLRequestContextGetter* system_url_request_context_getter();
205 
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();
210 
211   void InitializeNetworkSessionParams(net::HttpNetworkSession::Params* params);
212 
213  private:
214   // Provide SystemURLRequestContextGetter with access to
215   // InitSystemRequestContext().
216   friend class SystemURLRequestContextGetter;
217 
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;
224 
225   void InitializeNetworkOptions(const CommandLine& parsed_command_line);
226 
227   // Enable SPDY with the given mode, which may contain the following:
228   //
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
237   //                                on port 443.
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);
243 
244   // Global state must be initialized on the IO thread, then this
245   // method must be invoked on the UI thread.
246   void InitSystemRequestContext();
247 
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();
253 
254   net::HttpAuthHandlerFactory* CreateDefaultAuthHandlerFactory(
255       net::HostResolver* resolver);
256 
257   // Returns an SSLConfigService instance.
258   net::SSLConfigService* GetSSLConfigService();
259 
260   void ChangedToOnTheRecordOnIOThread();
261 
262   void UpdateDnsClientEnabled();
263 
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);
267 
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);
272 
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);
277 
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);
283 
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_;
287 
288   // The extensions::EventRouterForwarder allows for sending events to
289   // extensions from the IOThread.
290   extensions::EventRouterForwarder* extension_event_router_forwarder_;
291 
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().
296 
297   // These member variables are initialized in Init() and do not change for the
298   // lifetime of the IO thread.
299 
300   Globals* globals_;
301 
302   // Observer that logs network changes to the ChromeNetLog.
303   class LoggingNetworkChangeObserver;
304   scoped_ptr<LoggingNetworkChangeObserver> network_change_observer_;
305 
306   BooleanPrefMember system_enable_referrers_;
307 
308   BooleanPrefMember dns_client_enabled_;
309 
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_;
318 
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_;
322 
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_;
326 
327   scoped_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_;
328 
329   scoped_refptr<net::URLRequestContextGetter>
330       system_url_request_context_getter_;
331 
332   net::SdchManager* sdch_manager_;
333 
334   // True if SPDY is disabled by policy.
335   bool is_spdy_disabled_by_policy_;
336 
337   base::WeakPtrFactory<IOThread> weak_factory_;
338 
339   DISALLOW_COPY_AND_ASSIGN(IOThread);
340 };
341 
342 #endif  // CHROME_BROWSER_IO_THREAD_H_
343