• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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