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