Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(670)

Unified Diff: chrome/browser/ui/unload_controller.h

Issue 11016023: Quickly close tabs/window with long-running unload handlers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Make UnloadDetachedHandler a delegate for all detached tabs. Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/ui/unload_controller.cc » ('j') | chrome/browser/ui/unload_controller.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/unload_controller.h
diff --git a/chrome/browser/ui/unload_controller.h b/chrome/browser/ui/unload_controller.h
index fb51668b0554bd67d563d351b8c5db5ee7081f75..048005360461aa5205ac9a4dab1941ba8eeb0042 100644
--- a/chrome/browser/ui/unload_controller.h
+++ b/chrome/browser/ui/unload_controller.h
@@ -7,6 +7,7 @@
#include <set>
+#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
#include "content/public/browser/notification_observer.h"
@@ -23,7 +24,35 @@ class WebContents;
}
namespace chrome {
-
+class UnloadDetachedHandler;
+
+// UnloadController manages closing tabs and windows -- especially in
+// regards to beforeunload handlers (proceed/cancel dialogs) and
+// unload handlers (no user interaction).
+//
+// Typical flow of closing a tab:
+// 1. Browser calls |CanCloseContents()|.
+// If true, browser calls contents::CloseWebContents().
+// 2. WebContents notifies us via its delegate and BeforeUnloadFired()
+// that the beforeunload handler was run. If the user allowed the
+// close to continue, we hand-off running the unload handler to
+// UnloadDetachedHandler which decides if the tab can be unloaded
+// in the background. If it can, the tab is removed from the tab
+// strip at this point.
+//
+// Typical flow of closing a window:
+// 1. Browser calls |ShouldCloseWindow()|.
+// If beforeunload/unload handlers need to run, |UnloadController| returns
+// false and calls |ProcessPendingTabs()| (private method).
+// 2. For each tab with a beforeunload/unload handler, |ProcessPendingTabs()|
+// calls |web_contents->OnCloseStarted()|
+// and |web_contents->GetRenderViewHost()->FirePageBeforeUnload()|.
+// 3. |UnloadController| waits for any tabs from the "closing a tab" flow above
+// to finish detached unloads.
+// 4. For each tab with a beforeunload/unload handler, |ProcessPendingTabs()|
+// calls |web_contents->GetRenderViewHost()->ClosePage()|.
+// 5. |ProcessPendingTabs()| calls |browser_->OnWindowClosing()|.
+//
class UnloadController : public content::NotificationObserver,
public TabStripModelObserver {
public:
@@ -114,11 +143,11 @@ class UnloadController : public content::NotificationObserver,
content::NotificationRegistrar registrar_;
- // Tracks tabs that need there beforeunload event fired before we can
+ // Tracks tabs that need their beforeunload event fired before we can
// close the browser. Only gets populated when we try to close the browser.
UnloadListenerSet tabs_needing_before_unload_fired_;
- // Tracks tabs that need there unload event fired before we can
+ // Tracks tabs that need their unload event fired before we can
// close the browser. Only gets populated when we try to close the browser.
UnloadListenerSet tabs_needing_unload_fired_;
@@ -128,6 +157,9 @@ class UnloadController : public content::NotificationObserver,
// Browser window isn't just immediately closed.
bool is_attempting_to_close_browser_;
+ // Allow unload handlers to run without holding up the UI.
+ scoped_ptr<UnloadDetachedHandler> unload_detached_handler_;
+
base::WeakPtrFactory<UnloadController> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(UnloadController);
« no previous file with comments | « no previous file | chrome/browser/ui/unload_controller.cc » ('j') | chrome/browser/ui/unload_controller.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698