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_PLUGINS_PLUGIN_INFOBAR_DELEGATES_H_
6#define CHROME_BROWSER_PLUGINS_PLUGIN_INFOBAR_DELEGATES_H_
7
8#include "base/callback.h"
9#include "components/infobars/core/confirm_infobar_delegate.h"
10#include "url/gurl.h"
11
12#if defined(ENABLE_PLUGIN_INSTALLATION)
13#include "chrome/browser/plugins/plugin_installer_observer.h"
14#endif
15
16class InfoBarService;
17class HostContentSettingsMap;
18class PluginMetadata;
19
20namespace content {
21class WebContents;
22}
23
24// Base class for blocked plug-in infobars.
25class PluginInfoBarDelegate : public ConfirmInfoBarDelegate {
26 protected:
27  explicit PluginInfoBarDelegate(const std::string& identifier);
28  virtual ~PluginInfoBarDelegate();
29
30  // ConfirmInfoBarDelegate:
31  virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE;
32
33  virtual std::string GetLearnMoreURL() const = 0;
34
35  void LoadBlockedPlugins();
36
37 private:
38  // ConfirmInfoBarDelegate:
39  virtual int GetIconID() const OVERRIDE;
40  virtual base::string16 GetLinkText() const OVERRIDE;
41
42  std::string identifier_;
43
44  DISALLOW_COPY_AND_ASSIGN(PluginInfoBarDelegate);
45};
46
47// Infobar that's shown when a plug-in requires user authorization to run.
48class UnauthorizedPluginInfoBarDelegate : public PluginInfoBarDelegate {
49 public:
50  // Creates an unauthorized plugin infobar and delegate and adds the infobar to
51  // |infobar_service|.
52  static void Create(InfoBarService* infobar_service,
53                     HostContentSettingsMap* content_settings,
54                     const base::string16& name,
55                     const std::string& identifier);
56
57 private:
58  UnauthorizedPluginInfoBarDelegate(HostContentSettingsMap* content_settings,
59                                    const base::string16& name,
60                                    const std::string& identifier);
61  virtual ~UnauthorizedPluginInfoBarDelegate();
62
63  // PluginInfoBarDelegate:
64  virtual base::string16 GetMessageText() const OVERRIDE;
65  virtual base::string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
66  virtual bool Accept() OVERRIDE;
67  virtual bool Cancel() OVERRIDE;
68  virtual void InfoBarDismissed() OVERRIDE;
69  virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE;
70  virtual std::string GetLearnMoreURL() const OVERRIDE;
71
72  HostContentSettingsMap* content_settings_;
73  base::string16 name_;
74
75  DISALLOW_COPY_AND_ASSIGN(UnauthorizedPluginInfoBarDelegate);
76};
77
78#if defined(ENABLE_PLUGIN_INSTALLATION)
79// Infobar that's shown when a plug-in is out of date.
80class OutdatedPluginInfoBarDelegate : public PluginInfoBarDelegate,
81                                      public WeakPluginInstallerObserver {
82 public:
83  // Creates an outdated plugin infobar and delegate and adds the infobar to
84  // |infobar_service|.
85  static void Create(InfoBarService* infobar_service,
86                     PluginInstaller* installer,
87                     scoped_ptr<PluginMetadata> metadata);
88
89 private:
90  OutdatedPluginInfoBarDelegate(PluginInstaller* installer,
91                                scoped_ptr<PluginMetadata> metadata,
92                                const base::string16& message);
93  virtual ~OutdatedPluginInfoBarDelegate();
94
95  // PluginInfoBarDelegate:
96  virtual base::string16 GetMessageText() const OVERRIDE;
97  virtual base::string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
98  virtual bool Accept() OVERRIDE;
99  virtual bool Cancel() OVERRIDE;
100  virtual void InfoBarDismissed() OVERRIDE;
101  virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE;
102  virtual std::string GetLearnMoreURL() const OVERRIDE;
103
104  // PluginInstallerObserver:
105  virtual void DownloadStarted() OVERRIDE;
106  virtual void DownloadError(const std::string& message) OVERRIDE;
107  virtual void DownloadCancelled() OVERRIDE;
108  virtual void DownloadFinished() OVERRIDE;
109
110  // WeakPluginInstallerObserver:
111  virtual void OnlyWeakObserversLeft() OVERRIDE;
112
113  // Replaces this infobar with one showing |message|. The new infobar will
114  // not have any buttons (and not call the callback).
115  void ReplaceWithInfoBar(const base::string16& message);
116
117  scoped_ptr<PluginMetadata> plugin_metadata_;
118
119  base::string16 message_;
120
121  DISALLOW_COPY_AND_ASSIGN(OutdatedPluginInfoBarDelegate);
122};
123
124// The main purpose for this class is to popup/close the infobar when there is
125// a missing plugin.
126class PluginInstallerInfoBarDelegate : public ConfirmInfoBarDelegate,
127                                       public WeakPluginInstallerObserver {
128 public:
129  typedef base::Callback<void(const PluginMetadata*)> InstallCallback;
130
131  // Shows an infobar asking whether to install the plugin represented by
132  // |installer|. When the user accepts, |callback| is called.
133  // During installation of the plug-in, the infobar will change to reflect the
134  // installation state.
135  static void Create(InfoBarService* infobar_service,
136                     PluginInstaller* installer,
137                     scoped_ptr<PluginMetadata> plugin_metadata,
138                     const InstallCallback& callback);
139
140  // Replaces |infobar|, which must currently be owned, with an infobar asking
141  // the user to install or update a particular plugin.
142  static void Replace(infobars::InfoBar* infobar,
143                      PluginInstaller* installer,
144                      scoped_ptr<PluginMetadata> plugin_metadata,
145                      bool new_install,
146                      const base::string16& message);
147
148 private:
149  PluginInstallerInfoBarDelegate(PluginInstaller* installer,
150                                 scoped_ptr<PluginMetadata> metadata,
151                                 const InstallCallback& callback,
152                                 bool new_install,
153                                 const base::string16& message);
154  virtual ~PluginInstallerInfoBarDelegate();
155
156  // ConfirmInfoBarDelegate:
157  virtual int GetIconID() const OVERRIDE;
158  virtual base::string16 GetMessageText() const OVERRIDE;
159  virtual int GetButtons() const OVERRIDE;
160  virtual base::string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
161  virtual bool Accept() OVERRIDE;
162  virtual base::string16 GetLinkText() const OVERRIDE;
163  virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE;
164
165  // PluginInstallerObserver:
166  virtual void DownloadStarted() OVERRIDE;
167  virtual void DownloadError(const std::string& message) OVERRIDE;
168  virtual void DownloadCancelled() OVERRIDE;
169  virtual void DownloadFinished() OVERRIDE;
170
171  // WeakPluginInstallerObserver:
172  virtual void OnlyWeakObserversLeft() OVERRIDE;
173
174  // Replaces this infobar with one showing |message|. The new infobar will
175  // not have any buttons (and not call the callback).
176  void ReplaceWithInfoBar(const base::string16& message);
177
178  scoped_ptr<PluginMetadata> plugin_metadata_;
179
180  InstallCallback callback_;
181
182  // True iff the plug-in isn't installed yet.
183  bool new_install_;
184
185  base::string16 message_;
186
187  DISALLOW_COPY_AND_ASSIGN(PluginInstallerInfoBarDelegate);
188};
189#endif  // defined(ENABLE_PLUGIN_INSTALLATION)
190
191#if defined(OS_WIN)
192class PluginMetroModeInfoBarDelegate : public ConfirmInfoBarDelegate {
193 public:
194  // The infobar can be used for two purposes: to inform the user about a
195  // missing plugin or to note that a plugin only works in desktop mode.  These
196  // purposes require different messages, buttons, etc.
197  enum Mode {
198    MISSING_PLUGIN,
199    DESKTOP_MODE_REQUIRED,
200  };
201
202  // Creates a metro mode infobar and delegate and adds the infobar to
203  // |infobar_service|.
204  static void Create(InfoBarService* infobar_service,
205                     Mode mode,
206                     const base::string16& name);
207
208 private:
209  PluginMetroModeInfoBarDelegate(Mode mode, const base::string16& name);
210  virtual ~PluginMetroModeInfoBarDelegate();
211
212  // ConfirmInfoBarDelegate:
213  virtual int GetIconID() const OVERRIDE;
214  virtual base::string16 GetMessageText() const OVERRIDE;
215  virtual int GetButtons() const OVERRIDE;
216  virtual base::string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
217  virtual bool Accept() OVERRIDE;
218  virtual base::string16 GetLinkText() const OVERRIDE;
219  virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE;
220
221  const Mode mode_;
222  const base::string16 name_;
223
224  DISALLOW_COPY_AND_ASSIGN(PluginMetroModeInfoBarDelegate);
225};
226#endif  // defined(OS_WIN)
227
228#endif  // CHROME_BROWSER_PLUGINS_PLUGIN_INFOBAR_DELEGATES_H_
229