| Index: chrome/browser/profiles/profile_manager_browsertest.cc
|
| diff --git a/chrome/browser/profiles/profile_manager_browsertest.cc b/chrome/browser/profiles/profile_manager_browsertest.cc
|
| index 1c5fec1e7fa1b63f5d168449b70537dd07dbca0e..f0287d73c6b953d7a3c65518adb11d0e0178910c 100644
|
| --- a/chrome/browser/profiles/profile_manager_browsertest.cc
|
| +++ b/chrome/browser/profiles/profile_manager_browsertest.cc
|
| @@ -7,12 +7,8 @@
|
| #include "base/bind.h"
|
| #include "base/command_line.h"
|
| #include "base/macros.h"
|
| -#include "base/memory/ptr_util.h"
|
| -#include "base/stl_util.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "build/build_config.h"
|
| -#include "chrome/browser/lifetime/keep_alive_types.h"
|
| -#include "chrome/browser/lifetime/scoped_keep_alive.h"
|
| #include "chrome/browser/password_manager/password_store_factory.h"
|
| #include "chrome/browser/profiles/profile_attributes_entry.h"
|
| #include "chrome/browser/profiles/profile_attributes_storage.h"
|
| @@ -63,39 +59,6 @@
|
| base::MessageLoop::current()->QuitWhenIdle();
|
| }
|
|
|
| -// An observer returns back to test code after one or more profiles was deleted.
|
| -// It has ScopedKeepAlive object to prevent browser shutdown started in case
|
| -// browser become windowless.
|
| -class MultipleProfileDeletionObserver {
|
| - public:
|
| - explicit MultipleProfileDeletionObserver(size_t callbacks_calls_expected)
|
| - : callback_calls_left_(callbacks_calls_expected) {
|
| - EXPECT_LT(0u, callback_calls_left_);
|
| - }
|
| - ProfileManager::CreateCallback QuitAttemptClosure() {
|
| - return base::Bind(&MultipleProfileDeletionObserver::QuitAttempt,
|
| - base::Unretained(this));
|
| - }
|
| - void Wait() {
|
| - keep_alive_ = base::MakeUnique<ScopedKeepAlive>(
|
| - KeepAliveOrigin::PROFILE_HELPER, KeepAliveRestartOption::DISABLED);
|
| - loop_.Run();
|
| - }
|
| -
|
| - private:
|
| - void QuitAttempt(Profile* profile, Profile::CreateStatus status) {
|
| - EXPECT_EQ(Profile::CREATE_STATUS_INITIALIZED, status);
|
| - if (--callback_calls_left_)
|
| - return;
|
| - keep_alive_.reset(nullptr);
|
| - loop_.Quit();
|
| - }
|
| -
|
| - base::RunLoop loop_;
|
| - size_t callback_calls_left_;
|
| - std::unique_ptr<ScopedKeepAlive> keep_alive_;
|
| -};
|
| -
|
| void EphemeralProfileCreationComplete(Profile* profile,
|
| Profile::CreateStatus status) {
|
| if (status == Profile::CREATE_STATUS_INITIALIZED)
|
| @@ -117,21 +80,14 @@
|
|
|
| std::string last_used_profile_name() { return last_used_profile_name_; }
|
|
|
| - void set_on_profile_removal_callback(const base::Closure& callback) {
|
| - on_profile_removal_callback_ = callback;
|
| - }
|
| -
|
| // ProfileAttributesStorage::Observer overrides:
|
| void OnProfileWillBeRemoved(const base::FilePath& profile_path) override {
|
| last_used_profile_name_ = g_browser_process->local_state()->GetString(
|
| prefs::kProfileLastUsed);
|
| - if (!on_profile_removal_callback_.is_null())
|
| - on_profile_removal_callback_.Run();
|
| }
|
|
|
| private:
|
| std::string last_used_profile_name_;
|
| - base::Closure on_profile_removal_callback_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(ProfileRemovalObserver);
|
| };
|
| @@ -196,9 +152,7 @@
|
| }
|
| };
|
|
|
| -// Android does not support multi-profiles, and CrOS multi-profiles
|
| -// implementation is too different for these tests.
|
| -#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
|
| +#if defined(OS_MACOSX)
|
|
|
| // Delete single profile and make sure a new one is created.
|
| IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DeleteSingletonProfile) {
|
| @@ -214,13 +168,14 @@
|
| base::FilePath singleton_profile_path =
|
| storage.GetAllProfilesAttributes().front()->GetPath();
|
| EXPECT_FALSE(singleton_profile_path.empty());
|
| - MultipleProfileDeletionObserver profile_deletion_observer(1u);
|
| + base::RunLoop run_loop;
|
| profile_manager->ScheduleProfileForDeletion(
|
| - singleton_profile_path, profile_deletion_observer.QuitAttemptClosure());
|
| + singleton_profile_path,
|
| + base::Bind(&OnUnblockOnProfileCreation, &run_loop));
|
|
|
| // Run the message loop until the profile is actually deleted (as indicated
|
| // by the callback above being called).
|
| - profile_deletion_observer.Wait();
|
| + run_loop.Run();
|
|
|
| // Make sure a new profile was created automatically.
|
| EXPECT_EQ(1u, storage.GetNumberOfProfiles());
|
| @@ -239,13 +194,13 @@
|
| EXPECT_EQ(last_used_profile_name, observer.last_used_profile_name());
|
| }
|
|
|
| -// Delete inactive profile in a multi profile setup and make sure current
|
| -// browser is not affected.
|
| -IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DeleteInactiveProfile) {
|
| +// Delete all profiles in a multi profile setup and make sure a new one is
|
| +// created.
|
| +// Crashes/CHECKs. See crbug.com/104851
|
| +IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DISABLED_DeleteAllProfiles) {
|
| ProfileManager* profile_manager = g_browser_process->profile_manager();
|
| ProfileAttributesStorage& storage =
|
| profile_manager->GetProfileAttributesStorage();
|
| - base::FilePath current_profile_path = browser()->profile()->GetPath();
|
|
|
| // Create an additional profile.
|
| base::FilePath new_path = profile_manager->GenerateNextProfileDirectoryPath();
|
| @@ -253,74 +208,6 @@
|
| profile_manager->CreateProfileAsync(
|
| new_path, base::Bind(&OnUnblockOnProfileCreation, &run_loop),
|
| base::string16(), std::string(), std::string());
|
| - run_loop.Run();
|
| -
|
| - ASSERT_EQ(2u, storage.GetNumberOfProfiles());
|
| -
|
| - // Delete inactive profile.
|
| - base::RunLoop loop;
|
| - ProfileRemovalObserver observer;
|
| - observer.set_on_profile_removal_callback(loop.QuitClosure());
|
| - profile_manager->ScheduleProfileForDeletion(new_path,
|
| - ProfileManager::CreateCallback());
|
| - loop.Run();
|
| -
|
| - // Make sure there only preexisted profile left.
|
| - EXPECT_EQ(1u, storage.GetNumberOfProfiles());
|
| - EXPECT_EQ(current_profile_path,
|
| - storage.GetAllProfilesAttributes().front()->GetPath());
|
| -
|
| - // Make sure that last used profile preference is set correctly.
|
| - Profile* last_used = ProfileManager::GetLastUsedProfile();
|
| - EXPECT_EQ(current_profile_path, last_used->GetPath());
|
| -}
|
| -
|
| -// Delete current profile in a multi profile setup and make sure an existing one
|
| -// is loaded.
|
| -IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DeleteCurrentProfile) {
|
| - ProfileManager* profile_manager = g_browser_process->profile_manager();
|
| - ProfileAttributesStorage& storage =
|
| - profile_manager->GetProfileAttributesStorage();
|
| -
|
| - // Create an additional profile.
|
| - base::FilePath new_path = profile_manager->GenerateNextProfileDirectoryPath();
|
| - base::RunLoop run_loop;
|
| - profile_manager->CreateProfileAsync(
|
| - new_path, base::Bind(&OnUnblockOnProfileCreation, &run_loop),
|
| - base::string16(), std::string(), std::string());
|
| - run_loop.Run();
|
| -
|
| - ASSERT_EQ(2u, storage.GetNumberOfProfiles());
|
| -
|
| - // Delete current profile.
|
| - MultipleProfileDeletionObserver profile_deletion_observer(1u);
|
| - profile_manager->ScheduleProfileForDeletion(
|
| - browser()->profile()->GetPath(),
|
| - profile_deletion_observer.QuitAttemptClosure());
|
| - profile_deletion_observer.Wait();
|
| -
|
| - // Make sure a profile created earlier become the only profile.
|
| - EXPECT_EQ(1u, storage.GetNumberOfProfiles());
|
| - EXPECT_EQ(new_path, storage.GetAllProfilesAttributes().front()->GetPath());
|
| -
|
| - // Make sure that last used profile preference is set correctly.
|
| - Profile* last_used = ProfileManager::GetLastUsedProfile();
|
| - EXPECT_EQ(new_path, last_used->GetPath());
|
| -}
|
| -
|
| -// Delete all profiles in a multi profile setup and make sure a new one is
|
| -// created.
|
| -IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DeleteAllProfiles) {
|
| - ProfileManager* profile_manager = g_browser_process->profile_manager();
|
| - ProfileAttributesStorage& storage =
|
| - profile_manager->GetProfileAttributesStorage();
|
| -
|
| - // Create an additional profile.
|
| - base::FilePath new_path = profile_manager->GenerateNextProfileDirectoryPath();
|
| - base::RunLoop run_loop;
|
| - profile_manager->CreateProfileAsync(
|
| - new_path, base::Bind(&OnUnblockOnProfileCreation, &run_loop),
|
| - base::string16(), std::string(), std::string());
|
|
|
| // Run the message loop to allow profile creation to take place; the loop is
|
| // terminated by OnUnblockOnProfileCreation when the profile is created.
|
| @@ -329,7 +216,6 @@
|
| ASSERT_EQ(2u, storage.GetNumberOfProfiles());
|
|
|
| // Delete all profiles.
|
| - MultipleProfileDeletionObserver profile_deletion_observer(2u);
|
| std::vector<ProfileAttributesEntry*> entries =
|
| storage.GetAllProfilesAttributes();
|
| std::vector<base::FilePath> old_profile_paths;
|
| @@ -337,10 +223,12 @@
|
| base::FilePath profile_path = entry->GetPath();
|
| EXPECT_FALSE(profile_path.empty());
|
| profile_manager->ScheduleProfileForDeletion(
|
| - profile_path, profile_deletion_observer.QuitAttemptClosure());
|
| + profile_path, ProfileManager::CreateCallback());
|
| old_profile_paths.push_back(profile_path);
|
| }
|
| - profile_deletion_observer.Wait();
|
| +
|
| + // Spin things so deletion can take place.
|
| + content::RunAllPendingInMessageLoop();
|
|
|
| // Make sure a new profile was created automatically.
|
| EXPECT_EQ(1u, storage.GetNumberOfProfiles());
|
| @@ -353,7 +241,7 @@
|
| Profile* last_used = ProfileManager::GetLastUsedProfile();
|
| EXPECT_EQ(new_profile_path, last_used->GetPath());
|
| }
|
| -#endif // !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
|
| +#endif // OS_MACOSX
|
|
|
| #if defined(OS_CHROMEOS)
|
|
|
|
|