1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_INFOBAR_DELEGATE_H_ 6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_INFOBAR_DELEGATE_H_ 7 8 #include "base/memory/scoped_ptr.h" 9 #include "base/scoped_observer.h" 10 #include "components/infobars/core/confirm_infobar_delegate.h" 11 #include "content/public/browser/notification_observer.h" 12 #include "content/public/browser/notification_registrar.h" 13 #include "extensions/browser/extension_registry_observer.h" 14 15 class Browser; 16 class GURL; 17 18 namespace content { 19 class WebContents; 20 } 21 22 namespace extensions { 23 class Extension; 24 class ExtensionRegistry; 25 class ExtensionViewHost; 26 } 27 28 // The InfobarDelegate for creating and managing state for the ExtensionInfobar 29 // plus monitor when the extension goes away. 30 class ExtensionInfoBarDelegate : public infobars::InfoBarDelegate, 31 public content::NotificationObserver, 32 public extensions::ExtensionRegistryObserver { 33 public: 34 virtual ~ExtensionInfoBarDelegate(); 35 36 // Creates an extension infobar and delegate and adds the infobar to the 37 // infobar service for |web_contents|. 38 static void Create(content::WebContents* web_contents, 39 Browser* browser, 40 const extensions::Extension* extension, 41 const GURL& url, 42 int height); 43 extension()44 const extensions::Extension* extension() { return extension_; } extension_view_host()45 extensions::ExtensionViewHost* extension_view_host() { 46 return extension_view_host_.get(); 47 } extension_view_host()48 const extensions::ExtensionViewHost* extension_view_host() const { 49 return extension_view_host_.get(); 50 } 51 height()52 int height() { return height_; } 53 closing()54 bool closing() const { return closing_; } 55 56 // Returns the WebContents associated with the ExtensionInfoBarDelegate. 57 content::WebContents* GetWebContents(); 58 59 private: 60 ExtensionInfoBarDelegate(Browser* browser, 61 const extensions::Extension* extension, 62 const GURL& url, 63 content::WebContents* web_contents, 64 int height); 65 66 // Returns an extension infobar that owns |delegate|. 67 static scoped_ptr<infobars::InfoBar> CreateInfoBar( 68 scoped_ptr<ExtensionInfoBarDelegate> delegate); 69 70 // InfoBarDelegate. 71 virtual bool EqualsDelegate( 72 infobars::InfoBarDelegate* delegate) const OVERRIDE; 73 virtual void InfoBarDismissed() OVERRIDE; 74 virtual Type GetInfoBarType() const OVERRIDE; 75 virtual ExtensionInfoBarDelegate* AsExtensionInfoBarDelegate() OVERRIDE; 76 77 // content::NotificationObserver. 78 virtual void Observe(int type, 79 const content::NotificationSource& source, 80 const content::NotificationDetails& details) OVERRIDE; 81 82 // extensions::ExtensionRegistryObserver. 83 virtual void OnExtensionUnloaded( 84 content::BrowserContext* browser_context, 85 const extensions::Extension* extension, 86 extensions::UnloadedExtensionInfo::Reason reason) OVERRIDE; 87 88 #if defined(TOOLKIT_VIEWS) 89 Browser* browser_; // We pass this to the ExtensionInfoBar. 90 #endif 91 92 // The extension host we are showing the InfoBar for. 93 // TODO(pkasting): Should this live on the InfoBar instead? 94 scoped_ptr<extensions::ExtensionViewHost> extension_view_host_; 95 96 const extensions::Extension* extension_; 97 content::NotificationRegistrar registrar_; 98 99 ScopedObserver<extensions::ExtensionRegistry, 100 extensions::ExtensionRegistryObserver> 101 extension_registry_observer_; 102 103 // The requested height of the infobar (in pixels). 104 int height_; 105 106 // Whether we are currently animating to close. This is used to ignore 107 // ExtensionView::PreferredSizeChanged notifications. 108 bool closing_; 109 110 DISALLOW_COPY_AND_ASSIGN(ExtensionInfoBarDelegate); 111 }; 112 113 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_INFOBAR_DELEGATE_H_ 114