Index: chrome/browser/infobars/infobar.h |
=================================================================== |
--- chrome/browser/infobars/infobar.h (revision 238220) |
+++ chrome/browser/infobars/infobar.h (working copy) |
@@ -7,9 +7,7 @@ |
#include <utility> |
-#include "base/basictypes.h" |
-#include "base/compiler_specific.h" |
-#include "build/build_config.h" |
+#include "base/memory/scoped_ptr.h" |
#include "chrome/browser/infobars/infobar_delegate.h" |
#include "third_party/skia/include/core/SkColor.h" |
#include "ui/gfx/animation/animation_delegate.h" |
@@ -19,12 +17,27 @@ |
class InfoBarContainer; |
class InfoBarService; |
+// InfoBar is a cross-platform base class for an infobar "view" (in the MVC |
+// sense), which owns a corresponding InfoBarDelegate "model". Typically, |
+// a caller will call XYZInfoBarDelegate::Create() and pass in the |
+// InfoBarService for the relevant tab. This will create an XYZInfoBarDelegate, |
+// create a platform-specific subclass of InfoBar to own it, and then call |
+// InfoBarService::AddInfoBar() to give it ownership of the infobar. |
+// During its life, the InfoBar may be shown and hidden as the owning tab is |
+// switched between the foreground and background. Eventually, InfoBarService |
+// will instruct the InfoBar to close itself. At this point, the InfoBar will |
+// optionally animate closed; once it's no longer visible, it deletes itself, |
+// destroying the InfoBarDelegate in the process. |
+// |
+// Thus, InfoBarDelegate and InfoBar implementations can assume they share |
+// lifetimes, and not NULL-check each other; but if one needs to reach back into |
+// the owning InfoBarService, it must check whether that's still possible. |
class InfoBar : public gfx::AnimationDelegate { |
public: |
// These are the types passed as Details for infobar-related notifications. |
- typedef InfoBarDelegate AddedDetails; |
- typedef std::pair<InfoBarDelegate*, bool> RemovedDetails; |
- typedef std::pair<InfoBarDelegate*, InfoBarDelegate*> ReplacedDetails; |
+ typedef InfoBar AddedDetails; |
+ typedef std::pair<InfoBar*, bool> RemovedDetails; |
+ typedef std::pair<InfoBar*, InfoBar*> ReplacedDetails; |
// Platforms must define these. |
static const int kDefaultBarTargetHeight; |
@@ -36,22 +49,30 @@ |
static const int kDefaultArrowTargetHalfWidth; |
static const int kMaximumArrowTargetHalfWidth; |
- InfoBar(InfoBarService* owner, InfoBarDelegate* delegate); |
+ explicit InfoBar(scoped_ptr<InfoBarDelegate> delegate); |
virtual ~InfoBar(); |
static SkColor GetTopColor(InfoBarDelegate::Type infobar_type); |
static SkColor GetBottomColor(InfoBarDelegate::Type infobar_type); |
- InfoBarDelegate* delegate() { return delegate_; } |
+ InfoBarService* owner() { return owner_; } |
+ InfoBarDelegate* delegate() { return delegate_.get(); } |
+ const InfoBarDelegate* delegate() const { return delegate_.get(); } |
void set_container(InfoBarContainer* container) { container_ = container; } |
+ // Sets |owner_|. This also calls StoreActiveEntryUniqueID() on |delegate_|. |
+ // This must only be called once as there's no way to extract an infobar from |
+ // its owner without deleting it, for reparenting in another tab. |
+ void SetOwner(InfoBarService* owner); |
+ |
// Makes the infobar visible. If |animate| is true, the infobar is then |
// animated to full size. |
void Show(bool animate); |
- // Makes the infobar hidden. If |animate| is true, the infobar is first |
- // animated to zero size. Once the infobar is hidden, it is removed from its |
- // container (triggering its deletion), and its delegate is closed. |
+ // Makes the infobar hidden. If |animate| is false, the infobar is |
+ // immediately removed from the container, and, if now unowned, deleted. If |
+ // |animate| is true, the infobar is animated to zero size, ultimately |
+ // triggering a call to AnimationEnded(). |
void Hide(bool animate); |
// Changes the target height of the arrow portion of the infobar. This has no |
@@ -58,10 +79,14 @@ |
// effect once the infobar is animating closed. |
void SetArrowTargetHeight(int height); |
- // Notifies the infobar that it is no longer owned and should close its |
- // delegate once it is invisible. |
+ // Notifies the infobar that it is no longer owned and should delete itself |
+ // once it is invisible. |
void CloseSoon(); |
+ // Forwards a close request to our owner. This is a no-op if we're already |
+ // unowned. |
+ void RemoveSelf(); |
+ |
// Changes the target height of the main ("bar") portion of the infobar. |
void SetBarTargetHeight(int height); |
@@ -75,16 +100,11 @@ |
// gfx::AnimationDelegate: |
virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE; |
- // Forwards a close request to our owner. |
- // NOTE: Subclasses should not call this if we're already unowned. |
- void RemoveSelf(); |
- |
// Given a control with size |prefsize|, returns the centered y position |
// within us, taking into account animation so the control "slides in" (or |
// out) as we animate open and closed. |
int OffsetY(const gfx::Size& prefsize) const; |
- InfoBarService* owner() const { return owner_; } |
const InfoBarContainer* container() const { return container_; } |
InfoBarContainer* container() { return container_; } |
gfx::SlideAnimation* animation() { return &animation_; } |
@@ -93,6 +113,7 @@ |
// Platforms may optionally override these if they need to do work during |
// processing of the given calls. |
+ virtual void PlatformSpecificSetOwner() {} |
virtual void PlatformSpecificShow(bool animate) {} |
virtual void PlatformSpecificHide(bool animate) {} |
virtual void PlatformSpecificOnCloseSoon() {} |
@@ -108,13 +129,13 @@ |
// |force_notify| is set. |
void RecalculateHeights(bool force_notify); |
- // Checks whether we're closed. If so, notifies the container that it should |
- // remove us (which will cause the platform-specific code to asynchronously |
- // delete us) and closes the delegate. |
+ // Checks whether the infobar is unowned and done with all animations. If so, |
+ // notifies the container that it should remove this infobar, and deletes |
+ // itself. |
void MaybeDelete(); |
InfoBarService* owner_; |
- InfoBarDelegate* delegate_; |
+ scoped_ptr<InfoBarDelegate> delegate_; |
InfoBarContainer* container_; |
gfx::SlideAnimation animation_; |