profile_manager_browsertest.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/utf_string_conversions.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache_observer.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_list.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An observer that returns back to test code after a new profile is 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// initialized. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OnUnblockOnProfileCreation(Profile* profile, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::CreateStatus status) { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status == Profile::CREATE_STATUS_INITIALIZED) 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileCreationComplete(Profile* profile, Profile::CreateStatus status) { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(status, Profile::CREATE_STATUS_FAIL); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No browser should have been created for this profile yet. 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::GetTotalBrowserCountForProfile(profile), 0U); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::GetTotalBrowserCount(), 1U); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status == Profile::CREATE_STATUS_INITIALIZED) 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProfileRemovalObserver : public ProfileInfoCacheObserver { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileRemovalObserver() { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_browser_process->profile_manager()->GetProfileInfoCache().AddObserver( 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ProfileRemovalObserver() { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_browser_process->profile_manager()->GetProfileInfoCache().RemoveObserver( 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string last_used_profile_name() { return last_used_profile_name_; } 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ProfileInfoCacheObserver overrides: 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnProfileAdded(const base::FilePath& profile_path) OVERRIDE {} 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnProfileWillBeRemoved( 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& profile_path) OVERRIDE { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_used_profile_name_ = g_browser_process->local_state()->GetString( 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kProfileLastUsed); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnProfileWasRemoved(const base::FilePath& profile_path, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& profile_name) OVERRIDE {} 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnProfileNameChanged(const base::FilePath& profile_path, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& old_profile_name) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERRIDE {} 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnProfileAvatarChanged(const base::FilePath& profile_path) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERRIDE {} 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string last_used_profile_name_; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ProfileRemovalObserver); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains tests for the ProfileManager that require a heavyweight 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InProcessBrowserTest. These include tests involving profile deletion. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jeremy): crbug.com/103355 - These tests should be enabled on all 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// platforms. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileManagerBrowserTest : public InProcessBrowserTest { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delete single profile and make sure a new one is created. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DeleteSingletonProfile) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileRemovalObserver observer; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should start out with 1 profile. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(cache.GetNumberOfProfiles(), 1U); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete singleton profile. 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath singleton_profile_path = cache.GetPathOfProfileAtIndex(0); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(singleton_profile_path.empty()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->ScheduleProfileForDeletion(singleton_profile_path, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::HOST_DESKTOP_TYPE_NATIVE); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Spin things till profile is actually deleted. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure a new profile was created automatically. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cache.GetNumberOfProfiles(), 1U); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath new_profile_path = cache.GetPathOfProfileAtIndex(0); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(new_profile_path, singleton_profile_path); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that last used profile preference is set correctly. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* last_used = ProfileManager::GetLastUsedProfile(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(new_profile_path, last_used->GetPath()); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the last used profile was set correctly before the notification 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // was sent. 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string last_used_profile_name = 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_used->GetPath().BaseName().MaybeAsASCII(); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(last_used_profile_name, observer.last_used_profile_name()); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delete all profiles in a multi profile setup and make sure a new one is 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// created. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Crashes/CHECKs. See crbug.com/104851 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DISABLED_DeleteAllProfiles) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create an additional profile. 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath new_path = profile_manager->GenerateNextProfileDirectoryPath(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->CreateProfileAsync(new_path, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&OnUnblockOnProfileCreation), 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16(), string16(), false); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Spin to allow profile creation to take place, loop is terminated 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by OnUnblockOnProfileCreation when the profile is created. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(cache.GetNumberOfProfiles(), 2U); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete all profiles. 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath profile_path1 = cache.GetPathOfProfileAtIndex(0); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath profile_path2 = cache.GetPathOfProfileAtIndex(1); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(profile_path1.empty()); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(profile_path2.empty()); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->ScheduleProfileForDeletion(profile_path1, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::HOST_DESKTOP_TYPE_NATIVE); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->ScheduleProfileForDeletion(profile_path2, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::HOST_DESKTOP_TYPE_NATIVE); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Spin things so deletion can take place. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure a new profile was created automatically. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cache.GetNumberOfProfiles(), 1U); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath new_profile_path = cache.GetPathOfProfileAtIndex(0); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(new_profile_path, profile_path1); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(new_profile_path, profile_path2); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that last used profile preference is set correctly. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* last_used = ProfileManager::GetLastUsedProfile(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(new_profile_path, last_used->GetPath()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // OS_MACOSX 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Times out (http://crbug.com/159002) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISABLED_CreateProfileWithCallback) { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(profile_manager->GetNumberOfProfiles(), 1U); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::GetTotalBrowserCount(), 1U); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a profile, make sure callback is invoked before any callbacks are 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // invoked (so they can do things like sign in the profile, etc). 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileManager::CreateMultiProfileAsync( 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16(), // name 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16(), // icon url 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(ProfileCreationComplete), 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::GetActiveDesktop(), 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for profile to finish loading. 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(profile_manager->GetNumberOfProfiles(), 2U); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::GetTotalBrowserCount(), 2U); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now close all browser windows. 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<Profile*> profiles = profile_manager->GetLoadedProfiles(); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::vector<Profile*>::const_iterator it = profiles.begin(); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != profiles.end(); ++it) { 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserList::CloseAllBrowsersWithProfile(*it); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 192