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