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_PROFILES_PROFILE_IMPL_IO_DATA_H_ 6 #define CHROME_BROWSER_PROFILES_PROFILE_IMPL_IO_DATA_H_ 7 8 #include "base/basictypes.h" 9 #include "base/callback.h" 10 #include "base/containers/hash_tables.h" 11 #include "base/memory/ref_counted.h" 12 #include "chrome/browser/custom_handlers/protocol_handler_registry.h" 13 #include "chrome/browser/net/chrome_url_request_context_getter.h" 14 #include "chrome/browser/profiles/profile_io_data.h" 15 #include "content/public/browser/cookie_store_factory.h" 16 17 namespace chrome_browser_net { 18 class Predictor; 19 } // namespace chrome_browser_net 20 21 namespace content { 22 class CookieCryptoDelegate; 23 } // namespace content 24 25 namespace domain_reliability { 26 class DomainReliabilityMonitor; 27 } // namespace domain_reliability 28 29 namespace net { 30 class FtpTransactionFactory; 31 class HttpServerProperties; 32 class HttpServerPropertiesManager; 33 class HttpTransactionFactory; 34 class ProxyConfig; 35 class SDCHManager; 36 } // namespace net 37 38 namespace storage { 39 class SpecialStoragePolicy; 40 } // namespace storage 41 42 class ProfileImplIOData : public ProfileIOData { 43 public: 44 class Handle { 45 public: 46 explicit Handle(Profile* profile); 47 ~Handle(); 48 49 // Init() must be called before ~Handle(). It records most of the 50 // parameters needed to construct a ChromeURLRequestContextGetter. 51 void Init( 52 const base::FilePath& cookie_path, 53 const base::FilePath& channel_id_path, 54 const base::FilePath& cache_path, 55 int cache_max_size, 56 const base::FilePath& media_cache_path, 57 int media_cache_max_size, 58 const base::FilePath& extensions_cookie_path, 59 const base::FilePath& profile_path, 60 const base::FilePath& infinite_cache_path, 61 chrome_browser_net::Predictor* predictor, 62 content::CookieStoreConfig::SessionCookieMode session_cookie_mode, 63 storage::SpecialStoragePolicy* special_storage_policy, 64 scoped_ptr<domain_reliability::DomainReliabilityMonitor> 65 domain_reliability_monitor, 66 const base::Callback<void(bool)>& data_reduction_proxy_unavailable, 67 scoped_ptr<DataReductionProxyChromeConfigurator> 68 data_reduction_proxy_chrome_configurator, 69 scoped_ptr<data_reduction_proxy::DataReductionProxyParams> 70 data_reduction_proxy_params, 71 scoped_ptr<data_reduction_proxy::DataReductionProxyStatisticsPrefs> 72 data_reduction_proxy_statistics_prefs); 73 74 // These Create*ContextGetter() functions are only exposed because the 75 // circular relationship between Profile, ProfileIOData::Handle, and the 76 // ChromeURLRequestContextGetter factories requires Profile be able to call 77 // these functions. 78 scoped_refptr<ChromeURLRequestContextGetter> CreateMainRequestContextGetter( 79 content::ProtocolHandlerMap* protocol_handlers, 80 content::URLRequestInterceptorScopedVector request_interceptors, 81 PrefService* local_state, 82 IOThread* io_thread) const; 83 scoped_refptr<ChromeURLRequestContextGetter> 84 CreateIsolatedAppRequestContextGetter( 85 const base::FilePath& partition_path, 86 bool in_memory, 87 content::ProtocolHandlerMap* protocol_handlers, 88 content::URLRequestInterceptorScopedVector 89 request_interceptors) const; 90 91 content::ResourceContext* GetResourceContext() const; 92 // GetResourceContextNoInit() does not call LazyInitialize() so it can be 93 // safely be used during initialization. 94 content::ResourceContext* GetResourceContextNoInit() const; 95 scoped_refptr<ChromeURLRequestContextGetter> 96 GetMediaRequestContextGetter() const; 97 scoped_refptr<ChromeURLRequestContextGetter> 98 GetExtensionsRequestContextGetter() const; 99 scoped_refptr<ChromeURLRequestContextGetter> 100 GetIsolatedMediaRequestContextGetter( 101 const base::FilePath& partition_path, 102 bool in_memory) const; 103 104 // Returns the DevToolsNetworkController attached to ProfileIOData. 105 DevToolsNetworkController* GetDevToolsNetworkController() const; 106 107 // Deletes all network related data since |time|. It deletes transport 108 // security state since |time| and also deletes HttpServerProperties data. 109 // Works asynchronously, however if the |completion| callback is non-null, 110 // it will be posted on the UI thread once the removal process completes. 111 void ClearNetworkingHistorySince(base::Time time, 112 const base::Closure& completion); 113 114 private: 115 typedef std::map<StoragePartitionDescriptor, 116 scoped_refptr<ChromeURLRequestContextGetter>, 117 StoragePartitionDescriptorLess> 118 ChromeURLRequestContextGetterMap; 119 120 // Lazily initialize ProfileParams. We do this on the calls to 121 // Get*RequestContextGetter(), so we only initialize ProfileParams right 122 // before posting a task to the IO thread to start using them. This prevents 123 // objects that are supposed to be deleted on the IO thread, but are created 124 // on the UI thread from being unnecessarily initialized. 125 void LazyInitialize() const; 126 127 // Collect references to context getters in reverse order, i.e. last item 128 // will be main request getter. This list is passed to |io_data_| 129 // for invalidation on IO thread. 130 scoped_ptr<ChromeURLRequestContextGetterVector> GetAllContextGetters(); 131 132 // The getters will be invalidated on the IO thread before 133 // ProfileIOData instance is deleted. 134 mutable scoped_refptr<ChromeURLRequestContextGetter> 135 main_request_context_getter_; 136 mutable scoped_refptr<ChromeURLRequestContextGetter> 137 media_request_context_getter_; 138 mutable scoped_refptr<ChromeURLRequestContextGetter> 139 extensions_request_context_getter_; 140 mutable ChromeURLRequestContextGetterMap app_request_context_getter_map_; 141 mutable ChromeURLRequestContextGetterMap 142 isolated_media_request_context_getter_map_; 143 ProfileImplIOData* const io_data_; 144 145 Profile* const profile_; 146 147 mutable bool initialized_; 148 149 DISALLOW_COPY_AND_ASSIGN(Handle); 150 }; 151 152 private: 153 friend class base::RefCountedThreadSafe<ProfileImplIOData>; 154 155 struct LazyParams { 156 LazyParams(); 157 ~LazyParams(); 158 159 // All of these parameters are intended to be read on the IO thread. 160 base::FilePath cookie_path; 161 base::FilePath channel_id_path; 162 base::FilePath cache_path; 163 int cache_max_size; 164 base::FilePath media_cache_path; 165 int media_cache_max_size; 166 base::FilePath extensions_cookie_path; 167 base::FilePath infinite_cache_path; 168 content::CookieStoreConfig::SessionCookieMode session_cookie_mode; 169 scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy; 170 }; 171 172 ProfileImplIOData(); 173 virtual ~ProfileImplIOData(); 174 175 virtual void InitializeInternal( 176 ProfileParams* profile_params, 177 content::ProtocolHandlerMap* protocol_handlers, 178 content::URLRequestInterceptorScopedVector request_interceptors) 179 const OVERRIDE; 180 virtual void InitializeExtensionsRequestContext( 181 ProfileParams* profile_params) const OVERRIDE; 182 virtual net::URLRequestContext* InitializeAppRequestContext( 183 net::URLRequestContext* main_context, 184 const StoragePartitionDescriptor& partition_descriptor, 185 scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory> 186 protocol_handler_interceptor, 187 content::ProtocolHandlerMap* protocol_handlers, 188 content::URLRequestInterceptorScopedVector request_interceptors) 189 const OVERRIDE; 190 virtual net::URLRequestContext* InitializeMediaRequestContext( 191 net::URLRequestContext* original_context, 192 const StoragePartitionDescriptor& partition_descriptor) const OVERRIDE; 193 virtual net::URLRequestContext* 194 AcquireMediaRequestContext() const OVERRIDE; 195 virtual net::URLRequestContext* AcquireIsolatedAppRequestContext( 196 net::URLRequestContext* main_context, 197 const StoragePartitionDescriptor& partition_descriptor, 198 scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory> 199 protocol_handler_interceptor, 200 content::ProtocolHandlerMap* protocol_handlers, 201 content::URLRequestInterceptorScopedVector request_interceptors) 202 const OVERRIDE; 203 virtual net::URLRequestContext* 204 AcquireIsolatedMediaRequestContext( 205 net::URLRequestContext* app_context, 206 const StoragePartitionDescriptor& partition_descriptor) 207 const OVERRIDE; 208 209 // Deletes all network related data since |time|. It deletes transport 210 // security state since |time| and also deletes HttpServerProperties data. 211 // Works asynchronously, however if the |completion| callback is non-null, 212 // it will be posted on the UI thread once the removal process completes. 213 void ClearNetworkingHistorySinceOnIOThread(base::Time time, 214 const base::Closure& completion); 215 216 // Lazy initialization params. 217 mutable scoped_ptr<LazyParams> lazy_params_; 218 219 mutable scoped_ptr<net::HttpTransactionFactory> main_http_factory_; 220 mutable scoped_ptr<net::FtpTransactionFactory> ftp_factory_; 221 222 // Same as |ProfileIOData::http_server_properties_|, owned there to maintain 223 // destruction ordering. 224 mutable net::HttpServerPropertiesManager* http_server_properties_manager_; 225 226 mutable scoped_ptr<chrome_browser_net::Predictor> predictor_; 227 228 mutable scoped_ptr<net::URLRequestContext> media_request_context_; 229 230 mutable scoped_ptr<net::URLRequestJobFactory> main_job_factory_; 231 mutable scoped_ptr<net::URLRequestJobFactory> extensions_job_factory_; 232 233 mutable scoped_ptr<domain_reliability::DomainReliabilityMonitor> 234 domain_reliability_monitor_; 235 236 mutable scoped_ptr<net::SdchManager> sdch_manager_; 237 238 // Parameters needed for isolated apps. 239 base::FilePath profile_path_; 240 int app_cache_max_size_; 241 int app_media_cache_max_size_; 242 243 DISALLOW_COPY_AND_ASSIGN(ProfileImplIOData); 244 }; 245 246 #endif // CHROME_BROWSER_PROFILES_PROFILE_IMPL_IO_DATA_H_ 247