// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_INSTANT_INSTANT_UNLOAD_HANDLER_H_
#define CHROME_BROWSER_INSTANT_INSTANT_UNLOAD_HANDLER_H_
#pragma once
#include "base/memory/scoped_vector.h"
class Browser;
class TabContentsWrapper;
// InstantUnloadHandler makes sure the before unload and unload handler is run
// when using instant. When the user commits the instant preview the existing
// TabContentsWrapper is passed to |RunUnloadListenersOrDestroy|. If the tab has
// no before unload or unload listener the tab is deleted, otherwise the before
// unload and unload listener is executed. If the before unload listener shows a
// dialog the tab is added back to the tabstrip at its original location next to
// the instant page.
class InstantUnloadHandler {
public:
explicit InstantUnloadHandler(Browser* browser);
~InstantUnloadHandler();
// See class description for details on what this does.
void RunUnloadListenersOrDestroy(TabContentsWrapper* tab_contents, int index);
private:
class TabContentsDelegateImpl;
// Invoked if the tab is to be shown. This happens if the before unload
// listener returns a string.
void Activate(TabContentsDelegateImpl* delegate);
// Destroys the old tab. This is invoked if script tries to close the page.
void Destroy(TabContentsDelegateImpl* delegate);
// TODO(sky): browser really needs to wait to close until there are no more
// tabs managed by InstantUnloadHandler.
Browser* browser_;
ScopedVector<TabContentsDelegateImpl> delegates_;
DISALLOW_COPY_AND_ASSIGN(InstantUnloadHandler);
};
#endif // CHROME_BROWSER_INSTANT_INSTANT_UNLOAD_HANDLER_H_