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.
5 #ifndef CHROME_BROWSER_PROFILES_PROFILE_IO_DATA_H_
6 #define CHROME_BROWSER_PROFILES_PROFILE_IO_DATA_H_
10 #include "base/basictypes.h"
11 #include "base/callback_forward.h"
12 #include "base/files/file_path.h"
13 #include "base/memory/ref_counted.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/memory/weak_ptr.h"
16 #include "base/prefs/pref_member.h"
17 #include "base/synchronization/lock.h"
18 #include "chrome/browser/custom_handlers/protocol_handler_registry.h"
19 #include "chrome/browser/io_thread.h"
20 #include "chrome/browser/net/chrome_url_request_context.h"
21 #include "chrome/browser/profiles/profile.h"
22 #include "chrome/browser/profiles/storage_partition_descriptor.h"
23 #include "chrome/common/content_settings_types.h"
24 #include "content/public/browser/content_browser_client.h"
25 #include "content/public/browser/resource_context.h"
26 #include "net/cookies/cookie_monster.h"
27 #include "net/http/http_network_session.h"
28 #include "net/url_request/url_request_job_factory.h"
30 class ChromeHttpUserAgentSettings;
31 class ChromeNetworkDelegate;
33 class HostContentSettingsMap;
34 class ManagedModeURLFilter;
35 class MediaDeviceIDSalt;
36 class ProtocolHandlerRegistry;
37 class SigninNamesOnIOThread;
39 namespace extensions {
45 class FraudulentCertificateReporter;
46 class FtpTransactionFactory;
47 class HttpServerProperties;
48 class HttpTransactionFactory;
49 class ServerBoundCertService;
50 class ProxyConfigService;
52 class SSLConfigService;
53 class TransportSecurityPersister;
54 class TransportSecurityState;
55 class URLRequestJobFactoryImpl;
59 class PolicyCertVerifier;
60 class PolicyHeaderIOHelper;
61 class URLBlacklistManager;
64 // Conceptually speaking, the ProfileIOData represents data that lives on the IO
65 // thread that is owned by a Profile, such as, but not limited to, network
66 // objects like CookieMonster, HttpTransactionFactory, etc. Profile owns
67 // ProfileIOData, but will make sure to delete it on the IO thread (except
68 // possibly in unit tests where there is no IO thread).
71 virtual ~ProfileIOData();
73 static ProfileIOData* FromResourceContext(content::ResourceContext* rc);
75 // Returns true if |scheme| is handled in Chrome, or by default handlers in
77 static bool IsHandledProtocol(const std::string& scheme);
79 // Returns true if |url| is handled in Chrome, or by default handlers in
81 static bool IsHandledURL(const GURL& url);
83 // Utility to install additional WebUI handlers into the |job_factory|.
84 // Ownership of the handlers is transfered from |protocol_handlers|
85 // to the |job_factory|.
86 static void InstallProtocolHandlers(
87 net::URLRequestJobFactoryImpl* job_factory,
88 content::ProtocolHandlerMap* protocol_handlers);
91 content::ResourceContext* GetResourceContext() const;
93 // Initializes the ProfileIOData object and primes the RequestContext
94 // generation. Must be called prior to any of the Get*() methods other than
95 // GetResouceContext or GetMetricsEnabledStateOnIOThread.
96 void Init(content::ProtocolHandlerMap* protocol_handlers,
97 content::ProtocolHandlerScopedVector protocol_interceptors) const;
99 ChromeURLRequestContext* GetMainRequestContext() const;
100 ChromeURLRequestContext* GetMediaRequestContext() const;
101 ChromeURLRequestContext* GetExtensionsRequestContext() const;
102 ChromeURLRequestContext* GetIsolatedAppRequestContext(
103 ChromeURLRequestContext* main_context,
104 const StoragePartitionDescriptor& partition_descriptor,
105 scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
106 protocol_handler_interceptor,
107 content::ProtocolHandlerMap* protocol_handlers,
108 content::ProtocolHandlerScopedVector protocol_interceptors) const;
109 ChromeURLRequestContext* GetIsolatedMediaRequestContext(
110 ChromeURLRequestContext* app_context,
111 const StoragePartitionDescriptor& partition_descriptor) const;
113 // These are useful when the Chrome layer is called from the content layer
114 // with a content::ResourceContext, and they want access to Chrome data for
116 extensions::InfoMap* GetExtensionInfoMap() const;
117 CookieSettings* GetCookieSettings() const;
118 HostContentSettingsMap* GetHostContentSettingsMap() const;
120 IntegerPrefMember* session_startup_pref() const {
121 return &session_startup_pref_;
124 SigninNamesOnIOThread* signin_names() const {
125 return signin_names_.get();
128 StringPrefMember* google_services_account_id() const {
129 return &google_services_user_account_id_;
132 StringPrefMember* google_services_username() const {
133 return &google_services_username_;
136 StringPrefMember* google_services_username_pattern() const {
137 return &google_services_username_pattern_;
140 BooleanPrefMember* reverse_autologin_enabled() const {
141 return &reverse_autologin_enabled_;
144 const std::string& reverse_autologin_pending_email() const {
145 return reverse_autologin_pending_email_;
148 void set_reverse_autologin_pending_email(const std::string& email) {
149 reverse_autologin_pending_email_ = email;
152 StringListPrefMember* one_click_signin_rejected_email_list() const {
153 return &one_click_signin_rejected_email_list_;
156 ChromeURLRequestContext* extensions_request_context() const {
157 return extensions_request_context_.get();
160 BooleanPrefMember* safe_browsing_enabled() const {
161 return &safe_browsing_enabled_;
164 BooleanPrefMember* printing_enabled() const {
165 return &printing_enabled_;
168 BooleanPrefMember* sync_disabled() const {
169 return &sync_disabled_;
172 BooleanPrefMember* signin_allowed() const {
173 return &signin_allowed_;
176 BooleanPrefMember* network_prediction_enabled() const {
177 return &network_prediction_enabled_;
180 content::ResourceContext::SaltCallback GetMediaDeviceIDSalt() const;
182 net::TransportSecurityState* transport_security_state() const {
183 return transport_security_state_.get();
186 #if defined(OS_CHROMEOS)
187 std::string username_hash() const {
188 return username_hash_;
192 Profile::ProfileType profile_type() const {
193 return profile_type_;
196 bool IsOffTheRecord() const;
198 IntegerPrefMember* incognito_availibility() const {
199 return &incognito_availibility_pref_;
202 #if defined(ENABLE_CONFIGURATION_POLICY)
203 policy::PolicyHeaderIOHelper* policy_header_helper() const {
204 return policy_header_helper_.get();
208 #if defined(ENABLE_MANAGED_USERS)
209 const ManagedModeURLFilter* managed_mode_url_filter() const {
210 return managed_mode_url_filter_.get();
214 // Initialize the member needed to track the metrics enabled state. This is
215 // only to be called on the UI thread.
216 void InitializeMetricsEnabledStateOnUIThread();
218 // Returns whether or not metrics reporting is enabled in the browser instance
219 // on which this profile resides. This is safe for use from the IO thread, and
220 // should only be called from there.
221 bool GetMetricsEnabledStateOnIOThread() const;
223 void set_client_cert_store_factory_for_testing(
224 const base::Callback<scoped_ptr<net::ClientCertStore>()>& factory) {
225 client_cert_store_factory_ = factory;
229 // A URLRequestContext for media that owns its HTTP factory, to ensure
231 class MediaRequestContext : public ChromeURLRequestContext {
233 MediaRequestContext();
235 void SetHttpTransactionFactory(
236 scoped_ptr<net::HttpTransactionFactory> http_factory);
239 virtual ~MediaRequestContext();
241 scoped_ptr<net::HttpTransactionFactory> http_factory_;
244 // A URLRequestContext for apps that owns its cookie store and HTTP factory,
245 // to ensure they are deleted.
246 class AppRequestContext : public ChromeURLRequestContext {
250 void SetCookieStore(net::CookieStore* cookie_store);
251 void SetHttpTransactionFactory(
252 scoped_ptr<net::HttpTransactionFactory> http_factory);
253 void SetJobFactory(scoped_ptr<net::URLRequestJobFactory> job_factory);
256 virtual ~AppRequestContext();
258 scoped_refptr<net::CookieStore> cookie_store_;
259 scoped_ptr<net::HttpTransactionFactory> http_factory_;
260 scoped_ptr<net::URLRequestJobFactory> job_factory_;
263 // Created on the UI thread, read on the IO thread during ProfileIOData lazy
265 struct ProfileParams {
271 scoped_refptr<CookieSettings> cookie_settings;
272 scoped_refptr<HostContentSettingsMap> host_content_settings_map;
273 scoped_refptr<net::SSLConfigService> ssl_config_service;
274 scoped_refptr<net::CookieMonster::Delegate> cookie_monster_delegate;
275 scoped_refptr<extensions::InfoMap> extension_info_map;
277 // This pointer exists only as a means of conveying a url job factory
278 // pointer from the protocol handler registry on the UI thread to the
279 // the URLRequestContext on the IO thread. The consumer MUST take
280 // ownership of the object by calling release() on this pointer.
281 scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
282 protocol_handler_interceptor;
284 // We need to initialize the ProxyConfigService from the UI thread
285 // because on linux it relies on initializing things through gconf,
286 // and needs to be on the main thread.
287 scoped_ptr<net::ProxyConfigService> proxy_config_service;
289 #if defined(ENABLE_MANAGED_USERS)
290 scoped_refptr<const ManagedModeURLFilter> managed_mode_url_filter;
293 #if defined(OS_CHROMEOS)
294 std::string username_hash;
297 // The profile this struct was populated from. It's passed as a void* to
298 // ensure it's not accidently used on the IO thread. Before using it on the
299 // UI thread, call ProfileManager::IsValidProfile to ensure it's alive.
303 explicit ProfileIOData(Profile::ProfileType profile_type);
305 static std::string GetSSLSessionCacheShard();
307 void InitializeOnUIThread(Profile* profile);
308 void ApplyProfileParamsToContext(ChromeURLRequestContext* context) const;
310 scoped_ptr<net::URLRequestJobFactory> SetUpJobFactoryDefaults(
311 scoped_ptr<net::URLRequestJobFactoryImpl> job_factory,
312 content::ProtocolHandlerScopedVector protocol_interceptors,
313 scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
314 protocol_handler_interceptor,
315 net::NetworkDelegate* network_delegate,
316 net::FtpTransactionFactory* ftp_transaction_factory) const;
318 // Called when the profile is destroyed.
319 void ShutdownOnUIThread();
321 // A ServerBoundCertService object is created by a derived class of
322 // ProfileIOData, and the derived class calls this method to set the
323 // server_bound_cert_service_ member and transfers ownership to the base
325 void set_server_bound_cert_service(
326 net::ServerBoundCertService* server_bound_cert_service) const;
328 ChromeNetworkDelegate* network_delegate() const {
329 return network_delegate_.get();
332 net::FraudulentCertificateReporter* fraudulent_certificate_reporter() const {
333 return fraudulent_certificate_reporter_.get();
336 net::ProxyService* proxy_service() const {
337 return proxy_service_.get();
340 base::WeakPtr<net::HttpServerProperties> http_server_properties() const;
342 void set_http_server_properties(
343 scoped_ptr<net::HttpServerProperties> http_server_properties) const;
345 ChromeURLRequestContext* main_request_context() const {
346 return main_request_context_.get();
349 bool initialized() const {
353 // Destroys the ResourceContext first, to cancel any URLRequests that are
354 // using it still, before we destroy the member variables that those
355 // URLRequests may be accessing.
356 void DestroyResourceContext();
358 // Fills in fields of params using values from main_request_context_ and the
359 // IOThread associated with profile_params.
360 void PopulateNetworkSessionParams(
361 const ProfileParams* profile_params,
362 net::HttpNetworkSession::Params* params) const;
364 void SetCookieSettingsForTesting(CookieSettings* cookie_settings);
366 void set_signin_names_for_testing(SigninNamesOnIOThread* signin_names);
369 class ResourceContext : public content::ResourceContext {
371 explicit ResourceContext(ProfileIOData* io_data);
372 virtual ~ResourceContext();
374 // ResourceContext implementation:
375 virtual net::HostResolver* GetHostResolver() OVERRIDE;
376 virtual net::URLRequestContext* GetRequestContext() OVERRIDE;
377 virtual scoped_ptr<net::ClientCertStore> CreateClientCertStore() OVERRIDE;
378 virtual void CreateKeygenHandler(
379 uint32 key_size_in_bits,
380 const std::string& challenge_string,
382 const base::Callback<void(scoped_ptr<net::KeygenHandler>)>& callback)
384 virtual bool AllowMicAccess(const GURL& origin) OVERRIDE;
385 virtual bool AllowCameraAccess(const GURL& origin) OVERRIDE;
386 virtual SaltCallback GetMediaDeviceIDSalt() OVERRIDE;
389 friend class ProfileIOData;
391 // Helper method that returns true if |type| is allowed for |origin|, false
393 bool AllowContentAccess(const GURL& origin, ContentSettingsType type);
395 ProfileIOData* const io_data_;
397 net::HostResolver* host_resolver_;
398 net::URLRequestContext* request_context_;
401 typedef std::map<StoragePartitionDescriptor,
402 ChromeURLRequestContext*,
403 StoragePartitionDescriptorLess>
404 URLRequestContextMap;
406 // --------------------------------------------
407 // Virtual interface for subtypes to implement:
408 // --------------------------------------------
410 // Does the actual initialization of the ProfileIOData subtype. Subtypes
411 // should use the static helper functions above to implement this.
412 virtual void InitializeInternal(
413 ProfileParams* profile_params,
414 content::ProtocolHandlerMap* protocol_handlers,
415 content::ProtocolHandlerScopedVector protocol_interceptors) const = 0;
417 // Initializes the RequestContext for extensions.
418 virtual void InitializeExtensionsRequestContext(
419 ProfileParams* profile_params) const = 0;
420 // Does an on-demand initialization of a RequestContext for the given
422 virtual ChromeURLRequestContext* InitializeAppRequestContext(
423 ChromeURLRequestContext* main_context,
424 const StoragePartitionDescriptor& details,
425 scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
426 protocol_handler_interceptor,
427 content::ProtocolHandlerMap* protocol_handlers,
428 content::ProtocolHandlerScopedVector protocol_interceptors) const = 0;
430 // Does an on-demand initialization of a media RequestContext for the given
432 virtual ChromeURLRequestContext* InitializeMediaRequestContext(
433 ChromeURLRequestContext* original_context,
434 const StoragePartitionDescriptor& details) const = 0;
436 // These functions are used to transfer ownership of the lazily initialized
437 // context from ProfileIOData to the URLRequestContextGetter.
438 virtual ChromeURLRequestContext*
439 AcquireMediaRequestContext() const = 0;
440 virtual ChromeURLRequestContext* AcquireIsolatedAppRequestContext(
441 ChromeURLRequestContext* main_context,
442 const StoragePartitionDescriptor& partition_descriptor,
443 scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
444 protocol_handler_interceptor,
445 content::ProtocolHandlerMap* protocol_handlers,
446 content::ProtocolHandlerScopedVector protocol_interceptors) const = 0;
447 virtual ChromeURLRequestContext*
448 AcquireIsolatedMediaRequestContext(
449 ChromeURLRequestContext* app_context,
450 const StoragePartitionDescriptor& partition_descriptor) const = 0;
452 // The order *DOES* matter for the majority of these member variables, so
453 // don't move them around unless you know what you're doing!
455 // * ResourceContext references the URLRequestContexts, so
456 // URLRequestContexts must outlive ResourceContext, hence ResourceContext
457 // should be destroyed first.
458 // * URLRequestContexts reference a whole bunch of members, so
459 // URLRequestContext needs to be destroyed before them.
460 // * Therefore, ResourceContext should be listed last, and then the
461 // URLRequestContexts, and then the URLRequestContext members.
462 // * Note that URLRequestContext members have a directed dependency graph
463 // too, so they must themselves be ordered correctly.
465 // Tracks whether or not we've been lazily initialized.
466 mutable bool initialized_;
468 // Data from the UI thread from the Profile, used to initialize ProfileIOData.
469 // Deleted after lazy initialization.
470 mutable scoped_ptr<ProfileParams> profile_params_;
472 // Provides access to the email addresses of all signed in profiles.
473 mutable scoped_ptr<SigninNamesOnIOThread> signin_names_;
476 mutable base::Callback<scoped_ptr<net::ClientCertStore>()>
477 client_cert_store_factory_;
479 mutable StringPrefMember google_services_user_account_id_;
480 mutable StringPrefMember google_services_username_;
481 mutable StringPrefMember google_services_username_pattern_;
482 mutable BooleanPrefMember reverse_autologin_enabled_;
484 // During the reverse autologin request chain processing, this member saves
485 // the email of the google account that is being signed into.
486 std::string reverse_autologin_pending_email_;
488 mutable StringListPrefMember one_click_signin_rejected_email_list_;
490 mutable scoped_refptr<MediaDeviceIDSalt> media_device_id_salt_;
492 // Member variables which are pointed to by the various context objects.
493 mutable BooleanPrefMember enable_referrers_;
494 mutable BooleanPrefMember enable_do_not_track_;
495 mutable BooleanPrefMember force_safesearch_;
496 mutable BooleanPrefMember safe_browsing_enabled_;
497 mutable BooleanPrefMember printing_enabled_;
498 mutable BooleanPrefMember sync_disabled_;
499 mutable BooleanPrefMember signin_allowed_;
500 mutable BooleanPrefMember network_prediction_enabled_;
501 // TODO(marja): Remove session_startup_pref_ if no longer needed.
502 mutable IntegerPrefMember session_startup_pref_;
503 mutable BooleanPrefMember quick_check_enabled_;
504 mutable IntegerPrefMember incognito_availibility_pref_;
506 // The state of metrics reporting in the browser that this profile runs on.
507 // Unfortunately, since ChromeOS has a separate representation of this state,
508 // we need to make one available based on the platform.
509 #if defined(OS_CHROMEOS)
510 bool enable_metrics_;
512 BooleanPrefMember enable_metrics_;
515 #if defined(ENABLE_CONFIGURATION_POLICY)
516 // Pointed to by NetworkDelegate.
517 mutable scoped_ptr<policy::URLBlacklistManager> url_blacklist_manager_;
518 mutable scoped_ptr<policy::PolicyHeaderIOHelper> policy_header_helper_;
521 // Pointed to by URLRequestContext.
522 mutable scoped_refptr<extensions::InfoMap> extension_info_map_;
523 mutable scoped_ptr<net::ServerBoundCertService> server_bound_cert_service_;
524 mutable scoped_ptr<ChromeNetworkDelegate> network_delegate_;
525 mutable scoped_ptr<net::FraudulentCertificateReporter>
526 fraudulent_certificate_reporter_;
527 mutable scoped_ptr<net::ProxyService> proxy_service_;
528 mutable scoped_ptr<net::TransportSecurityState> transport_security_state_;
529 mutable scoped_ptr<net::HttpServerProperties>
530 http_server_properties_;
531 #if defined(OS_CHROMEOS)
532 mutable scoped_ptr<policy::PolicyCertVerifier> cert_verifier_;
533 mutable std::string username_hash_;
536 mutable scoped_ptr<net::TransportSecurityPersister>
537 transport_security_persister_;
539 // These are only valid in between LazyInitialize() and their accessor being
541 mutable scoped_ptr<ChromeURLRequestContext> main_request_context_;
542 mutable scoped_ptr<ChromeURLRequestContext> extensions_request_context_;
543 // One URLRequestContext per isolated app for main and media requests.
544 mutable URLRequestContextMap app_request_context_map_;
545 mutable URLRequestContextMap isolated_media_request_context_map_;
547 mutable scoped_ptr<ResourceContext> resource_context_;
549 mutable scoped_refptr<CookieSettings> cookie_settings_;
551 mutable scoped_refptr<HostContentSettingsMap> host_content_settings_map_;
553 mutable scoped_ptr<ChromeHttpUserAgentSettings>
554 chrome_http_user_agent_settings_;
556 #if defined(ENABLE_MANAGED_USERS)
557 mutable scoped_refptr<const ManagedModeURLFilter> managed_mode_url_filter_;
560 // TODO(jhawkins): Remove once crbug.com/102004 is fixed.
561 bool initialized_on_UI_thread_;
563 const Profile::ProfileType profile_type_;
565 DISALLOW_COPY_AND_ASSIGN(ProfileIOData);
568 #endif // CHROME_BROWSER_PROFILES_PROFILE_IO_DATA_H_