// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_PLUGINS_PLUGIN_INFOBAR_DELEGATES_H_ #define CHROME_BROWSER_PLUGINS_PLUGIN_INFOBAR_DELEGATES_H_ #include "base/callback.h" #include "chrome/browser/infobars/confirm_infobar_delegate.h" #include "url/gurl.h" #if defined(ENABLE_PLUGIN_INSTALLATION) #include "chrome/browser/plugins/plugin_installer_observer.h" #endif class InfoBarService; class HostContentSettingsMap; class PluginMetadata; namespace content { class WebContents; } // Base class for blocked plug-in infobars. class PluginInfoBarDelegate : public ConfirmInfoBarDelegate { protected: explicit PluginInfoBarDelegate(const std::string& identifier); virtual ~PluginInfoBarDelegate(); // ConfirmInfoBarDelegate: virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE; virtual std::string GetLearnMoreURL() const = 0; void LoadBlockedPlugins(); private: // ConfirmInfoBarDelegate: virtual int GetIconID() const OVERRIDE; virtual base::string16 GetLinkText() const OVERRIDE; std::string identifier_; DISALLOW_COPY_AND_ASSIGN(PluginInfoBarDelegate); }; // Infobar that's shown when a plug-in requires user authorization to run. class UnauthorizedPluginInfoBarDelegate : public PluginInfoBarDelegate { public: // Creates an unauthorized plugin infobar and delegate and adds the infobar to // |infobar_service|. static void Create(InfoBarService* infobar_service, HostContentSettingsMap* content_settings, const base::string16& name, const std::string& identifier); private: UnauthorizedPluginInfoBarDelegate(HostContentSettingsMap* content_settings, const base::string16& name, const std::string& identifier); virtual ~UnauthorizedPluginInfoBarDelegate(); // PluginInfoBarDelegate: virtual base::string16 GetMessageText() const OVERRIDE; virtual base::string16 GetButtonLabel(InfoBarButton button) const OVERRIDE; virtual bool Accept() OVERRIDE; virtual bool Cancel() OVERRIDE; virtual void InfoBarDismissed() OVERRIDE; virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE; virtual std::string GetLearnMoreURL() const OVERRIDE; HostContentSettingsMap* content_settings_; base::string16 name_; DISALLOW_COPY_AND_ASSIGN(UnauthorizedPluginInfoBarDelegate); }; #if defined(ENABLE_PLUGIN_INSTALLATION) // Infobar that's shown when a plug-in is out of date. class OutdatedPluginInfoBarDelegate : public PluginInfoBarDelegate, public WeakPluginInstallerObserver { public: // Creates an outdated plugin infobar and delegate and adds the infobar to // |infobar_service|. static void Create(InfoBarService* infobar_service, PluginInstaller* installer, scoped_ptr<PluginMetadata> metadata); private: OutdatedPluginInfoBarDelegate(PluginInstaller* installer, scoped_ptr<PluginMetadata> metadata, const base::string16& message); virtual ~OutdatedPluginInfoBarDelegate(); // PluginInfoBarDelegate: virtual base::string16 GetMessageText() const OVERRIDE; virtual base::string16 GetButtonLabel(InfoBarButton button) const OVERRIDE; virtual bool Accept() OVERRIDE; virtual bool Cancel() OVERRIDE; virtual void InfoBarDismissed() OVERRIDE; virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE; virtual std::string GetLearnMoreURL() const OVERRIDE; // PluginInstallerObserver: virtual void DownloadStarted() OVERRIDE; virtual void DownloadError(const std::string& message) OVERRIDE; virtual void DownloadCancelled() OVERRIDE; virtual void DownloadFinished() OVERRIDE; // WeakPluginInstallerObserver: virtual void OnlyWeakObserversLeft() OVERRIDE; // Replaces this infobar with one showing |message|. The new infobar will // not have any buttons (and not call the callback). void ReplaceWithInfoBar(const base::string16& message); scoped_ptr<PluginMetadata> plugin_metadata_; base::string16 message_; DISALLOW_COPY_AND_ASSIGN(OutdatedPluginInfoBarDelegate); }; // The main purpose for this class is to popup/close the infobar when there is // a missing plugin. class PluginInstallerInfoBarDelegate : public ConfirmInfoBarDelegate, public WeakPluginInstallerObserver { public: typedef base::Callback<void(const PluginMetadata*)> InstallCallback; // Shows an infobar asking whether to install the plugin represented by // |installer|. When the user accepts, |callback| is called. // During installation of the plug-in, the infobar will change to reflect the // installation state. static void Create(InfoBarService* infobar_service, PluginInstaller* installer, scoped_ptr<PluginMetadata> plugin_metadata, const InstallCallback& callback); // Replaces |infobar|, which must currently be owned, with an infobar asking // the user to install or update a particular plugin. static void Replace(InfoBar* infobar, PluginInstaller* installer, scoped_ptr<PluginMetadata> plugin_metadata, bool new_install, const base::string16& message); private: PluginInstallerInfoBarDelegate(PluginInstaller* installer, scoped_ptr<PluginMetadata> metadata, const InstallCallback& callback, bool new_install, const base::string16& message); virtual ~PluginInstallerInfoBarDelegate(); // ConfirmInfoBarDelegate: virtual int GetIconID() const OVERRIDE; virtual base::string16 GetMessageText() const OVERRIDE; virtual int GetButtons() const OVERRIDE; virtual base::string16 GetButtonLabel(InfoBarButton button) const OVERRIDE; virtual bool Accept() OVERRIDE; virtual base::string16 GetLinkText() const OVERRIDE; virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE; // PluginInstallerObserver: virtual void DownloadStarted() OVERRIDE; virtual void DownloadError(const std::string& message) OVERRIDE; virtual void DownloadCancelled() OVERRIDE; virtual void DownloadFinished() OVERRIDE; // WeakPluginInstallerObserver: virtual void OnlyWeakObserversLeft() OVERRIDE; // Replaces this infobar with one showing |message|. The new infobar will // not have any buttons (and not call the callback). void ReplaceWithInfoBar(const base::string16& message); scoped_ptr<PluginMetadata> plugin_metadata_; InstallCallback callback_; // True iff the plug-in isn't installed yet. bool new_install_; base::string16 message_; DISALLOW_COPY_AND_ASSIGN(PluginInstallerInfoBarDelegate); }; #endif // defined(ENABLE_PLUGIN_INSTALLATION) #if defined(OS_WIN) class PluginMetroModeInfoBarDelegate : public ConfirmInfoBarDelegate { public: // The infobar can be used for two purposes: to inform the user about a // missing plugin or to note that a plugin only works in desktop mode. These // purposes require different messages, buttons, etc. enum Mode { MISSING_PLUGIN, DESKTOP_MODE_REQUIRED, }; // Creates a metro mode infobar and delegate and adds the infobar to // |infobar_service|. static void Create(InfoBarService* infobar_service, Mode mode, const base::string16& name); private: PluginMetroModeInfoBarDelegate(Mode mode, const base::string16& name); virtual ~PluginMetroModeInfoBarDelegate(); // ConfirmInfoBarDelegate: virtual int GetIconID() const OVERRIDE; virtual base::string16 GetMessageText() const OVERRIDE; virtual int GetButtons() const OVERRIDE; virtual base::string16 GetButtonLabel(InfoBarButton button) const OVERRIDE; virtual bool Accept() OVERRIDE; virtual base::string16 GetLinkText() const OVERRIDE; virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE; const Mode mode_; const base::string16 name_; DISALLOW_COPY_AND_ASSIGN(PluginMetroModeInfoBarDelegate); }; #endif // defined(OS_WIN) #endif // CHROME_BROWSER_PLUGINS_PLUGIN_INFOBAR_DELEGATES_H_