summaryrefslogtreecommitdiffstats
path: root/chrome/browser/tab_contents.cc
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-21 22:27:24 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-21 22:27:24 +0000
commit616ed5a653d4bc13b4633d7c7b85d2f0c73bfd72 (patch)
tree04b8cd92d18cd6e1ff54e46c6c32b0d70391a831 /chrome/browser/tab_contents.cc
parentc7eeed7fa25e06ec3d0367a74d2b43671958c5d3 (diff)
downloadchromium_src-616ed5a653d4bc13b4633d7c7b85d2f0c73bfd72.zip
chromium_src-616ed5a653d4bc13b4633d7c7b85d2f0c73bfd72.tar.gz
chromium_src-616ed5a653d4bc13b4633d7c7b85d2f0c73bfd72.tar.bz2
Beginnings of a new InfoBar system.
This implements AlertInfoBar and InfoBarContainer. It also makes the crashed plugin/js oom infobars use this new system. Design Doc: http://dev.chromium.org/developers/design-documents/info-barshttp://crbug.com/4620 Review URL: http://codereview.chromium.org/11318 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@5856 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/tab_contents.cc')
-rw-r--r--chrome/browser/tab_contents.cc77
1 files changed, 77 insertions, 0 deletions
diff --git a/chrome/browser/tab_contents.cc b/chrome/browser/tab_contents.cc
index e5131dc..510c611 100644
--- a/chrome/browser/tab_contents.cc
+++ b/chrome/browser/tab_contents.cc
@@ -6,6 +6,7 @@
#include "chrome/browser/cert_store.h"
#include "chrome/browser/navigation_entry.h"
+#include "chrome/browser/infobar_delegate.h"
#include "chrome/browser/views/download_shelf_view.h"
#include "chrome/browser/views/download_started_animation.h"
#include "chrome/browser/views/blocked_popup_container.h"
@@ -386,6 +387,48 @@ void TabContents::SetInitialFocus() {
::SetFocus(GetContainerHWND());
}
+void TabContents::AddInfoBar(InfoBarDelegate* delegate) {
+ // Look through the existing InfoBarDelegates we have for a match. If we've
+ // already got one that matches, then we don't add the new one.
+ for (size_t i = 0; i < infobar_delegate_count(); ++i) {
+ if (GetInfoBarDelegateAt(i)->EqualsDelegate(delegate))
+ return;
+ }
+
+ infobar_delegates_.push_back(delegate);
+ NotificationService::current()->Notify(NOTIFY_TAB_CONTENTS_INFOBAR_ADDED,
+ Source<TabContents>(this),
+ Details<InfoBarDelegate>(delegate));
+
+ // Add ourselves as an observer for navigations the first time a delegate is
+ // added. We use this notification to expire InfoBars that need to expire on
+ // page transitions.
+ if (infobar_delegates_.size() == 1) {
+ NotificationService::current()->AddObserver(
+ this, NOTIFY_NAV_ENTRY_COMMITTED,
+ Source<NavigationController>(controller()));
+ }
+}
+
+void TabContents::RemoveInfoBar(InfoBarDelegate* delegate) {
+ std::vector<InfoBarDelegate*>::iterator it =
+ find(infobar_delegates_.begin(), infobar_delegates_.end(), delegate);
+ if (it != infobar_delegates_.end()) {
+ InfoBarDelegate* delegate = *it;
+ infobar_delegates_.erase(it);
+ NotificationService::current()->Notify(NOTIFY_TAB_CONTENTS_INFOBAR_REMOVED,
+ Source<TabContents>(this),
+ Details<InfoBarDelegate>(delegate));
+ }
+
+ // Remove ourselves as an observer if we are tracking no more InfoBars.
+ if (infobar_delegates_.empty()) {
+ NotificationService::current()->RemoveObserver(
+ this, NOTIFY_NAV_ENTRY_COMMITTED,
+ Source<NavigationController>(controller()));
+ }
+}
+
void TabContents::SetDownloadShelfVisible(bool visible) {
if (shelf_visible_ != visible) {
if (visible) {
@@ -467,6 +510,17 @@ void TabContents::DidMoveOrResize(ConstrainedWindow* window) {
UpdateWindow(GetContainerHWND());
}
+void TabContents::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ DCHECK(type == NOTIFY_NAV_ENTRY_COMMITTED);
+ DCHECK(controller() == Source<NavigationController>(source).ptr());
+
+ NavigationController::LoadCommittedDetails& committed_details =
+ *(Details<NavigationController::LoadCommittedDetails>(details).ptr());
+ ExpireInfoBars(committed_details);
+}
+
// static
void TabContents::MigrateShelfView(TabContents* from, TabContents* to) {
bool was_shelf_visible = from->IsDownloadShelfVisible();
@@ -521,3 +575,26 @@ bool TabContents::ShowingBlockedPopupNotification() const {
return blocked_popups_ != NULL &&
blocked_popups_->GetTabContentsCount() != 0;
}
+
+namespace {
+bool TransitionIsReload(PageTransition::Type transition) {
+ return PageTransition::StripQualifier(transition) == PageTransition::RELOAD;
+}
+}
+
+void TabContents::ExpireInfoBars(
+ const NavigationController::LoadCommittedDetails& details) {
+ // Only hide InfoBars when the user has done something that makes the main
+ // frame load. We don't want various automatic or subframe navigations making
+ // it disappear.
+ if (!details.is_user_initiated_main_frame_load())
+ return;
+
+ for (size_t i = 0; i < infobar_delegate_count(); ++i) {
+ InfoBarDelegate* delegate = GetInfoBarDelegateAt(i);
+ if (!TransitionIsReload(details.entry->transition_type()) &&
+ delegate->ShouldCloseOnNavigate()) {
+ RemoveInfoBar(delegate);
+ }
+ }
+}