Chromium Code Reviews| 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/command_line.h" | 6 #include "base/command_line.h" |
| 7 #include "base/prefs/pref_service.h" | 7 #include "base/prefs/pref_service.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "chrome/browser/password_manager/password_store_factory.h" | 9 #include "chrome/browser/password_manager/password_store_factory.h" |
| 10 #include "chrome/browser/profiles/profile_info_cache.h" | 10 #include "chrome/browser/profiles/profile_info_cache.h" |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 33 #include "chromeos/chromeos_switches.h" | 33 #include "chromeos/chromeos_switches.h" |
| 34 #include "testing/gtest/include/gtest/gtest.h" | 34 #include "testing/gtest/include/gtest/gtest.h" |
| 35 #endif | 35 #endif |
| 36 | 36 |
| 37 namespace { | 37 namespace { |
| 38 | 38 |
| 39 const ProfileManager::CreateCallback kOnProfileSwitchDoNothing; | 39 const ProfileManager::CreateCallback kOnProfileSwitchDoNothing; |
| 40 | 40 |
| 41 // An observer that returns back to test code after a new profile is | 41 // An observer that returns back to test code after a new profile is |
| 42 // initialized. | 42 // initialized. |
| 43 void OnUnblockOnProfileCreation(Profile* profile, | 43 void OnUnblockOnProfileCreation(base::RunLoop* run_loop, |
| 44 Profile* profile, | |
| 44 Profile::CreateStatus status) { | 45 Profile::CreateStatus status) { |
| 45 if (status == Profile::CREATE_STATUS_INITIALIZED) | 46 if (status == Profile::CREATE_STATUS_INITIALIZED) |
| 46 base::MessageLoop::current()->Quit(); | 47 run_loop->Quit(); |
| 47 } | 48 } |
| 48 | 49 |
| 49 void ProfileCreationComplete(Profile* profile, Profile::CreateStatus status) { | 50 void ProfileCreationComplete(Profile* profile, Profile::CreateStatus status) { |
| 50 ASSERT_NE(status, Profile::CREATE_STATUS_LOCAL_FAIL); | 51 ASSERT_NE(status, Profile::CREATE_STATUS_LOCAL_FAIL); |
| 51 ASSERT_NE(status, Profile::CREATE_STATUS_REMOTE_FAIL); | 52 ASSERT_NE(status, Profile::CREATE_STATUS_REMOTE_FAIL); |
| 52 // No browser should have been created for this profile yet. | 53 // No browser should have been created for this profile yet. |
| 53 EXPECT_EQ(chrome::GetTotalBrowserCountForProfile(profile), 0U); | 54 EXPECT_EQ(chrome::GetTotalBrowserCountForProfile(profile), 0U); |
| 54 EXPECT_EQ(chrome::GetTotalBrowserCount(), 1U); | 55 EXPECT_EQ(chrome::GetTotalBrowserCount(), 1U); |
| 55 if (status == Profile::CREATE_STATUS_INITIALIZED) | 56 if (status == Profile::CREATE_STATUS_INITIALIZED) |
| 56 base::MessageLoop::current()->Quit(); | 57 base::MessageLoop::current()->Quit(); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 84 } | 85 } |
| 85 | 86 |
| 86 private: | 87 private: |
| 87 std::string last_used_profile_name_; | 88 std::string last_used_profile_name_; |
| 88 | 89 |
| 89 DISALLOW_COPY_AND_ASSIGN(ProfileRemovalObserver); | 90 DISALLOW_COPY_AND_ASSIGN(ProfileRemovalObserver); |
| 90 }; | 91 }; |
| 91 | 92 |
| 92 // The class serves to retrieve passwords from PasswordStore asynchronously. It | 93 // The class serves to retrieve passwords from PasswordStore asynchronously. It |
| 93 // used by ProfileManagerBrowserTest.DeletePasswords on some platforms. | 94 // used by ProfileManagerBrowserTest.DeletePasswords on some platforms. |
| 94 class PasswordStoreConsumerVerifier : | 95 class PasswordStoreConsumerVerifier |
| 95 public password_manager::PasswordStoreConsumer { | 96 : public password_manager::PasswordStoreConsumer { |
| 96 public: | 97 public: |
| 97 PasswordStoreConsumerVerifier() : called_(false) {} | |
| 98 | |
| 99 void OnGetPasswordStoreResults( | 98 void OnGetPasswordStoreResults( |
| 100 ScopedVector<autofill::PasswordForm> results) override { | 99 ScopedVector<autofill::PasswordForm> results) override { |
| 101 EXPECT_FALSE(called_); | |
| 102 called_ = true; | |
| 103 password_entries_.swap(results); | 100 password_entries_.swap(results); |
| 101 run_loop_.Quit(); | |
| 104 } | 102 } |
| 105 | 103 |
| 106 bool IsCalled() const { return called_; } | 104 void Wait() { |
| 105 run_loop_.Run(); | |
| 106 } | |
| 107 | 107 |
| 108 const std::vector<autofill::PasswordForm*>& GetPasswords() const { | 108 const std::vector<autofill::PasswordForm*>& GetPasswords() const { |
| 109 return password_entries_.get(); | 109 return password_entries_.get(); |
| 110 } | 110 } |
| 111 | |
| 111 private: | 112 private: |
| 113 base::RunLoop run_loop_; | |
| 112 ScopedVector<autofill::PasswordForm> password_entries_; | 114 ScopedVector<autofill::PasswordForm> password_entries_; |
| 113 bool called_; | |
| 114 }; | 115 }; |
| 115 | 116 |
| 116 static base::FilePath GetFirstNonSigninProfile(const ProfileInfoCache& cache) { | 117 static base::FilePath GetFirstNonSigninProfile(const ProfileInfoCache& cache) { |
| 117 #if defined(OS_CHROMEOS) | 118 #if defined(OS_CHROMEOS) |
| 118 const base::FilePath signin_path = | 119 const base::FilePath signin_path = |
| 119 chromeos::ProfileHelper::GetSigninProfileDir(); | 120 chromeos::ProfileHelper::GetSigninProfileDir(); |
| 120 size_t i, profile_num = cache.GetNumberOfProfiles(); | 121 size_t i, profile_num = cache.GetNumberOfProfiles(); |
| 121 for (i = 0; i != profile_num; ++i) { | 122 for (i = 0; i != profile_num; ++i) { |
| 122 base::FilePath profile_path = cache.GetPathOfProfileAtIndex(i); | 123 base::FilePath profile_path = cache.GetPathOfProfileAtIndex(i); |
| 123 if (profile_path != signin_path) | 124 if (profile_path != signin_path) |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 153 ProfileManager* profile_manager = g_browser_process->profile_manager(); | 154 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| 154 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); | 155 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); |
| 155 ProfileRemovalObserver observer; | 156 ProfileRemovalObserver observer; |
| 156 | 157 |
| 157 // We should start out with 1 profile. | 158 // We should start out with 1 profile. |
| 158 ASSERT_EQ(cache.GetNumberOfProfiles(), 1U); | 159 ASSERT_EQ(cache.GetNumberOfProfiles(), 1U); |
| 159 | 160 |
| 160 // Delete singleton profile. | 161 // Delete singleton profile. |
| 161 base::FilePath singleton_profile_path = cache.GetPathOfProfileAtIndex(0); | 162 base::FilePath singleton_profile_path = cache.GetPathOfProfileAtIndex(0); |
| 162 EXPECT_FALSE(singleton_profile_path.empty()); | 163 EXPECT_FALSE(singleton_profile_path.empty()); |
| 163 profile_manager->ScheduleProfileForDeletion(singleton_profile_path, | 164 base::RunLoop run_loop; |
| 164 ProfileManager::CreateCallback()); | 165 profile_manager->ScheduleProfileForDeletion( |
| 166 singleton_profile_path, | |
| 167 base::Bind(&OnUnblockOnProfileCreation, &run_loop)); | |
| 165 | 168 |
| 166 // Spin things till profile is actually deleted. | 169 // Spin things till profile is actually deleted. |
|
Mike Lerman
2015/03/02 18:37:38
Replace Spin with Wait
Bernhard Bauer
2015/03/02 21:06:45
Done.
| |
| 167 content::RunAllPendingInMessageLoop(); | 170 run_loop.Run(); |
| 168 | 171 |
| 169 // Make sure a new profile was created automatically. | 172 // Make sure a new profile was created automatically. |
| 170 EXPECT_EQ(cache.GetNumberOfProfiles(), 1U); | 173 EXPECT_EQ(cache.GetNumberOfProfiles(), 1U); |
| 171 base::FilePath new_profile_path = cache.GetPathOfProfileAtIndex(0); | 174 base::FilePath new_profile_path = cache.GetPathOfProfileAtIndex(0); |
| 172 EXPECT_NE(new_profile_path, singleton_profile_path); | 175 EXPECT_NE(new_profile_path.value(), singleton_profile_path.value()); |
| 173 | 176 |
| 174 // Make sure that last used profile preference is set correctly. | 177 // Make sure that last used profile preference is set correctly. |
| 175 Profile* last_used = ProfileManager::GetLastUsedProfile(); | 178 Profile* last_used = ProfileManager::GetLastUsedProfile(); |
| 176 EXPECT_EQ(new_profile_path, last_used->GetPath()); | 179 EXPECT_EQ(new_profile_path.value(), last_used->GetPath().value()); |
| 177 | 180 |
| 178 // Make sure the last used profile was set correctly before the notification | 181 // Make sure the last used profile was set correctly before the notification |
| 179 // was sent. | 182 // was sent. |
| 180 std::string last_used_profile_name = | 183 std::string last_used_profile_name = |
| 181 last_used->GetPath().BaseName().MaybeAsASCII(); | 184 last_used->GetPath().BaseName().MaybeAsASCII(); |
| 182 EXPECT_EQ(last_used_profile_name, observer.last_used_profile_name()); | 185 EXPECT_EQ(last_used_profile_name, observer.last_used_profile_name()); |
| 183 } | 186 } |
| 184 | 187 |
| 185 // Delete all profiles in a multi profile setup and make sure a new one is | 188 // Delete all profiles in a multi profile setup and make sure a new one is |
| 186 // created. | 189 // created. |
| 187 // Crashes/CHECKs. See crbug.com/104851 | 190 // Crashes/CHECKs. See crbug.com/104851 |
| 188 IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DISABLED_DeleteAllProfiles) { | 191 IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DISABLED_DeleteAllProfiles) { |
| 189 ProfileManager* profile_manager = g_browser_process->profile_manager(); | 192 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| 190 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); | 193 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); |
| 191 | 194 |
| 192 // Create an additional profile. | 195 // Create an additional profile. |
| 193 base::FilePath new_path = profile_manager->GenerateNextProfileDirectoryPath(); | 196 base::FilePath new_path = profile_manager->GenerateNextProfileDirectoryPath(); |
| 194 profile_manager->CreateProfileAsync(new_path, | 197 base::RunLoop run_loop; |
| 195 base::Bind(&OnUnblockOnProfileCreation), | 198 profile_manager->CreateProfileAsync( |
| 196 base::string16(), base::string16(), | 199 new_path, base::Bind(&OnUnblockOnProfileCreation, &run_loop), |
| 197 std::string()); | 200 base::string16(), base::string16(), std::string()); |
| 198 | 201 |
| 199 // Spin to allow profile creation to take place, loop is terminated | 202 // Spin to allow profile creation to take place, loop is terminated |
| 200 // by OnUnblockOnProfileCreation when the profile is created. | 203 // by OnUnblockOnProfileCreation when the profile is created. |
| 201 content::RunMessageLoop(); | 204 run_loop.Run(); |
| 202 | 205 |
| 203 ASSERT_EQ(cache.GetNumberOfProfiles(), 2U); | 206 ASSERT_EQ(cache.GetNumberOfProfiles(), 2U); |
| 204 | 207 |
| 205 // Delete all profiles. | 208 // Delete all profiles. |
| 206 base::FilePath profile_path1 = cache.GetPathOfProfileAtIndex(0); | 209 base::FilePath profile_path1 = cache.GetPathOfProfileAtIndex(0); |
| 207 base::FilePath profile_path2 = cache.GetPathOfProfileAtIndex(1); | 210 base::FilePath profile_path2 = cache.GetPathOfProfileAtIndex(1); |
| 208 EXPECT_FALSE(profile_path1.empty()); | 211 EXPECT_FALSE(profile_path1.empty()); |
| 209 EXPECT_FALSE(profile_path2.empty()); | 212 EXPECT_FALSE(profile_path2.empty()); |
| 210 profile_manager->ScheduleProfileForDeletion(profile_path1, | 213 profile_manager->ScheduleProfileForDeletion(profile_path1, |
| 211 ProfileManager::CreateCallback()); | 214 ProfileManager::CreateCallback()); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 299 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); | 302 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); |
| 300 size_t initial_profile_count = profile_manager->GetNumberOfProfiles(); | 303 size_t initial_profile_count = profile_manager->GetNumberOfProfiles(); |
| 301 base::FilePath path_profile1 = GetFirstNonSigninProfile(cache); | 304 base::FilePath path_profile1 = GetFirstNonSigninProfile(cache); |
| 302 | 305 |
| 303 ASSERT_NE(0U, initial_profile_count); | 306 ASSERT_NE(0U, initial_profile_count); |
| 304 EXPECT_EQ(1U, chrome::GetTotalBrowserCount()); | 307 EXPECT_EQ(1U, chrome::GetTotalBrowserCount()); |
| 305 | 308 |
| 306 // Create an additional profile. | 309 // Create an additional profile. |
| 307 base::FilePath path_profile2 = | 310 base::FilePath path_profile2 = |
| 308 profile_manager->GenerateNextProfileDirectoryPath(); | 311 profile_manager->GenerateNextProfileDirectoryPath(); |
| 309 profile_manager->CreateProfileAsync(path_profile2, | 312 base::RunLoop run_loop; |
| 310 base::Bind(&OnUnblockOnProfileCreation), | 313 profile_manager->CreateProfileAsync( |
| 311 base::string16(), base::string16(), | 314 path_profile2, base::Bind(&OnUnblockOnProfileCreation, &run_loop), |
| 312 std::string()); | 315 base::string16(), base::string16(), std::string()); |
| 313 | 316 |
| 314 // Spin to allow profile creation to take place, loop is terminated | 317 // Spin to allow profile creation to take place, loop is terminated |
|
Mike Lerman
2015/03/02 18:37:38
Replace "Spin" with "Wait", or somehow note that w
Bernhard Bauer
2015/03/02 21:06:45
Done. (I used "run the message loop", as "spin" is
| |
| 315 // by OnUnblockOnProfileCreation when the profile is created. | 318 // by OnUnblockOnProfileCreation when the profile is created. |
| 316 content::RunMessageLoop(); | 319 run_loop.Run(); |
| 317 | 320 |
| 318 chrome::HostDesktopType desktop_type = chrome::GetActiveDesktop(); | 321 chrome::HostDesktopType desktop_type = chrome::GetActiveDesktop(); |
| 319 BrowserList* browser_list = BrowserList::GetInstance(desktop_type); | 322 BrowserList* browser_list = BrowserList::GetInstance(desktop_type); |
| 320 ASSERT_EQ(initial_profile_count + 1, cache.GetNumberOfProfiles()); | 323 ASSERT_EQ(initial_profile_count + 1, cache.GetNumberOfProfiles()); |
| 321 EXPECT_EQ(1U, browser_list->size()); | 324 EXPECT_EQ(1U, browser_list->size()); |
| 322 | 325 |
| 323 // Open a browser window for the first profile. | 326 // Open a browser window for the first profile. |
| 324 profiles::SwitchToProfile(path_profile1, desktop_type, false, | 327 profiles::SwitchToProfile(path_profile1, desktop_type, false, |
| 325 kOnProfileSwitchDoNothing, | 328 kOnProfileSwitchDoNothing, |
| 326 ProfileMetrics::SWITCH_PROFILE_ICON); | 329 ProfileMetrics::SWITCH_PROFILE_ICON); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 438 form.blacklisted_by_user = false; | 441 form.blacklisted_by_user = false; |
| 439 | 442 |
| 440 scoped_refptr<password_manager::PasswordStore> password_store = | 443 scoped_refptr<password_manager::PasswordStore> password_store = |
| 441 PasswordStoreFactory::GetForProfile( | 444 PasswordStoreFactory::GetForProfile( |
| 442 profile, ServiceAccessType::EXPLICIT_ACCESS).get(); | 445 profile, ServiceAccessType::EXPLICIT_ACCESS).get(); |
| 443 ASSERT_TRUE(password_store.get()); | 446 ASSERT_TRUE(password_store.get()); |
| 444 | 447 |
| 445 password_store->AddLogin(form); | 448 password_store->AddLogin(form); |
| 446 PasswordStoreConsumerVerifier verify_add; | 449 PasswordStoreConsumerVerifier verify_add; |
| 447 password_store->GetAutofillableLogins(&verify_add); | 450 password_store->GetAutofillableLogins(&verify_add); |
| 451 verify_add.Wait(); | |
| 452 EXPECT_EQ(1u, verify_add.GetPasswords().size()); | |
| 448 | 453 |
| 449 ProfileManager* profile_manager = g_browser_process->profile_manager(); | 454 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| 450 profile_manager->ScheduleProfileForDeletion(profile->GetPath(), | 455 base::RunLoop run_loop; |
| 451 ProfileManager::CreateCallback()); | 456 profile_manager->ScheduleProfileForDeletion( |
| 452 content::RunAllPendingInMessageLoop(); | 457 profile->GetPath(), base::Bind(&OnUnblockOnProfileCreation, &run_loop)); |
| 458 run_loop.Run(); | |
| 459 | |
| 453 PasswordStoreConsumerVerifier verify_delete; | 460 PasswordStoreConsumerVerifier verify_delete; |
| 454 password_store->GetAutofillableLogins(&verify_delete); | 461 password_store->GetAutofillableLogins(&verify_delete); |
| 455 | 462 verify_delete.Wait(); |
| 456 // Run the password background thread. | |
| 457 base::RunLoop run_loop; | |
| 458 base::Closure task = base::Bind( | |
| 459 base::IgnoreResult(&content::BrowserThread::PostTask), | |
| 460 content::BrowserThread::UI, | |
| 461 FROM_HERE, | |
| 462 run_loop.QuitClosure()); | |
| 463 EXPECT_TRUE(password_store->ScheduleTask(task)); | |
| 464 run_loop.Run(); | |
| 465 | |
| 466 EXPECT_TRUE(verify_add.IsCalled()); | |
| 467 EXPECT_EQ(1u, verify_add.GetPasswords().size()); | |
| 468 EXPECT_TRUE(verify_delete.IsCalled()); | |
| 469 EXPECT_EQ(0u, verify_delete.GetPasswords().size()); | 463 EXPECT_EQ(0u, verify_delete.GetPasswords().size()); |
| 470 } | 464 } |
| 471 #endif // !defined(OS_WIN) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS) | 465 #endif // !defined(OS_WIN) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS) |
| OLD | NEW |