Index: trunk/src/chrome/browser/infobars/infobar.h |
=================================================================== |
--- trunk/src/chrome/browser/infobars/infobar.h (revision 238401) |
+++ trunk/src/chrome/browser/infobars/infobar.h (working copy) |
@@ -7,7 +7,9 @@ |
#include <utility> |
-#include "base/memory/scoped_ptr.h" |
+#include "base/basictypes.h" |
+#include "base/compiler_specific.h" |
+#include "build/build_config.h" |
#include "chrome/browser/infobars/infobar_delegate.h" |
#include "third_party/skia/include/core/SkColor.h" |
#include "ui/gfx/animation/animation_delegate.h" |
@@ -17,27 +19,12 @@ |
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 InfoBar AddedDetails; |
- typedef std::pair<InfoBar*, bool> RemovedDetails; |
- typedef std::pair<InfoBar*, InfoBar*> ReplacedDetails; |
+ typedef InfoBarDelegate AddedDetails; |
+ typedef std::pair<InfoBarDelegate*, bool> RemovedDetails; |
+ typedef std::pair<InfoBarDelegate*, InfoBarDelegate*> ReplacedDetails; |
// Platforms must define these. |
static const int kDefaultBarTargetHeight; |
@@ -49,44 +36,32 @@ |
static const int kDefaultArrowTargetHalfWidth; |
static const int kMaximumArrowTargetHalfWidth; |
- explicit InfoBar(scoped_ptr<InfoBarDelegate> delegate); |
+ InfoBar(InfoBarService* owner, InfoBarDelegate* delegate); |
virtual ~InfoBar(); |
static SkColor GetTopColor(InfoBarDelegate::Type infobar_type); |
static SkColor GetBottomColor(InfoBarDelegate::Type infobar_type); |
- InfoBarService* owner() { return owner_; } |
- InfoBarDelegate* delegate() { return delegate_.get(); } |
- const InfoBarDelegate* delegate() const { return delegate_.get(); } |
+ InfoBarDelegate* delegate() { return delegate_; } |
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 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(). |
+ // 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. |
void Hide(bool animate); |
// Changes the target height of the arrow portion of the infobar. This has no |
// effect once the infobar is animating closed. |
void SetArrowTargetHeight(int height); |
- // Notifies the infobar that it is no longer owned and should delete itself |
- // once it is invisible. |
+ // Notifies the infobar that it is no longer owned and should close its |
+ // delegate 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); |
@@ -100,11 +75,16 @@ |
// 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_; } |
@@ -113,7 +93,6 @@ |
// 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() {} |
@@ -129,13 +108,13 @@ |
// |force_notify| is set. |
void RecalculateHeights(bool force_notify); |
- // 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. |
+ // 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. |
void MaybeDelete(); |
InfoBarService* owner_; |
- scoped_ptr<InfoBarDelegate> delegate_; |
+ InfoBarDelegate* delegate_; |
InfoBarContainer* container_; |
gfx::SlideAnimation animation_; |