| 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));
|
| }
|
| }
|
| }
|
|
|