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 "chrome/browser/infobars/confirm_infobar_delegate.h"
10#include "content/public/browser/notification_observer.h"
11#include "content/public/browser/notification_registrar.h"
12
13class Browser;
14class GURL;
15class InfoBarService;
16
17namespace extensions {
18class Extension;
19class ExtensionHost;
20}
21
22// The InfobarDelegate for creating and managing state for the ExtensionInfobar
23// plus monitor when the extension goes away.
24class ExtensionInfoBarDelegate : public InfoBarDelegate,
25                                 public content::NotificationObserver {
26 public:
27  // The observer for when the delegate dies.
28  class DelegateObserver {
29   public:
30    virtual void OnDelegateDeleted() = 0;
31
32   protected:
33    virtual ~DelegateObserver() {}
34  };
35
36  virtual ~ExtensionInfoBarDelegate();
37
38  // Creates an extension infobar delegate and adds it to |infobar_service|.
39  static void Create(InfoBarService* infobar_service,
40                     Browser* browser,
41                     const extensions::Extension* extension,
42                     const GURL& url,
43                     int height);
44
45  const extensions::Extension* extension() { return extension_; }
46  extensions::ExtensionHost* extension_host() { return extension_host_.get(); }
47  int height() { return height_; }
48
49  void set_observer(DelegateObserver* observer) { observer_ = observer; }
50
51  bool closing() const { return closing_; }
52
53 private:
54  ExtensionInfoBarDelegate(Browser* browser,
55                           InfoBarService* infobar_service,
56                           const extensions::Extension* extension,
57                           const GURL& url,
58                           content::WebContents* web_contents,
59                           int height);
60
61  // InfoBarDelegate:
62  virtual InfoBar* CreateInfoBar(InfoBarService* owner) OVERRIDE;
63  virtual bool EqualsDelegate(InfoBarDelegate* delegate) const OVERRIDE;
64  virtual void InfoBarDismissed() OVERRIDE;
65  virtual Type GetInfoBarType() const OVERRIDE;
66  virtual ExtensionInfoBarDelegate* AsExtensionInfoBarDelegate() OVERRIDE;
67
68  // content::NotificationObserver:
69  virtual void Observe(int type,
70                       const content::NotificationSource& source,
71                       const content::NotificationDetails& details) OVERRIDE;
72
73#if defined(TOOLKIT_VIEWS)
74  Browser* browser_;  // We pass this to the ExtensionInfoBar.
75#endif
76
77  // The extension host we are showing the InfoBar for. The delegate needs to
78  // own this since the InfoBar gets deleted and recreated when you switch tabs
79  // and come back (and we don't want the user's interaction with the InfoBar to
80  // get lost at that point).
81  scoped_ptr<extensions::ExtensionHost> extension_host_;
82
83  // The observer monitoring when the delegate dies.
84  DelegateObserver* observer_;
85
86  const extensions::Extension* extension_;
87  content::NotificationRegistrar registrar_;
88
89  // The requested height of the infobar (in pixels).
90  int height_;
91
92  // Whether we are currently animating to close. This is used to ignore
93  // ExtensionView::PreferredSizeChanged notifications.
94  bool closing_;
95
96  DISALLOW_COPY_AND_ASSIGN(ExtensionInfoBarDelegate);
97};
98
99#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_INFOBAR_DELEGATE_H_
100