text: // 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_PLUGIN_INFOBAR_DELEGATES_H_
  #define CHROME_BROWSER_PLUGIN_INFOBAR_DELEGATES_H_
  #pragma once
  
  #include "base/callback.h"
  #include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
  #include "googleurl/src/gurl.h"
  
  #if defined(ENABLE_PLUGIN_INSTALLATION)
  #include "chrome/browser/plugin_installer_observer.h"
  #endif  // defined(ENABLE_PLUGIN_INSTALLATION)
  
  class HostContentSettingsMap;
  class PluginObserver;
  
  // Base class for blocked plug-in infobars.
  class PluginInfoBarDelegate : public ConfirmInfoBarDelegate {
   public:
    PluginInfoBarDelegate(InfoBarTabHelper* infobar_helper, const string16& name);
  
   protected:
    virtual ~PluginInfoBarDelegate();
  
    // ConfirmInfoBarDelegate:
    virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE;
  
    virtual std::string GetLearnMoreURL() const = 0;
  
    void LoadBlockedPlugins();
  
    string16 name_;
  
   private:
    // ConfirmInfoBarDelegate:
    virtual gfx::Image* GetIcon() const OVERRIDE;
    virtual string16 GetLinkText() const OVERRIDE;
  
    DISALLOW_COPY_AND_ASSIGN(PluginInfoBarDelegate);
  };
  
  // Infobar that's shown when a plug-in requires user authorization to run.
  class UnauthorizedPluginInfoBarDelegate : public PluginInfoBarDelegate {
   public:
    UnauthorizedPluginInfoBarDelegate(InfoBarTabHelper* infobar_helper,
                                 HostContentSettingsMap* content_settings,
                                 const string16& name);
  
   private:
    virtual ~UnauthorizedPluginInfoBarDelegate();
  
    // PluginInfoBarDelegate:
    virtual string16 GetMessageText() const OVERRIDE;
    virtual 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_;
  
    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:
    static InfoBarDelegate* Create(PluginObserver* observer,
                                   PluginInstaller* installer);
  
   private:
    OutdatedPluginInfoBarDelegate(PluginObserver* observer,
                                  PluginInstaller* installer,
                                  const string16& message);
    virtual ~OutdatedPluginInfoBarDelegate();
  
    // PluginInfoBarDelegate:
    virtual string16 GetMessageText() const OVERRIDE;
    virtual 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 string16& message);
  
    // Has the same lifetime as TabContentsWrapper, which owns us
    // (transitively via InfoBarTabHelper).
    PluginObserver* observer_;
  
    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:
    // 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 InfoBarDelegate* Create(InfoBarTabHelper* infobar_helper,
                                   PluginInstaller* installer,
                                   const base::Closure& callback);
  
   private:
    friend class OutdatedPluginInfoBarDelegate;
  
    PluginInstallerInfoBarDelegate(InfoBarTabHelper* infobar_helper,
                                   PluginInstaller* installer,
                                   const base::Closure& callback,
                                   bool new_install,
                                   const string16& message);
    virtual ~PluginInstallerInfoBarDelegate();
  
    // ConfirmInfoBarDelegate:
    virtual gfx::Image* GetIcon() const OVERRIDE;
    virtual string16 GetMessageText() const OVERRIDE;
    virtual int GetButtons() const OVERRIDE;
    virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
    virtual bool Accept() OVERRIDE;
    virtual 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 string16& message);
  
    base::Closure callback_;
  
    // True iff the plug-in isn't installed yet.
    bool new_install_;
  
    string16 message_;
  
    DISALLOW_COPY_AND_ASSIGN(PluginInstallerInfoBarDelegate);
  };
  #endif  // defined(ENABLE_PLUGIN_INSTALLATION)
  
  #endif  // CHROME_BROWSER_PLUGIN_INFOBAR_DELEGATES_H_
  