Home | History | Annotate | Download | only in tab_contents
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_TAB_CONTENTS_INFOBAR_DELEGATE_H_
      6 #define CHROME_BROWSER_TAB_CONTENTS_INFOBAR_DELEGATE_H_
      7 #pragma once
      8 
      9 #include "base/basictypes.h"
     10 #include "base/string16.h"
     11 #include "content/browser/tab_contents/navigation_controller.h"
     12 #include "webkit/glue/window_open_disposition.h"
     13 
     14 class ConfirmInfoBarDelegate;
     15 class ExtensionInfoBarDelegate;
     16 class InfoBar;
     17 class LinkInfoBarDelegate;
     18 class PluginInstallerInfoBarDelegate;
     19 class SkBitmap;
     20 class ThemeInstalledInfoBarDelegate;
     21 class TranslateInfoBarDelegate;
     22 
     23 // An interface implemented by objects wishing to control an InfoBar.
     24 // Implementing this interface is not sufficient to use an InfoBar, since it
     25 // does not map to a specific InfoBar type. Instead, you must implement either
     26 // LinkInfoBarDelegate or ConfirmInfoBarDelegate, or override with your own
     27 // delegate for your own InfoBar variety.
     28 //
     29 // --- WARNING ---
     30 // When creating your InfoBarDelegate subclass, it is recommended that you
     31 // design it such that you instantiate a brand new delegate for every call to
     32 // AddInfoBar, rather than re-using/sharing a delegate object. Otherwise,
     33 // you need to consider the fact that more than one InfoBar instance can exist
     34 // and reference the same delegate -- even though it is also true that we only
     35 // ever fully show one infobar (they don't stack). The dual-references occur
     36 // because a second InfoBar can be added while the first one is in the process
     37 // of closing (the animations). This can cause problems because when the first
     38 // one does finally fully close InfoBarDelegate::InfoBarClosed() is called,
     39 // and the delegate is free to clean itself up or reset state, which may have
     40 // fatal consequences for the InfoBar that was in the process of opening (or is
     41 // now fully opened) -- it is referencing a delegate that may not even exist
     42 // anymore.
     43 // As such, it is generally much safer to dedicate a delegate instance to
     44 // AddInfoBar!
     45 class InfoBarDelegate {
     46  public:
     47   // The type of the infobar. It controls its appearance, such as its background
     48   // color.
     49   enum Type {
     50     WARNING_TYPE,
     51     PAGE_ACTION_TYPE,
     52   };
     53 
     54   virtual ~InfoBarDelegate();
     55 
     56   // Called to create the InfoBar. Implementation of this method is
     57   // platform-specific.
     58   virtual InfoBar* CreateInfoBar() = 0;
     59 
     60   // Returns true if the supplied |delegate| is equal to this one. Equality is
     61   // left to the implementation to define. This function is called by the
     62   // TabContents when determining whether or not a delegate should be added
     63   // because a matching one already exists. If this function returns true, the
     64   // TabContents will not add the new delegate because it considers one to
     65   // already be present.
     66   virtual bool EqualsDelegate(InfoBarDelegate* delegate) const;
     67 
     68   // Returns true if the InfoBar should be closed automatically after the page
     69   // is navigated. The default behavior is to return true if the page is
     70   // navigated somewhere else or reloaded.
     71   virtual bool ShouldExpire(
     72       const NavigationController::LoadCommittedDetails& details) const;
     73 
     74   // Called when the user clicks on the close button to dismiss the infobar.
     75   virtual void InfoBarDismissed();
     76 
     77   // Called after the InfoBar is closed. The delegate is free to delete itself
     78   // at this point.
     79   virtual void InfoBarClosed();
     80 
     81   // Return the icon to be shown for this InfoBar. If the returned bitmap is
     82   // NULL, no icon is shown.
     83   virtual SkBitmap* GetIcon() const;
     84 
     85   // Returns the type of the infobar.  The type determines the appearance (such
     86   // as background color) of the infobar.
     87   virtual Type GetInfoBarType() const;
     88 
     89   // Type-checking downcast routines:
     90   virtual ConfirmInfoBarDelegate* AsConfirmInfoBarDelegate();
     91   virtual ExtensionInfoBarDelegate* AsExtensionInfoBarDelegate();
     92   virtual LinkInfoBarDelegate* AsLinkInfoBarDelegate();
     93   virtual PluginInstallerInfoBarDelegate* AsPluginInstallerInfoBarDelegate();
     94   virtual ThemeInstalledInfoBarDelegate* AsThemePreviewInfobarDelegate();
     95   virtual TranslateInfoBarDelegate* AsTranslateInfoBarDelegate();
     96 
     97  protected:
     98   // Provided to subclasses as a convenience to initialize the state of this
     99   // object. If |contents| is non-NULL, its active entry's unique ID will be
    100   // stored using StoreActiveEntryUniqueID automatically.
    101   explicit InfoBarDelegate(TabContents* contents);
    102 
    103   // Store the unique id for the active entry in the specified TabContents, to
    104   // be used later upon navigation to determine if this InfoBarDelegate should
    105   // be expired from |contents_|.
    106   void StoreActiveEntryUniqueID(TabContents* contents);
    107 
    108  private:
    109   // The unique id of the active NavigationEntry of the TabContents that we were
    110   // opened for. Used to help expire on navigations.
    111   int contents_unique_id_;
    112 
    113   DISALLOW_COPY_AND_ASSIGN(InfoBarDelegate);
    114 };
    115 
    116 #endif  // CHROME_BROWSER_TAB_CONTENTS_INFOBAR_DELEGATE_H_
    117