1// Copyright 2013 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#include "chrome/browser/chromeos/file_manager/app_installer.h"
6
7#include "base/strings/stringprintf.h"
8#include "chrome/browser/profiles/profile.h"
9#include "content/public/browser/web_contents.h"
10
11namespace file_manager {
12
13namespace {
14const char kWebContentsDestroyedError[] = "WebContents is destroyed.";
15}  // namespace
16
17class AppInstaller::WebContentsObserver
18    : public content::WebContentsObserver {
19
20 public:
21  explicit WebContentsObserver(
22      content::WebContents* web_contents,
23      AppInstaller* parent)
24      : content::WebContentsObserver(web_contents),
25        parent_(parent) {
26  }
27
28 protected:
29  // content::WebContentsObserver implementation.
30  virtual void WebContentsDestroyed(
31      content::WebContents* web_contents) OVERRIDE {
32    parent_->OnWebContentsDestroyed(web_contents);
33  }
34
35 private:
36  AppInstaller* parent_;
37
38  DISALLOW_IMPLICIT_CONSTRUCTORS(WebContentsObserver);
39};
40
41AppInstaller::AppInstaller(
42    content::WebContents* web_contents,
43    const std::string& webstore_item_id,
44    Profile* profile,
45    const Callback& callback)
46    : extensions::WebstoreStandaloneInstaller(
47          webstore_item_id,
48          profile,
49          callback),
50      callback_(callback),
51      web_contents_(web_contents),
52      web_contents_observer_(new WebContentsObserver(web_contents, this)) {
53}
54
55AppInstaller::~AppInstaller() {}
56
57bool AppInstaller::CheckRequestorAlive() const {
58  // The tab may have gone away - cancel installation in that case.
59  return web_contents_ != NULL;
60}
61
62const GURL& AppInstaller::GetRequestorURL() const {
63  return GURL::EmptyGURL();
64}
65
66scoped_ptr<ExtensionInstallPrompt::Prompt>
67AppInstaller::CreateInstallPrompt() const {
68  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt(
69      new ExtensionInstallPrompt::Prompt(
70          ExtensionInstallPrompt::INLINE_INSTALL_PROMPT));
71
72  prompt->SetInlineInstallWebstoreData(localized_user_count(),
73                                       show_user_count(),
74                                       average_rating(),
75                                       rating_count());
76  return prompt.Pass();
77}
78
79bool AppInstaller::ShouldShowPostInstallUI() const {
80  return false;
81}
82
83bool AppInstaller::ShouldShowAppInstalledBubble() const {
84  return false;
85}
86
87content::WebContents* AppInstaller::GetWebContents() const {
88  return web_contents_;
89}
90
91bool AppInstaller::CheckInlineInstallPermitted(
92    const base::DictionaryValue& webstore_data,
93    std::string* error) const {
94  DCHECK(error != NULL);
95  DCHECK(error->empty());
96  return true;
97}
98
99bool AppInstaller::CheckRequestorPermitted(
100    const base::DictionaryValue& webstore_data,
101    std::string* error) const {
102  DCHECK(error != NULL);
103  DCHECK(error->empty());
104  return true;
105}
106
107void AppInstaller::OnWebContentsDestroyed(
108    content::WebContents* web_contents) {
109  callback_.Run(false, kWebContentsDestroyedError);
110  AbortInstall();
111}
112
113}  // namespace file_manager
114