1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/external_install_error.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/bind.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/utf_string_conversions.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/app/chrome_command_ids.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/extension_service.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/external_install_manager.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/webstore_data_fetcher.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/profiles/profile.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/browser.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/browser_finder.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/global_error/global_error.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/global_error/global_error_service.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/global_error/global_error_service_factory.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/tabs/tab_strip_model.h"
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_registry.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_system.h"
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/uninstall_reason.h"
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/constants.h"
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/extension.h"
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/base/l10n/l10n_util.h"
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/image/image.h"
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/image/image_skia_operations.h"
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace extensions {
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Return the menu label for a global error.
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::string16 GetMenuItemLabel(const Extension* extension) {
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!extension)
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return base::string16();
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int id = -1;
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (extension->is_app())
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    id = IDS_EXTENSION_EXTERNAL_INSTALL_ALERT_APP;
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else if (extension->is_theme())
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    id = IDS_EXTENSION_EXTERNAL_INSTALL_ALERT_THEME;
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    id = IDS_EXTENSION_EXTERNAL_INSTALL_ALERT_EXTENSION;
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return l10n_util::GetStringFUTF16(id, base::UTF8ToUTF16(extension->name()));
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// A global error that spawns a dialog when the menu item is clicked.
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ExternalInstallMenuAlert : public GlobalError {
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit ExternalInstallMenuAlert(ExternalInstallError* error);
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~ExternalInstallMenuAlert();
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // GlobalError implementation.
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual Severity GetSeverity() OVERRIDE;
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool HasMenuItem() OVERRIDE;
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual int MenuItemCommandID() OVERRIDE;
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual base::string16 MenuItemLabel() OVERRIDE;
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void ExecuteMenuItem(Browser* browser) OVERRIDE;
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool HasBubbleView() OVERRIDE;
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool HasShownBubbleView() OVERRIDE;
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void ShowBubbleView(Browser* browser) OVERRIDE;
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual GlobalErrorBubbleViewBase* GetBubbleView() OVERRIDE;
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The owning ExternalInstallError.
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExternalInstallError* error_;
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(ExternalInstallMenuAlert);
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// A global error that spawns a bubble when the menu item is clicked.
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ExternalInstallBubbleAlert : public GlobalErrorWithStandardBubble {
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit ExternalInstallBubbleAlert(ExternalInstallError* error,
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      ExtensionInstallPrompt::Prompt* prompt);
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~ExternalInstallBubbleAlert();
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // GlobalError implementation.
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual Severity GetSeverity() OVERRIDE;
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool HasMenuItem() OVERRIDE;
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual int MenuItemCommandID() OVERRIDE;
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual base::string16 MenuItemLabel() OVERRIDE;
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void ExecuteMenuItem(Browser* browser) OVERRIDE;
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // GlobalErrorWithStandardBubble implementation.
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual gfx::Image GetBubbleViewIcon() OVERRIDE;
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual base::string16 GetBubbleViewTitle() OVERRIDE;
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual std::vector<base::string16> GetBubbleViewMessages() OVERRIDE;
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual base::string16 GetBubbleViewAcceptButtonLabel() OVERRIDE;
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual base::string16 GetBubbleViewCancelButtonLabel() OVERRIDE;
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnBubbleViewDidClose(Browser* browser) OVERRIDE;
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void BubbleViewAcceptButtonPressed(Browser* browser) OVERRIDE;
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void BubbleViewCancelButtonPressed(Browser* browser) OVERRIDE;
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The owning ExternalInstallError.
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExternalInstallError* error_;
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The Prompt with all information, which we then use to populate the bubble.
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionInstallPrompt::Prompt* prompt_;
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(ExternalInstallBubbleAlert);
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch////////////////////////////////////////////////////////////////////////////////
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// ExternalInstallMenuAlert
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
111116680a4aac90f2aa7413d9095a592090648e557Ben MurdochExternalInstallMenuAlert::ExternalInstallMenuAlert(ExternalInstallError* error)
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : error_(error) {
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
115116680a4aac90f2aa7413d9095a592090648e557Ben MurdochExternalInstallMenuAlert::~ExternalInstallMenuAlert() {
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
118116680a4aac90f2aa7413d9095a592090648e557Ben MurdochGlobalError::Severity ExternalInstallMenuAlert::GetSeverity() {
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return SEVERITY_LOW;
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ExternalInstallMenuAlert::HasMenuItem() {
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint ExternalInstallMenuAlert::MenuItemCommandID() {
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return IDC_EXTERNAL_EXTENSION_ALERT;
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::string16 ExternalInstallMenuAlert::MenuItemLabel() {
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return GetMenuItemLabel(error_->GetExtension());
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExternalInstallMenuAlert::ExecuteMenuItem(Browser* browser) {
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  error_->ShowDialog(browser);
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ExternalInstallMenuAlert::HasBubbleView() {
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return false;
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ExternalInstallMenuAlert::HasShownBubbleView() {
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  NOTREACHED();
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExternalInstallMenuAlert::ShowBubbleView(Browser* browser) {
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  NOTREACHED();
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
151116680a4aac90f2aa7413d9095a592090648e557Ben MurdochGlobalErrorBubbleViewBase* ExternalInstallMenuAlert::GetBubbleView() {
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return NULL;
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch////////////////////////////////////////////////////////////////////////////////
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// ExternalInstallBubbleAlert
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
158116680a4aac90f2aa7413d9095a592090648e557Ben MurdochExternalInstallBubbleAlert::ExternalInstallBubbleAlert(
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ExternalInstallError* error,
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ExtensionInstallPrompt::Prompt* prompt)
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : error_(error), prompt_(prompt) {
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(error_);
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(prompt_);
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
166116680a4aac90f2aa7413d9095a592090648e557Ben MurdochExternalInstallBubbleAlert::~ExternalInstallBubbleAlert() {
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
169116680a4aac90f2aa7413d9095a592090648e557Ben MurdochGlobalError::Severity ExternalInstallBubbleAlert::GetSeverity() {
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return SEVERITY_LOW;
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ExternalInstallBubbleAlert::HasMenuItem() {
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint ExternalInstallBubbleAlert::MenuItemCommandID() {
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return IDC_EXTERNAL_EXTENSION_ALERT;
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::string16 ExternalInstallBubbleAlert::MenuItemLabel() {
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return GetMenuItemLabel(error_->GetExtension());
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExternalInstallBubbleAlert::ExecuteMenuItem(Browser* browser) {
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ShowBubbleView(browser);
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::Image ExternalInstallBubbleAlert::GetBubbleViewIcon() {
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (prompt_->icon().IsEmpty())
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return GlobalErrorWithStandardBubble::GetBubbleViewIcon();
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Scale icon to a reasonable size.
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return gfx::Image(gfx::ImageSkiaOperations::CreateResizedImage(
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      *prompt_->icon().ToImageSkia(),
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      skia::ImageOperations::RESIZE_BEST,
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      gfx::Size(extension_misc::EXTENSION_ICON_SMALL,
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                extension_misc::EXTENSION_ICON_SMALL)));
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::string16 ExternalInstallBubbleAlert::GetBubbleViewTitle() {
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return prompt_->GetDialogTitle();
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::vector<base::string16>
205116680a4aac90f2aa7413d9095a592090648e557Ben MurdochExternalInstallBubbleAlert::GetBubbleViewMessages() {
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionInstallPrompt::PermissionsType regular_permissions =
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS;
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionInstallPrompt::PermissionsType withheld_permissions =
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ExtensionInstallPrompt::PermissionsType::WITHHELD_PERMISSIONS;
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<base::string16> messages;
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  messages.push_back(prompt_->GetHeading());
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (prompt_->GetPermissionCount(regular_permissions)) {
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    messages.push_back(prompt_->GetPermissionsHeading(regular_permissions));
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (size_t i = 0; i < prompt_->GetPermissionCount(regular_permissions);
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         ++i) {
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      messages.push_back(l10n_util::GetStringFUTF16(
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          IDS_EXTENSION_PERMISSION_LINE,
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          prompt_->GetPermission(i, regular_permissions)));
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (prompt_->GetPermissionCount(withheld_permissions)) {
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    messages.push_back(prompt_->GetPermissionsHeading(withheld_permissions));
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (size_t i = 0; i < prompt_->GetPermissionCount(withheld_permissions);
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         ++i) {
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      messages.push_back(l10n_util::GetStringFUTF16(
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          IDS_EXTENSION_PERMISSION_LINE,
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          prompt_->GetPermission(i, withheld_permissions)));
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(yoz): OAuth issue advice?
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return messages;
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::string16 ExternalInstallBubbleAlert::GetBubbleViewAcceptButtonLabel() {
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return prompt_->GetAcceptButtonLabel();
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::string16 ExternalInstallBubbleAlert::GetBubbleViewCancelButtonLabel() {
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return prompt_->GetAbortButtonLabel();
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExternalInstallBubbleAlert::OnBubbleViewDidClose(Browser* browser) {
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExternalInstallBubbleAlert::BubbleViewAcceptButtonPressed(
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Browser* browser) {
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  error_->InstallUIProceed();
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExternalInstallBubbleAlert::BubbleViewCancelButtonPressed(
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Browser* browser) {
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  error_->InstallUIAbort(true);
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch////////////////////////////////////////////////////////////////////////////////
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// ExternalInstallError
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
261116680a4aac90f2aa7413d9095a592090648e557Ben MurdochExternalInstallError::ExternalInstallError(
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::BrowserContext* browser_context,
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& extension_id,
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AlertType alert_type,
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ExternalInstallManager* manager)
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : browser_context_(browser_context),
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extension_id_(extension_id),
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      alert_type_(alert_type),
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      manager_(manager),
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      error_service_(GlobalErrorServiceFactory::GetForProfile(
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          Profile::FromBrowserContext(browser_context_))),
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      weak_factory_(this) {
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  prompt_ = new ExtensionInstallPrompt::Prompt(
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ExtensionInstallPrompt::EXTERNAL_INSTALL_PROMPT);
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  webstore_data_fetcher_.reset(new WebstoreDataFetcher(
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      this, browser_context_->GetRequestContext(), GURL(), extension_id_));
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  webstore_data_fetcher_->Start();
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
281116680a4aac90f2aa7413d9095a592090648e557Ben MurdochExternalInstallError::~ExternalInstallError() {
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (global_error_.get())
283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    error_service_->RemoveGlobalError(global_error_.get());
284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExternalInstallError::InstallUIProceed() {
287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const Extension* extension = GetExtension();
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (extension) {
289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ExtensionSystem::Get(browser_context_)
290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ->extension_service()
291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ->GrantPermissionsAndEnableExtension(extension);
292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Since the manager listens for the extension to be loaded, this will
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // remove the error...
294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // ... Otherwise we have to do it explicitly.
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager_->RemoveExternalInstallError();
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
300116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExternalInstallError::InstallUIAbort(bool user_initiated) {
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (user_initiated && GetExtension()) {
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ExtensionSystem::Get(browser_context_)
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ->extension_service()
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ->UninstallExtension(extension_id_,
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             extensions::UNINSTALL_REASON_INSTALL_CANCELED,
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             base::Bind(&base::DoNothing),
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             NULL);  // Ignore error.
308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Since the manager listens for the extension to be removed, this will
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // remove the error...
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // ... Otherwise we have to do it explicitly.
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager_->RemoveExternalInstallError();
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExternalInstallError::ShowDialog(Browser* browser) {
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(install_ui_.get());
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(prompt_.get());
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(browser);
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::WebContents* web_contents = NULL;
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  web_contents = browser->tab_strip_model()->GetActiveWebContents();
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionInstallPrompt::ShowParams params(web_contents);
323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionInstallPrompt::GetDefaultShowDialogCallback().Run(
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      params, this, prompt_);
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst Extension* ExternalInstallError::GetExtension() const {
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ExtensionRegistry::Get(browser_context_)
329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ->GetExtensionById(extension_id_, ExtensionRegistry::EVERYTHING);
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExternalInstallError::OnWebstoreRequestFailure() {
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  OnFetchComplete();
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExternalInstallError::OnWebstoreResponseParseSuccess(
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<base::DictionaryValue> webstore_data) {
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string localized_user_count;
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  double average_rating = 0;
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int rating_count = 0;
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!webstore_data->GetString(kUsersKey, &localized_user_count) ||
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !webstore_data->GetDouble(kAverageRatingKey, &average_rating) ||
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !webstore_data->GetInteger(kRatingCountKey, &rating_count)) {
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // If we don't get a valid webstore response, short circuit, and continue
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // to show a prompt without webstore data.
346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    OnFetchComplete();
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool show_user_count = true;
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  webstore_data->GetBoolean(kShowUserCountKey, &show_user_count);
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  prompt_->SetWebstoreData(
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      localized_user_count, show_user_count, average_rating, rating_count);
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  OnFetchComplete();
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExternalInstallError::OnWebstoreResponseParseFailure(
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& error) {
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  OnFetchComplete();
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
363116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExternalInstallError::OnFetchComplete() {
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Create a new ExtensionInstallPrompt. We pass in NULL for the UI
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // components because we display at a later point, and don't want
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // to pass ones which may be invalidated.
367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  install_ui_.reset(
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new ExtensionInstallPrompt(Profile::FromBrowserContext(browser_context_),
369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 NULL,    // NULL native window.
370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 NULL));  // NULL navigator.
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  install_ui_->ConfirmExternalInstall(
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      this,
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetExtension(),
375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&ExternalInstallError::OnDialogReady,
376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 weak_factory_.GetWeakPtr()),
377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      prompt_);
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExternalInstallError::OnDialogReady(
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const ExtensionInstallPrompt::ShowParams& show_params,
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ExtensionInstallPrompt::Delegate* prompt_delegate,
383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) {
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK_EQ(this, prompt_delegate);
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  prompt_ = prompt;
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (alert_type_ == BUBBLE_ALERT) {
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    global_error_.reset(new ExternalInstallBubbleAlert(this, prompt_.get()));
389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    error_service_->AddGlobalError(global_error_.get());
390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    Browser* browser =
392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        chrome::FindTabbedBrowser(Profile::FromBrowserContext(browser_context_),
393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  true,
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  chrome::GetActiveDesktop());
395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (browser)
396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      global_error_->ShowBubbleView(browser);
397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK(alert_type_ == MENU_ALERT);
399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    global_error_.reset(new ExternalInstallMenuAlert(this));
400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    error_service_->AddGlobalError(global_error_.get());
401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace extensions
405