Home | History | Annotate | Download | only in profiles
      1 // Copyright (c) 2011 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 #pragma once
      8 
      9 #include <set>
     10 #include "base/basictypes.h"
     11 #include "base/debug/stack_trace.h"
     12 #include "base/file_path.h"
     13 #include "base/memory/ref_counted.h"
     14 #include "base/memory/scoped_ptr.h"
     15 #include "base/synchronization/lock.h"
     16 #include "chrome/browser/net/chrome_url_request_context.h"
     17 #include "chrome/browser/prefs/pref_member.h"
     18 #include "chrome/browser/profiles/profile.h"
     19 #include "content/browser/resource_context.h"
     20 #include "net/base/cookie_monster.h"
     21 
     22 class CommandLine;
     23 class ChromeAppCacheService;
     24 class ChromeBlobStorageContext;
     25 class ExtensionInfoMap;
     26 namespace fileapi {
     27 class FileSystemContext;
     28 }  // namespace fileapi
     29 class HostContentSettingsMap;
     30 class HostZoomMap;
     31 class IOThread;
     32 namespace net {
     33 class DnsCertProvenanceChecker;
     34 class NetLog;
     35 class ProxyConfigService;
     36 class ProxyService;
     37 class SSLConfigService;
     38 class TransportSecurityState;
     39 }  // namespace net
     40 namespace prerender {
     41 class PrerenderManager;
     42 };  // namespace prerender
     43 class ProtocolHandlerRegistry;
     44 namespace webkit_database {
     45 class DatabaseTracker;
     46 }  // webkit_database
     47 
     48 // Conceptually speaking, the ProfileIOData represents data that lives on the IO
     49 // thread that is owned by a Profile, such as, but not limited to, network
     50 // objects like CookieMonster, HttpTransactionFactory, etc. The Profile
     51 // implementation will maintain a reference to the ProfileIOData. The
     52 // ProfileIOData will originally own a reference to the ChromeURLRequestContexts
     53 // that reference its members. When an accessor for a ChromeURLRequestContext is
     54 // invoked, then ProfileIOData will release its reference to the
     55 // ChromeURLRequestContext and the ChromeURLRequestContext will acquire a
     56 // reference to the ProfileIOData, so they exchange ownership. This is done
     57 // because it's possible for a context's accessor never to be invoked, so this
     58 // ownership reversal prevents shutdown leaks. ProfileIOData will lazily
     59 // initialize its members on the first invocation of a ChromeURLRequestContext
     60 // accessor.
     61 class ProfileIOData : public base::RefCountedThreadSafe<ProfileIOData> {
     62  public:
     63   // These should only be called at most once each. Ownership is reversed when
     64   // they get called, from ProfileIOData owning ChromeURLRequestContext to vice
     65   // versa.
     66   scoped_refptr<ChromeURLRequestContext> GetMainRequestContext() const;
     67   scoped_refptr<ChromeURLRequestContext> GetMediaRequestContext() const;
     68   scoped_refptr<ChromeURLRequestContext> GetExtensionsRequestContext() const;
     69   scoped_refptr<ChromeURLRequestContext> GetIsolatedAppRequestContext(
     70       scoped_refptr<ChromeURLRequestContext> main_context,
     71       const std::string& app_id) const;
     72   const content::ResourceContext& GetResourceContext() const;
     73 
     74  protected:
     75   friend class base::RefCountedThreadSafe<ProfileIOData>;
     76 
     77   class RequestContext : public ChromeURLRequestContext {
     78    public:
     79     RequestContext();
     80     ~RequestContext();
     81 
     82     // Setter is used to transfer ownership of the ProfileIOData to the context.
     83     void set_profile_io_data(const ProfileIOData* profile_io_data) {
     84       profile_io_data_ = profile_io_data;
     85     }
     86 
     87    private:
     88     scoped_refptr<const ProfileIOData> profile_io_data_;
     89   };
     90 
     91   // Created on the UI thread, read on the IO thread during ProfileIOData lazy
     92   // initialization.
     93   struct ProfileParams {
     94     ProfileParams();
     95     ~ProfileParams();
     96 
     97     bool is_incognito;
     98     bool clear_local_state_on_exit;
     99     std::string accept_language;
    100     std::string accept_charset;
    101     std::string referrer_charset;
    102     FilePath user_script_dir_path;
    103     IOThread* io_thread;
    104     scoped_refptr<HostContentSettingsMap> host_content_settings_map;
    105     scoped_refptr<HostZoomMap> host_zoom_map;
    106     scoped_refptr<net::TransportSecurityState> transport_security_state;
    107     scoped_refptr<net::SSLConfigService> ssl_config_service;
    108     scoped_refptr<net::CookieMonster::Delegate> cookie_monster_delegate;
    109     scoped_refptr<webkit_database::DatabaseTracker> database_tracker;
    110     scoped_refptr<ChromeAppCacheService> appcache_service;
    111     scoped_refptr<ChromeBlobStorageContext> blob_storage_context;
    112     scoped_refptr<fileapi::FileSystemContext> file_system_context;
    113     scoped_refptr<ExtensionInfoMap> extension_info_map;
    114     scoped_refptr<prerender::PrerenderManager> prerender_manager;
    115     scoped_refptr<ProtocolHandlerRegistry> protocol_handler_registry;
    116     // We need to initialize the ProxyConfigService from the UI thread
    117     // because on linux it relies on initializing things through gconf,
    118     // and needs to be on the main thread.
    119     scoped_ptr<net::ProxyConfigService> proxy_config_service;
    120     // The profile this struct was populated from.
    121     ProfileId profile_id;
    122   };
    123 
    124   explicit ProfileIOData(bool is_incognito);
    125   virtual ~ProfileIOData();
    126 
    127   void InitializeProfileParams(Profile* profile);
    128   void ApplyProfileParamsToContext(ChromeURLRequestContext* context) const;
    129 
    130   // Lazy initializes the ProfileIOData object the first time a request context
    131   // is requested. The lazy logic is implemented here. The actual initialization
    132   // is done in LazyInitializeInternal(), implemented by subtypes. Static helper
    133   // functions have been provided to assist in common operations.
    134   void LazyInitialize() const;
    135 
    136   // Called when the profile is destroyed.
    137   void ShutdownOnUIThread();
    138 
    139   BooleanPrefMember* enable_referrers() const {
    140     return &enable_referrers_;
    141   }
    142 
    143   net::NetworkDelegate* network_delegate() const {
    144     return network_delegate_.get();
    145   }
    146 
    147   net::DnsCertProvenanceChecker* dns_cert_checker() const {
    148     return dns_cert_checker_.get();
    149   }
    150 
    151   net::ProxyService* proxy_service() const {
    152     return proxy_service_.get();
    153   }
    154 
    155   net::CookiePolicy* cookie_policy() const {
    156     return cookie_policy_.get();
    157   }
    158 
    159   ChromeURLRequestContext* main_request_context() const {
    160     return main_request_context_;
    161   }
    162 
    163   ChromeURLRequestContext* extensions_request_context() const {
    164     return extensions_request_context_;
    165   }
    166 
    167  private:
    168   class ResourceContext : public content::ResourceContext {
    169    public:
    170     explicit ResourceContext(const ProfileIOData* io_data);
    171     virtual ~ResourceContext();
    172 
    173    private:
    174     virtual void EnsureInitialized() const;
    175 
    176     const ProfileIOData* const io_data_;
    177   };
    178 
    179   // --------------------------------------------
    180   // Virtual interface for subtypes to implement:
    181   // --------------------------------------------
    182 
    183   // Does the actual initialization of the ProfileIOData subtype. Subtypes
    184   // should use the static helper functions above to implement this.
    185   virtual void LazyInitializeInternal(ProfileParams* profile_params) const = 0;
    186 
    187   // Does an on-demand initialization of a RequestContext for the given
    188   // isolated app.
    189   virtual scoped_refptr<RequestContext> InitializeAppRequestContext(
    190       scoped_refptr<ChromeURLRequestContext> main_context,
    191       const std::string& app_id) const = 0;
    192 
    193   // These functions are used to transfer ownership of the lazily initialized
    194   // context from ProfileIOData to the URLRequestContextGetter.
    195   virtual scoped_refptr<ChromeURLRequestContext>
    196       AcquireMediaRequestContext() const = 0;
    197   virtual scoped_refptr<ChromeURLRequestContext>
    198       AcquireIsolatedAppRequestContext(
    199           scoped_refptr<ChromeURLRequestContext> main_context,
    200           const std::string& app_id) const = 0;
    201 
    202   // Tracks whether or not we've been lazily initialized.
    203   mutable bool initialized_;
    204 
    205   // Data from the UI thread from the Profile, used to initialize ProfileIOData.
    206   // Deleted after lazy initialization.
    207   mutable scoped_ptr<ProfileParams> profile_params_;
    208 
    209   // Member variables which are pointed to by the various context objects.
    210   mutable BooleanPrefMember enable_referrers_;
    211 
    212   // Pointed to by URLRequestContext.
    213   mutable scoped_ptr<net::NetworkDelegate> network_delegate_;
    214   mutable scoped_ptr<net::DnsCertProvenanceChecker> dns_cert_checker_;
    215   mutable scoped_refptr<net::ProxyService> proxy_service_;
    216   mutable scoped_ptr<net::CookiePolicy> cookie_policy_;
    217 
    218   // Pointed to by ResourceContext.
    219   mutable scoped_refptr<webkit_database::DatabaseTracker> database_tracker_;
    220   mutable scoped_refptr<ChromeAppCacheService> appcache_service_;
    221   mutable scoped_refptr<ChromeBlobStorageContext> blob_storage_context_;
    222   mutable scoped_refptr<fileapi::FileSystemContext> file_system_context_;
    223 
    224   mutable ResourceContext resource_context_;
    225 
    226   // These are only valid in between LazyInitialize() and their accessor being
    227   // called.
    228   mutable scoped_refptr<RequestContext> main_request_context_;
    229   mutable scoped_refptr<RequestContext> extensions_request_context_;
    230 
    231   DISALLOW_COPY_AND_ASSIGN(ProfileIOData);
    232 };
    233 
    234 #endif  // CHROME_BROWSER_PROFILES_PROFILE_IO_DATA_H_
    235