• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 keeps track of the currently-active profiles in the runtime.
6 
7 #ifndef CHROME_BROWSER_PROFILES_PROFILE_MANAGER_H_
8 #define CHROME_BROWSER_PROFILES_PROFILE_MANAGER_H_
9 
10 #include <list>
11 #include <vector>
12 
13 #include "base/basictypes.h"
14 #include "base/containers/hash_tables.h"
15 #include "base/files/file_path.h"
16 #include "base/gtest_prod_util.h"
17 #include "base/memory/linked_ptr.h"
18 #include "base/memory/scoped_ptr.h"
19 #include "base/message_loop/message_loop.h"
20 #include "base/threading/non_thread_safe.h"
21 #include "chrome/browser/profiles/profile.h"
22 #include "chrome/browser/profiles/profile_shortcut_manager.h"
23 #include "chrome/browser/ui/browser_list_observer.h"
24 #include "content/public/browser/notification_observer.h"
25 #include "content/public/browser/notification_registrar.h"
26 
27 class NewProfileLauncher;
28 class ProfileInfoCache;
29 
30 class ProfileManager : public base::NonThreadSafe,
31                        public content::NotificationObserver,
32                        public Profile::Delegate {
33  public:
34   typedef base::Callback<void(Profile*, Profile::CreateStatus)> CreateCallback;
35 
36   explicit ProfileManager(const base::FilePath& user_data_dir);
37   virtual ~ProfileManager();
38 
39 #if defined(ENABLE_SESSION_SERVICE)
40   // Invokes SessionServiceFactory::ShutdownForProfile() for all profiles.
41   static void ShutdownSessionServices();
42 #endif
43 
44   // Physically remove deleted profile directories from disk.
45   static void NukeDeletedProfilesFromDisk();
46 
47   // Same as instance method but provides the default user_data_dir as well.
48   // If the Profile is going to be used to open a new window then consider using
49   // GetLastUsedProfileAllowedByPolicy() instead.
50   static Profile* GetLastUsedProfile();
51 
52   // Same as GetLastUsedProfile() but returns the incognito Profile if
53   // incognito mode is forced. This should be used if the last used Profile
54   // will be used to open new browser windows.
55   static Profile* GetLastUsedProfileAllowedByPolicy();
56 
57   // Same as instance method but provides the default user_data_dir as well.
58   static std::vector<Profile*> GetLastOpenedProfiles();
59 
60   // Get the profile for the user which created the current session.
61   // Note that in case of a guest account this will return a 'suitable' profile.
62   // This function is temporary and will soon be moved to ash. As such avoid
63   // using it at all cost.
64   // TODO(skuhne): Move into ash's new user management function.
65   static Profile* GetPrimaryUserProfile();
66 
67   // Get the profile for the currently active user.
68   // Note that in case of a guest account this will return a 'suitable' profile.
69   // This function is temporary and will soon be moved to ash. As such avoid
70   // using it at all cost.
71   // TODO(skuhne): Move into ash's new user management function.
72   static Profile* GetActiveUserProfile();
73 
74   // Returns a profile for a specific profile directory within the user data
75   // dir. This will return an existing profile it had already been created,
76   // otherwise it will create and manage it.
77   Profile* GetProfile(const base::FilePath& profile_dir);
78 
79   // Returns total number of profiles available on this machine.
80   size_t GetNumberOfProfiles();
81 
82   // Explicit asynchronous creation of a profile located at |profile_path|.
83   // If the profile has already been created then callback is called
84   // immediately. Should be called on the UI thread.
85   void CreateProfileAsync(const base::FilePath& profile_path,
86                           const CreateCallback& callback,
87                           const base::string16& name,
88                           const base::string16& icon_url,
89                           const std::string& supervised_user_id);
90 
91   // Returns true if the profile pointer is known to point to an existing
92   // profile.
93   bool IsValidProfile(Profile* profile);
94 
95   // Returns the directory where the first created profile is stored,
96   // relative to the user data directory currently in use.
97   base::FilePath GetInitialProfileDir();
98 
99   // Get the Profile last used (the Profile to which owns the most recently
100   // focused window) with this Chrome build. If no signed profile has been
101   // stored in Local State, hand back the Default profile.
102   Profile* GetLastUsedProfile(const base::FilePath& user_data_dir);
103 
104   // Get the path of the last used profile, or if that's undefined, the default
105   // profile.
106   base::FilePath GetLastUsedProfileDir(const base::FilePath& user_data_dir);
107 
108   // Get the Profiles which are currently open, i.e., have open browsers, or
109   // were open the last time Chrome was running. The Profiles appear in the
110   // order they were opened. The last used profile will be on the list, but its
111   // index on the list will depend on when it was opened (it is not necessarily
112   // the last one).
113   std::vector<Profile*> GetLastOpenedProfiles(
114       const base::FilePath& user_data_dir);
115 
116   // Returns created profiles. Note, profiles order is NOT guaranteed to be
117   // related with the creation order.
118   std::vector<Profile*> GetLoadedProfiles() const;
119 
120   // If a profile with the given path is currently managed by this object,
121   // return a pointer to the corresponding Profile object;
122   // otherwise return NULL.
123   Profile* GetProfileByPath(const base::FilePath& path) const;
124 
125   // Creates a new profile in the next available multiprofile directory.
126   // Directories are named "profile_1", "profile_2", etc., in sequence of
127   // creation. (Because directories can be removed, however, it may be the case
128   // that at some point the list of numbered profiles is not continuous.)
129   // |callback| may be invoked multiple times (for CREATE_STATUS_INITIALIZED
130   // and CREATE_STATUS_CREATED) so binding parameters with bind::Passed() is
131   // prohibited. Returns the file path to the profile that will be created
132   // asynchronously.
133   static base::FilePath CreateMultiProfileAsync(
134       const base::string16& name,
135       const base::string16& icon_url,
136       const CreateCallback& callback,
137       const std::string& supervised_user_id);
138 
139   // Returns the full path to be used for guest profiles.
140   static base::FilePath GetGuestProfilePath();
141 
142   // Get the path of the next profile directory and increment the internal
143   // count.
144   // Lack of side effects:
145   // This function doesn't actually create the directory or touch the file
146   // system.
147   base::FilePath GenerateNextProfileDirectoryPath();
148 
149   // Returns a ProfileInfoCache object which can be used to get information
150   // about profiles without having to load them from disk.
151   ProfileInfoCache& GetProfileInfoCache();
152 
153   // Returns a ProfileShortcut Manager that enables the caller to create
154   // profile specfic desktop shortcuts.
155   ProfileShortcutManager* profile_shortcut_manager();
156 
157   // Schedules the profile at the given path to be deleted on shutdown. If we're
158   // deleting the last profile, a new one will be created in its place, and in
159   // that case the callback will be called when profile creation is complete.
160   void ScheduleProfileForDeletion(const base::FilePath& profile_dir,
161                                   const CreateCallback& callback);
162 
163   // Called on start-up if there are any stale ephemeral profiles to be deleted.
164   // This can be the case if the browser has crashed and the clean-up code had
165   // no chance to run then.
166   static void CleanUpStaleProfiles(
167       const std::vector<base::FilePath>& profile_paths);
168 
169   // Autoloads profiles if they are running background apps.
170   void AutoloadProfiles();
171 
172   // Initializes user prefs of |profile|. This includes profile name and
173   // avatar values.
174   void InitProfileUserPrefs(Profile* profile);
175 
176   // Register and add testing profile to the ProfileManager. Use ONLY in tests.
177   // This allows the creation of Profiles outside of the standard creation path
178   // for testing. If |addToCache|, adds to ProfileInfoCache as well.
179   // If |start_deferred_task_runners|, starts the deferred task runners.
180   // Use ONLY in tests.
181   void RegisterTestingProfile(Profile* profile,
182                               bool addToCache,
183                               bool start_deferred_task_runners);
184 
user_data_dir()185   const base::FilePath& user_data_dir() const { return user_data_dir_; }
186 
187   // For ChromeOS, determines if the user has logged in to a real profile.
IsLoggedIn()188   bool IsLoggedIn() const { return logged_in_; }
189 
190   // content::NotificationObserver implementation.
191   virtual void Observe(int type,
192                        const content::NotificationSource& source,
193                        const content::NotificationDetails& details) OVERRIDE;
194 
195   // Profile::Delegate implementation:
196   virtual void OnProfileCreated(Profile* profile,
197                                 bool success,
198                                 bool is_new_profile) OVERRIDE;
199 
200  protected:
201   // Does final initial actions.
202   virtual void DoFinalInit(Profile* profile, bool go_off_the_record);
203   virtual void DoFinalInitForServices(Profile* profile, bool go_off_the_record);
204   virtual void DoFinalInitLogging(Profile* profile);
205 
206   // Creates a new profile by calling into the profile's profile creation
207   // method. Virtual so that unittests can return a TestingProfile instead
208   // of the Profile's result.
209   virtual Profile* CreateProfileHelper(const base::FilePath& path);
210 
211   // Creates a new profile asynchronously by calling into the profile's
212   // asynchronous profile creation method. Virtual so that unittests can return
213   // a TestingProfile instead of the Profile's result.
214   virtual Profile* CreateProfileAsyncHelper(const base::FilePath& path,
215                                             Delegate* delegate);
216 
217  private:
218   friend class TestingProfileManager;
219   FRIEND_TEST_ALL_PREFIXES(ProfileManagerBrowserTest, DeleteAllProfiles);
220   FRIEND_TEST_ALL_PREFIXES(ProfileManagerBrowserTest, SwitchToProfile);
221 
222   // This struct contains information about profiles which are being loaded or
223   // were loaded.
224   struct ProfileInfo {
225     ProfileInfo(Profile* profile, bool created);
226 
227     ~ProfileInfo();
228 
229     scoped_ptr<Profile> profile;
230     // Whether profile has been fully loaded (created and initialized).
231     bool created;
232     // Whether or not this profile should have a shortcut.
233     bool create_shortcut;
234     // List of callbacks to run when profile initialization is done. Note, when
235     // profile is fully loaded this vector will be empty.
236     std::vector<CreateCallback> callbacks;
237 
238    private:
239     DISALLOW_COPY_AND_ASSIGN(ProfileInfo);
240   };
241 
242   // Returns the profile of the active user and / or the off the record profile
243   // if needed. This adds the profile to the ProfileManager if it doesn't
244   // already exist. The method will return NULL if the profile doesn't exist
245   // and we can't create it.
246   // The profile used can be overridden by using --login-profile on cros.
247   Profile* GetActiveUserOrOffTheRecordProfileFromPath(
248                const base::FilePath& user_data_dir);
249 
250   // Adds a pre-existing Profile object to the set managed by this
251   // ProfileManager. This ProfileManager takes ownership of the Profile.
252   // The Profile should not already be managed by this ProfileManager.
253   // Returns true if the profile was added, false otherwise.
254   bool AddProfile(Profile* profile);
255 
256   // Schedules the profile at the given path to be deleted on shutdown.
257   void FinishDeletingProfile(const base::FilePath& profile_dir);
258 
259   // Registers profile with given info. Returns pointer to created ProfileInfo
260   // entry.
261   ProfileInfo* RegisterProfile(Profile* profile, bool created);
262 
263   // Returns ProfileInfo associated with given |path|, registred earlier with
264   // RegisterProfile.
265   ProfileInfo* GetProfileInfoByPath(const base::FilePath& path) const;
266 
267   // Adds |profile| to the profile info cache if it hasn't been added yet.
268   void AddProfileToCache(Profile* profile);
269 
270   // Apply settings for (desktop) Guest User profile.
271   void SetGuestProfilePrefs(Profile* profile);
272 
273   // For ChromeOS, determines if profile should be otr.
274   bool ShouldGoOffTheRecord(Profile* profile);
275 
276   void RunCallbacks(const std::vector<CreateCallback>& callbacks,
277                     Profile* profile,
278                     Profile::CreateStatus status);
279 
280 #if !defined(OS_ANDROID) && !defined(OS_IOS)
281   class BrowserListObserver : public chrome::BrowserListObserver {
282    public:
283     explicit BrowserListObserver(ProfileManager* manager);
284     virtual ~BrowserListObserver();
285 
286     // chrome::BrowserListObserver implementation.
287     virtual void OnBrowserAdded(Browser* browser) OVERRIDE;
288     virtual void OnBrowserRemoved(Browser* browser) OVERRIDE;
289     virtual void OnBrowserSetLastActive(Browser* browser) OVERRIDE;
290 
291    private:
292     ProfileManager* profile_manager_;
293     DISALLOW_COPY_AND_ASSIGN(BrowserListObserver);
294   };
295 #endif  // !defined(OS_ANDROID) && !defined(OS_IOS)
296 
297 #if defined(OS_MACOSX)
298   // If the |loaded_profile| has been loaded successfully (according to
299   // |status|) and isn't already scheduled for deletion, then finishes adding
300   // |profile_to_delete_dir| to the queue of profiles to be deleted, and updates
301   // the kProfileLastUsed preference based on
302   // |last_non_supervised_profile_path|.
303   void OnNewActiveProfileLoaded(
304       const base::FilePath& profile_to_delete_path,
305       const base::FilePath& last_non_supervised_profile_path,
306       const CreateCallback& original_callback,
307       Profile* loaded_profile,
308       Profile::CreateStatus status);
309 #endif
310 
311   content::NotificationRegistrar registrar_;
312 
313   // The path to the user data directory (DIR_USER_DATA).
314   const base::FilePath user_data_dir_;
315 
316   // Indicates that a user has logged in and that the profile specified
317   // in the --login-profile command line argument should be used as the
318   // default.
319   bool logged_in_;
320 
321 #if !defined(OS_ANDROID) && !defined(OS_IOS)
322   BrowserListObserver browser_list_observer_;
323 #endif  // !defined(OS_ANDROID) && !defined(OS_IOS)
324 
325   // Maps profile path to ProfileInfo (if profile has been created). Use
326   // RegisterProfile() to add into this map. This map owns all loaded profile
327   // objects in a running instance of Chrome.
328   typedef std::map<base::FilePath, linked_ptr<ProfileInfo> > ProfilesInfoMap;
329   ProfilesInfoMap profiles_info_;
330 
331   // Object to cache various information about profiles. Contains information
332   // about every profile which has been created for this instance of Chrome,
333   // if it has not been explicitly deleted.
334   scoped_ptr<ProfileInfoCache> profile_info_cache_;
335 
336   // Manages the process of creating, deleteing and updating Desktop shortcuts.
337   scoped_ptr<ProfileShortcutManager> profile_shortcut_manager_;
338 
339   // For keeping track of the last active profiles.
340   std::map<Profile*, int> browser_counts_;
341   // On startup we launch the active profiles in the order they became active
342   // during the last run. This is why they are kept in a list, not in a set.
343   std::vector<Profile*> active_profiles_;
344   bool closing_all_browsers_;
345 
346   DISALLOW_COPY_AND_ASSIGN(ProfileManager);
347 };
348 
349 // Same as the ProfileManager, but doesn't initialize some services of the
350 // profile. This one is useful in unittests.
351 class ProfileManagerWithoutInit : public ProfileManager {
352  public:
353   explicit ProfileManagerWithoutInit(const base::FilePath& user_data_dir);
354 
355  protected:
DoFinalInitForServices(Profile *,bool)356   virtual void DoFinalInitForServices(Profile*, bool) OVERRIDE {}
DoFinalInitLogging(Profile *)357   virtual void DoFinalInitLogging(Profile*) OVERRIDE {}
358 };
359 
360 #endif  // CHROME_BROWSER_PROFILES_PROFILE_MANAGER_H_
361