Index: chrome/browser/profile_manager.cc |
=================================================================== |
--- chrome/browser/profile_manager.cc (revision 68044) |
+++ chrome/browser/profile_manager.cc (working copy) |
@@ -1,284 +0,0 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <set> |
- |
-#include "chrome/browser/profile_manager.h" |
- |
-#include "base/command_line.h" |
-#include "base/file_util.h" |
-#include "base/path_service.h" |
-#include "base/string_util.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/browser_thread.h" |
-#include "chrome/browser/prefs/pref_service.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_list.h" |
-#include "chrome/browser/ui/browser_window.h" |
-#include "chrome/common/chrome_constants.h" |
-#include "chrome/common/chrome_paths.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "chrome/common/logging_chrome.h" |
-#include "chrome/common/net/url_request_context_getter.h" |
-#include "chrome/common/notification_service.h" |
-#include "chrome/common/notification_type.h" |
-#include "chrome/common/pref_names.h" |
-#include "grit/generated_resources.h" |
-#include "net/http/http_transaction_factory.h" |
-#include "net/url_request/url_request_context.h" |
-#include "net/url_request/url_request_job.h" |
-#include "net/url_request/url_request_job_tracker.h" |
- |
-#if defined(OS_CHROMEOS) |
-#include "chrome/browser/chromeos/cros/cros_library.h" |
-#include "chrome/browser/chromeos/cros/cryptohome_library.h" |
-#endif |
- |
-// static |
-void ProfileManager::ShutdownSessionServices() { |
- ProfileManager* pm = g_browser_process->profile_manager(); |
- if (!pm) // Is NULL when running unit tests. |
- return; |
- for (ProfileManager::const_iterator i = pm->begin(); i != pm->end(); ++i) |
- (*i)->ShutdownSessionService(); |
-} |
- |
-// static |
-Profile* ProfileManager::GetDefaultProfile() { |
- FilePath user_data_dir; |
- PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); |
- ProfileManager* profile_manager = g_browser_process->profile_manager(); |
- return profile_manager->GetDefaultProfile(user_data_dir); |
-} |
- |
-ProfileManager::ProfileManager() : logged_in_(false) { |
- SystemMonitor::Get()->AddObserver(this); |
-#if defined(OS_CHROMEOS) |
- registrar_.Add( |
- this, |
- NotificationType::LOGIN_USER_CHANGED, |
- NotificationService::AllSources()); |
-#endif |
-} |
- |
-ProfileManager::~ProfileManager() { |
- SystemMonitor* system_monitor = SystemMonitor::Get(); |
- if (system_monitor) |
- system_monitor->RemoveObserver(this); |
- |
- // Destroy all profiles that we're keeping track of. |
- for (const_iterator i(begin()); i != end(); ++i) |
- delete *i; |
- profiles_.clear(); |
-} |
- |
-FilePath ProfileManager::GetDefaultProfileDir( |
- const FilePath& user_data_dir) { |
- FilePath default_profile_dir(user_data_dir); |
- default_profile_dir = default_profile_dir.Append( |
- FilePath::FromWStringHack(chrome::kNotSignedInProfile)); |
- return default_profile_dir; |
-} |
- |
-FilePath ProfileManager::GetProfilePrefsPath( |
- const FilePath &profile_dir) { |
- FilePath default_prefs_path(profile_dir); |
- default_prefs_path = default_prefs_path.Append(chrome::kPreferencesFilename); |
- return default_prefs_path; |
-} |
- |
-FilePath ProfileManager::GetCurrentProfileDir() { |
- FilePath relative_profile_dir; |
-#if defined(OS_CHROMEOS) |
- const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
- if (logged_in_) { |
- FilePath profile_dir; |
- // If the user has logged in, pick up the new profile. |
- if (command_line.HasSwitch(switches::kLoginProfile)) { |
- profile_dir = command_line.GetSwitchValuePath(switches::kLoginProfile); |
- } else { |
- // We should never be logged in with no profile dir. |
- NOTREACHED(); |
- return FilePath(""); |
- } |
- relative_profile_dir = relative_profile_dir.Append(profile_dir); |
- return relative_profile_dir; |
- } |
-#endif |
- relative_profile_dir = relative_profile_dir.Append( |
- FilePath::FromWStringHack(chrome::kNotSignedInProfile)); |
- return relative_profile_dir; |
-} |
- |
-Profile* ProfileManager::GetDefaultProfile(const FilePath& user_data_dir) { |
- FilePath default_profile_dir(user_data_dir); |
- default_profile_dir = default_profile_dir.Append(GetCurrentProfileDir()); |
-#if defined(OS_CHROMEOS) |
- if (!logged_in_) { |
- Profile* profile; |
- const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
- |
- // For cros, return the OTR profile so we never accidentally keep |
- // user data in an unencrypted profile. But doing this makes |
- // many of the browser and ui tests fail. We do return the OTR profile |
- // if the login-profile switch is passed so that we can test this. |
- // TODO(davemoore) Fix the tests so they allow OTR profiles. |
- if (!command_line.HasSwitch(switches::kTestType) || |
- command_line.HasSwitch(switches::kLoginProfile)) { |
- // Don't init extensions for this profile |
- profile = GetProfile(default_profile_dir, false); |
- profile = profile->GetOffTheRecordProfile(); |
- } else { |
- profile = GetProfile(default_profile_dir, true); |
- } |
- return profile; |
- } |
-#endif |
- return GetProfile(default_profile_dir); |
-} |
- |
-Profile* ProfileManager::GetProfile(const FilePath& profile_dir) { |
- return GetProfile(profile_dir, true); |
-} |
- |
-Profile* ProfileManager::GetProfile( |
- const FilePath& profile_dir, bool init_extensions) { |
- // If the profile is already loaded (e.g., chrome.exe launched twice), just |
- // return it. |
- Profile* profile = GetProfileByPath(profile_dir); |
- if (NULL != profile) |
- return profile; |
- |
- if (!ProfileManager::IsProfile(profile_dir)) { |
- // If the profile directory doesn't exist, create it. |
- profile = ProfileManager::CreateProfile(profile_dir); |
- } else { |
- // The profile already exists on disk, just load it. |
- profile = Profile::CreateProfile(profile_dir); |
- } |
- DCHECK(profile); |
- if (profile) { |
- bool result = AddProfile(profile, init_extensions); |
- DCHECK(result); |
- } |
- return profile; |
-} |
- |
-bool ProfileManager::AddProfile(Profile* profile, bool init_extensions) { |
- DCHECK(profile); |
- |
- // Make sure that we're not loading a profile with the same ID as a profile |
- // that's already loaded. |
- if (GetProfileByPath(profile->GetPath())) { |
- NOTREACHED() << "Attempted to add profile with the same path (" << |
- profile->GetPath().value() << |
- ") as an already-loaded profile."; |
- return false; |
- } |
- |
- profiles_.insert(profiles_.end(), profile); |
- if (init_extensions) |
- profile->InitExtensions(); |
- const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
- if (!command_line.HasSwitch(switches::kDisableWebResources)) |
- profile->InitWebResources(); |
- return true; |
-} |
- |
-Profile* ProfileManager::GetProfileByPath(const FilePath& path) const { |
- for (const_iterator i(begin()); i != end(); ++i) { |
- if ((*i)->GetPath() == path) |
- return *i; |
- } |
- |
- return NULL; |
-} |
- |
-void ProfileManager::OnSuspend() { |
- DCHECK(CalledOnValidThread()); |
- |
- for (const_iterator i(begin()); i != end(); ++i) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableFunction(&ProfileManager::SuspendProfile, *i)); |
- } |
-} |
- |
-void ProfileManager::OnResume() { |
- DCHECK(CalledOnValidThread()); |
- for (const_iterator i(begin()); i != end(); ++i) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableFunction(&ProfileManager::ResumeProfile, *i)); |
- } |
-} |
- |
-void ProfileManager::Observe( |
- NotificationType type, |
- const NotificationSource& source, |
- const NotificationDetails& details) { |
-#if defined(OS_CHROMEOS) |
- if (type == NotificationType::LOGIN_USER_CHANGED) { |
- const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
- if (!command_line.HasSwitch(switches::kTestType)) { |
- // This will fail when running on non cros os. |
- // TODO(davemoore) Need to mock this enough to enable testing. |
- CHECK(chromeos::CrosLibrary::Get()->EnsureLoaded()); |
- // If we don't have a mounted profile directory we're in trouble. |
- // TODO(davemoore) Once we have better api this check should ensure that |
- // our profile directory is the one that's mounted, and that it's mounted |
- // as the current user. |
- CHECK(chromeos::CrosLibrary::Get()->GetCryptohomeLibrary()->IsMounted()); |
- } |
- logged_in_ = true; |
- } |
-#endif |
-} |
- |
-void ProfileManager::SuspendProfile(Profile* profile) { |
- DCHECK(profile); |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- for (URLRequestJobTracker::JobIterator i = g_url_request_job_tracker.begin(); |
- i != g_url_request_job_tracker.end(); ++i) |
- (*i)->Kill(); |
- |
- profile->GetRequestContext()->GetURLRequestContext()-> |
- http_transaction_factory()->Suspend(true); |
-} |
- |
-void ProfileManager::ResumeProfile(Profile* profile) { |
- DCHECK(profile); |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- profile->GetRequestContext()->GetURLRequestContext()-> |
- http_transaction_factory()->Suspend(false); |
-} |
- |
-// static |
-bool ProfileManager::IsProfile(const FilePath& path) { |
- FilePath prefs_path = GetProfilePrefsPath(path); |
- FilePath history_path = path; |
- history_path = history_path.Append(chrome::kHistoryFilename); |
- |
- return file_util::PathExists(prefs_path) && |
- file_util::PathExists(history_path); |
-} |
- |
-// static |
-Profile* ProfileManager::CreateProfile(const FilePath& path) { |
- if (IsProfile(path)) { |
- DCHECK(false) << "Attempted to create a profile with the path:\n" |
- << path.value() << "\n but that path already contains a profile"; |
- } |
- |
- if (!file_util::PathExists(path)) { |
- // TODO(tc): http://b/1094718 Bad things happen if we can't write to the |
- // profile directory. We should eventually be able to run in this |
- // situation. |
- if (!file_util::CreateDirectory(path)) |
- return NULL; |
- } |
- |
- return Profile::CreateProfile(path); |
-} |