• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 #pragma once
8 
9 #include <list>
10 #include <string>
11 #include "base/basictypes.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "chrome/browser/browser_process_sub_thread.h"
15 #include "chrome/browser/prefs/pref_member.h"
16 #include "chrome/common/net/predictor_common.h"
17 #include "net/base/network_change_notifier.h"
18 
19 class ChromeNetLog;
20 class ChromeURLRequestContextGetter;
21 class ExtensionEventRouterForwarder;
22 class ListValue;
23 class PrefProxyConfigTracker;
24 class PrefService;
25 class SystemURLRequestContextGetter;
26 
27 namespace chrome_browser_net {
28 class ConnectInterceptor;
29 class Predictor;
30 }  // namespace chrome_browser_net
31 
32 namespace net {
33 class CertVerifier;
34 class DnsRRResolver;
35 class FtpTransactionFactory;
36 class HostResolver;
37 class HttpAuthHandlerFactory;
38 class HttpTransactionFactory;
39 class NetworkDelegate;
40 class ProxyConfigService;
41 class ProxyScriptFetcher;
42 class ProxyService;
43 class SSLConfigService;
44 class URLRequestContext;
45 class URLRequestContextGetter;
46 class URLSecurityManager;
47 }  // namespace net
48 
49 class IOThread : public BrowserProcessSubThread {
50  public:
51   struct Globals {
52     Globals();
53     ~Globals();
54 
55     // The "system" NetworkDelegate, used for Profile-agnostic network events.
56     scoped_ptr<net::NetworkDelegate> system_network_delegate;
57     scoped_ptr<net::HostResolver> host_resolver;
58     scoped_ptr<net::CertVerifier> cert_verifier;
59     scoped_ptr<net::DnsRRResolver> dnsrr_resolver;
60     scoped_refptr<net::SSLConfigService> ssl_config_service;
61     scoped_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory;
62     scoped_refptr<net::ProxyService> proxy_script_fetcher_proxy_service;
63     scoped_ptr<net::HttpTransactionFactory>
64         proxy_script_fetcher_http_transaction_factory;
65     scoped_ptr<net::FtpTransactionFactory>
66         proxy_script_fetcher_ftp_transaction_factory;
67     scoped_ptr<net::URLSecurityManager> url_security_manager;
68     scoped_refptr<net::URLRequestContext> proxy_script_fetcher_context;
69     scoped_ptr<net::HttpTransactionFactory> system_http_transaction_factory;
70     scoped_ptr<net::FtpTransactionFactory> system_ftp_transaction_factory;
71     scoped_refptr<net::ProxyService> system_proxy_service;
72     // NOTE(willchan): This request context is unusable until a system
73     // SSLConfigService is provided that doesn't rely on
74     // Profiles. Do NOT use this yet.
75     scoped_refptr<net::URLRequestContext> system_request_context;
76     scoped_refptr<ExtensionEventRouterForwarder>
77         extension_event_router_forwarder;
78   };
79 
80   // |net_log| must either outlive the IOThread or be NULL.
81   IOThread(PrefService* local_state,
82            ChromeNetLog* net_log,
83            ExtensionEventRouterForwarder* extension_event_router_forwarder);
84 
85   virtual ~IOThread();
86 
87   // Can only be called on the IO thread.
88   Globals* globals();
89 
90   ChromeNetLog* net_log();
91 
92   // Initializes the network predictor, which induces DNS pre-resolution and/or
93   // TCP/IP preconnections.  |prefetching_enabled| indicates whether or not DNS
94   // prefetching should be enabled, and |preconnect_enabled| controls whether
95   // TCP/IP preconnection is enabled.  This should be called by the UI thread.
96   // It will post a task to the IO thread to perform the actual initialization.
97   void InitNetworkPredictor(bool prefetching_enabled,
98                             base::TimeDelta max_dns_queue_delay,
99                             size_t max_speculative_parallel_resolves,
100                             const chrome_common_net::UrlList& startup_urls,
101                             ListValue* referral_list,
102                             bool preconnect_enabled);
103 
104   // Registers |url_request_context_getter| into the IO thread.  During
105   // IOThread::CleanUp(), IOThread will iterate through known getters and
106   // release their URLRequestContexts.  Only called on the IO thread.  It does
107   // not acquire a refcount for |url_request_context_getter|.  If
108   // |url_request_context_getter| is being deleted before IOThread::CleanUp() is
109   // invoked, then this needs to be balanced with a call to
110   // UnregisterURLRequestContextGetter().
111   void RegisterURLRequestContextGetter(
112       ChromeURLRequestContextGetter* url_request_context_getter);
113 
114   // Unregisters |url_request_context_getter| from the IO thread.  Only called
115   // on the IO thread.
116   void UnregisterURLRequestContextGetter(
117       ChromeURLRequestContextGetter* url_request_context_getter);
118 
119   // Handles changing to On The Record mode, discarding confidential data.
120   void ChangedToOnTheRecord();
121 
122   // Returns a getter for the URLRequestContext.  Only called on the UI thread.
123   net::URLRequestContextGetter* system_url_request_context_getter();
124 
125   // Clear all network stack history, including the host cache, as well as
126   // speculative data about subresources of visited sites, and startup-time
127   // navigations.
128   void ClearNetworkingHistory();
129 
130  protected:
131   virtual void Init();
132   virtual void CleanUp();
133 
134  private:
135   // Provide SystemURLRequestContextGetter with access to
136   // InitSystemRequestContext().
137   friend class SystemURLRequestContextGetter;
138 
139   static void RegisterPrefs(PrefService* local_state);
140 
141   net::HttpAuthHandlerFactory* CreateDefaultAuthHandlerFactory(
142       net::HostResolver* resolver);
143 
144   // Lazy initialization of system request context for
145   // SystemURLRequestContextGetter. To be called on IO thread.
146   void InitSystemRequestContext();
147 
148   void InitNetworkPredictorOnIOThread(
149       bool prefetching_enabled,
150       base::TimeDelta max_dns_queue_delay,
151       size_t max_speculative_parallel_resolves,
152       const chrome_common_net::UrlList& startup_urls,
153       ListValue* referral_list,
154       bool preconnect_enabled);
155 
156   void ChangedToOnTheRecordOnIOThread();
157 
158   // Clears the host cache.  Intended to be used to prevent exposing recently
159   // visited sites on about:net-internals/#dns and about:dns pages.  Must be
160   // called on the IO thread.
161   void ClearHostCache();
162 
163   // The NetLog is owned by the browser process, to allow logging from other
164   // threads during shutdown, but is used most frequently on the IOThread.
165   ChromeNetLog* net_log_;
166 
167   // The ExtensionEventRouterForwarder allows for sending events to extensions
168   // from the IOThread.
169   ExtensionEventRouterForwarder* extension_event_router_forwarder_;
170 
171   // These member variables are basically global, but their lifetimes are tied
172   // to the IOThread.  IOThread owns them all, despite not using scoped_ptr.
173   // This is because the destructor of IOThread runs on the wrong thread.  All
174   // member variables should be deleted in CleanUp().
175 
176   // These member variables are initialized in Init() and do not change for the
177   // lifetime of the IO thread.
178 
179   Globals* globals_;
180 
181   // Observer that logs network changes to the ChromeNetLog.
182   scoped_ptr<net::NetworkChangeNotifier::IPAddressObserver>
183       network_change_observer_;
184 
185   BooleanPrefMember system_enable_referrers_;
186 
187   // Store HTTP Auth-related policies in this thread.
188   std::string auth_schemes_;
189   bool negotiate_disable_cname_lookup_;
190   bool negotiate_enable_port_;
191   std::string auth_server_whitelist_;
192   std::string auth_delegate_whitelist_;
193   std::string gssapi_library_name_;
194 
195   // These member variables are initialized by a task posted to the IO thread,
196   // which gets posted by calling certain member functions of IOThread.
197 
198   // Note: we user explicit pointers rather than smart pointers to be more
199   // explicit about destruction order, and ensure that there is no chance that
200   // these observers would be used accidentally after we have begun to tear
201   // down.
202   chrome_browser_net::ConnectInterceptor* speculative_interceptor_;
203   chrome_browser_net::Predictor* predictor_;
204 
205   scoped_ptr<net::ProxyConfigService> system_proxy_config_service_;
206 
207   scoped_refptr<PrefProxyConfigTracker> pref_proxy_config_tracker_;
208 
209   scoped_refptr<net::URLRequestContextGetter>
210       system_url_request_context_getter_;
211 
212   // Keeps track of all live ChromeURLRequestContextGetters, so the
213   // ChromeURLRequestContexts can be released during
214   // IOThread::CleanUp().
215   std::list<ChromeURLRequestContextGetter*> url_request_context_getters_;
216 
217   DISALLOW_COPY_AND_ASSIGN(IOThread);
218 };
219 
220 #endif  // CHROME_BROWSER_IO_THREAD_H_
221