| Index: chrome/browser/instant/instant_unload_handler.h
|
| diff --git a/chrome/browser/instant/instant_unload_handler.h b/chrome/browser/instant/instant_unload_handler.h
|
| index 89562f0bfc0c8a135a31460eb2e0d8883aa71ef2..deaf0b7438368efa239388d9bd74e02d5f167c08 100644
|
| --- a/chrome/browser/instant/instant_unload_handler.h
|
| +++ b/chrome/browser/instant/instant_unload_handler.h
|
| @@ -6,6 +6,7 @@
|
| #define CHROME_BROWSER_INSTANT_INSTANT_UNLOAD_HANDLER_H_
|
|
|
| #include "base/basictypes.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| #include "base/memory/scoped_vector.h"
|
|
|
| class Browser;
|
| @@ -14,29 +15,39 @@ namespace content {
|
| class WebContents;
|
| }
|
|
|
| -// InstantUnloadHandler ensures that the beforeunload and unload handlers are
|
| -// run when using Instant. When the user commits the Instant preview the
|
| -// existing WebContents is passed to RunUnloadListenersOrDestroy(). If the tab
|
| -// has no beforeunload or unload listeners, the tab is deleted; otherwise the
|
| -// beforeunload and unload listeners are executed. If the beforeunload listener
|
| -// shows a dialog the tab is added back to the tabstrip at its original location
|
| -// next to the Instant page.
|
| +// InstantUnloadHandler ensures that it runs the BeforeUnload/Unload Handlers
|
| +// (BUH) of a page if the page is replaced by an Instant overlay.
|
| +//
|
| +// Why is this needed? Say the user is looking at a page P. They then try to
|
| +// navigate to another page Q. Consider what happens with and without Instant:
|
| +//
|
| +// Without Instant: Before the navigation is committed, P's BUH are run. If P's
|
| +// BUH return a string (instead of the default null), the user is prompted to
|
| +// "Stay or Leave?". If the user clicks "Stay", the navigation is cancelled,
|
| +// and the user remains on P.
|
| +//
|
| +// With Instant: The navigation to Q has already happened, since Q is being
|
| +// shown as a preview (overlay). When the user "commits" the overlay, it's too
|
| +// late to cancel Q based on P's BUH. So, Instant just replaces P with Q and
|
| +// passes P to InstantUnloadHandler::RunUnloadListenersOrDestroy(). This class
|
| +// runs P's BUH in the background. If the "Stay or Leave?" dialog needs to be
|
| +// shown, it adds P back onto the tabstrip, next to Q. Otherwise, P is deleted.
|
| class InstantUnloadHandler {
|
| public:
|
| explicit InstantUnloadHandler(Browser* browser);
|
| ~InstantUnloadHandler();
|
|
|
| // See class description for details on what this does.
|
| - void RunUnloadListenersOrDestroy(content::WebContents* contents, int index);
|
| + void RunUnloadListenersOrDestroy(scoped_ptr<content::WebContents> contents,
|
| + int index);
|
|
|
| private:
|
| class WebContentsDelegateImpl;
|
|
|
| // Invoked if the tab is to be shown, at |index| on the tab strip. This
|
| - // happens if the before unload listener returns a string. Takes ownership of
|
| - // |delegate| and |contents|.
|
| + // happens if the beforeunload listener returns a string.
|
| void Activate(WebContentsDelegateImpl* delegate,
|
| - content::WebContents* contents,
|
| + scoped_ptr<content::WebContents> contents,
|
| int index);
|
|
|
| // Destroys the old tab. This is invoked if script tries to close the page.
|
|
|