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
15class Browser;
16class GURL;
17
18namespace content {
19class WebContents;
20}
21
22namespace extensions {
23class Extension;
24class ExtensionRegistry;
25class ExtensionViewHost;
26}
27
28// The InfobarDelegate for creating and managing state for the ExtensionInfobar
29// plus monitor when the extension goes away.
30class 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