158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/app_installer.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/common/extensions/webstore_install_result.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/web_contents.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/web_contents_observer.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace file_manager {
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace {
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kWebContentsDestroyedError[] = "WebContents is destroyed.";
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass AppInstaller::WebContentsObserver : public content::WebContentsObserver {
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebContentsObserver(content::WebContents* web_contents, AppInstaller* parent)
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : content::WebContentsObserver(web_contents),
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        parent_(parent) {
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // content::WebContentsObserver implementation.
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void WebContentsDestroyed() OVERRIDE {
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    parent_->OnWebContentsDestroyed(web_contents());
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppInstaller* parent_;
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DISALLOW_IMPLICIT_CONSTRUCTORS(WebContentsObserver);
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
36116680a4aac90f2aa7413d9095a592090648e557Ben MurdochAppInstaller::AppInstaller(content::WebContents* web_contents,
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           const std::string& item_id,
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           Profile* profile,
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           bool silent_installation,
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           const Callback& callback)
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : extensions::WebstoreStandaloneInstaller(item_id, profile, callback),
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      silent_installation_(silent_installation),
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      callback_(callback),
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      web_contents_(web_contents),
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      web_contents_observer_(new WebContentsObserver(web_contents, this)) {
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)AppInstaller::~AppInstaller() {}
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool AppInstaller::CheckRequestorAlive() const {
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The tab may have gone away - cancel installation in that case.
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return web_contents_ != NULL;
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const GURL& AppInstaller::GetRequestorURL() const {
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return GURL::EmptyGURL();
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)scoped_refptr<ExtensionInstallPrompt::Prompt>
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)AppInstaller::CreateInstallPrompt() const {
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (silent_installation_)
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return NULL;
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt(
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new ExtensionInstallPrompt::Prompt(
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          ExtensionInstallPrompt::INLINE_INSTALL_PROMPT));
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prompt->SetWebstoreData(localized_user_count(),
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          show_user_count(),
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          average_rating(),
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          rating_count());
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return prompt;
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool AppInstaller::ShouldShowPostInstallUI() const {
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return false;
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool AppInstaller::ShouldShowAppInstalledBubble() const {
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return false;
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)content::WebContents* AppInstaller::GetWebContents() const {
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return web_contents_;
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool AppInstaller::CheckInlineInstallPermitted(
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const base::DictionaryValue& webstore_data,
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::string* error) const {
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(error != NULL);
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(error->empty());
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return true;
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool AppInstaller::CheckRequestorPermitted(
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const base::DictionaryValue& webstore_data,
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::string* error) const {
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(error != NULL);
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(error->empty());
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return true;
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AppInstaller::OnWebContentsDestroyed(
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    content::WebContents* web_contents) {
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  callback_.Run(false,
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                kWebContentsDestroyedError,
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                extensions::webstore_install::OTHER_ERROR);
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AbortInstall();
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace file_manager
112