| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/profiles/profile_manager.h" | 5 #include "chrome/browser/profiles/profile_manager.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 #include "chromeos/dbus/dbus_thread_manager.h" | 104 #include "chromeos/dbus/dbus_thread_manager.h" |
| 105 #include "components/user_manager/user.h" | 105 #include "components/user_manager/user.h" |
| 106 #include "components/user_manager/user_manager.h" | 106 #include "components/user_manager/user_manager.h" |
| 107 #endif | 107 #endif |
| 108 | 108 |
| 109 using base::UserMetricsAction; | 109 using base::UserMetricsAction; |
| 110 using content::BrowserThread; | 110 using content::BrowserThread; |
| 111 | 111 |
| 112 namespace { | 112 namespace { |
| 113 | 113 |
| 114 // Profiles that should be deleted on shutdown. | |
| 115 std::vector<base::FilePath>& ProfilesToDelete() { | |
| 116 CR_DEFINE_STATIC_LOCAL(std::vector<base::FilePath>, profiles_to_delete, ()); | |
| 117 return profiles_to_delete; | |
| 118 } | |
| 119 | |
| 120 int64 ComputeFilesSize(const base::FilePath& directory, | 114 int64 ComputeFilesSize(const base::FilePath& directory, |
| 121 const base::FilePath::StringType& pattern) { | 115 const base::FilePath::StringType& pattern) { |
| 122 int64 running_size = 0; | 116 int64 running_size = 0; |
| 123 base::FileEnumerator iter(directory, false, base::FileEnumerator::FILES, | 117 base::FileEnumerator iter(directory, false, base::FileEnumerator::FILES, |
| 124 pattern); | 118 pattern); |
| 125 while (!iter.Next().empty()) | 119 while (!iter.Next().empty()) |
| 126 running_size += iter.GetInfo().GetSize(); | 120 running_size += iter.GetInfo().GetSize(); |
| 127 return running_size; | 121 return running_size; |
| 128 } | 122 } |
| 129 | 123 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 | 168 |
| 175 size = ComputeFilesSize(path, FILE_PATH_LITERAL("Policy")); | 169 size = ComputeFilesSize(path, FILE_PATH_LITERAL("Policy")); |
| 176 size_MB = static_cast<int>(size / kBytesInOneMB); | 170 size_MB = static_cast<int>(size / kBytesInOneMB); |
| 177 UMA_HISTOGRAM_COUNTS_10000("Profile.PolicySize", size_MB); | 171 UMA_HISTOGRAM_COUNTS_10000("Profile.PolicySize", size_MB); |
| 178 | 172 |
| 179 // Count number of enabled apps in this profile, if we know. | 173 // Count number of enabled apps in this profile, if we know. |
| 180 if (enabled_app_count != -1) | 174 if (enabled_app_count != -1) |
| 181 UMA_HISTOGRAM_COUNTS_10000("Profile.AppCount", enabled_app_count); | 175 UMA_HISTOGRAM_COUNTS_10000("Profile.AppCount", enabled_app_count); |
| 182 } | 176 } |
| 183 | 177 |
| 178 // Profiles that should be deleted on shutdown. |
| 179 std::vector<base::FilePath>& ProfilesToDelete() { |
| 180 CR_DEFINE_STATIC_LOCAL(std::vector<base::FilePath>, profiles_to_delete, ()); |
| 181 return profiles_to_delete; |
| 182 } |
| 183 |
| 184 void QueueProfileDirectoryForDeletion(const base::FilePath& path) { | 184 void QueueProfileDirectoryForDeletion(const base::FilePath& path) { |
| 185 ProfilesToDelete().push_back(path); | 185 ProfilesToDelete().push_back(path); |
| 186 } | 186 } |
| 187 | 187 |
| 188 bool IsProfileMarkedForDeletion(const base::FilePath& profile_path) { | 188 bool IsProfileMarkedForDeletion(const base::FilePath& profile_path) { |
| 189 return std::find(ProfilesToDelete().begin(), ProfilesToDelete().end(), | 189 return std::find(ProfilesToDelete().begin(), ProfilesToDelete().end(), |
| 190 profile_path) != ProfilesToDelete().end(); | 190 profile_path) != ProfilesToDelete().end(); |
| 191 } | 191 } |
| 192 | 192 |
| 193 // Physically remove deleted profile directories from disk. | 193 // Physically remove deleted profile directories from disk. |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 for (std::vector<base::FilePath>::iterator it = | 290 for (std::vector<base::FilePath>::iterator it = |
| 291 ProfilesToDelete().begin(); | 291 ProfilesToDelete().begin(); |
| 292 it != ProfilesToDelete().end(); | 292 it != ProfilesToDelete().end(); |
| 293 ++it) { | 293 ++it) { |
| 294 NukeProfileFromDisk(*it); | 294 NukeProfileFromDisk(*it); |
| 295 } | 295 } |
| 296 ProfilesToDelete().clear(); | 296 ProfilesToDelete().clear(); |
| 297 } | 297 } |
| 298 | 298 |
| 299 // static | 299 // static |
| 300 Profile* ProfileManager::GetLastUsedProfile() { | |
| 301 ProfileManager* profile_manager = g_browser_process->profile_manager(); | |
| 302 return profile_manager->GetLastUsedProfile(profile_manager->user_data_dir_); | |
| 303 } | |
| 304 | |
| 305 // static | |
| 306 Profile* ProfileManager::GetLastUsedProfileAllowedByPolicy() { | |
| 307 Profile* profile = GetLastUsedProfile(); | |
| 308 if (profile->IsGuestSession() || | |
| 309 profile->IsSystemProfile() || | |
| 310 IncognitoModePrefs::GetAvailability(profile->GetPrefs()) == | |
| 311 IncognitoModePrefs::FORCED) { | |
| 312 return profile->GetOffTheRecordProfile(); | |
| 313 } | |
| 314 return profile; | |
| 315 } | |
| 316 | |
| 317 // static | |
| 318 std::vector<Profile*> ProfileManager::GetLastOpenedProfiles() { | |
| 319 ProfileManager* profile_manager = g_browser_process->profile_manager(); | |
| 320 return profile_manager->GetLastOpenedProfiles( | |
| 321 profile_manager->user_data_dir_); | |
| 322 } | |
| 323 | |
| 324 // static | |
| 325 Profile* ProfileManager::GetPrimaryUserProfile() { | 300 Profile* ProfileManager::GetPrimaryUserProfile() { |
| 326 ProfileManager* profile_manager = g_browser_process->profile_manager(); | 301 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| 327 #if defined(OS_CHROMEOS) | 302 #if defined(OS_CHROMEOS) |
| 328 if (!profile_manager->IsLoggedIn() || | 303 if (!profile_manager->IsLoggedIn() || |
| 329 !user_manager::UserManager::IsInitialized()) | 304 !user_manager::UserManager::IsInitialized()) |
| 330 return profile_manager->GetActiveUserOrOffTheRecordProfileFromPath( | 305 return profile_manager->GetActiveUserOrOffTheRecordProfileFromPath(); |
| 331 profile_manager->user_data_dir()); | |
| 332 user_manager::UserManager* manager = user_manager::UserManager::Get(); | 306 user_manager::UserManager* manager = user_manager::UserManager::Get(); |
| 333 // Note: The ProfileHelper will take care of guest profiles. | 307 // Note: The ProfileHelper will take care of guest profiles. |
| 334 return chromeos::ProfileHelper::Get()->GetProfileByUserUnsafe( | 308 return chromeos::ProfileHelper::Get()->GetProfileByUserUnsafe( |
| 335 manager->GetPrimaryUser()); | 309 manager->GetPrimaryUser()); |
| 336 #else | 310 #else |
| 337 return profile_manager->GetActiveUserOrOffTheRecordProfileFromPath( | 311 return profile_manager->GetActiveUserOrOffTheRecordProfileFromPath(); |
| 338 profile_manager->user_data_dir()); | |
| 339 #endif | 312 #endif |
| 340 } | 313 } |
| 341 | 314 |
| 342 // static | 315 // static |
| 343 Profile* ProfileManager::GetActiveUserProfile() { | 316 Profile* ProfileManager::GetActiveUserProfile() { |
| 344 ProfileManager* profile_manager = g_browser_process->profile_manager(); | 317 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| 345 #if defined(OS_CHROMEOS) | 318 #if defined(OS_CHROMEOS) |
| 346 if (!profile_manager) | 319 if (!profile_manager) |
| 347 return NULL; | 320 return NULL; |
| 348 | 321 |
| 349 if (!profile_manager->IsLoggedIn() || | 322 if (!profile_manager->IsLoggedIn() || |
| 350 !user_manager::UserManager::IsInitialized()) { | 323 !user_manager::UserManager::IsInitialized()) { |
| 351 return profile_manager->GetActiveUserOrOffTheRecordProfileFromPath( | 324 return profile_manager->GetActiveUserOrOffTheRecordProfileFromPath(); |
| 352 profile_manager->user_data_dir()); | |
| 353 } | 325 } |
| 354 | 326 |
| 355 user_manager::UserManager* manager = user_manager::UserManager::Get(); | 327 user_manager::UserManager* manager = user_manager::UserManager::Get(); |
| 356 const user_manager::User* user = manager->GetActiveUser(); | 328 const user_manager::User* user = manager->GetActiveUser(); |
| 357 // To avoid an endless loop (crbug.com/334098) we have to additionally check | 329 // To avoid an endless loop (crbug.com/334098) we have to additionally check |
| 358 // if the profile of the user was already created. If the profile was not yet | 330 // if the profile of the user was already created. If the profile was not yet |
| 359 // created we load the profile using the profile directly. | 331 // created we load the profile using the profile directly. |
| 360 // TODO: This should be cleaned up with the new profile manager. | 332 // TODO: This should be cleaned up with the new profile manager. |
| 361 if (user && user->is_profile_created()) | 333 if (user && user->is_profile_created()) |
| 362 return chromeos::ProfileHelper::Get()->GetProfileByUserUnsafe(user); | 334 return chromeos::ProfileHelper::Get()->GetProfileByUserUnsafe(user); |
| 363 | 335 |
| 364 #endif | 336 #endif |
| 365 Profile* profile = | 337 Profile* profile = |
| 366 profile_manager->GetActiveUserOrOffTheRecordProfileFromPath( | 338 profile_manager->GetActiveUserOrOffTheRecordProfileFromPath(); |
| 367 profile_manager->user_data_dir()); | |
| 368 // |profile| could be null if the user doesn't have a profile yet and the path | 339 // |profile| could be null if the user doesn't have a profile yet and the path |
| 369 // is on a read-only volume (preventing Chrome from making a new one). | 340 // is on a read-only volume (preventing Chrome from making a new one). |
| 370 // However, most callers of this function immediately dereference the result | 341 // However, most callers of this function immediately dereference the result |
| 371 // which would lead to crashes in a variety of call sites. Assert here to | 342 // which would lead to crashes in a variety of call sites. Assert here to |
| 372 // figure out how common this is. http://crbug.com/383019 | 343 // figure out how common this is. http://crbug.com/383019 |
| 373 CHECK(profile) << profile_manager->user_data_dir().AsUTF8Unsafe(); | 344 CHECK(profile) << profile_manager->user_data_dir().AsUTF8Unsafe(); |
| 374 return profile; | 345 return profile; |
| 375 } | 346 } |
| 376 | 347 |
| 377 Profile* ProfileManager::GetProfile(const base::FilePath& profile_dir) { | 348 Profile* ProfileManager::GetProfile(const base::FilePath& profile_dir) { |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 #if defined(OS_CHROMEOS) | 446 #if defined(OS_CHROMEOS) |
| 476 if (logged_in_) { | 447 if (logged_in_) { |
| 477 return chromeos::ProfileHelper::Get()->GetActiveUserProfileDir(); | 448 return chromeos::ProfileHelper::Get()->GetActiveUserProfileDir(); |
| 478 } | 449 } |
| 479 #endif | 450 #endif |
| 480 base::FilePath relative_profile_dir; | 451 base::FilePath relative_profile_dir; |
| 481 // TODO(mirandac): should not automatically be default profile. | 452 // TODO(mirandac): should not automatically be default profile. |
| 482 return relative_profile_dir.AppendASCII(chrome::kInitialProfile); | 453 return relative_profile_dir.AppendASCII(chrome::kInitialProfile); |
| 483 } | 454 } |
| 484 | 455 |
| 485 Profile* ProfileManager::GetLastUsedProfile( | 456 Profile* ProfileManager::GetLastUsedProfile() { |
| 486 const base::FilePath& user_data_dir) { | |
| 487 #if defined(OS_CHROMEOS) | 457 #if defined(OS_CHROMEOS) |
| 488 // Use default login profile if user has not logged in yet. | 458 // Use default login profile if user has not logged in yet. |
| 489 if (!logged_in_) { | 459 if (!logged_in_) |
| 490 return GetActiveUserOrOffTheRecordProfileFromPath(user_data_dir); | 460 return GetActiveUserOrOffTheRecordProfileFromPath(); |
| 491 } else { | |
| 492 // CrOS multi-profiles implementation is different so GetLastUsedProfile | |
| 493 // has custom implementation too. | |
| 494 base::FilePath profile_dir; | |
| 495 // In case of multi-profiles we ignore "last used profile" preference | |
| 496 // since it may refer to profile that has been in use in previous session. | |
| 497 // That profile dir may not be mounted in this session so instead return | |
| 498 // active profile from current session. | |
| 499 profile_dir = chromeos::ProfileHelper::Get()->GetActiveUserProfileDir(); | |
| 500 | 461 |
| 501 base::FilePath profile_path(user_data_dir); | 462 // CrOS multi-profiles implementation is different so GetLastUsedProfile |
| 502 Profile* profile = GetProfile(profile_path.Append(profile_dir)); | 463 // has custom implementation too. |
| 503 return profile->IsGuestSession() ? profile->GetOffTheRecordProfile() : | 464 // In case of multi-profiles we ignore "last used profile" preference |
| 504 profile; | 465 // since it may refer to profile that has been in use in previous session. |
| 505 } | 466 // That profile dir may not be mounted in this session so instead return |
| 467 // active profile from current session. |
| 468 base::FilePath profile_dir = |
| 469 chromeos::ProfileHelper::Get()->GetActiveUserProfileDir(); |
| 470 |
| 471 Profile* profile = GetProfile(user_data_dir_.Append(profile_dir)); |
| 472 return profile->IsGuestSession() ? profile->GetOffTheRecordProfile() |
| 473 : profile; |
| 474 #else |
| 475 return GetProfile(GetLastUsedProfileDir()); |
| 506 #endif | 476 #endif |
| 507 | |
| 508 return GetProfile(GetLastUsedProfileDir(user_data_dir)); | |
| 509 } | 477 } |
| 510 | 478 |
| 511 base::FilePath ProfileManager::GetLastUsedProfileDir( | 479 Profile* ProfileManager::GetLastUsedProfileAllowedByPolicy() { |
| 512 const base::FilePath& user_data_dir) { | 480 Profile* profile = GetLastUsedProfile(); |
| 513 return user_data_dir.AppendASCII(GetLastUsedProfileName()); | 481 if (profile->IsGuestSession() || |
| 482 profile->IsSystemProfile() || |
| 483 IncognitoModePrefs::GetAvailability(profile->GetPrefs()) == |
| 484 IncognitoModePrefs::FORCED) { |
| 485 return profile->GetOffTheRecordProfile(); |
| 486 } |
| 487 return profile; |
| 488 } |
| 489 |
| 490 base::FilePath ProfileManager::GetLastUsedProfileDir() { |
| 491 return user_data_dir_.AppendASCII(GetLastUsedProfileName()); |
| 514 } | 492 } |
| 515 | 493 |
| 516 std::string ProfileManager::GetLastUsedProfileName() { | 494 std::string ProfileManager::GetLastUsedProfileName() { |
| 517 PrefService* local_state = g_browser_process->local_state(); | 495 PrefService* local_state = g_browser_process->local_state(); |
| 518 DCHECK(local_state); | 496 DCHECK(local_state); |
| 519 const std::string last_used_profile_name = | 497 const std::string last_used_profile_name = |
| 520 local_state->GetString(prefs::kProfileLastUsed); | 498 local_state->GetString(prefs::kProfileLastUsed); |
| 521 if (!last_used_profile_name.empty()) | 499 if (!last_used_profile_name.empty()) |
| 522 return last_used_profile_name; | 500 return last_used_profile_name; |
| 523 | 501 |
| 524 return chrome::kInitialProfile; | 502 return chrome::kInitialProfile; |
| 525 } | 503 } |
| 526 | 504 |
| 527 std::vector<Profile*> ProfileManager::GetLastOpenedProfiles( | 505 std::vector<Profile*> ProfileManager::GetLastOpenedProfiles() { |
| 528 const base::FilePath& user_data_dir) { | |
| 529 PrefService* local_state = g_browser_process->local_state(); | 506 PrefService* local_state = g_browser_process->local_state(); |
| 530 DCHECK(local_state); | 507 DCHECK(local_state); |
| 531 | 508 |
| 532 std::vector<Profile*> to_return; | 509 std::vector<Profile*> to_return; |
| 533 if (local_state->HasPrefPath(prefs::kProfilesLastActive) && | 510 if (local_state->HasPrefPath(prefs::kProfilesLastActive) && |
| 534 local_state->GetList(prefs::kProfilesLastActive)) { | 511 local_state->GetList(prefs::kProfilesLastActive)) { |
| 535 // Make a copy because the list might change in the calls to GetProfile. | 512 // Make a copy because the list might change in the calls to GetProfile. |
| 536 scoped_ptr<base::ListValue> profile_list( | 513 scoped_ptr<base::ListValue> profile_list( |
| 537 local_state->GetList(prefs::kProfilesLastActive)->DeepCopy()); | 514 local_state->GetList(prefs::kProfilesLastActive)->DeepCopy()); |
| 538 base::ListValue::const_iterator it; | 515 base::ListValue::const_iterator it; |
| 539 std::string profile; | 516 std::string profile; |
| 540 for (it = profile_list->begin(); it != profile_list->end(); ++it) { | 517 for (it = profile_list->begin(); it != profile_list->end(); ++it) { |
| 541 if (!(*it)->GetAsString(&profile) || profile.empty()) { | 518 if (!(*it)->GetAsString(&profile) || profile.empty()) { |
| 542 LOG(WARNING) << "Invalid entry in " << prefs::kProfilesLastActive; | 519 LOG(WARNING) << "Invalid entry in " << prefs::kProfilesLastActive; |
| 543 continue; | 520 continue; |
| 544 } | 521 } |
| 545 to_return.push_back(GetProfile(user_data_dir.AppendASCII(profile))); | 522 to_return.push_back(GetProfile(user_data_dir_.AppendASCII(profile))); |
| 546 } | 523 } |
| 547 } | 524 } |
| 548 return to_return; | 525 return to_return; |
| 549 } | 526 } |
| 550 | 527 |
| 551 std::vector<Profile*> ProfileManager::GetLoadedProfiles() const { | 528 std::vector<Profile*> ProfileManager::GetLoadedProfiles() const { |
| 552 std::vector<Profile*> profiles; | 529 std::vector<Profile*> profiles; |
| 553 for (ProfilesInfoMap::const_iterator iter = profiles_info_.begin(); | 530 for (ProfilesInfoMap::const_iterator iter = profiles_info_.begin(); |
| 554 iter != profiles_info_.end(); ++iter) { | 531 iter != profiles_info_.end(); ++iter) { |
| 555 if (iter->second->created) | 532 if (iter->second->created) |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 615 base::FilePath ProfileManager::GenerateNextProfileDirectoryPath() { | 592 base::FilePath ProfileManager::GenerateNextProfileDirectoryPath() { |
| 616 PrefService* local_state = g_browser_process->local_state(); | 593 PrefService* local_state = g_browser_process->local_state(); |
| 617 DCHECK(local_state); | 594 DCHECK(local_state); |
| 618 | 595 |
| 619 DCHECK(profiles::IsMultipleProfilesEnabled()); | 596 DCHECK(profiles::IsMultipleProfilesEnabled()); |
| 620 | 597 |
| 621 // Create the next profile in the next available directory slot. | 598 // Create the next profile in the next available directory slot. |
| 622 int next_directory = local_state->GetInteger(prefs::kProfilesNumCreated); | 599 int next_directory = local_state->GetInteger(prefs::kProfilesNumCreated); |
| 623 std::string profile_name = chrome::kMultiProfileDirPrefix; | 600 std::string profile_name = chrome::kMultiProfileDirPrefix; |
| 624 profile_name.append(base::IntToString(next_directory)); | 601 profile_name.append(base::IntToString(next_directory)); |
| 625 base::FilePath new_path = user_data_dir_; | 602 base::FilePath new_path = user_data_dir_.AppendASCII(profile_name); |
| 626 #if defined(OS_WIN) | |
| 627 new_path = new_path.Append(base::ASCIIToUTF16(profile_name)); | |
| 628 #else | |
| 629 new_path = new_path.Append(profile_name); | |
| 630 #endif | |
| 631 local_state->SetInteger(prefs::kProfilesNumCreated, ++next_directory); | 603 local_state->SetInteger(prefs::kProfilesNumCreated, ++next_directory); |
| 632 return new_path; | 604 return new_path; |
| 633 } | 605 } |
| 634 | 606 |
| 635 ProfileInfoCache& ProfileManager::GetProfileInfoCache() { | 607 ProfileInfoCache& ProfileManager::GetProfileInfoCache() { |
| 636 TRACE_EVENT0("browser", "ProfileManager::GetProfileInfoCache"); | 608 TRACE_EVENT0("browser", "ProfileManager::GetProfileInfoCache"); |
| 637 if (!profile_info_cache_) { | 609 if (!profile_info_cache_) { |
| 638 profile_info_cache_.reset(new ProfileInfoCache( | 610 profile_info_cache_.reset(new ProfileInfoCache( |
| 639 g_browser_process->local_state(), user_data_dir_)); | 611 g_browser_process->local_state(), user_data_dir_)); |
| 640 } | 612 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 670 // Make sure that this profile is not pending deletion, and is not | 642 // Make sure that this profile is not pending deletion, and is not |
| 671 // legacy-supervised. | 643 // legacy-supervised. |
| 672 if (cur_path != profile_dir && | 644 if (cur_path != profile_dir && |
| 673 !cache.ProfileIsLegacySupervisedAtIndex(i) && | 645 !cache.ProfileIsLegacySupervisedAtIndex(i) && |
| 674 !IsProfileMarkedForDeletion(cur_path)) { | 646 !IsProfileMarkedForDeletion(cur_path)) { |
| 675 last_non_supervised_profile_path = cur_path; | 647 last_non_supervised_profile_path = cur_path; |
| 676 break; | 648 break; |
| 677 } | 649 } |
| 678 } | 650 } |
| 679 | 651 |
| 680 base::FilePath new_path; | |
| 681 if (last_non_supervised_profile_path.empty()) { | 652 if (last_non_supervised_profile_path.empty()) { |
| 682 // If we are using --new-avatar-menu, then assign the default | 653 // If we are using --new-avatar-menu, then assign the default |
| 683 // placeholder avatar and name. Otherwise, use random ones. | 654 // placeholder avatar and name. Otherwise, use random ones. |
| 684 bool is_new_avatar_menu = switches::IsNewAvatarMenu(); | 655 base::string16 new_profile_name; |
| 685 int avatar_index = profiles::GetPlaceholderAvatarIndex(); | 656 base::string16 new_avatar_url; |
| 686 base::string16 new_avatar_url = is_new_avatar_menu ? | 657 if (switches::IsNewAvatarMenu()) { |
| 687 base::UTF8ToUTF16(profiles::GetDefaultAvatarIconUrl(avatar_index)) : | 658 int avatar_index = profiles::GetPlaceholderAvatarIndex(); |
| 688 base::string16(); | 659 new_profile_name = cache.ChooseNameForNewProfile(avatar_index); |
| 689 base::string16 new_profile_name = is_new_avatar_menu ? | 660 new_avatar_url = |
| 690 cache.ChooseNameForNewProfile(avatar_index) : base::string16(); | 661 base::UTF8ToUTF16(profiles::GetDefaultAvatarIconUrl(avatar_index)); |
| 662 } |
| 691 | 663 |
| 692 new_path = GenerateNextProfileDirectoryPath(); | 664 base::FilePath new_path = GenerateNextProfileDirectoryPath(); |
| 693 CreateProfileAsync(new_path, | 665 CreateProfileAsync(new_path, |
| 694 base::Bind(&ProfileManager::OnNewActiveProfileLoaded, | 666 base::Bind(&ProfileManager::OnNewActiveProfileLoaded, |
| 695 base::Unretained(this), | 667 base::Unretained(this), |
| 696 profile_dir, | 668 profile_dir, |
| 697 new_path, | 669 new_path, |
| 698 callback), | 670 callback), |
| 699 new_profile_name, | 671 new_profile_name, |
| 700 new_avatar_url, | 672 new_avatar_url, |
| 701 std::string()); | 673 std::string()); |
| 702 | 674 |
| 703 ProfileMetrics::LogProfileAddNewUser( | 675 ProfileMetrics::LogProfileAddNewUser( |
| 704 ProfileMetrics::ADD_NEW_USER_LAST_DELETED); | 676 ProfileMetrics::ADD_NEW_USER_LAST_DELETED); |
| 705 return; | 677 return; |
| 706 } | 678 } |
| 707 | 679 |
| 708 #if defined(OS_MACOSX) | 680 #if defined(OS_MACOSX) |
| 709 // On the Mac, the browser process is not killed when all browser windows are | 681 // On the Mac, the browser process is not killed when all browser windows are |
| 710 // closed, so just in case we are deleting the active profile, and no other | 682 // closed, so just in case we are deleting the active profile, and no other |
| 711 // profile has been loaded, we must pre-load a next one. | 683 // profile has been loaded, we must pre-load a next one. |
| 712 const base::FilePath last_used_profile = | 684 const base::FilePath last_used_profile = GetLastUsedProfileDir(); |
| 713 GetLastUsedProfileDir(user_data_dir_); | |
| 714 if (last_used_profile == profile_dir || | 685 if (last_used_profile == profile_dir || |
| 715 last_used_profile == GetGuestProfilePath()) { | 686 last_used_profile == GetGuestProfilePath()) { |
| 716 CreateProfileAsync(last_non_supervised_profile_path, | 687 CreateProfileAsync(last_non_supervised_profile_path, |
| 717 base::Bind(&ProfileManager::OnNewActiveProfileLoaded, | 688 base::Bind(&ProfileManager::OnNewActiveProfileLoaded, |
| 718 base::Unretained(this), | 689 base::Unretained(this), |
| 719 profile_dir, | 690 profile_dir, |
| 720 last_non_supervised_profile_path, | 691 last_non_supervised_profile_path, |
| 721 callback), | 692 callback), |
| 722 base::string16(), | 693 base::string16(), |
| 723 base::string16(), | 694 base::string16(), |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1115 return Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS); | 1086 return Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS); |
| 1116 } | 1087 } |
| 1117 | 1088 |
| 1118 Profile* ProfileManager::CreateProfileAsyncHelper(const base::FilePath& path, | 1089 Profile* ProfileManager::CreateProfileAsyncHelper(const base::FilePath& path, |
| 1119 Delegate* delegate) { | 1090 Delegate* delegate) { |
| 1120 return Profile::CreateProfile(path, | 1091 return Profile::CreateProfile(path, |
| 1121 delegate, | 1092 delegate, |
| 1122 Profile::CREATE_MODE_ASYNCHRONOUS); | 1093 Profile::CREATE_MODE_ASYNCHRONOUS); |
| 1123 } | 1094 } |
| 1124 | 1095 |
| 1125 Profile* ProfileManager::GetActiveUserOrOffTheRecordProfileFromPath( | 1096 Profile* ProfileManager::GetActiveUserOrOffTheRecordProfileFromPath() { |
| 1126 const base::FilePath& user_data_dir) { | |
| 1127 #if defined(OS_CHROMEOS) | 1097 #if defined(OS_CHROMEOS) |
| 1128 base::FilePath default_profile_dir(user_data_dir); | |
| 1129 if (!logged_in_) { | 1098 if (!logged_in_) { |
| 1130 default_profile_dir = profiles::GetDefaultProfileDir(user_data_dir); | 1099 base::FilePath default_profile_dir = |
| 1100 profiles::GetDefaultProfileDir(user_data_dir_); |
| 1131 Profile* profile = GetProfile(default_profile_dir); | 1101 Profile* profile = GetProfile(default_profile_dir); |
| 1132 // For cros, return the OTR profile so we never accidentally keep | 1102 // For cros, return the OTR profile so we never accidentally keep |
| 1133 // user data in an unencrypted profile. But doing this makes | 1103 // user data in an unencrypted profile. But doing this makes |
| 1134 // many of the browser and ui tests fail. We do return the OTR profile | 1104 // many of the browser and ui tests fail. We do return the OTR profile |
| 1135 // if the login-profile switch is passed so that we can test this. | 1105 // if the login-profile switch is passed so that we can test this. |
| 1136 if (ShouldGoOffTheRecord(profile)) | 1106 if (ShouldGoOffTheRecord(profile)) |
| 1137 return profile->GetOffTheRecordProfile(); | 1107 return profile->GetOffTheRecordProfile(); |
| 1138 DCHECK(!user_manager::UserManager::Get()->IsLoggedInAsGuest()); | 1108 DCHECK(!user_manager::UserManager::Get()->IsLoggedInAsGuest()); |
| 1139 return profile; | 1109 return profile; |
| 1140 } | 1110 } |
| 1141 | 1111 |
| 1142 default_profile_dir = default_profile_dir.Append(GetInitialProfileDir()); | 1112 base::FilePath default_profile_dir = |
| 1113 user_data_dir_.Append(GetInitialProfileDir()); |
| 1143 ProfileInfo* profile_info = GetProfileInfoByPath(default_profile_dir); | 1114 ProfileInfo* profile_info = GetProfileInfoByPath(default_profile_dir); |
| 1144 // Fallback to default off-the-record profile, if user profile has not fully | 1115 // Fallback to default off-the-record profile, if user profile has not fully |
| 1145 // loaded yet. | 1116 // loaded yet. |
| 1146 if (profile_info && !profile_info->created) | 1117 if (profile_info && !profile_info->created) |
| 1147 default_profile_dir = profiles::GetDefaultProfileDir(user_data_dir); | 1118 default_profile_dir = profiles::GetDefaultProfileDir(user_data_dir_); |
| 1148 | 1119 |
| 1149 Profile* profile = GetProfile(default_profile_dir); | 1120 Profile* profile = GetProfile(default_profile_dir); |
| 1150 // Some unit tests didn't initialize the UserManager. | 1121 // Some unit tests didn't initialize the UserManager. |
| 1151 if (user_manager::UserManager::IsInitialized() && | 1122 if (user_manager::UserManager::IsInitialized() && |
| 1152 user_manager::UserManager::Get()->IsLoggedInAsGuest()) | 1123 user_manager::UserManager::Get()->IsLoggedInAsGuest()) |
| 1153 return profile->GetOffTheRecordProfile(); | 1124 return profile->GetOffTheRecordProfile(); |
| 1154 return profile; | 1125 return profile; |
| 1155 #else | 1126 #else |
| 1156 base::FilePath default_profile_dir(user_data_dir); | 1127 base::FilePath default_profile_dir = |
| 1157 default_profile_dir = default_profile_dir.Append(GetInitialProfileDir()); | 1128 user_data_dir_.Append(GetInitialProfileDir()); |
| 1158 return GetProfile(default_profile_dir); | 1129 return GetProfile(default_profile_dir); |
| 1159 #endif | 1130 #endif |
| 1160 } | 1131 } |
| 1161 | 1132 |
| 1162 bool ProfileManager::AddProfile(Profile* profile) { | 1133 bool ProfileManager::AddProfile(Profile* profile) { |
| 1163 TRACE_EVENT0("browser", "ProfileManager::AddProfile"); | 1134 TRACE_EVENT0("browser", "ProfileManager::AddProfile"); |
| 1164 TRACK_SCOPED_REGION("Startup", "ProfileManager::AddProfile"); | 1135 TRACK_SCOPED_REGION("Startup", "ProfileManager::AddProfile"); |
| 1165 | 1136 |
| 1166 DCHECK(profile); | 1137 DCHECK(profile); |
| 1167 | 1138 |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1469 } | 1440 } |
| 1470 | 1441 |
| 1471 FinishDeletingProfile(profile_to_delete_path, new_active_profile_path); | 1442 FinishDeletingProfile(profile_to_delete_path, new_active_profile_path); |
| 1472 if (!original_callback.is_null()) | 1443 if (!original_callback.is_null()) |
| 1473 original_callback.Run(loaded_profile, status); | 1444 original_callback.Run(loaded_profile, status); |
| 1474 } | 1445 } |
| 1475 | 1446 |
| 1476 ProfileManagerWithoutInit::ProfileManagerWithoutInit( | 1447 ProfileManagerWithoutInit::ProfileManagerWithoutInit( |
| 1477 const base::FilePath& user_data_dir) : ProfileManager(user_data_dir) { | 1448 const base::FilePath& user_data_dir) : ProfileManager(user_data_dir) { |
| 1478 } | 1449 } |
| OLD | NEW |