Home | History | Annotate | Download | only in extensions
      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 
     44   const extensions::Extension* extension() { return extension_; }
     45   extensions::ExtensionViewHost* extension_view_host() {
     46     return extension_view_host_.get();
     47   }
     48   const extensions::ExtensionViewHost* extension_view_host() const {
     49     return extension_view_host_.get();
     50   }
     51 
     52   int height() { return height_; }
     53 
     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