15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_PLUGINS_PLUGIN_INSTALLER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_PLUGINS_PLUGIN_INSTALLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/gtest_prod_util.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/version.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_metadata.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/download_interrupt_reasons.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginInstallerObserver;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WeakPluginInstallerObserver;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass DownloadManager;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct WebPluginInfo;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginInstaller : public content::DownloadItem::Observer {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum InstallerState {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALLER_STATE_IDLE,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALLER_STATE_DOWNLOADING,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginInstaller();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PluginInstaller();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadUpdated(content::DownloadItem* download) OVERRIDE;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadDestroyed(content::DownloadItem* download) OVERRIDE;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddObserver(PluginInstallerObserver* observer);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveObserver(PluginInstallerObserver* observer);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddWeakObserver(WeakPluginInstallerObserver* observer);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveWeakObserver(WeakPluginInstallerObserver* observer);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallerState state() const { return state_; }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opens the download URL in a new tab.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OpenDownloadURL(const GURL& plugin_url,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       content::WebContents* web_contents);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts downloading the download URL and opens the downloaded file
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when finished.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartInstalling(const GURL& plugin_url,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       content::WebContents* web_contents);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void StartInstallingWithDownloadManager(
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const GURL& plugin_url,
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      content::WebContents* web_contents,
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      content::DownloadManager* download_manager);
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DownloadStarted(content::DownloadItem* item,
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       content::DownloadInterruptReason interrupt_reason);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DownloadError(const std::string& msg);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DownloadCancelled();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallerState state_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<PluginInstallerObserver> observers_;
68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int strong_observer_count_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<WeakPluginInstallerObserver> weak_observers_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  FRIEND_TEST_ALL_PREFIXES(PluginInstallerTest,
720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           StartInstalling_SuccessfulDownload);
730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  FRIEND_TEST_ALL_PREFIXES(PluginInstallerTest, StartInstalling_FailedStart);
740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  FRIEND_TEST_ALL_PREFIXES(PluginInstallerTest, StartInstalling_Interrupted);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PluginInstaller);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_PLUGINS_PLUGIN_INSTALLER_H_
79