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