This source file includes following definitions.
- AddInfoBar
- RemoveInfoBar
- RemoveAllInfoBars
- ReplaceInfoBar
- AddObserver
- RemoveObserver
- web_contents_
- OnNavigation
- OnWebContentsDestroyed
- RemoveInfoBarInternal
#include "chrome/browser/infobars/infobar_manager.h"
#include "base/command_line.h"
#include "chrome/browser/infobars/infobar.h"
#include "chrome/common/chrome_switches.h"
InfoBar* InfoBarManager::AddInfoBar(scoped_ptr<InfoBar> infobar) {
DCHECK(infobar);
if (!infobars_enabled_)
return NULL;
for (InfoBars::const_iterator i(infobars_.begin()); i != infobars_.end();
++i) {
if ((*i)->delegate()->EqualsDelegate(infobar->delegate())) {
DCHECK_NE((*i)->delegate(), infobar->delegate());
return NULL;
}
}
InfoBar* infobar_ptr = infobar.release();
infobars_.push_back(infobar_ptr);
infobar_ptr->SetOwner(this);
FOR_EACH_OBSERVER(Observer, observer_list_, OnInfoBarAdded(infobar_ptr));
return infobar_ptr;
}
void InfoBarManager::RemoveInfoBar(InfoBar* infobar) {
RemoveInfoBarInternal(infobar, true);
}
void InfoBarManager::RemoveAllInfoBars(bool animate) {
while (!infobars_.empty())
RemoveInfoBarInternal(infobars_.back(), animate);
}
InfoBar* InfoBarManager::ReplaceInfoBar(InfoBar* old_infobar,
scoped_ptr<InfoBar> new_infobar) {
DCHECK(old_infobar);
if (!infobars_enabled_)
return AddInfoBar(new_infobar.Pass());
DCHECK(new_infobar);
InfoBars::iterator i(std::find(infobars_.begin(), infobars_.end(),
old_infobar));
DCHECK(i != infobars_.end());
InfoBar* new_infobar_ptr = new_infobar.release();
i = infobars_.insert(i, new_infobar_ptr);
new_infobar_ptr->SetOwner(this);
infobars_.erase(++i);
FOR_EACH_OBSERVER(Observer,
observer_list_,
OnInfoBarReplaced(old_infobar, new_infobar_ptr));
old_infobar->CloseSoon();
return new_infobar_ptr;
}
void InfoBarManager::AddObserver(Observer* obs) {
observer_list_.AddObserver(obs);
}
void InfoBarManager::RemoveObserver(Observer* obs) {
observer_list_.RemoveObserver(obs);
}
InfoBarManager::InfoBarManager(content::WebContents* web_contents)
: infobars_enabled_(true),
web_contents_(web_contents) {
DCHECK(web_contents);
if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableInfoBars))
infobars_enabled_ = false;
}
InfoBarManager::~InfoBarManager() {
RemoveAllInfoBars(false);
FOR_EACH_OBSERVER(Observer, observer_list_, OnManagerShuttingDown(this));
}
void InfoBarManager::OnNavigation(
const InfoBarDelegate::NavigationDetails& details) {
for (size_t i = infobars_.size(); i > 0; --i) {
InfoBar* infobar = infobars_[i - 1];
if (infobar->delegate()->ShouldExpire(details))
RemoveInfoBar(infobar);
}
}
void InfoBarManager::OnWebContentsDestroyed() { web_contents_ = NULL; }
void InfoBarManager::RemoveInfoBarInternal(InfoBar* infobar, bool animate) {
DCHECK(infobar);
if (!infobars_enabled_) {
DCHECK(infobars_.empty());
return;
}
InfoBars::iterator i(std::find(infobars_.begin(), infobars_.end(), infobar));
DCHECK(i != infobars_.end());
infobars_.erase(i);
FOR_EACH_OBSERVER(Observer, observer_list_,
OnInfoBarRemoved(infobar, animate));
infobar->CloseSoon();
}