Index: chrome/browser/lifetime/browser_close_manager.cc |
diff --git a/chrome/browser/lifetime/browser_close_manager.cc b/chrome/browser/lifetime/browser_close_manager.cc |
index 234eeb484b6b531581a8d97c5c6efa8bae555a2e..5d35dcb1d48dfe0f48de1e0d9e41371923b26122 100644 |
--- a/chrome/browser/lifetime/browser_close_manager.cc |
+++ b/chrome/browser/lifetime/browser_close_manager.cc |
@@ -4,6 +4,10 @@ |
#include "chrome/browser/lifetime/browser_close_manager.h" |
+#include <algorithm> |
+#include <iterator> |
+#include <vector> |
+ |
#include "build/build_config.h" |
#include "chrome/browser/background/background_mode_manager.h" |
#include "chrome/browser/browser_process.h" |
@@ -12,7 +16,6 @@ |
#include "chrome/browser/download/download_service_factory.h" |
#include "chrome/browser/profiles/profile_manager.h" |
#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_iterator.h" |
#include "chrome/browser/ui/browser_list.h" |
#include "chrome/browser/ui/browser_window.h" |
#include "chrome/browser/ui/chrome_pages.h" |
@@ -56,8 +59,8 @@ void BrowserCloseManager::StartClosingBrowsers() { |
void BrowserCloseManager::CancelBrowserClose() { |
browser_shutdown::SetTryingToQuit(false); |
- for (chrome::BrowserIterator it; !it.done(); it.Next()) { |
- it->ResetBeforeUnloadHandlers(); |
+ for (auto* browser : *BrowserList::GetInstance()) { |
+ browser->ResetBeforeUnloadHandlers(); |
} |
} |
@@ -67,10 +70,10 @@ void BrowserCloseManager::TryToCloseBrowsers() { |
// stop closing. CallBeforeUnloadHandlers prompts the user and calls |
// OnBrowserReportCloseable with the result. If the user confirms the close, |
// this will trigger TryToCloseBrowsers to try again. |
- for (chrome::BrowserIterator it; !it.done(); it.Next()) { |
- if (it->CallBeforeUnloadHandlers( |
+ for (auto* browser : *BrowserList::GetInstance()) { |
+ if (browser->CallBeforeUnloadHandlers( |
base::Bind(&BrowserCloseManager::OnBrowserReportCloseable, this))) { |
- current_browser_ = *it; |
+ current_browser_ = browser; |
return; |
} |
} |
@@ -150,16 +153,19 @@ void BrowserCloseManager::CloseBrowsers() { |
background_mode_manager->SuspendBackgroundMode(); |
} |
+ // Make a copy of the BrowserList to simplify the case where we need to |
+ // destroy a Browser during the loop. |
+ std::vector<Browser*> browser_list_copy; |
+ std::copy(BrowserList::GetInstance()->begin(), |
+ BrowserList::GetInstance()->end(), |
+ std::back_inserter(browser_list_copy)); |
+ |
bool session_ending = |
browser_shutdown::GetShutdownType() == browser_shutdown::END_SESSION; |
- for (scoped_ptr<chrome::BrowserIterator> it_ptr( |
- new chrome::BrowserIterator()); |
- !it_ptr->done();) { |
- Browser* browser = **it_ptr; |
+ |
+ for (auto* browser : browser_list_copy) { |
browser->window()->Close(); |
- if (!session_ending) { |
- it_ptr->Next(); |
- } else { |
+ if (session_ending) { |
// This path is hit during logoff/power-down. In this case we won't get |
// a final message and so we force the browser to be deleted. |
// Close doesn't immediately destroy the browser |
@@ -170,13 +176,10 @@ void BrowserCloseManager::CloseBrowsers() { |
while (browser->tab_strip_model()->count()) |
delete browser->tab_strip_model()->GetWebContentsAt(0); |
browser->window()->DestroyBrowser(); |
- it_ptr.reset(new chrome::BrowserIterator()); |
- if (!it_ptr->done() && browser == **it_ptr) { |
- // Destroying the browser should have removed it from the browser list. |
- // We should never get here. |
- NOTREACHED(); |
- return; |
- } |
+ // Destroying the browser should have removed it from the browser list. |
+ DCHECK(BrowserList::GetInstance()->end() == |
+ std::find(BrowserList::GetInstance()->begin(), |
+ BrowserList::GetInstance()->end(), browser)); |
} |
} |
} |