summaryrefslogtreecommitdiffstats
path: root/chrome/browser/tab_contents/infobar_delegate.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/tab_contents/infobar_delegate.h')
-rw-r--r--chrome/browser/tab_contents/infobar_delegate.h300
1 files changed, 300 insertions, 0 deletions
diff --git a/chrome/browser/tab_contents/infobar_delegate.h b/chrome/browser/tab_contents/infobar_delegate.h
new file mode 100644
index 0000000..3c8b714
--- /dev/null
+++ b/chrome/browser/tab_contents/infobar_delegate.h
@@ -0,0 +1,300 @@
+// Copyright (c) 2010 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_TAB_CONTENTS_INFOBAR_DELEGATE_H_
+#define CHROME_BROWSER_TAB_CONTENTS_INFOBAR_DELEGATE_H_
+
+#include <string>
+
+#include "base/basictypes.h"
+#include "chrome/browser/tab_contents/navigation_controller.h"
+#include "webkit/glue/window_open_disposition.h"
+
+class AlertInfoBarDelegate;
+class ConfirmInfoBarDelegate;
+class CrashedExtensionInfoBarDelegate;
+class ExtensionInfoBarDelegate;
+class TranslateInfoBarDelegate;
+class InfoBar;
+class LinkInfoBarDelegate;
+class SkBitmap;
+class ThemeInstalledInfoBarDelegate;
+
+// An interface implemented by objects wishing to control an InfoBar.
+// Implementing this interface is not sufficient to use an InfoBar, since it
+// does not map to a specific InfoBar type. Instead, you must implement either
+// AlertInfoBarDelegate or ConfirmInfoBarDelegate, or override with your own
+// delegate for your own InfoBar variety.
+//
+// --- WARNING ---
+// When creating your InfoBarDelegate subclass, it is recommended that you
+// design it such that you instantiate a brand new delegate for every call to
+// AddInfoBar, rather than re-using/sharing a delegate object. Otherwise,
+// you need to consider the fact that more than one InfoBar instance can exist
+// and reference the same delegate -- even though it is also true that we only
+// ever fully show one infobar (they don't stack). The dual-references occur
+// because a second InfoBar can be added while the first one is in the process
+// of closing (the animations). This can cause problems because when the first
+// one does finally fully close InfoBarDelegate::InfoBarClosed() is called,
+// and the delegate is free to clean itself up or reset state, which may have
+// fatal consequences for the InfoBar that was in the process of opening (or is
+// now fully opened) -- it is referencing a delegate that may not even exist
+// anymore.
+// As such, it is generally much safer to dedicate a delegate instance to
+// AddInfoBar!
+class InfoBarDelegate {
+ public:
+ // The type of the infobar. It controls its appearance, such as its background
+ // color.
+ enum Type {
+ INFO_TYPE,
+ WARNING_TYPE,
+ ERROR_TYPE,
+ PAGE_ACTION_TYPE
+ };
+
+ // Returns true if the supplied |delegate| is equal to this one. Equality is
+ // left to the implementation to define. This function is called by the
+ // TabContents when determining whether or not a delegate should be added
+ // because a matching one already exists. If this function returns true, the
+ // TabContents will not add the new delegate because it considers one to
+ // already be present.
+ virtual bool EqualsDelegate(InfoBarDelegate* delegate) const {
+ return false;
+ }
+
+ // Returns true if the InfoBar should be closed automatically after the page
+ // is navigated. The default behavior is to return true if the page is
+ // navigated somewhere else or reloaded.
+ virtual bool ShouldExpire(
+ const NavigationController::LoadCommittedDetails& details) const;
+
+ // Called when the user clicks on the close button to dismiss the infobar.
+ virtual void InfoBarDismissed() {}
+
+ // Called after the InfoBar is closed. The delegate is free to delete itself
+ // at this point.
+ virtual void InfoBarClosed() {}
+
+ // Called to create the InfoBar. Implementation of this method is
+ // platform-specific.
+ virtual InfoBar* CreateInfoBar() = 0;
+
+ // Return the icon to be shown for this InfoBar. If the returned bitmap is
+ // NULL, no icon is shown.
+ virtual SkBitmap* GetIcon() const { return NULL; }
+
+ // Returns a pointer to the AlertInfoBarDelegate interface, if implemented.
+ virtual AlertInfoBarDelegate* AsAlertInfoBarDelegate() {
+ return NULL;
+ }
+
+ // Returns a pointer to the LinkInfoBarDelegate interface, if implemented.
+ virtual LinkInfoBarDelegate* AsLinkInfoBarDelegate() {
+ return NULL;
+ }
+
+ // Returns a pointer to the ConfirmInfoBarDelegate interface, if implemented.
+ virtual ConfirmInfoBarDelegate* AsConfirmInfoBarDelegate() {
+ return NULL;
+ }
+
+ // Returns a pointer to the ThemeInstalledInfoBarDelegate interface, if
+ // implemented.
+ virtual ThemeInstalledInfoBarDelegate* AsThemePreviewInfobarDelegate() {
+ return NULL;
+ }
+
+ // Returns a pointer to the TranslateInfoBarDelegate interface, if
+ // implemented.
+ virtual TranslateInfoBarDelegate* AsTranslateInfoBarDelegate() {
+ return NULL;
+ }
+
+ // Returns a pointer to the ExtensionInfoBarDelegate interface, if
+ // implemented.
+ virtual ExtensionInfoBarDelegate* AsExtensionInfoBarDelegate() {
+ return NULL;
+ }
+
+ // Returns a pointer to the CrashedExtensionInfoBarDelegate interface, if
+ // implemented.
+ virtual CrashedExtensionInfoBarDelegate* AsCrashedExtensionInfoBarDelegate() {
+ return NULL;
+ }
+
+ // Returns the type of the infobar. The type determines the appearance (such
+ // as background color) of the infobar.
+ virtual Type GetInfoBarType() {
+ return WARNING_TYPE;
+ }
+
+ protected:
+ // Provided to subclasses as a convenience to initialize the state of this
+ // object. If |contents| is non-NULL, its active entry's unique ID will be
+ // stored using StoreActiveEntryUniqueID automatically.
+ explicit InfoBarDelegate(TabContents* contents);
+
+ virtual ~InfoBarDelegate() { }
+
+ // Store the unique id for the active entry in the specified TabContents, to
+ // be used later upon navigation to determine if this InfoBarDelegate should
+ // be expired from |contents_|.
+ void StoreActiveEntryUniqueID(TabContents* contents);
+
+ private:
+ // The unique id of the active NavigationEntry of the TabContents taht we were
+ // opened for. Used to help expire on navigations.
+ int contents_unique_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(InfoBarDelegate);
+};
+
+// An interface derived from InfoBarDelegate implemented by objects wishing to
+// control an AlertInfoBar.
+class AlertInfoBarDelegate : public InfoBarDelegate {
+ public:
+ // Returns the message string to be displayed for the InfoBar.
+ virtual std::wstring GetMessageText() const = 0;
+
+ // Overridden from InfoBarDelegate.
+ virtual SkBitmap* GetIcon() const { return NULL; }
+
+ // Overridden from InfoBarDelegate:
+ virtual bool EqualsDelegate(InfoBarDelegate* delegate) const;
+ virtual InfoBar* CreateInfoBar();
+ virtual AlertInfoBarDelegate* AsAlertInfoBarDelegate() { return this; }
+
+ protected:
+ explicit AlertInfoBarDelegate(TabContents* contents);
+
+ DISALLOW_COPY_AND_ASSIGN(AlertInfoBarDelegate);
+};
+
+// An interface derived from InfoBarDelegate implemented by objects wishing to
+// control a LinkInfoBar.
+class LinkInfoBarDelegate : public InfoBarDelegate {
+ public:
+ // Returns the message string to be displayed in the InfoBar. |link_offset|
+ // is the position where the link should be inserted. If |link_offset| is set
+ // to std::wstring::npos (it is by default), the link is right aligned within
+ // the InfoBar rather than being embedded in the message text.
+ virtual std::wstring GetMessageTextWithOffset(size_t* link_offset) const {
+ *link_offset = std::wstring::npos;
+ return std::wstring();
+ }
+
+ // Returns the text of the link to be displayed.
+ virtual std::wstring GetLinkText() const = 0;
+
+ // Overridden from InfoBarDelegate.
+ virtual SkBitmap* GetIcon() const { return NULL; }
+
+ // Called when the Link is clicked. The |disposition| specifies how the
+ // resulting document should be loaded (based on the event flags present when
+ // the link was clicked). This function returns true if the InfoBar should be
+ // closed now or false if it should remain until the user explicitly closes
+ // it.
+ virtual bool LinkClicked(WindowOpenDisposition disposition) {
+ return true;
+ }
+
+ // Overridden from InfoBarDelegate:
+ virtual InfoBar* CreateInfoBar();
+ virtual LinkInfoBarDelegate* AsLinkInfoBarDelegate() {
+ return this;
+ }
+
+ protected:
+ explicit LinkInfoBarDelegate(TabContents* contents);
+
+ DISALLOW_COPY_AND_ASSIGN(LinkInfoBarDelegate);
+};
+
+// An interface derived from InfoBarDelegate implemented by objects wishing to
+// control a ConfirmInfoBar.
+class ConfirmInfoBarDelegate : public AlertInfoBarDelegate {
+ public:
+ enum InfoBarButton {
+ BUTTON_NONE = 0,
+ BUTTON_OK = 1,
+ BUTTON_CANCEL = 2,
+ // Specifies that the OK button should be rendered like a default button.
+ BUTTON_OK_DEFAULT = 4
+ };
+
+ // Return the buttons to be shown for this InfoBar.
+ virtual int GetButtons() const {
+ return BUTTON_NONE;
+ }
+
+ // Return the label for the specified button. The default implementation
+ // returns "OK" for the OK button and "Cancel" for the Cancel button.
+ virtual std::wstring GetButtonLabel(InfoBarButton button) const;
+
+ // Return whether or not the specified button needs elevation.
+ virtual bool NeedElevation(InfoBarButton button) const { return false; }
+
+ // Called when the OK button is pressed. If the function returns true, the
+ // InfoBarDelegate should be removed from the associated TabContents.
+ virtual bool Accept() { return true; }
+
+ // Called when the Cancel button is pressed. If the function returns true,
+ // the InfoBarDelegate should be removed from the associated TabContents.
+ virtual bool Cancel() { return true; }
+
+ // Returns the text of the link to be displayed, if any. Otherwise returns
+ // and empty string.
+ virtual std::wstring GetLinkText() {
+ return std::wstring();
+ }
+
+ // Called when the Link is clicked. The |disposition| specifies how the
+ // resulting document should be loaded (based on the event flags present when
+ // the link was clicked). This function returns true if the InfoBar should be
+ // closed now or false if it should remain until the user explicitly closes
+ // it.
+ // Will only be called if GetLinkText() returns non-empty string.
+ virtual bool LinkClicked(WindowOpenDisposition disposition) {
+ return true;
+ }
+
+ // Overridden from InfoBarDelegate:
+ virtual InfoBar* CreateInfoBar();
+ virtual ConfirmInfoBarDelegate* AsConfirmInfoBarDelegate() {
+ return this;
+ }
+
+ protected:
+ explicit ConfirmInfoBarDelegate(TabContents* contents);
+
+ DISALLOW_COPY_AND_ASSIGN(ConfirmInfoBarDelegate);
+};
+
+// Simple implementations for common use cases ---------------------------------
+
+class SimpleAlertInfoBarDelegate : public AlertInfoBarDelegate {
+ public:
+ // |icon| may be |NULL|.
+ SimpleAlertInfoBarDelegate(TabContents* contents,
+ const std::wstring& message,
+ SkBitmap* icon,
+ bool auto_expire);
+
+ // Overridden from AlertInfoBarDelegate:
+ virtual bool ShouldExpire(
+ const NavigationController::LoadCommittedDetails& details) const;
+ virtual std::wstring GetMessageText() const;
+ virtual SkBitmap* GetIcon() const;
+ virtual void InfoBarClosed();
+
+ private:
+ std::wstring message_;
+ SkBitmap* icon_;
+ bool auto_expire_; // Should it expire automatically on navigation?
+
+ DISALLOW_COPY_AND_ASSIGN(SimpleAlertInfoBarDelegate);
+};
+
+#endif // CHROME_BROWSER_TAB_CONTENTS_INFOBAR_DELEGATE_H_