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 // This class gathers state related to a single user profile.
      6 
      7 #ifndef CHROME_BROWSER_PROFILES_PROFILE_IMPL_H_
      8 #define CHROME_BROWSER_PROFILES_PROFILE_IMPL_H_
      9 
     10 #include <string>
     11 
     12 #include "base/files/file_path.h"
     13 #include "base/gtest_prod_util.h"
     14 #include "base/memory/ref_counted.h"
     15 #include "base/memory/scoped_ptr.h"
     16 #include "base/prefs/pref_change_registrar.h"
     17 #include "base/timer/timer.h"
     18 #include "chrome/browser/profiles/profile.h"
     19 #include "chrome/browser/profiles/profile_impl_io_data.h"
     20 #include "content/public/browser/content_browser_client.h"
     21 #include "content/public/browser/host_zoom_map.h"
     22 
     23 class NetPrefObserver;
     24 class PrefService;
     25 class PrefServiceSyncable;
     26 class ShortcutsBackend;
     27 class SSLConfigServiceManager;
     28 class TrackedPreferenceValidationDelegate;
     29 
     30 #if defined(OS_CHROMEOS)
     31 namespace chromeos {
     32 class KioskTest;
     33 class LocaleChangeGuard;
     34 class Preferences;
     35 class SupervisedUserTestBase;
     36 }
     37 #endif
     38 
     39 namespace base {
     40 class SequencedTaskRunner;
     41 }
     42 
     43 namespace data_reduction_proxy {
     44 class DataReductionProxyParams;
     45 }
     46 
     47 class DataReductionProxyChromeSettings;
     48 
     49 namespace domain_reliability {
     50 class DomainReliabilityMonitor;
     51 }
     52 
     53 namespace extensions {
     54 class ExtensionSystem;
     55 }
     56 
     57 namespace policy {
     58 class CloudPolicyManager;
     59 class ProfilePolicyConnector;
     60 class SchemaRegistryService;
     61 }
     62 
     63 namespace user_prefs {
     64 class refRegistrySyncable;
     65 }
     66 
     67 // The default profile implementation.
     68 class ProfileImpl : public Profile {
     69  public:
     70   // Value written to prefs when the exit type is EXIT_NORMAL. Public for tests.
     71   static const char* const kPrefExitTypeNormal;
     72 
     73   virtual ~ProfileImpl();
     74 
     75   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
     76 
     77   // content::BrowserContext implementation:
     78   virtual base::FilePath GetPath() const OVERRIDE;
     79   virtual content::DownloadManagerDelegate*
     80       GetDownloadManagerDelegate() OVERRIDE;
     81   virtual net::URLRequestContextGetter* GetRequestContext() OVERRIDE;
     82   virtual net::URLRequestContextGetter* GetRequestContextForRenderProcess(
     83       int renderer_child_id) OVERRIDE;
     84   virtual net::URLRequestContextGetter* GetMediaRequestContext() OVERRIDE;
     85   virtual net::URLRequestContextGetter* GetMediaRequestContextForRenderProcess(
     86       int renderer_child_id) OVERRIDE;
     87   virtual net::URLRequestContextGetter*
     88       GetMediaRequestContextForStoragePartition(
     89           const base::FilePath& partition_path,
     90           bool in_memory) OVERRIDE;
     91   virtual content::ResourceContext* GetResourceContext() OVERRIDE;
     92   virtual content::BrowserPluginGuestManager* GetGuestManager() OVERRIDE;
     93   virtual storage::SpecialStoragePolicy* GetSpecialStoragePolicy() OVERRIDE;
     94   virtual content::PushMessagingService* GetPushMessagingService() OVERRIDE;
     95   virtual content::SSLHostStateDelegate* GetSSLHostStateDelegate() OVERRIDE;
     96 
     97   // Profile implementation:
     98   virtual scoped_refptr<base::SequencedTaskRunner> GetIOTaskRunner() OVERRIDE;
     99   // Note that this implementation returns the Google-services username, if any,
    100   // not the Chrome user's display name.
    101   virtual std::string GetProfileName() OVERRIDE;
    102   virtual ProfileType GetProfileType() const OVERRIDE;
    103   virtual bool IsOffTheRecord() const OVERRIDE;
    104   virtual Profile* GetOffTheRecordProfile() OVERRIDE;
    105   virtual void DestroyOffTheRecordProfile() OVERRIDE;
    106   virtual bool HasOffTheRecordProfile() OVERRIDE;
    107   virtual Profile* GetOriginalProfile() OVERRIDE;
    108   virtual bool IsSupervised() OVERRIDE;
    109   virtual history::TopSites* GetTopSites() OVERRIDE;
    110   virtual history::TopSites* GetTopSitesWithoutCreating() OVERRIDE;
    111   virtual ExtensionSpecialStoragePolicy*
    112       GetExtensionSpecialStoragePolicy() OVERRIDE;
    113   virtual PrefService* GetPrefs() OVERRIDE;
    114   virtual PrefService* GetOffTheRecordPrefs() OVERRIDE;
    115   virtual net::URLRequestContextGetter*
    116       GetRequestContextForExtensions() OVERRIDE;
    117   virtual net::SSLConfigService* GetSSLConfigService() OVERRIDE;
    118   virtual HostContentSettingsMap* GetHostContentSettingsMap() OVERRIDE;
    119   virtual bool IsSameProfile(Profile* profile) OVERRIDE;
    120   virtual base::Time GetStartTime() const OVERRIDE;
    121   virtual net::URLRequestContextGetter* CreateRequestContext(
    122       content::ProtocolHandlerMap* protocol_handlers,
    123       content::URLRequestInterceptorScopedVector request_interceptors) OVERRIDE;
    124   virtual net::URLRequestContextGetter* CreateRequestContextForStoragePartition(
    125       const base::FilePath& partition_path,
    126       bool in_memory,
    127       content::ProtocolHandlerMap* protocol_handlers,
    128       content::URLRequestInterceptorScopedVector request_interceptors) OVERRIDE;
    129   virtual base::FilePath last_selected_directory() OVERRIDE;
    130   virtual void set_last_selected_directory(const base::FilePath& path) OVERRIDE;
    131   virtual chrome_browser_net::Predictor* GetNetworkPredictor() OVERRIDE;
    132   virtual DevToolsNetworkController* GetDevToolsNetworkController() OVERRIDE;
    133   virtual void ClearNetworkingHistorySince(
    134       base::Time time,
    135       const base::Closure& completion) OVERRIDE;
    136   virtual GURL GetHomePage() OVERRIDE;
    137   virtual bool WasCreatedByVersionOrLater(const std::string& version) OVERRIDE;
    138   virtual void SetExitType(ExitType exit_type) OVERRIDE;
    139   virtual ExitType GetLastSessionExitType() OVERRIDE;
    140 
    141 #if defined(OS_CHROMEOS)
    142   virtual void ChangeAppLocale(const std::string& locale,
    143                                AppLocaleChangedVia) OVERRIDE;
    144   virtual void OnLogin() OVERRIDE;
    145   virtual void InitChromeOSPreferences() OVERRIDE;
    146 #endif  // defined(OS_CHROMEOS)
    147 
    148   virtual PrefProxyConfigTracker* GetProxyConfigTracker() OVERRIDE;
    149 
    150  private:
    151 #if defined(OS_CHROMEOS)
    152   friend class chromeos::KioskTest;
    153   friend class chromeos::SupervisedUserTestBase;
    154 #endif
    155   friend class Profile;
    156   friend class BetterSessionRestoreCrashTest;
    157   FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorTest,
    158                            ProfilesLaunchedAfterCrash);
    159   FRIEND_TEST_ALL_PREFIXES(ProfileBrowserTest, DISABLED_ProfileReadmeCreated);
    160   FRIEND_TEST_ALL_PREFIXES(ProfileBrowserTest,
    161                            ProfileDeletedBeforeReadmeCreated);
    162 
    163   // Delay, in milliseconds, before README file is created for a new profile.
    164   // This is non-const for testing purposes.
    165   static int create_readme_delay_ms;
    166 
    167   ProfileImpl(const base::FilePath& path,
    168               Delegate* delegate,
    169               CreateMode create_mode,
    170               base::SequencedTaskRunner* sequenced_task_runner);
    171 
    172   // Does final initialization. Should be called after prefs were loaded.
    173   void DoFinalInit();
    174 
    175   void InitHostZoomMap();
    176 
    177   void OnDefaultZoomLevelChanged();
    178   void OnZoomLevelChanged(
    179       const content::HostZoomMap::ZoomLevelChange& change);
    180 
    181   // Does final prefs initialization and calls Init().
    182   void OnPrefsLoaded(bool success);
    183 
    184 #if defined(ENABLE_SESSION_SERVICE)
    185   void StopCreateSessionServiceTimer();
    186 
    187   void EnsureSessionServiceCreated();
    188 #endif
    189 
    190 
    191   void EnsureRequestContextCreated() {
    192     GetRequestContext();
    193   }
    194 
    195   // Updates the ProfileInfoCache with data from this profile.
    196   void UpdateProfileUserNameCache();
    197   void UpdateProfileSupervisedUserIdCache();
    198   void UpdateProfileNameCache();
    199   void UpdateProfileAvatarCache();
    200   void UpdateProfileIsEphemeralCache();
    201 
    202   void GetCacheParameters(bool is_media_context,
    203                           base::FilePath* cache_path,
    204                           int* max_size);
    205 
    206   PrefProxyConfigTracker* CreateProxyConfigTracker();
    207 
    208   scoped_ptr<domain_reliability::DomainReliabilityMonitor>
    209       CreateDomainReliabilityMonitor(PrefService* local_state);
    210 
    211   scoped_ptr<content::HostZoomMap::Subscription> zoom_subscription_;
    212   PrefChangeRegistrar pref_change_registrar_;
    213 
    214   base::FilePath path_;
    215   base::FilePath base_cache_path_;
    216 
    217   // !!! BIG HONKING WARNING !!!
    218   //  The order of the members below is important. Do not change it unless
    219   //  you know what you're doing. Also, if adding a new member here make sure
    220   //  that the declaration occurs AFTER things it depends on as destruction
    221   //  happens in reverse order of declaration.
    222 
    223   // TODO(mnissler, joaodasilva): The |profile_policy_connector_| provides the
    224   // PolicyService that the |prefs_| depend on, and must outlive |prefs_|.
    225 // This can be removed once |prefs_| becomes a KeyedService too.
    226 // |profile_policy_connector_| in turn depends on |cloud_policy_manager_|,
    227 // which depends on |schema_registry_service_|.
    228 #if defined(ENABLE_CONFIGURATION_POLICY)
    229   scoped_ptr<policy::SchemaRegistryService> schema_registry_service_;
    230   scoped_ptr<policy::CloudPolicyManager> cloud_policy_manager_;
    231 #endif
    232   scoped_ptr<policy::ProfilePolicyConnector> profile_policy_connector_;
    233 
    234   // Keep |pref_validation_delegate_| above |prefs_| so that the former outlives
    235   // the latter.
    236   scoped_ptr<TrackedPreferenceValidationDelegate> pref_validation_delegate_;
    237 
    238   // Keep |prefs_| on top for destruction order because |extension_prefs_|,
    239   // |net_pref_observer_|, |io_data_| and others store pointers to |prefs_| and
    240   // shall be destructed first.
    241   scoped_refptr<user_prefs::PrefRegistrySyncable> pref_registry_;
    242   scoped_ptr<PrefServiceSyncable> prefs_;
    243   scoped_ptr<PrefServiceSyncable> otr_prefs_;
    244   ProfileImplIOData::Handle io_data_;
    245 #if defined(ENABLE_EXTENSIONS)
    246   scoped_refptr<ExtensionSpecialStoragePolicy>
    247       extension_special_storage_policy_;
    248 #endif
    249   scoped_ptr<NetPrefObserver> net_pref_observer_;
    250   scoped_ptr<SSLConfigServiceManager> ssl_config_service_manager_;
    251   scoped_refptr<HostContentSettingsMap> host_content_settings_map_;
    252   scoped_refptr<ShortcutsBackend> shortcuts_backend_;
    253 
    254   // Exit type the last time the profile was opened. This is set only once from
    255   // prefs.
    256   ExitType last_session_exit_type_;
    257 
    258 #if defined(ENABLE_SESSION_SERVICE)
    259   base::OneShotTimer<ProfileImpl> create_session_service_timer_;
    260 #endif
    261 
    262   scoped_ptr<Profile> off_the_record_profile_;
    263 
    264   // See GetStartTime for details.
    265   base::Time start_time_;
    266 
    267   scoped_refptr<history::TopSites> top_sites_;  // For history and thumbnails.
    268 
    269 #if defined(OS_CHROMEOS)
    270   scoped_ptr<chromeos::Preferences> chromeos_preferences_;
    271 
    272   scoped_ptr<chromeos::LocaleChangeGuard> locale_change_guard_;
    273 
    274   bool is_login_profile_;
    275 #endif
    276 
    277   scoped_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_;
    278 
    279   // STOP!!!! DO NOT ADD ANY MORE ITEMS HERE!!!!
    280   //
    281   // Instead, make your Service/Manager/whatever object you're hanging off the
    282   // Profile use our new BrowserContextKeyedServiceFactory system instead.
    283   // You can find the design document here:
    284   //
    285   //   https://sites.google.com/a/chromium.org/dev/developers/design-documents/profile-architecture
    286   //
    287   // and you can read the raw headers here:
    288   //
    289   // components/keyed_service/content/browser_context_dependency_manager.*
    290   // components/keyed_service/core/keyed_service.h
    291   // components/keyed_service/content/browser_context_keyed_service_factory.*
    292 
    293   Profile::Delegate* delegate_;
    294 
    295   chrome_browser_net::Predictor* predictor_;
    296 
    297   DISALLOW_COPY_AND_ASSIGN(ProfileImpl);
    298 };
    299 
    300 #endif  // CHROME_BROWSER_PROFILES_PROFILE_IMPL_H_
    301