chrome_url_request_context.h revision 731df977c0511bca2206b5f333555b1205ff1f43
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_NET_CHROME_URL_REQUEST_CONTEXT_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_NET_CHROME_URL_REQUEST_CONTEXT_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/appcache/chrome_appcache_service.h"
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chrome_blob_storage_context.h"
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/extensions/extension_info_map.h"
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/file_system/file_system_host_context.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/host_content_settings_map.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/host_zoom_map.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/io_thread.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/chrome_cookie_policy.h"
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_change_registrar.h"
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h"
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/extensions/extension_icon_set.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/net/url_request_context_getter.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/notification_registrar.h"
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/cookie_monster.h"
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/cookie_policy.h"
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_context.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/database/database_tracker.h"
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CommandLine;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PrefService;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net {
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NetworkDelegate;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ProxyConfig;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ChromeURLRequestContext;
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ChromeURLRequestContextFactory;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Subclass of URLRequestContext which can be used to store extra information
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// for requests.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// All methods of this class must be called from the IO thread,
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// including the constructor and destructor.
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ChromeURLRequestContext : public URLRequestContext {
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ChromeURLRequestContext();
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the path to the directory user scripts are stored in.
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath user_script_dir_path() const {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return user_script_dir_path_;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the appcache service to be used for requests in this context.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // May be NULL if requests for this context aren't subject to appcaching.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ChromeAppCacheService* appcache_service() const {
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return appcache_service_.get();
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the database tracker associated with this context's profile.
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  webkit_database::DatabaseTracker* database_tracker() const {
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return database_tracker_.get();
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Gets the blob storage context associated with this context's profile.
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ChromeBlobStorageContext* blob_storage_context() const {
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return blob_storage_context_.get();
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Gets the file system host context with this context's profile.
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FileSystemHostContext* file_system_host_context() const {
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return file_system_host_context_.get();
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_off_the_record() const {
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return is_off_the_record_;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_media() const {
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return is_media_;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const std::string& GetUserAgent(const GURL& url) const;
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HostContentSettingsMap* host_content_settings_map() {
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return host_content_settings_map_;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const HostZoomMap* host_zoom_map() const { return host_zoom_map_; }
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const ExtensionInfoMap* extension_info_map() const {
94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return extension_info_map_;
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if this context is an external request context, like
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ChromeFrame.
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool IsExternal() const;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Copies the dependencies from |other| into |this|. If you use this
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // constructor, then you should hold a reference to |other|, as we
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // depend on |other| being alive.
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit ChromeURLRequestContext(ChromeURLRequestContext* other);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~ChromeURLRequestContext();
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Setters to simplify initializing from factory objects.
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_accept_language(const std::string& accept_language) {
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    accept_language_ = accept_language;
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_accept_charset(const std::string& accept_charset) {
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    accept_charset_ = accept_charset;
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_referrer_charset(const std::string& referrer_charset) {
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    referrer_charset_ = referrer_charset;
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_transport_security_state(
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      net::TransportSecurityState* state) {
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    transport_security_state_ = state;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_ssl_config_service(net::SSLConfigService* service) {
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ssl_config_service_ = service;
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_host_resolver(net::HostResolver* resolver) {
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    host_resolver_ = resolver;
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void set_dnsrr_resolver(net::DnsRRResolver* dnsrr_resolver) {
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    dnsrr_resolver_ = dnsrr_resolver;
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_http_transaction_factory(net::HttpTransactionFactory* factory) {
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    http_transaction_factory_ = factory;
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_ftp_transaction_factory(net::FtpTransactionFactory* factory) {
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ftp_transaction_factory_ = factory;
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_http_auth_handler_factory(net::HttpAuthHandlerFactory* factory) {
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    http_auth_handler_factory_ = factory;
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_cookie_store(net::CookieStore* cookie_store) {
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    cookie_store_ = cookie_store;
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_cookie_policy(ChromeCookiePolicy* cookie_policy) {
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    chrome_cookie_policy_ = cookie_policy;  // Take a strong reference.
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    cookie_policy_ = cookie_policy;
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_proxy_service(net::ProxyService* service) {
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    proxy_service_ = service;
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_user_script_dir_path(const FilePath& path) {
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    user_script_dir_path_ = path;
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_is_off_the_record(bool is_off_the_record) {
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    is_off_the_record_ = is_off_the_record;
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_is_media(bool is_media) {
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    is_media_ = is_media;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_host_content_settings_map(
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostContentSettingsMap* host_content_settings_map) {
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    host_content_settings_map_ = host_content_settings_map;
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_host_zoom_map(HostZoomMap* host_zoom_map) {
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    host_zoom_map_ = host_zoom_map;
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_appcache_service(ChromeAppCacheService* service) {
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    appcache_service_ = service;
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_database_tracker(webkit_database::DatabaseTracker* tracker) {
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    database_tracker_ = tracker;
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void set_blob_storage_context(ChromeBlobStorageContext* context) {
1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    blob_storage_context_ = context;
1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void set_file_system_host_context(FileSystemHostContext* context) {
1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    file_system_host_context_ = context;
1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void set_extension_info_map(ExtensionInfoMap* map) {
181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    extension_info_map_ = map;
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_net_log(net::NetLog* net_log) {
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    net_log_ = net_log;
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_network_delegate(
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      net::HttpNetworkDelegate* network_delegate) {
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    network_delegate_ = network_delegate;
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Callback for when the accept language changes.
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnAcceptLanguageChange(const std::string& accept_language);
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Callback for when the default charset changes.
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnDefaultCharsetChange(const std::string& default_charset);
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Path to the directory user scripts are stored in.
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath user_script_dir_path_;
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<ChromeAppCacheService> appcache_service_;
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<webkit_database::DatabaseTracker> database_tracker_;
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<ChromeCookiePolicy> chrome_cookie_policy_;
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<HostContentSettingsMap> host_content_settings_map_;
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<HostZoomMap> host_zoom_map_;
2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_refptr<ChromeBlobStorageContext> blob_storage_context_;
2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_refptr<FileSystemHostContext> file_system_host_context_;
208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_refptr<ExtensionInfoMap> extension_info_map_;
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_media_;
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_off_the_record_;
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ChromeURLRequestContext);
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A URLRequestContextGetter subclass used by the browser. This returns a
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// subclass of URLRequestContext which can be used to store extra information
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// about requests.
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Most methods are expected to be called on the UI thread, except for
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the destructor and GetURLRequestContext().
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ChromeURLRequestContextGetter : public URLRequestContextGetter,
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      public NotificationObserver {
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Constructs a ChromeURLRequestContextGetter that will use |factory| to
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // create the ChromeURLRequestContext. If |profile| is non-NULL, then the
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ChromeURLRequestContextGetter will additionally watch the preferences for
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // changes to charset/language and CleanupOnUIThread() will need to be
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // called to unregister.
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ChromeURLRequestContextGetter(Profile* profile,
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                ChromeURLRequestContextFactory* factory);
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void RegisterUserPrefs(PrefService* user_prefs);
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Note that GetURLRequestContext() can only be called from the IO
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // thread (it will assert otherwise). GetCookieStore() and
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // GetIOMessageLoopProxy however can be called from any thread.
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URLRequestContextGetter implementation.
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual URLRequestContext* GetURLRequestContext();
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual net::CookieStore* GetCookieStore();
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy();
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Convenience overload of GetURLRequestContext() that returns a
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ChromeURLRequestContext* rather than a URLRequestContext*.
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ChromeURLRequestContext* GetIOContext() {
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return reinterpret_cast<ChromeURLRequestContext*>(GetURLRequestContext());
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create an instance for use with an 'original' (non-OTR) profile. This is
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // expected to get called on the UI thread.
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static ChromeURLRequestContextGetter* CreateOriginal(
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Profile* profile, const FilePath& cookie_store_path,
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const FilePath& disk_cache_path, int cache_size);
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create an instance for an original profile for media. This is expected to
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // get called on UI thread. This method takes a profile and reuses the
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 'original' URLRequestContext for common files.
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static ChromeURLRequestContextGetter* CreateOriginalForMedia(
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Profile* profile, const FilePath& disk_cache_path, int cache_size);
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create an instance for an original profile for extensions. This is expected
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to get called on UI thread.
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static ChromeURLRequestContextGetter* CreateOriginalForExtensions(
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Profile* profile, const FilePath& cookie_store_path);
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create an instance for use with an OTR profile. This is expected to get
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // called on the UI thread.
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static ChromeURLRequestContextGetter* CreateOffTheRecord(Profile* profile);
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Create an instance for an OTR profile for extensions. This is expected
2733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // to get called on UI thread.
2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static ChromeURLRequestContextGetter* CreateOffTheRecordForExtensions(
2753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      Profile* profile);
2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Clean up UI thread resources. This is expected to get called on the UI
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // thread before the instance is deleted on the IO thread.
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CleanupOnUIThread();
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NotificationObserver implementation.
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Must be called on the IO thread.
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~ChromeURLRequestContextGetter();
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Registers an observer on |profile|'s preferences which will be used
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to update the context when the default language and charset change.
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RegisterPrefsObserver(Profile* profile);
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a request context for media resources from a regular request
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // context. This helper method is called from CreateOriginalForMedia and
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // CreateOffTheRecordForMedia.
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static ChromeURLRequestContextGetter* CreateRequestContextForMedia(
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Profile* profile, const FilePath& disk_cache_path, int cache_size,
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      bool off_the_record);
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These methods simply forward to the corresponding method on
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ChromeURLRequestContext.
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnAcceptLanguageChange(const std::string& accept_language);
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnDefaultCharsetChange(const std::string& default_charset);
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Saves the cookie store to |result| and signals |completion|.
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetCookieStoreAsyncHelper(base::WaitableEvent* completion,
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 net::CookieStore** result);
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  PrefChangeRegistrar registrar_;
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Deferred logic for creating a ChromeURLRequestContext.
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Access only from the IO thread.
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<ChromeURLRequestContextFactory> factory_;
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NULL if not yet initialized. Otherwise, it is the URLRequestContext
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // instance that was lazilly created by GetURLRequestContext.
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Access only from the IO thread.
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<URLRequestContext> url_request_context_;
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ChromeURLRequestContextGetter);
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Base class for a ChromeURLRequestContext factory. This includes
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the shared functionality like extracting the default language/charset
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// from a profile.
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Except for the constructor, all methods of this class must be called from
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the IO thread.
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ChromeURLRequestContextFactory {
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Extract properties of interested from |profile|, for setting later into
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a ChromeURLRequestContext using ApplyProfileParametersToContext().
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit ChromeURLRequestContextFactory(Profile* profile);
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~ChromeURLRequestContextFactory();
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called to create a new instance (will only be called once).
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ChromeURLRequestContext* Create() = 0;
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  IOThread* io_thread() { return io_thread_; }
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Assigns this factory's properties to |context|.
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ApplyProfileParametersToContext(ChromeURLRequestContext* context);
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Values extracted from the Profile.
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NOTE: If you add any parameters here, keep it in sync with
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ApplyProfileParametersToContext().
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_media_;
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_off_the_record_;
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string accept_language_;
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string accept_charset_;
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string referrer_charset_;
356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(aa): I think this can go away now as we no longer support standalone
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // user scripts.
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath user_script_dir_path_;
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<HostContentSettingsMap> host_content_settings_map_;
3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_refptr<ChromeAppCacheService> appcache_service_;
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<webkit_database::DatabaseTracker> database_tracker_;
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<HostZoomMap> host_zoom_map_;
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<net::TransportSecurityState> transport_security_state_;
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<net::SSLConfigService> ssl_config_service_;
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<net::CookieMonster::Delegate> cookie_monster_delegate_;
3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_refptr<ChromeBlobStorageContext> blob_storage_context_;
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_refptr<FileSystemHostContext> file_system_host_context_;
369731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_refptr<ExtensionInfoMap> extension_info_map_;
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath profile_dir_path_;
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  IOThread* const io_thread_;
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ChromeURLRequestContextFactory);
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Creates a proxy configuration from proxy-related preferences fetched
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// from |pref_service|. The relevant preferences in |pref_service| are
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// initialized from the process' command line or by applicable proxy policies.
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnet::ProxyConfig* CreateProxyConfig(const PrefService* pref_service);
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_NET_CHROME_URL_REQUEST_CONTEXT_H_
385