diff options
Diffstat (limited to 'chrome/browser/extensions/extension_infobar_delegate.cc')
-rw-r--r-- | chrome/browser/extensions/extension_infobar_delegate.cc | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/chrome/browser/extensions/extension_infobar_delegate.cc b/chrome/browser/extensions/extension_infobar_delegate.cc new file mode 100644 index 0000000..c741d94 --- /dev/null +++ b/chrome/browser/extensions/extension_infobar_delegate.cc @@ -0,0 +1,82 @@ +// 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. + +#include "chrome/browser/extensions/extension_infobar_delegate.h" + +#include "chrome/browser/browser.h" +#include "chrome/browser/profile.h" +#include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" +#include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/common/notification_details.h" +#include "chrome/common/notification_source.h" +#include "chrome/common/notification_type.h" + +ExtensionInfoBarDelegate::ExtensionInfoBarDelegate(Browser* browser, + TabContents* tab_contents, + Extension* extension, + const GURL& url) + : InfoBarDelegate(tab_contents), + observer_(NULL), + extension_(extension), + tab_contents_(tab_contents), + closing_(false) { + ExtensionProcessManager* manager = + browser->profile()->GetExtensionProcessManager(); + extension_host_.reset(manager->CreateInfobar(url, browser)); + extension_host_->set_associated_tab_contents(tab_contents); + + registrar_.Add(this, NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE, + Source<Profile>(browser->profile())); + registrar_.Add(this, NotificationType::EXTENSION_UNLOADED, + Source<Profile>(browser->profile())); +} + +ExtensionInfoBarDelegate::~ExtensionInfoBarDelegate() { + if (observer_) + observer_->OnDelegateDeleted(); +} + +bool ExtensionInfoBarDelegate::EqualsDelegate(InfoBarDelegate* delegate) const { + ExtensionInfoBarDelegate* extension_delegate = + delegate->AsExtensionInfoBarDelegate(); + // When an extension crashes, an InfoBar is shown (for the crashed extension). + // That will result in a call to this function (to see if this InfoBarDelegate + // is already showing the 'extension crashed InfoBar', which it never is), but + // if it is our extension that crashes, the extension delegate is NULL so + // we cannot check. + if (!extension_delegate) + return false; + + // Only allow one InfoBar at a time per extension. + return extension_delegate->extension_host()->extension() == + extension_host_->extension(); +} + +void ExtensionInfoBarDelegate::InfoBarClosed() { + delete this; +} + +void ExtensionInfoBarDelegate::Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + switch (type.value) { + case NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE: { + const ExtensionHost* result = Details<ExtensionHost>(details).ptr(); + if (extension_host_.get() == result) + tab_contents_->RemoveInfoBar(this); + break; + } + case NotificationType::EXTENSION_UNLOADED: { + Extension* extension = Details<Extension>(details).ptr(); + if (extension_ == extension) + tab_contents_->RemoveInfoBar(this); + break; + } + default: { + NOTREACHED() << "Unknown message"; + break; + } + } +} |