// Copyright (c) 2011 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/extensions/extension_host.h" #include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/extensions/extension.h" #include "content/browser/tab_contents/tab_contents.h" #include "content/common/notification_details.h" #include "content/common/notification_source.h" #include "content/common/notification_type.h" ExtensionInfoBarDelegate::ExtensionInfoBarDelegate(Browser* browser, TabContents* tab_contents, const 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::InfoBarDismissed() { closing_ = true; } void ExtensionInfoBarDelegate::InfoBarClosed() { delete this; } InfoBarDelegate::Type ExtensionInfoBarDelegate::GetInfoBarType() const { return PAGE_ACTION_TYPE; } ExtensionInfoBarDelegate* ExtensionInfoBarDelegate::AsExtensionInfoBarDelegate() { return 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: { const Extension* extension = Details<UnloadedExtensionInfo>(details)->extension; if (extension_ == extension) tab_contents_->RemoveInfoBar(this); break; } default: { NOTREACHED() << "Unknown message"; break; } } }