| Index: chrome/browser/ui/unload_controller.cc | 
| diff --git a/chrome/browser/ui/unload_controller.cc b/chrome/browser/ui/unload_controller.cc | 
| index 8da59883131c958fbd7a16fe9daa400225b43eb7..7a30244ff82a5b5d2a596bc747714e12bc18e913 100644 | 
| --- a/chrome/browser/ui/unload_controller.cc | 
| +++ b/chrome/browser/ui/unload_controller.cc | 
| @@ -291,6 +291,9 @@ void UnloadController::TabDetachedImpl(content::WebContents* contents) { | 
| } | 
|  | 
| void UnloadController::ProcessPendingTabs() { | 
| +  // Cancel posted/queued ProcessPendingTabs task if there is any. | 
| +  weak_factory_.InvalidateWeakPtrs(); | 
| + | 
| if (!is_attempting_to_close_browser_) { | 
| // Because we might invoke this after a delay it's possible for the value of | 
| // is_attempting_to_close_browser_ to have changed since we scheduled the | 
| @@ -298,7 +301,7 @@ void UnloadController::ProcessPendingTabs() { | 
| return; | 
| } | 
|  | 
| -  if (HasCompletedUnloadProcessing()) { | 
| +  if (HasCompletedUnloadProcessing() && !TabsNeedBeforeUnloadFired()) { | 
| // We've finished all the unload events and can proceed to close the | 
| // browser. | 
| browser_->OnWindowClosing(); | 
| @@ -379,6 +382,9 @@ void UnloadController::ClearUnloadState(content::WebContents* web_contents, | 
| if (process_now) { | 
| ProcessPendingTabs(); | 
| } else { | 
| +      // Do not post a new task if there is already any. | 
| +      if (weak_factory_.HasWeakPtrs()) | 
| +        return; | 
| base::ThreadTaskRunnerHandle::Get()->PostTask( | 
| FROM_HERE, base::Bind(&UnloadController::ProcessPendingTabs, | 
| weak_factory_.GetWeakPtr())); | 
|  |