• 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_NET_CHROME_URL_REQUEST_CONTEXT_H_
6 #define CHROME_BROWSER_NET_CHROME_URL_REQUEST_CONTEXT_H_
7 #pragma once
8 
9 #include <string>
10 #include <vector>
11 
12 #include "base/file_path.h"
13 #include "chrome/browser/content_settings/host_content_settings_map.h"
14 #include "chrome/browser/extensions/extension_info_map.h"
15 #include "chrome/browser/extensions/extension_webrequest_api.h"
16 #include "chrome/browser/prefs/pref_change_registrar.h"
17 #include "chrome/browser/prefs/pref_service.h"
18 #include "chrome/browser/prerender/prerender_manager.h"
19 #include "chrome/common/extensions/extension_icon_set.h"
20 #include "content/browser/appcache/chrome_appcache_service.h"
21 #include "content/browser/chrome_blob_storage_context.h"
22 #include "content/browser/host_zoom_map.h"
23 #include "net/base/cookie_policy.h"
24 #include "net/url_request/url_request_context.h"
25 #include "net/url_request/url_request_context_getter.h"
26 #include "webkit/fileapi/file_system_context.h"
27 
28 class ChromeURLDataManagerBackend;
29 class ChromeURLRequestContextFactory;
30 class IOThread;
31 namespace net {
32 class DnsCertProvenanceChecker;
33 class NetworkDelegate;
34 }
35 class PrefService;
36 class Profile;
37 class ProfileIOData;
38 
39 // Subclass of net::URLRequestContext which can be used to store extra
40 // information for requests.
41 //
42 // All methods of this class must be called from the IO thread,
43 // including the constructor and destructor.
44 class ChromeURLRequestContext : public net::URLRequestContext {
45  public:
46   ChromeURLRequestContext();
47 
48   // Copies the state from |other| into this context.
49   void CopyFrom(ChromeURLRequestContext* other);
50 
51   // Gets the path to the directory user scripts are stored in.
user_script_dir_path()52   FilePath user_script_dir_path() const {
53     return user_script_dir_path_;
54   }
55 
56   // Gets the appcache service to be used for requests in this context.
57   // May be NULL if requests for this context aren't subject to appcaching.
appcache_service()58   ChromeAppCacheService* appcache_service() const {
59     return appcache_service_.get();
60   }
61 
62   // Gets the blob storage context associated with this context's profile.
blob_storage_context()63   ChromeBlobStorageContext* blob_storage_context() const {
64     return blob_storage_context_.get();
65   }
66 
67   // Gets the file system host context with this context's profile.
file_system_context()68   fileapi::FileSystemContext* file_system_context() const {
69     return file_system_context_.get();
70   }
71 
is_incognito()72   bool is_incognito() const {
73     return is_incognito_;
74   }
75 
76   virtual const std::string& GetUserAgent(const GURL& url) const;
77 
host_content_settings_map()78   HostContentSettingsMap* host_content_settings_map() {
79     return host_content_settings_map_;
80   }
81 
host_zoom_map()82   const HostZoomMap* host_zoom_map() const { return host_zoom_map_; }
83 
extension_info_map()84   const ExtensionInfoMap* extension_info_map() const {
85     return extension_info_map_;
86   }
87 
prerender_manager()88   prerender::PrerenderManager* prerender_manager() {
89     return prerender_manager_.get();
90   }
91 
92   ChromeURLDataManagerBackend* GetChromeURLDataManagerBackend();
93 
94   // Setters to simplify initializing from factory objects.
set_user_script_dir_path(const FilePath & path)95   void set_user_script_dir_path(const FilePath& path) {
96     user_script_dir_path_ = path;
97   }
set_is_incognito(bool is_incognito)98   void set_is_incognito(bool is_incognito) {
99     is_incognito_ = is_incognito;
100   }
set_host_content_settings_map(HostContentSettingsMap * host_content_settings_map)101   void set_host_content_settings_map(
102       HostContentSettingsMap* host_content_settings_map) {
103     host_content_settings_map_ = host_content_settings_map;
104   }
set_host_zoom_map(HostZoomMap * host_zoom_map)105   void set_host_zoom_map(HostZoomMap* host_zoom_map) {
106     host_zoom_map_ = host_zoom_map;
107   }
set_appcache_service(ChromeAppCacheService * service)108   void set_appcache_service(ChromeAppCacheService* service) {
109     appcache_service_ = service;
110   }
set_blob_storage_context(ChromeBlobStorageContext * context)111   void set_blob_storage_context(ChromeBlobStorageContext* context) {
112     blob_storage_context_ = context;
113   }
set_file_system_context(fileapi::FileSystemContext * context)114   void set_file_system_context(fileapi::FileSystemContext* context) {
115     file_system_context_ = context;
116   }
set_extension_info_map(ExtensionInfoMap * map)117   void set_extension_info_map(ExtensionInfoMap* map) {
118     extension_info_map_ = map;
119   }
set_prerender_manager(prerender::PrerenderManager * prerender_manager)120   void set_prerender_manager(prerender::PrerenderManager* prerender_manager) {
121     prerender_manager_ = prerender_manager;
122   }
123 
124   // Callback for when the accept language changes.
125   void OnAcceptLanguageChange(const std::string& accept_language);
126 
127   // Callback for when the default charset changes.
128   void OnDefaultCharsetChange(const std::string& default_charset);
129 
130  protected:
131   virtual ~ChromeURLRequestContext();
132 
133  private:
134   // ---------------------------------------------------------------------------
135   // Important: When adding any new members below, consider whether they need to
136   // be added to CopyFrom.
137   // ---------------------------------------------------------------------------
138 
139   // Path to the directory user scripts are stored in.
140   FilePath user_script_dir_path_;
141 
142   // TODO(willchan): Make these non-refcounted.
143   scoped_refptr<ChromeAppCacheService> appcache_service_;
144   scoped_refptr<HostContentSettingsMap> host_content_settings_map_;
145   scoped_refptr<HostZoomMap> host_zoom_map_;
146   scoped_refptr<ChromeBlobStorageContext> blob_storage_context_;
147   scoped_refptr<fileapi::FileSystemContext> file_system_context_;
148   // TODO(aa): This should use chrome/common/extensions/extension_set.h.
149   scoped_refptr<ExtensionInfoMap> extension_info_map_;
150   scoped_refptr<prerender::PrerenderManager> prerender_manager_;
151   scoped_ptr<ChromeURLDataManagerBackend> chrome_url_data_manager_backend_;
152 
153   bool is_incognito_;
154 
155   // ---------------------------------------------------------------------------
156   // Important: When adding any new members above, consider whether they need to
157   // be added to CopyFrom.
158   // ---------------------------------------------------------------------------
159 
160   DISALLOW_COPY_AND_ASSIGN(ChromeURLRequestContext);
161 };
162 
163 // A net::URLRequestContextGetter subclass used by the browser. This returns a
164 // subclass of net::URLRequestContext which can be used to store extra
165 // information about requests.
166 //
167 // Most methods are expected to be called on the UI thread, except for
168 // the destructor and GetURLRequestContext().
169 class ChromeURLRequestContextGetter : public net::URLRequestContextGetter,
170                                       public NotificationObserver {
171  public:
172   // Constructs a ChromeURLRequestContextGetter that will use |factory| to
173   // create the ChromeURLRequestContext. If |profile| is non-NULL, then the
174   // ChromeURLRequestContextGetter will additionally watch the preferences for
175   // changes to charset/language and CleanupOnUIThread() will need to be
176   // called to unregister.
177   ChromeURLRequestContextGetter(Profile* profile,
178                                 ChromeURLRequestContextFactory* factory);
179 
180   // Note that GetURLRequestContext() can only be called from the IO
181   // thread (it will assert otherwise). DONTUSEME_GetCookieStore() and
182   // GetIOMessageLoopProxy however can be called from any thread.
183   //
184   // net::URLRequestContextGetter implementation.
185   virtual net::URLRequestContext* GetURLRequestContext();
186   virtual net::CookieStore* DONTUSEME_GetCookieStore();
187   virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy() const;
188 
189   // Releases |url_request_context_|.  It's invalid to call
190   // GetURLRequestContext() after this point.
191   void ReleaseURLRequestContext();
192 
193   // Convenience overload of GetURLRequestContext() that returns a
194   // ChromeURLRequestContext* rather than a net::URLRequestContext*.
GetIOContext()195   ChromeURLRequestContext* GetIOContext() {
196     return reinterpret_cast<ChromeURLRequestContext*>(GetURLRequestContext());
197   }
198 
199   // Create an instance for use with an 'original' (non-OTR) profile. This is
200   // expected to get called on the UI thread.
201   static ChromeURLRequestContextGetter* CreateOriginal(
202       Profile* profile, const ProfileIOData* profile_io_data);
203 
204   // Create an instance for an original profile for media. This is expected to
205   // get called on UI thread. This method takes a profile and reuses the
206   // 'original' net::URLRequestContext for common files.
207   static ChromeURLRequestContextGetter* CreateOriginalForMedia(
208       Profile* profile, const ProfileIOData* profile_io_data);
209 
210   // Create an instance for an original profile for extensions. This is expected
211   // to get called on UI thread.
212   static ChromeURLRequestContextGetter* CreateOriginalForExtensions(
213       Profile* profile, const ProfileIOData* profile_io_data);
214 
215   // Create an instance for an original profile for an app with isolated
216   // storage. This is expected to get called on UI thread.
217   static ChromeURLRequestContextGetter* CreateOriginalForIsolatedApp(
218       Profile* profile,
219       const ProfileIOData* profile_io_data,
220       const std::string& app_id);
221 
222   // Create an instance for use with an OTR profile. This is expected to get
223   // called on the UI thread.
224   static ChromeURLRequestContextGetter* CreateOffTheRecord(
225       Profile* profile, const ProfileIOData* profile_io_data);
226 
227   // Create an instance for an OTR profile for extensions. This is expected
228   // to get called on UI thread.
229   static ChromeURLRequestContextGetter* CreateOffTheRecordForExtensions(
230       Profile* profile, const ProfileIOData* profile_io_data);
231 
232   // Create an instance for an OTR profile for an app with isolated storage.
233   // This is expected to get called on UI thread.
234   static ChromeURLRequestContextGetter* CreateOffTheRecordForIsolatedApp(
235       Profile* profile,
236       const ProfileIOData* profile_io_data,
237       const std::string& app_id);
238 
239   // Clean up UI thread resources. This is expected to get called on the UI
240   // thread before the instance is deleted on the IO thread.
241   void CleanupOnUIThread();
242 
243   // NotificationObserver implementation.
244   virtual void Observe(NotificationType type,
245                        const NotificationSource& source,
246                        const NotificationDetails& details);
247 
248  private:
249   // Must be called on the IO thread.
250   virtual ~ChromeURLRequestContextGetter();
251 
252   // Registers an observer on |profile|'s preferences which will be used
253   // to update the context when the default language and charset change.
254   void RegisterPrefsObserver(Profile* profile);
255 
256   // These methods simply forward to the corresponding method on
257   // ChromeURLRequestContext.
258   void OnAcceptLanguageChange(const std::string& accept_language);
259   void OnDefaultCharsetChange(const std::string& default_charset);
260   void OnClearSiteDataOnExitChange(bool clear_site_data);
261 
262   // Saves the cookie store to |result| and signals |completion|.
263   void GetCookieStoreAsyncHelper(base::WaitableEvent* completion,
264                                  net::CookieStore** result);
265 
266   PrefChangeRegistrar registrar_;
267 
268   // |io_thread_| is always valid during the lifetime of |this| since |this| is
269   // deleted on the IO thread.
270   IOThread* const io_thread_;
271 
272   // Deferred logic for creating a ChromeURLRequestContext.
273   // Access only from the IO thread.
274   scoped_ptr<ChromeURLRequestContextFactory> factory_;
275 
276   // NULL if not yet initialized. Otherwise, it is the net::URLRequestContext
277   // instance that was lazilly created by GetURLRequestContext.
278   // Access only from the IO thread.
279   scoped_refptr<net::URLRequestContext> url_request_context_;
280 
281   DISALLOW_COPY_AND_ASSIGN(ChromeURLRequestContextGetter);
282 };
283 
284 #endif  // CHROME_BROWSER_NET_CHROME_URL_REQUEST_CONTEXT_H_
285