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_H_
      8 #define CHROME_BROWSER_PROFILES_PROFILE_H_
      9 
     10 #include <string>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/containers/hash_tables.h"
     14 #include "base/logging.h"
     15 #include "content/public/browser/browser_context.h"
     16 #include "content/public/browser/content_browser_client.h"
     17 #include "net/url_request/url_request_job_factory.h"
     18 
     19 class ChromeAppCacheService;
     20 class ExtensionService;
     21 class ExtensionSpecialStoragePolicy;
     22 class FaviconService;
     23 class HostContentSettingsMap;
     24 class PasswordStore;
     25 class PrefProxyConfigTracker;
     26 class PrefService;
     27 class PromoCounter;
     28 class ProtocolHandlerRegistry;
     29 class TestingProfile;
     30 class WebDataService;
     31 
     32 namespace android {
     33 class TabContentsProvider;
     34 }
     35 
     36 namespace base {
     37 class SequencedTaskRunner;
     38 class Time;
     39 }
     40 
     41 namespace chrome_browser_net {
     42 class Predictor;
     43 }
     44 
     45 namespace chromeos {
     46 class LibCrosServiceLibraryImpl;
     47 class ResetDefaultProxyConfigServiceTask;
     48 }
     49 
     50 namespace content {
     51 class WebUI;
     52 }
     53 
     54 namespace fileapi {
     55 class FileSystemContext;
     56 }
     57 
     58 namespace history {
     59 class ShortcutsBackend;
     60 class TopSites;
     61 }
     62 
     63 namespace net {
     64 class SSLConfigService;
     65 }
     66 
     67 namespace user_prefs {
     68 class PrefRegistrySyncable;
     69 }
     70 
     71 // Instead of adding more members to Profile, consider creating a
     72 // BrowserContextKeyedService. See
     73 // http://dev.chromium.org/developers/design-documents/profile-architecture
     74 class Profile : public content::BrowserContext {
     75  public:
     76   // Profile services are accessed with the following parameter. This parameter
     77   // defines what the caller plans to do with the service.
     78   // The caller is responsible for not performing any operation that would
     79   // result in persistent implicit records while using an OffTheRecord profile.
     80   // This flag allows the profile to perform an additional check.
     81   //
     82   // It also gives us an opportunity to perform further checks in the future. We
     83   // could, for example, return an history service that only allow some specific
     84   // methods.
     85   enum ServiceAccessType {
     86     // The caller plans to perform a read or write that takes place as a result
     87     // of the user input. Use this flag when the operation you are doing can be
     88     // performed while incognito. (ex: creating a bookmark)
     89     //
     90     // Since EXPLICIT_ACCESS means "as a result of a user action", this request
     91     // always succeeds.
     92     EXPLICIT_ACCESS,
     93 
     94     // The caller plans to call a method that will permanently change some data
     95     // in the profile, as part of Chrome's implicit data logging. Use this flag
     96     // when you are about to perform an operation which is incompatible with the
     97     // incognito mode.
     98     IMPLICIT_ACCESS
     99   };
    100 
    101   enum CreateStatus {
    102     // Profile services were not created due to a local error (e.g., disk full).
    103     CREATE_STATUS_LOCAL_FAIL,
    104     // Profile services were not created due to a remote error (e.g., network
    105     // down during limited-user registration).
    106     CREATE_STATUS_REMOTE_FAIL,
    107     // Profile created but before initializing extensions and promo resources.
    108     CREATE_STATUS_CREATED,
    109     // Profile is created, extensions and promo resources are initialized.
    110     CREATE_STATUS_INITIALIZED,
    111     // Profile creation (managed-user registration, generally) was canceled
    112     // by the user.
    113     CREATE_STATUS_CANCELED,
    114     MAX_CREATE_STATUS  // For histogram display.
    115   };
    116 
    117   enum CreateMode {
    118     CREATE_MODE_SYNCHRONOUS,
    119     CREATE_MODE_ASYNCHRONOUS
    120   };
    121 
    122   enum ExitType {
    123     // A normal shutdown. The user clicked exit/closed last window of the
    124     // profile.
    125     EXIT_NORMAL,
    126 
    127     // The exit was the result of the system shutting down.
    128     EXIT_SESSION_ENDED,
    129 
    130     EXIT_CRASHED,
    131   };
    132 
    133   class Delegate {
    134    public:
    135     virtual ~Delegate();
    136 
    137     // Called when creation of the profile is finished.
    138     virtual void OnProfileCreated(Profile* profile,
    139                                   bool success,
    140                                   bool is_new_profile) = 0;
    141   };
    142 
    143   // Key used to bind profile to the widget with which it is associated.
    144   static const char kProfileKey[];
    145 
    146   Profile();
    147   virtual ~Profile();
    148 
    149   // Profile prefs are registered as soon as the prefs are loaded for the first
    150   // time.
    151   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
    152 
    153   // Create a new profile given a path. If |create_mode| is
    154   // CREATE_MODE_ASYNCHRONOUS then the profile is initialized asynchronously.
    155   static Profile* CreateProfile(const base::FilePath& path,
    156                                 Delegate* delegate,
    157                                 CreateMode create_mode);
    158 
    159   // Returns the profile corresponding to the given browser context.
    160   static Profile* FromBrowserContext(content::BrowserContext* browser_context);
    161 
    162   // Returns the profile corresponding to the given WebUI.
    163   static Profile* FromWebUI(content::WebUI* web_ui);
    164 
    165   // content::BrowserContext implementation ------------------------------------
    166 
    167   // Typesafe upcast.
    168   virtual TestingProfile* AsTestingProfile();
    169 
    170   // Returns sequenced task runner where browser context dependent I/O
    171   // operations should be performed.
    172   virtual scoped_refptr<base::SequencedTaskRunner> GetIOTaskRunner() = 0;
    173 
    174   // Returns the name associated with this profile. This name is displayed in
    175   // the browser frame.
    176   virtual std::string GetProfileName() = 0;
    177 
    178   // Return the incognito version of this profile. The returned pointer
    179   // is owned by the receiving profile. If the receiving profile is off the
    180   // record, the same profile is returned.
    181   //
    182   // WARNING: This will create the OffTheRecord profile if it doesn't already
    183   // exist. If this isn't what you want, you need to check
    184   // HasOffTheRecordProfile() first.
    185   virtual Profile* GetOffTheRecordProfile() = 0;
    186 
    187   // Destroys the incognito profile.
    188   virtual void DestroyOffTheRecordProfile() = 0;
    189 
    190   // True if an incognito profile exists.
    191   virtual bool HasOffTheRecordProfile() = 0;
    192 
    193   // Return the original "recording" profile. This method returns this if the
    194   // profile is not incognito.
    195   virtual Profile* GetOriginalProfile() = 0;
    196 
    197   // Returns whether the profile is managed (see ManagedUserService).
    198   virtual bool IsManaged() = 0;
    199 
    200   // Returns a pointer to the TopSites (thumbnail manager) instance
    201   // for this profile.
    202   virtual history::TopSites* GetTopSites() = 0;
    203 
    204   // Variant of GetTopSites that doesn't force creation.
    205   virtual history::TopSites* GetTopSitesWithoutCreating() = 0;
    206 
    207   // DEPRECATED. Instead, use ExtensionSystem::extension_service().
    208   // Retrieves a pointer to the ExtensionService associated with this
    209   // profile. The ExtensionService is created at startup.
    210   // TODO(yoz): remove this accessor (bug 104095).
    211   virtual ExtensionService* GetExtensionService() = 0;
    212 
    213   // Accessor. The instance is created upon first access.
    214   virtual ExtensionSpecialStoragePolicy*
    215       GetExtensionSpecialStoragePolicy() = 0;
    216 
    217   // Retrieves a pointer to the PrefService that manages the
    218   // preferences for this user profile.
    219   virtual PrefService* GetPrefs() = 0;
    220 
    221   // Retrieves a pointer to the PrefService that manages the preferences
    222   // for OffTheRecord Profiles.  This PrefService is lazily created the first
    223   // time that this method is called.
    224   virtual PrefService* GetOffTheRecordPrefs() = 0;
    225 
    226   // Returns the main request context.
    227   virtual net::URLRequestContextGetter* GetRequestContext() = 0;
    228 
    229   // Returns the request context used for extension-related requests.  This
    230   // is only used for a separate cookie store currently.
    231   virtual net::URLRequestContextGetter* GetRequestContextForExtensions() = 0;
    232 
    233   // Returns the SSLConfigService for this profile.
    234   virtual net::SSLConfigService* GetSSLConfigService() = 0;
    235 
    236   // Returns the Hostname <-> Content settings map for this profile.
    237   virtual HostContentSettingsMap* GetHostContentSettingsMap() = 0;
    238 
    239   // Return whether 2 profiles are the same. 2 profiles are the same if they
    240   // represent the same profile. This can happen if there is pointer equality
    241   // or if one profile is the incognito version of another profile (or vice
    242   // versa).
    243   virtual bool IsSameProfile(Profile* profile) = 0;
    244 
    245   // Returns the time the profile was started. This is not the time the profile
    246   // was created, rather it is the time the user started chrome and logged into
    247   // this profile. For the single profile case, this corresponds to the time
    248   // the user started chrome.
    249   virtual base::Time GetStartTime() const = 0;
    250 
    251   // Creates the main net::URLRequestContextGetter that will be returned by
    252   // GetRequestContext(). Should only be called once per ContentBrowserClient
    253   // object. This function is exposed because of the circular dependency where
    254   // GetStoragePartition() is used to retrieve the request context, but creation
    255   // still has to happen in the Profile so the StoragePartition calls
    256   // ContextBrowserClient to call this function.
    257   // TODO(ajwong): Remove once http://crbug.com/159193 is resolved.
    258   virtual net::URLRequestContextGetter* CreateRequestContext(
    259       content::ProtocolHandlerMap* protocol_handlers) = 0;
    260 
    261   // Creates the net::URLRequestContextGetter for a StoragePartition. Should
    262   // only be called once per partition_path per ContentBrowserClient object.
    263   // This function is exposed because the request context is retrieved from the
    264   // StoragePartition, but creation still has to happen in the Profile so the
    265   // StoragePartition calls ContextBrowserClient to call this function.
    266   // TODO(ajwong): Remove once http://crbug.com/159193 is resolved.
    267   virtual net::URLRequestContextGetter* CreateRequestContextForStoragePartition(
    268       const base::FilePath& partition_path,
    269       bool in_memory,
    270       content::ProtocolHandlerMap* protocol_handlers) = 0;
    271 
    272   // Returns the last directory that was chosen for uploading or opening a file.
    273   virtual base::FilePath last_selected_directory() = 0;
    274   virtual void set_last_selected_directory(const base::FilePath& path) = 0;
    275 
    276 #if defined(OS_CHROMEOS)
    277   enum AppLocaleChangedVia {
    278     // Caused by chrome://settings change.
    279     APP_LOCALE_CHANGED_VIA_SETTINGS,
    280     // Locale has been reverted via LocaleChangeGuard.
    281     APP_LOCALE_CHANGED_VIA_REVERT,
    282     // From login screen.
    283     APP_LOCALE_CHANGED_VIA_LOGIN,
    284     // Source unknown.
    285     APP_LOCALE_CHANGED_VIA_UNKNOWN
    286   };
    287 
    288   // Changes application locale for a profile.
    289   virtual void ChangeAppLocale(
    290       const std::string& locale, AppLocaleChangedVia via) = 0;
    291 
    292   // Called after login.
    293   virtual void OnLogin() = 0;
    294 
    295   // Initializes Chrome OS's preferences.
    296   virtual void InitChromeOSPreferences() = 0;
    297 #endif  // defined(OS_CHROMEOS)
    298 
    299   // Returns the helper object that provides the proxy configuration service
    300   // access to the the proxy configuration possibly defined by preferences.
    301   virtual PrefProxyConfigTracker* GetProxyConfigTracker() = 0;
    302 
    303   // Returns the Predictor object used for dns prefetch.
    304   virtual chrome_browser_net::Predictor* GetNetworkPredictor() = 0;
    305 
    306   // Deletes all network related data since |time|. It deletes transport
    307   // security state since |time| and it also deletes HttpServerProperties data.
    308   // Works asynchronously, however if the |completion| callback is non-null, it
    309   // will be posted on the UI thread once the removal process completes.
    310   // Be aware that theoretically it is possible that |completion| will be
    311   // invoked after the Profile instance has been destroyed.
    312   virtual void ClearNetworkingHistorySince(base::Time time,
    313                                            const base::Closure& completion) = 0;
    314 
    315   // Returns the home page for this profile.
    316   virtual GURL GetHomePage() = 0;
    317 
    318   // Returns whether or not the profile was created by a version of Chrome
    319   // more recent (or equal to) the one specified.
    320   virtual bool WasCreatedByVersionOrLater(const std::string& version) = 0;
    321 
    322   std::string GetDebugName();
    323 
    324   // Returns whether it is a guest session.
    325   virtual bool IsGuestSession() const;
    326 
    327   // Did the user restore the last session? This is set by SessionRestore.
    328   void set_restored_last_session(bool restored_last_session) {
    329     restored_last_session_ = restored_last_session;
    330   }
    331   bool restored_last_session() const {
    332     return restored_last_session_;
    333   }
    334 
    335   // Sets the ExitType for the profile. This may be invoked multiple times
    336   // during shutdown; only the first such change (the transition from
    337   // EXIT_CRASHED to one of the other values) is written to prefs, any
    338   // later calls are ignored.
    339   //
    340   // NOTE: this is invoked internally on a normal shutdown, but is public so
    341   // that it can be invoked when the user logs out/powers down (WM_ENDSESSION),
    342   // or to handle backgrounding/foregrounding on mobile.
    343   virtual void SetExitType(ExitType exit_type) = 0;
    344 
    345   // Returns how the last session was shutdown.
    346   virtual ExitType GetLastSessionExitType() = 0;
    347 
    348   // Stop sending accessibility events until ResumeAccessibilityEvents().
    349   // Calls to Pause nest; no events will be sent until the number of
    350   // Resume calls matches the number of Pause calls received.
    351   void PauseAccessibilityEvents() {
    352     accessibility_pause_level_++;
    353   }
    354 
    355   void ResumeAccessibilityEvents() {
    356     DCHECK_GT(accessibility_pause_level_, 0);
    357     accessibility_pause_level_--;
    358   }
    359 
    360   bool ShouldSendAccessibilityEvents() {
    361     return 0 == accessibility_pause_level_;
    362   }
    363 
    364   // Returns whether the profile is new.  A profile is new if the browser has
    365   // not been shut down since the profile was created.
    366   bool IsNewProfile();
    367 
    368   // Checks whether sync is configurable by the user. Returns false if sync is
    369   // disabled or controlled by configuration management.
    370   bool IsSyncAccessible();
    371 
    372   // Send NOTIFICATION_PROFILE_DESTROYED for this Profile, if it has not
    373   // already been sent. It is necessary because most Profiles are destroyed by
    374   // ProfileDestroyer, but in tests, some are not.
    375   void MaybeSendDestroyedNotification();
    376 
    377   // Creates an OffTheRecordProfile which points to this Profile.
    378   Profile* CreateOffTheRecordProfile();
    379 
    380  private:
    381   bool restored_last_session_;
    382 
    383   // Used to prevent the notification that this Profile is destroyed from
    384   // being sent twice.
    385   bool sent_destroyed_notification_;
    386 
    387   // Accessibility events will only be propagated when the pause
    388   // level is zero.  PauseAccessibilityEvents and ResumeAccessibilityEvents
    389   // increment and decrement the level, respectively, rather than set it to
    390   // true or false, so that calls can be nested.
    391   int accessibility_pause_level_;
    392 
    393   DISALLOW_COPY_AND_ASSIGN(Profile);
    394 };
    395 
    396 #if defined(COMPILER_GCC)
    397 namespace BASE_HASH_NAMESPACE {
    398 
    399 template<>
    400 struct hash<Profile*> {
    401   std::size_t operator()(Profile* const& p) const {
    402     return reinterpret_cast<std::size_t>(p);
    403   }
    404 };
    405 
    406 }  // namespace BASE_HASH_NAMESPACE
    407 #endif
    408 
    409 #endif  // CHROME_BROWSER_PROFILES_PROFILE_H_
    410