// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_PROFILES_PROFILE_IMPL_IO_DATA_H_ #define CHROME_BROWSER_PROFILES_PROFILE_IMPL_IO_DATA_H_ #include "base/basictypes.h" #include "base/callback.h" #include "base/containers/hash_tables.h" #include "base/memory/ref_counted.h" #include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/net/chrome_url_request_context_getter.h" #include "chrome/browser/profiles/profile_io_data.h" #include "content/public/browser/cookie_store_factory.h" namespace chrome_browser_net { class Predictor; } // namespace chrome_browser_net namespace content { class CookieCryptoDelegate; } // namespace content namespace domain_reliability { class DomainReliabilityMonitor; } // namespace domain_reliability namespace net { class FtpTransactionFactory; class HttpServerProperties; class HttpServerPropertiesManager; class HttpTransactionFactory; class ProxyConfig; class SDCHManager; } // namespace net namespace storage { class SpecialStoragePolicy; } // namespace storage class ProfileImplIOData : public ProfileIOData { public: class Handle { public: explicit Handle(Profile* profile); ~Handle(); // Init() must be called before ~Handle(). It records most of the // parameters needed to construct a ChromeURLRequestContextGetter. void Init( const base::FilePath& cookie_path, const base::FilePath& channel_id_path, const base::FilePath& cache_path, int cache_max_size, const base::FilePath& media_cache_path, int media_cache_max_size, const base::FilePath& extensions_cookie_path, const base::FilePath& profile_path, const base::FilePath& infinite_cache_path, chrome_browser_net::Predictor* predictor, content::CookieStoreConfig::SessionCookieMode session_cookie_mode, storage::SpecialStoragePolicy* special_storage_policy, scoped_ptr domain_reliability_monitor, const base::Callback& data_reduction_proxy_unavailable, scoped_ptr data_reduction_proxy_chrome_configurator, scoped_ptr data_reduction_proxy_params, scoped_ptr data_reduction_proxy_statistics_prefs); // These Create*ContextGetter() functions are only exposed because the // circular relationship between Profile, ProfileIOData::Handle, and the // ChromeURLRequestContextGetter factories requires Profile be able to call // these functions. scoped_refptr CreateMainRequestContextGetter( content::ProtocolHandlerMap* protocol_handlers, content::URLRequestInterceptorScopedVector request_interceptors, PrefService* local_state, IOThread* io_thread) const; scoped_refptr CreateIsolatedAppRequestContextGetter( const base::FilePath& partition_path, bool in_memory, content::ProtocolHandlerMap* protocol_handlers, content::URLRequestInterceptorScopedVector request_interceptors) const; content::ResourceContext* GetResourceContext() const; // GetResourceContextNoInit() does not call LazyInitialize() so it can be // safely be used during initialization. content::ResourceContext* GetResourceContextNoInit() const; scoped_refptr GetMediaRequestContextGetter() const; scoped_refptr GetExtensionsRequestContextGetter() const; scoped_refptr GetIsolatedMediaRequestContextGetter( const base::FilePath& partition_path, bool in_memory) const; // Returns the DevToolsNetworkController attached to ProfileIOData. DevToolsNetworkController* GetDevToolsNetworkController() const; // Deletes all network related data since |time|. It deletes transport // security state since |time| and also deletes HttpServerProperties data. // Works asynchronously, however if the |completion| callback is non-null, // it will be posted on the UI thread once the removal process completes. void ClearNetworkingHistorySince(base::Time time, const base::Closure& completion); private: typedef std::map, StoragePartitionDescriptorLess> ChromeURLRequestContextGetterMap; // Lazily initialize ProfileParams. We do this on the calls to // Get*RequestContextGetter(), so we only initialize ProfileParams right // before posting a task to the IO thread to start using them. This prevents // objects that are supposed to be deleted on the IO thread, but are created // on the UI thread from being unnecessarily initialized. void LazyInitialize() const; // Collect references to context getters in reverse order, i.e. last item // will be main request getter. This list is passed to |io_data_| // for invalidation on IO thread. scoped_ptr GetAllContextGetters(); // The getters will be invalidated on the IO thread before // ProfileIOData instance is deleted. mutable scoped_refptr main_request_context_getter_; mutable scoped_refptr media_request_context_getter_; mutable scoped_refptr extensions_request_context_getter_; mutable ChromeURLRequestContextGetterMap app_request_context_getter_map_; mutable ChromeURLRequestContextGetterMap isolated_media_request_context_getter_map_; ProfileImplIOData* const io_data_; Profile* const profile_; mutable bool initialized_; DISALLOW_COPY_AND_ASSIGN(Handle); }; virtual bool IsDataReductionProxyEnabled() const override; BooleanPrefMember* data_reduction_proxy_enabled() const { return &data_reduction_proxy_enabled_; } private: friend class base::RefCountedThreadSafe; struct LazyParams { LazyParams(); ~LazyParams(); // All of these parameters are intended to be read on the IO thread. base::FilePath cookie_path; base::FilePath channel_id_path; base::FilePath cache_path; int cache_max_size; base::FilePath media_cache_path; int media_cache_max_size; base::FilePath extensions_cookie_path; base::FilePath infinite_cache_path; content::CookieStoreConfig::SessionCookieMode session_cookie_mode; scoped_refptr special_storage_policy; }; ProfileImplIOData(); virtual ~ProfileImplIOData(); virtual void InitializeInternal( ProfileParams* profile_params, content::ProtocolHandlerMap* protocol_handlers, content::URLRequestInterceptorScopedVector request_interceptors) const override; virtual void InitializeExtensionsRequestContext( ProfileParams* profile_params) const override; virtual net::URLRequestContext* InitializeAppRequestContext( net::URLRequestContext* main_context, const StoragePartitionDescriptor& partition_descriptor, scoped_ptr protocol_handler_interceptor, content::ProtocolHandlerMap* protocol_handlers, content::URLRequestInterceptorScopedVector request_interceptors) const override; virtual net::URLRequestContext* InitializeMediaRequestContext( net::URLRequestContext* original_context, const StoragePartitionDescriptor& partition_descriptor) const override; virtual net::URLRequestContext* AcquireMediaRequestContext() const override; virtual net::URLRequestContext* AcquireIsolatedAppRequestContext( net::URLRequestContext* main_context, const StoragePartitionDescriptor& partition_descriptor, scoped_ptr protocol_handler_interceptor, content::ProtocolHandlerMap* protocol_handlers, content::URLRequestInterceptorScopedVector request_interceptors) const override; virtual net::URLRequestContext* AcquireIsolatedMediaRequestContext( net::URLRequestContext* app_context, const StoragePartitionDescriptor& partition_descriptor) const override; // Deletes all network related data since |time|. It deletes transport // security state since |time| and also deletes HttpServerProperties data. // Works asynchronously, however if the |completion| callback is non-null, // it will be posted on the UI thread once the removal process completes. void ClearNetworkingHistorySinceOnIOThread(base::Time time, const base::Closure& completion); // Lazy initialization params. mutable scoped_ptr lazy_params_; mutable scoped_ptr main_http_factory_; mutable scoped_ptr ftp_factory_; // Same as |ProfileIOData::http_server_properties_|, owned there to maintain // destruction ordering. mutable net::HttpServerPropertiesManager* http_server_properties_manager_; mutable scoped_ptr predictor_; mutable scoped_ptr media_request_context_; mutable scoped_ptr main_job_factory_; mutable scoped_ptr extensions_job_factory_; mutable scoped_ptr domain_reliability_monitor_; mutable scoped_ptr sdch_manager_; mutable BooleanPrefMember data_reduction_proxy_enabled_; // Parameters needed for isolated apps. base::FilePath profile_path_; int app_cache_max_size_; int app_media_cache_max_size_; DISALLOW_COPY_AND_ASSIGN(ProfileImplIOData); }; #endif // CHROME_BROWSER_PROFILES_PROFILE_IMPL_IO_DATA_H_