Home | History | Annotate | Download | only in profiles
      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_IO_DATA_H_
      6 #define CHROME_BROWSER_PROFILES_PROFILE_IO_DATA_H_
      7 
      8 #include <map>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/callback_forward.h"
     14 #include "base/files/file_path.h"
     15 #include "base/memory/ref_counted.h"
     16 #include "base/memory/scoped_ptr.h"
     17 #include "base/memory/weak_ptr.h"
     18 #include "base/prefs/pref_member.h"
     19 #include "base/synchronization/lock.h"
     20 #include "chrome/browser/custom_handlers/protocol_handler_registry.h"
     21 #include "chrome/browser/io_thread.h"
     22 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_configurator.h"
     23 #include "chrome/browser/profiles/profile.h"
     24 #include "chrome/browser/profiles/storage_partition_descriptor.h"
     25 #include "components/content_settings/core/common/content_settings_types.h"
     26 #include "components/data_reduction_proxy/browser/data_reduction_proxy_auth_request_handler.h"
     27 #include "components/data_reduction_proxy/browser/data_reduction_proxy_statistics_prefs.h"
     28 #include "components/data_reduction_proxy/browser/data_reduction_proxy_usage_stats.h"
     29 #include "content/public/browser/content_browser_client.h"
     30 #include "content/public/browser/resource_context.h"
     31 #include "net/cookies/cookie_monster.h"
     32 #include "net/http/http_cache.h"
     33 #include "net/http/http_network_session.h"
     34 #include "net/url_request/url_request_context.h"
     35 #include "net/url_request/url_request_job_factory.h"
     36 
     37 class ChromeHttpUserAgentSettings;
     38 class ChromeNetworkDelegate;
     39 class ChromeURLRequestContextGetter;
     40 class CookieSettings;
     41 class DevToolsNetworkController;
     42 class HostContentSettingsMap;
     43 class MediaDeviceIDSalt;
     44 class ProtocolHandlerRegistry;
     45 class SigninNamesOnIOThread;
     46 class SupervisedUserURLFilter;
     47 
     48 namespace chrome_browser_net {
     49 class ResourcePrefetchPredictorObserver;
     50 }
     51 
     52 namespace extensions {
     53 class InfoMap;
     54 }
     55 
     56 namespace net {
     57 class CertVerifier;
     58 class ChannelIDService;
     59 class CookieStore;
     60 class FraudulentCertificateReporter;
     61 class FtpTransactionFactory;
     62 class HttpServerProperties;
     63 class HttpTransactionFactory;
     64 class ProxyConfigService;
     65 class ProxyService;
     66 class SSLConfigService;
     67 class TransportSecurityPersister;
     68 class TransportSecurityState;
     69 class URLRequestJobFactoryImpl;
     70 }  // namespace net
     71 
     72 namespace policy {
     73 class PolicyCertVerifier;
     74 class PolicyHeaderIOHelper;
     75 class URLBlacklistManager;
     76 }  // namespace policy
     77 
     78 namespace prerender {
     79 class PrerenderTracker;
     80 }
     81 
     82 // Conceptually speaking, the ProfileIOData represents data that lives on the IO
     83 // thread that is owned by a Profile, such as, but not limited to, network
     84 // objects like CookieMonster, HttpTransactionFactory, etc.  Profile owns
     85 // ProfileIOData, but will make sure to delete it on the IO thread (except
     86 // possibly in unit tests where there is no IO thread).
     87 class ProfileIOData {
     88  public:
     89   typedef std::vector<scoped_refptr<ChromeURLRequestContextGetter>>
     90       ChromeURLRequestContextGetterVector;
     91 
     92   virtual ~ProfileIOData();
     93 
     94   static ProfileIOData* FromResourceContext(content::ResourceContext* rc);
     95 
     96   // Returns true if |scheme| is handled in Chrome, or by default handlers in
     97   // net::URLRequest.
     98   static bool IsHandledProtocol(const std::string& scheme);
     99 
    100   // Returns true if |url| is handled in Chrome, or by default handlers in
    101   // net::URLRequest.
    102   static bool IsHandledURL(const GURL& url);
    103 
    104   // Utility to install additional WebUI handlers into the |job_factory|.
    105   // Ownership of the handlers is transfered from |protocol_handlers|
    106   // to the |job_factory|.
    107   static void InstallProtocolHandlers(
    108       net::URLRequestJobFactoryImpl* job_factory,
    109       content::ProtocolHandlerMap* protocol_handlers);
    110 
    111   // Called by Profile.
    112   content::ResourceContext* GetResourceContext() const;
    113 
    114   // Initializes the ProfileIOData object and primes the RequestContext
    115   // generation. Must be called prior to any of the Get*() methods other than
    116   // GetResouceContext or GetMetricsEnabledStateOnIOThread.
    117   void Init(
    118       content::ProtocolHandlerMap* protocol_handlers,
    119       content::URLRequestInterceptorScopedVector request_interceptors) const;
    120 
    121   net::URLRequestContext* GetMainRequestContext() const;
    122   net::URLRequestContext* GetMediaRequestContext() const;
    123   net::URLRequestContext* GetExtensionsRequestContext() const;
    124   net::URLRequestContext* GetIsolatedAppRequestContext(
    125       net::URLRequestContext* main_context,
    126       const StoragePartitionDescriptor& partition_descriptor,
    127       scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
    128           protocol_handler_interceptor,
    129       content::ProtocolHandlerMap* protocol_handlers,
    130       content::URLRequestInterceptorScopedVector request_interceptors) const;
    131   net::URLRequestContext* GetIsolatedMediaRequestContext(
    132       net::URLRequestContext* app_context,
    133       const StoragePartitionDescriptor& partition_descriptor) const;
    134 
    135   // These are useful when the Chrome layer is called from the content layer
    136   // with a content::ResourceContext, and they want access to Chrome data for
    137   // that profile.
    138   extensions::InfoMap* GetExtensionInfoMap() const;
    139   CookieSettings* GetCookieSettings() const;
    140   HostContentSettingsMap* GetHostContentSettingsMap() const;
    141 
    142   IntegerPrefMember* session_startup_pref() const {
    143     return &session_startup_pref_;
    144   }
    145 
    146   SigninNamesOnIOThread* signin_names() const {
    147     return signin_names_.get();
    148   }
    149 
    150   StringPrefMember* google_services_account_id() const {
    151     return &google_services_user_account_id_;
    152   }
    153 
    154   StringPrefMember* google_services_username() const {
    155     return &google_services_username_;
    156   }
    157 
    158   StringPrefMember* google_services_username_pattern() const {
    159     return &google_services_username_pattern_;
    160   }
    161 
    162   BooleanPrefMember* reverse_autologin_enabled() const {
    163     return &reverse_autologin_enabled_;
    164   }
    165 
    166   const std::string& reverse_autologin_pending_email() const {
    167     return reverse_autologin_pending_email_;
    168   }
    169 
    170   void set_reverse_autologin_pending_email(const std::string& email) {
    171     reverse_autologin_pending_email_ = email;
    172   }
    173 
    174   StringListPrefMember* one_click_signin_rejected_email_list() const {
    175     return &one_click_signin_rejected_email_list_;
    176   }
    177 
    178   net::URLRequestContext* extensions_request_context() const {
    179     return extensions_request_context_.get();
    180   }
    181 
    182   BooleanPrefMember* safe_browsing_enabled() const {
    183     return &safe_browsing_enabled_;
    184   }
    185 
    186   // TODO(feng): move the function to protected area.
    187   // IsDataReductionProxyEnabled() should be used as public API.
    188   BooleanPrefMember* data_reduction_proxy_enabled() const {
    189     return &data_reduction_proxy_enabled_;
    190   }
    191 
    192   BooleanPrefMember* printing_enabled() const {
    193     return &printing_enabled_;
    194   }
    195 
    196   BooleanPrefMember* sync_disabled() const {
    197     return &sync_disabled_;
    198   }
    199 
    200   BooleanPrefMember* signin_allowed() const {
    201     return &signin_allowed_;
    202   }
    203 
    204   IntegerPrefMember* network_prediction_options() const {
    205     return &network_prediction_options_;
    206   }
    207 
    208   content::ResourceContext::SaltCallback GetMediaDeviceIDSalt() const;
    209 
    210   DevToolsNetworkController* network_controller() const {
    211     return network_controller_.get();
    212   }
    213 
    214   net::TransportSecurityState* transport_security_state() const {
    215     return transport_security_state_.get();
    216   }
    217 
    218 #if defined(OS_CHROMEOS)
    219   std::string username_hash() const {
    220     return username_hash_;
    221   }
    222 
    223   bool use_system_key_slot() const { return use_system_key_slot_; }
    224 #endif
    225 
    226   Profile::ProfileType profile_type() const {
    227     return profile_type_;
    228   }
    229 
    230   bool IsOffTheRecord() const;
    231 
    232   IntegerPrefMember* incognito_availibility() const {
    233     return &incognito_availibility_pref_;
    234   }
    235 
    236   chrome_browser_net::ResourcePrefetchPredictorObserver*
    237       resource_prefetch_predictor_observer() const {
    238     return resource_prefetch_predictor_observer_.get();
    239   }
    240 
    241 #if defined(ENABLE_CONFIGURATION_POLICY)
    242   policy::PolicyHeaderIOHelper* policy_header_helper() const {
    243     return policy_header_helper_.get();
    244   }
    245 #endif
    246 
    247 #if defined(ENABLE_MANAGED_USERS)
    248   const SupervisedUserURLFilter* supervised_user_url_filter() const {
    249     return supervised_user_url_filter_.get();
    250   }
    251 #endif
    252 
    253   // Initialize the member needed to track the metrics enabled state. This is
    254   // only to be called on the UI thread.
    255   void InitializeMetricsEnabledStateOnUIThread();
    256 
    257   // Returns whether or not metrics reporting is enabled in the browser instance
    258   // on which this profile resides. This is safe for use from the IO thread, and
    259   // should only be called from there.
    260   bool GetMetricsEnabledStateOnIOThread() const;
    261 
    262   // Returns whether or not data reduction proxy is enabled in the browser
    263   // instance on which this profile resides.
    264   bool IsDataReductionProxyEnabled() const;
    265 
    266   void set_client_cert_store_factory_for_testing(
    267     const base::Callback<scoped_ptr<net::ClientCertStore>()>& factory) {
    268       client_cert_store_factory_ = factory;
    269   }
    270 
    271  protected:
    272   // A URLRequestContext for media that owns its HTTP factory, to ensure
    273   // it is deleted.
    274   class MediaRequestContext : public net::URLRequestContext {
    275    public:
    276     MediaRequestContext();
    277 
    278     void SetHttpTransactionFactory(
    279         scoped_ptr<net::HttpTransactionFactory> http_factory);
    280 
    281    private:
    282     virtual ~MediaRequestContext();
    283 
    284     scoped_ptr<net::HttpTransactionFactory> http_factory_;
    285   };
    286 
    287   // A URLRequestContext for apps that owns its cookie store and HTTP factory,
    288   // to ensure they are deleted.
    289   class AppRequestContext : public net::URLRequestContext {
    290    public:
    291     AppRequestContext();
    292 
    293     void SetCookieStore(net::CookieStore* cookie_store);
    294     void SetHttpTransactionFactory(
    295         scoped_ptr<net::HttpTransactionFactory> http_factory);
    296     void SetJobFactory(scoped_ptr<net::URLRequestJobFactory> job_factory);
    297 
    298    private:
    299     virtual ~AppRequestContext();
    300 
    301     scoped_refptr<net::CookieStore> cookie_store_;
    302     scoped_ptr<net::HttpTransactionFactory> http_factory_;
    303     scoped_ptr<net::URLRequestJobFactory> job_factory_;
    304   };
    305 
    306   // Created on the UI thread, read on the IO thread during ProfileIOData lazy
    307   // initialization.
    308   struct ProfileParams {
    309     ProfileParams();
    310     ~ProfileParams();
    311 
    312     base::FilePath path;
    313     IOThread* io_thread;
    314     scoped_refptr<CookieSettings> cookie_settings;
    315     scoped_refptr<HostContentSettingsMap> host_content_settings_map;
    316     scoped_refptr<net::SSLConfigService> ssl_config_service;
    317     scoped_refptr<net::CookieMonster::Delegate> cookie_monster_delegate;
    318 #if defined(ENABLE_EXTENSIONS)
    319     scoped_refptr<extensions::InfoMap> extension_info_map;
    320 #endif
    321     scoped_ptr<chrome_browser_net::ResourcePrefetchPredictorObserver>
    322         resource_prefetch_predictor_observer_;
    323 
    324     // This pointer exists only as a means of conveying a url job factory
    325     // pointer from the protocol handler registry on the UI thread to the
    326     // the URLRequestContext on the IO thread. The consumer MUST take
    327     // ownership of the object by calling release() on this pointer.
    328     scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
    329         protocol_handler_interceptor;
    330 
    331     // We need to initialize the ProxyConfigService from the UI thread
    332     // because on linux it relies on initializing things through gconf,
    333     // and needs to be on the main thread.
    334     scoped_ptr<net::ProxyConfigService> proxy_config_service;
    335 
    336 #if defined(ENABLE_MANAGED_USERS)
    337     scoped_refptr<const SupervisedUserURLFilter> supervised_user_url_filter;
    338 #endif
    339 
    340 #if defined(OS_CHROMEOS)
    341     std::string username_hash;
    342     bool use_system_key_slot;
    343 #endif
    344 
    345     // The profile this struct was populated from. It's passed as a void* to
    346     // ensure it's not accidently used on the IO thread. Before using it on the
    347     // UI thread, call ProfileManager::IsValidProfile to ensure it's alive.
    348     void* profile;
    349 
    350     prerender::PrerenderTracker* prerender_tracker;
    351   };
    352 
    353   explicit ProfileIOData(Profile::ProfileType profile_type);
    354 
    355   static std::string GetSSLSessionCacheShard();
    356 
    357   void InitializeOnUIThread(Profile* profile);
    358   void ApplyProfileParamsToContext(net::URLRequestContext* context) const;
    359 
    360   scoped_ptr<net::URLRequestJobFactory> SetUpJobFactoryDefaults(
    361       scoped_ptr<net::URLRequestJobFactoryImpl> job_factory,
    362       content::URLRequestInterceptorScopedVector request_interceptors,
    363       scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
    364           protocol_handler_interceptor,
    365       net::NetworkDelegate* network_delegate,
    366       net::FtpTransactionFactory* ftp_transaction_factory) const;
    367 
    368   // Called when the profile is destroyed.
    369   void ShutdownOnUIThread(
    370       scoped_ptr<ChromeURLRequestContextGetterVector> context_getters);
    371 
    372   // A ChannelIDService object is created by a derived class of
    373   // ProfileIOData, and the derived class calls this method to set the
    374   // channel_id_service_ member and transfers ownership to the base
    375   // class.
    376   void set_channel_id_service(
    377       net::ChannelIDService* channel_id_service) const;
    378 
    379   data_reduction_proxy::DataReductionProxyParams* data_reduction_proxy_params()
    380       const {
    381     return data_reduction_proxy_params_.get();
    382   }
    383 
    384   void set_data_reduction_proxy_params(
    385       scoped_ptr<data_reduction_proxy::DataReductionProxyParams>
    386           data_reduction_proxy_params) const {
    387     data_reduction_proxy_params_ = data_reduction_proxy_params.Pass();
    388   }
    389 
    390   data_reduction_proxy::DataReductionProxyUsageStats*
    391       data_reduction_proxy_usage_stats() const {
    392     return data_reduction_proxy_usage_stats_.get();
    393   }
    394 
    395   void set_data_reduction_proxy_statistics_prefs(
    396       scoped_ptr<data_reduction_proxy::DataReductionProxyStatisticsPrefs>
    397           data_reduction_proxy_statistics_prefs) {
    398     data_reduction_proxy_statistics_prefs_ =
    399         data_reduction_proxy_statistics_prefs.Pass();
    400   }
    401 
    402   data_reduction_proxy::DataReductionProxyStatisticsPrefs*
    403       data_reduction_proxy_statistics_prefs() const {
    404     return data_reduction_proxy_statistics_prefs_.get();
    405   }
    406 
    407   void set_data_reduction_proxy_usage_stats(
    408       scoped_ptr<data_reduction_proxy::DataReductionProxyUsageStats>
    409           data_reduction_proxy_usage_stats) const {
    410      data_reduction_proxy_usage_stats_ =
    411          data_reduction_proxy_usage_stats.Pass();
    412   }
    413 
    414   base::Callback<void(bool)> data_reduction_proxy_unavailable_callback() const {
    415     return data_reduction_proxy_unavailable_callback_;
    416   }
    417 
    418   void set_data_reduction_proxy_unavailable_callback(
    419       const base::Callback<void(bool)>& unavailable_callback) const {
    420     data_reduction_proxy_unavailable_callback_ = unavailable_callback;
    421   }
    422 
    423   DataReductionProxyChromeConfigurator*
    424       data_reduction_proxy_chrome_configurator() const {
    425     return data_reduction_proxy_chrome_configurator_.get();
    426   }
    427 
    428   void set_data_reduction_proxy_chrome_configurator(
    429       scoped_ptr<DataReductionProxyChromeConfigurator>
    430           data_reduction_proxy_chrome_configurator) const {
    431     data_reduction_proxy_chrome_configurator_ =
    432         data_reduction_proxy_chrome_configurator.Pass();
    433   }
    434 
    435   data_reduction_proxy::DataReductionProxyAuthRequestHandler*
    436       data_reduction_proxy_auth_request_handler() const {
    437     return data_reduction_proxy_auth_request_handler_.get();
    438   }
    439 
    440   void set_data_reduction_proxy_auth_request_handler(
    441       scoped_ptr<data_reduction_proxy::DataReductionProxyAuthRequestHandler>
    442           data_reduction_proxy_auth_request_handler) const {
    443     data_reduction_proxy_auth_request_handler_ =
    444         data_reduction_proxy_auth_request_handler.Pass();
    445   }
    446 
    447   ChromeNetworkDelegate* network_delegate() const {
    448     return network_delegate_.get();
    449   }
    450 
    451   net::FraudulentCertificateReporter* fraudulent_certificate_reporter() const {
    452     return fraudulent_certificate_reporter_.get();
    453   }
    454 
    455   net::ProxyService* proxy_service() const {
    456     return proxy_service_.get();
    457   }
    458 
    459   base::WeakPtr<net::HttpServerProperties> http_server_properties() const;
    460 
    461   void set_http_server_properties(
    462       scoped_ptr<net::HttpServerProperties> http_server_properties) const;
    463 
    464   net::URLRequestContext* main_request_context() const {
    465     return main_request_context_.get();
    466   }
    467 
    468   bool initialized() const {
    469     return initialized_;
    470   }
    471 
    472   // Destroys the ResourceContext first, to cancel any URLRequests that are
    473   // using it still, before we destroy the member variables that those
    474   // URLRequests may be accessing.
    475   void DestroyResourceContext();
    476 
    477   // Creates network session and main network transaction factory.
    478   scoped_ptr<net::HttpCache> CreateMainHttpFactory(
    479       const ProfileParams* profile_params,
    480       net::HttpCache::BackendFactory* main_backend) const;
    481 
    482   // Creates network transaction factory.
    483   scoped_ptr<net::HttpCache> CreateHttpFactory(
    484       net::HttpNetworkSession* shared_session,
    485       net::HttpCache::BackendFactory* backend) const;
    486 
    487   void SetCookieSettingsForTesting(CookieSettings* cookie_settings);
    488 
    489   void set_signin_names_for_testing(SigninNamesOnIOThread* signin_names);
    490 
    491  private:
    492   class ResourceContext : public content::ResourceContext {
    493    public:
    494     explicit ResourceContext(ProfileIOData* io_data);
    495     virtual ~ResourceContext();
    496 
    497     // ResourceContext implementation:
    498     virtual net::HostResolver* GetHostResolver() OVERRIDE;
    499     virtual net::URLRequestContext* GetRequestContext() OVERRIDE;
    500     virtual scoped_ptr<net::ClientCertStore> CreateClientCertStore() OVERRIDE;
    501     virtual void CreateKeygenHandler(
    502         uint32 key_size_in_bits,
    503         const std::string& challenge_string,
    504         const GURL& url,
    505         const base::Callback<void(scoped_ptr<net::KeygenHandler>)>& callback)
    506         OVERRIDE;
    507     virtual SaltCallback GetMediaDeviceIDSalt() OVERRIDE;
    508 
    509    private:
    510     friend class ProfileIOData;
    511 
    512     ProfileIOData* const io_data_;
    513 
    514     net::HostResolver* host_resolver_;
    515     net::URLRequestContext* request_context_;
    516   };
    517 
    518   typedef std::map<StoragePartitionDescriptor,
    519                    net::URLRequestContext*,
    520                    StoragePartitionDescriptorLess>
    521       URLRequestContextMap;
    522 
    523   // --------------------------------------------
    524   // Virtual interface for subtypes to implement:
    525   // --------------------------------------------
    526 
    527   // Does the actual initialization of the ProfileIOData subtype. Subtypes
    528   // should use the static helper functions above to implement this.
    529   virtual void InitializeInternal(
    530       ProfileParams* profile_params,
    531       content::ProtocolHandlerMap* protocol_handlers,
    532       content::URLRequestInterceptorScopedVector
    533           request_interceptors) const = 0;
    534 
    535   // Initializes the RequestContext for extensions.
    536   virtual void InitializeExtensionsRequestContext(
    537       ProfileParams* profile_params) const = 0;
    538   // Does an on-demand initialization of a RequestContext for the given
    539   // isolated app.
    540   virtual net::URLRequestContext* InitializeAppRequestContext(
    541       net::URLRequestContext* main_context,
    542       const StoragePartitionDescriptor& details,
    543       scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
    544           protocol_handler_interceptor,
    545       content::ProtocolHandlerMap* protocol_handlers,
    546       content::URLRequestInterceptorScopedVector
    547           request_interceptors) const = 0;
    548 
    549   // Does an on-demand initialization of a media RequestContext for the given
    550   // isolated app.
    551   virtual net::URLRequestContext* InitializeMediaRequestContext(
    552       net::URLRequestContext* original_context,
    553       const StoragePartitionDescriptor& details) const = 0;
    554 
    555   // These functions are used to transfer ownership of the lazily initialized
    556   // context from ProfileIOData to the URLRequestContextGetter.
    557   virtual net::URLRequestContext*
    558       AcquireMediaRequestContext() const = 0;
    559   virtual net::URLRequestContext* AcquireIsolatedAppRequestContext(
    560       net::URLRequestContext* main_context,
    561       const StoragePartitionDescriptor& partition_descriptor,
    562       scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
    563           protocol_handler_interceptor,
    564       content::ProtocolHandlerMap* protocol_handlers,
    565       content::URLRequestInterceptorScopedVector
    566           request_interceptors) const = 0;
    567   virtual net::URLRequestContext*
    568       AcquireIsolatedMediaRequestContext(
    569           net::URLRequestContext* app_context,
    570           const StoragePartitionDescriptor& partition_descriptor) const = 0;
    571 
    572   // The order *DOES* matter for the majority of these member variables, so
    573   // don't move them around unless you know what you're doing!
    574   // General rules:
    575   //   * ResourceContext references the URLRequestContexts, so
    576   //   URLRequestContexts must outlive ResourceContext, hence ResourceContext
    577   //   should be destroyed first.
    578   //   * URLRequestContexts reference a whole bunch of members, so
    579   //   URLRequestContext needs to be destroyed before them.
    580   //   * Therefore, ResourceContext should be listed last, and then the
    581   //   URLRequestContexts, and then the URLRequestContext members.
    582   //   * Note that URLRequestContext members have a directed dependency graph
    583   //   too, so they must themselves be ordered correctly.
    584 
    585   // Tracks whether or not we've been lazily initialized.
    586   mutable bool initialized_;
    587 
    588   // Data from the UI thread from the Profile, used to initialize ProfileIOData.
    589   // Deleted after lazy initialization.
    590   mutable scoped_ptr<ProfileParams> profile_params_;
    591 
    592   // Provides access to the email addresses of all signed in profiles.
    593   mutable scoped_ptr<SigninNamesOnIOThread> signin_names_;
    594 
    595   // Used for testing.
    596   mutable base::Callback<scoped_ptr<net::ClientCertStore>()>
    597       client_cert_store_factory_;
    598 
    599   mutable StringPrefMember google_services_user_account_id_;
    600   mutable StringPrefMember google_services_username_;
    601   mutable StringPrefMember google_services_username_pattern_;
    602   mutable BooleanPrefMember reverse_autologin_enabled_;
    603 
    604   // During the reverse autologin request chain processing, this member saves
    605   // the email of the google account that is being signed into.
    606   std::string reverse_autologin_pending_email_;
    607 
    608   mutable StringListPrefMember one_click_signin_rejected_email_list_;
    609 
    610   mutable scoped_refptr<MediaDeviceIDSalt> media_device_id_salt_;
    611 
    612   // Member variables which are pointed to by the various context objects.
    613   mutable BooleanPrefMember enable_referrers_;
    614   mutable BooleanPrefMember enable_do_not_track_;
    615   mutable BooleanPrefMember force_safesearch_;
    616   mutable BooleanPrefMember safe_browsing_enabled_;
    617   mutable BooleanPrefMember data_reduction_proxy_enabled_;
    618   mutable BooleanPrefMember printing_enabled_;
    619   mutable BooleanPrefMember sync_disabled_;
    620   mutable BooleanPrefMember signin_allowed_;
    621   mutable IntegerPrefMember network_prediction_options_;
    622   // TODO(marja): Remove session_startup_pref_ if no longer needed.
    623   mutable IntegerPrefMember session_startup_pref_;
    624   mutable BooleanPrefMember quick_check_enabled_;
    625   mutable IntegerPrefMember incognito_availibility_pref_;
    626 
    627   // The state of metrics reporting in the browser that this profile runs on.
    628   // Unfortunately, since ChromeOS has a separate representation of this state,
    629   // we need to make one available based on the platform.
    630 #if defined(OS_CHROMEOS)
    631   bool enable_metrics_;
    632 #else
    633   BooleanPrefMember enable_metrics_;
    634 #endif
    635 
    636 #if defined(ENABLE_CONFIGURATION_POLICY)
    637   // Pointed to by NetworkDelegate.
    638   mutable scoped_ptr<policy::URLBlacklistManager> url_blacklist_manager_;
    639   mutable scoped_ptr<policy::PolicyHeaderIOHelper> policy_header_helper_;
    640 #endif
    641 
    642   // Pointed to by URLRequestContext.
    643 #if defined(ENABLE_EXTENSIONS)
    644   mutable scoped_refptr<extensions::InfoMap> extension_info_map_;
    645 #endif
    646   mutable scoped_ptr<net::ChannelIDService> channel_id_service_;
    647 
    648   // data_reduction_proxy_* classes must be declared before |network_delegate_|.
    649   // The data_reduction_proxy_* classes are passed in to |network_delegate_|,
    650   // so this ordering ensures that the |network_delegate_| never references
    651   // freed objects.
    652   mutable scoped_ptr<data_reduction_proxy::DataReductionProxyParams>
    653       data_reduction_proxy_params_;
    654   mutable scoped_ptr<data_reduction_proxy::DataReductionProxyUsageStats>
    655       data_reduction_proxy_usage_stats_;
    656   mutable scoped_ptr<data_reduction_proxy::DataReductionProxyStatisticsPrefs>
    657             data_reduction_proxy_statistics_prefs_;
    658   mutable base::Callback<void(bool)> data_reduction_proxy_unavailable_callback_;
    659   mutable scoped_ptr<DataReductionProxyChromeConfigurator>
    660       data_reduction_proxy_chrome_configurator_;
    661   mutable scoped_ptr<data_reduction_proxy::DataReductionProxyAuthRequestHandler>
    662       data_reduction_proxy_auth_request_handler_;
    663 
    664   mutable scoped_ptr<ChromeNetworkDelegate> network_delegate_;
    665   mutable scoped_ptr<net::FraudulentCertificateReporter>
    666       fraudulent_certificate_reporter_;
    667   mutable scoped_ptr<net::ProxyService> proxy_service_;
    668   mutable scoped_ptr<net::TransportSecurityState> transport_security_state_;
    669   mutable scoped_ptr<net::HttpServerProperties>
    670       http_server_properties_;
    671 #if defined(OS_CHROMEOS)
    672   // Set to |cert_verifier_| if it references a PolicyCertVerifier. In that
    673   // case, the verifier is owned by  |cert_verifier_|. Otherwise, set to NULL.
    674   mutable policy::PolicyCertVerifier* policy_cert_verifier_;
    675   mutable scoped_ptr<net::CertVerifier> cert_verifier_;
    676   mutable std::string username_hash_;
    677   mutable bool use_system_key_slot_;
    678 #endif
    679 
    680   mutable scoped_ptr<net::TransportSecurityPersister>
    681       transport_security_persister_;
    682 
    683   // These are only valid in between LazyInitialize() and their accessor being
    684   // called.
    685   mutable scoped_ptr<net::URLRequestContext> main_request_context_;
    686   mutable scoped_ptr<net::URLRequestContext> extensions_request_context_;
    687   // One URLRequestContext per isolated app for main and media requests.
    688   mutable URLRequestContextMap app_request_context_map_;
    689   mutable URLRequestContextMap isolated_media_request_context_map_;
    690 
    691   mutable scoped_ptr<ResourceContext> resource_context_;
    692 
    693   mutable scoped_refptr<CookieSettings> cookie_settings_;
    694 
    695   mutable scoped_refptr<HostContentSettingsMap> host_content_settings_map_;
    696 
    697   mutable scoped_ptr<chrome_browser_net::ResourcePrefetchPredictorObserver>
    698       resource_prefetch_predictor_observer_;
    699 
    700   mutable scoped_ptr<ChromeHttpUserAgentSettings>
    701       chrome_http_user_agent_settings_;
    702 
    703 #if defined(ENABLE_MANAGED_USERS)
    704   mutable scoped_refptr<const SupervisedUserURLFilter>
    705       supervised_user_url_filter_;
    706 #endif
    707 
    708   mutable scoped_ptr<DevToolsNetworkController> network_controller_;
    709 
    710   // TODO(jhawkins): Remove once crbug.com/102004 is fixed.
    711   bool initialized_on_UI_thread_;
    712 
    713   const Profile::ProfileType profile_type_;
    714 
    715   DISALLOW_COPY_AND_ASSIGN(ProfileIOData);
    716 };
    717 
    718 #endif  // CHROME_BROWSER_PROFILES_PROFILE_IO_DATA_H_
    719