| Index: chrome/browser/ui/browser_list.cc | 
| diff --git a/chrome/browser/ui/browser_list.cc b/chrome/browser/ui/browser_list.cc | 
| index 000c4c6210db311e0600ad9cac30d7a454e833c8..851a9f8ca791e33639009faadca239dc3ef2017c 100644 | 
| --- a/chrome/browser/ui/browser_list.cc | 
| +++ b/chrome/browser/ui/browser_list.cc | 
| @@ -6,6 +6,7 @@ | 
|  | 
| #include <algorithm> | 
|  | 
| +#include "base/auto_reset.h" | 
| #include "base/logging.h" | 
| #include "chrome/browser/browser_process.h" | 
| #include "chrome/browser/browser_shutdown.h" | 
| @@ -116,6 +117,7 @@ void BrowserList::RemoveObserver(chrome::BrowserListObserver* observer) { | 
| observers_.Get().RemoveObserver(observer); | 
| } | 
|  | 
| +// static | 
| void BrowserList::CloseAllBrowsersWithProfile(Profile* profile) { | 
| BrowserVector browsers_to_close; | 
| for (chrome::BrowserIterator it; !it.done(); it.Next()) { | 
| @@ -130,6 +132,64 @@ void BrowserList::CloseAllBrowsersWithProfile(Profile* profile) { | 
| } | 
|  | 
| // static | 
| +void BrowserList::CloseAllBrowsersWithProfile(Profile* profile, | 
| +    const base::Callback<void(const base::FilePath&)>& on_close_success) { | 
| +  BrowserVector browsers_to_close; | 
| +  for (chrome::BrowserIterator it; !it.done(); it.Next()) { | 
| +    if (it->profile()->GetOriginalProfile() == profile->GetOriginalProfile()) | 
| +      browsers_to_close.push_back(*it); | 
| +  } | 
| + | 
| +  TryToCloseBrowserList(browsers_to_close, | 
| +                        on_close_success, | 
| +                        profile->GetPath()); | 
| +} | 
| + | 
| +// static | 
| +void BrowserList::TryToCloseBrowserList(const BrowserVector& browsers_to_close, | 
| +    const base::Callback<void(const base::FilePath&)>& on_close_success, | 
| +    const base::FilePath& profile_path) { | 
| +  for (BrowserVector::const_iterator it = browsers_to_close.begin(); | 
| +       it != browsers_to_close.end(); ++it) { | 
| +    if ((*it)->CallBeforeUnloadHandlers( | 
| +            base::Bind(&BrowserList::PostBeforeUnloadHandlers, | 
| +                       browsers_to_close, | 
| +                       on_close_success, | 
| +                       profile_path))) { | 
| +      return; | 
| +    } | 
| +  } | 
| + | 
| +  on_close_success.Run(profile_path); | 
| + | 
| +  for (BrowserVector::const_iterator it = browsers_to_close.begin(); | 
| +       it != browsers_to_close.end(); ++it) | 
| +    (*it)->window()->Close(); | 
| +} | 
| + | 
| +// static | 
| +void BrowserList::PostBeforeUnloadHandlers( | 
| +    const BrowserVector& browsers_to_close, | 
| +    const base::Callback<void(const base::FilePath&)>& on_close_success, | 
| +    const base::FilePath& profile_path, | 
| +    bool tab_close_confirmed) { | 
| +  // We need this bool to avoid infinite recursion when resetting the | 
| +  // BeforeUnload handlers, since doing that will trigger calls back to this | 
| +  // method for each affected window. | 
| +  static bool resetting_handlers = false; | 
| + | 
| +  if (tab_close_confirmed) { | 
| +    TryToCloseBrowserList(browsers_to_close, on_close_success, profile_path); | 
| +  } else if (!resetting_handlers) { | 
| +    base::AutoReset<bool> resetting_handlers_scoper(&resetting_handlers, true); | 
| +    for (BrowserVector::const_iterator it = browsers_to_close.begin(); | 
| +         it != browsers_to_close.end(); ++it) { | 
| +      (*it)->ResetBeforeUnloadHandlers(); | 
| +    } | 
| +  } | 
| +} | 
| + | 
| +// static | 
| void BrowserList::SetLastActive(Browser* browser) { | 
| content::RecordAction(UserMetricsAction("ActiveBrowserChanged")); | 
| BrowserList* browser_list = GetInstance(browser->host_desktop_type()); | 
|  |