| Index: chrome/browser/ui/browser.cc
|
| ===================================================================
|
| --- chrome/browser/ui/browser.cc (revision 71335)
|
| +++ chrome/browser/ui/browser.cc (working copy)
|
| @@ -2837,7 +2837,7 @@
|
| // waiting for unload to fire. Don't actually try to close the tab as it
|
| // will go down the slow shutdown path instead of the fast path of killing
|
| // all the renderer processes.
|
| - ClearUnloadState(source, true);
|
| + ClearUnloadState(source);
|
| return;
|
| }
|
|
|
| @@ -3198,10 +3198,12 @@
|
| switch (type.value) {
|
| case NotificationType::TAB_CONTENTS_DISCONNECTED:
|
| if (is_attempting_to_close_browser_) {
|
| - // Pass in false so that we delay processing. We need to delay the
|
| - // processing as it may close the tab, which is currently on the call
|
| - // stack above us.
|
| - ClearUnloadState(Source<TabContents>(source).ptr(), false);
|
| + // Need to do this asynchronously as it will close the tab, which is
|
| + // currently on the call stack above us.
|
| + MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + method_factory_.NewRunnableMethod(&Browser::ClearUnloadState,
|
| + Source<TabContents>(source).ptr()));
|
| }
|
| break;
|
|
|
| @@ -3858,7 +3860,7 @@
|
| if (tab->render_view_host()) {
|
| tab->render_view_host()->FirePageBeforeUnload(false);
|
| } else {
|
| - ClearUnloadState(tab, true);
|
| + ClearUnloadState(tab);
|
| }
|
| } else if (!tabs_needing_unload_fired_.empty()) {
|
| // We've finished firing all beforeunload events and can proceed with unload
|
| @@ -3875,7 +3877,7 @@
|
| if (tab->render_view_host()) {
|
| tab->render_view_host()->ClosePage(false, -1, -1);
|
| } else {
|
| - ClearUnloadState(tab, true);
|
| + ClearUnloadState(tab);
|
| }
|
| } else {
|
| NOTREACHED();
|
| @@ -3915,23 +3917,18 @@
|
| return false;
|
| }
|
|
|
| -void Browser::ClearUnloadState(TabContents* tab, bool process_now) {
|
| +void Browser::ClearUnloadState(TabContents* tab) {
|
| // Closing of browser could be canceled (via IsClosingPermitted) between the
|
| // time when request was initiated and when this method is called, so check
|
| // for is_attempting_to_close_browser_ flag before proceeding.
|
| if (is_attempting_to_close_browser_) {
|
| RemoveFromSet(&tabs_needing_before_unload_fired_, tab);
|
| RemoveFromSet(&tabs_needing_unload_fired_, tab);
|
| - if (process_now) {
|
| - ProcessPendingTabs();
|
| - } else {
|
| - MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - method_factory_.NewRunnableMethod(&Browser::ProcessPendingTabs));
|
| - }
|
| + ProcessPendingTabs();
|
| }
|
| }
|
|
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // Browser, In-progress download termination handling (private):
|
|
|
| @@ -4090,14 +4087,6 @@
|
| find_bar_controller_->ChangeTabContents(NULL);
|
| }
|
|
|
| - if (is_attempting_to_close_browser_) {
|
| - // If this is the last tab with unload handlers, then ProcessPendingTabs
|
| - // would call back into the TabStripModel (which is invoking this method on
|
| - // us). Avoid that by passing in false so that the call to
|
| - // ProcessPendingTabs is delayed.
|
| - ClearUnloadState(contents->tab_contents(), false);
|
| - }
|
| -
|
| registrar_.Remove(this, NotificationType::TAB_CONTENTS_DISCONNECTED,
|
| Source<TabContentsWrapper>(contents));
|
| }
|
|
|