Chromium Code Reviews| 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..c2784cc74060165bde5a09d286013becd9453a2f 100644 |
| --- a/chrome/browser/ui/unload_controller.h |
| +++ b/chrome/browser/ui/unload_controller.h |
| @@ -23,7 +23,34 @@ 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()|. |
|
Ben Goodger (Google)
2012/10/29 22:12:43
chrome::CloseWebContents()
slamm
2012/10/31 18:03:59
Done.
|
| +// 2. Browser calls |BeforeUnloadFired()| for tabs with beforeunload or unload |
|
Ben Goodger (Google)
2012/10/29 22:12:43
Technically, the WebContents calls BeforeUnloadFir
slamm
2012/10/31 18:03:59
Done. Your description is much better.
|
| +// handlers. If |proceed| is true, |UnloadController| hands-off the tab to |
| +// |UnloadDetachedHandler| to run the unload handler in the background. |
| +// |UnloadDetachedHandler| decides if the tab can unload in the background, |
| +// and removes it from the tab strip if it can. |
| +// |
| +// 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 +141,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 +155,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. |
| + UnloadDetachedHandler* const unload_detached_handler_; |
|
Ben Goodger (Google)
2012/10/29 22:12:43
We don't tend to use this type of const in chrome
slamm
2012/10/31 18:03:59
Changed to scoped_ptr.
|
| + |
| base::WeakPtrFactory<UnloadController> weak_factory_; |
| DISALLOW_COPY_AND_ASSIGN(UnloadController); |