C++程序  |  49行  |  1.74 KB

// 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_