extension_install_prompt.cc revision a36e5920737c6adbddd3e43b760e5de8431db6e0
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)#include "chrome/browser/extensions/extension_install_prompt.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/bundle_installer.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_install_ui.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/image_loader.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/signin/profile_oauth2_token_service.h"
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_icon_set.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_manifest_constants.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/feature_switch.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest.h"
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/icons_handler.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/permissions/permission_set.h"
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/common/extensions/permissions/permissions_data.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_view.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::BundleInstaller;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Manifest;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::PermissionSet;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTitleIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // The regular install prompt depends on what's being installed.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_INLINE_INSTALL_PROMPT_TITLE,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_INSTALL_PROMPT_TITLE,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_RE_ENABLE_PROMPT_TITLE,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PERMISSIONS_PROMPT_TITLE,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_TITLE,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IDS_EXTENSION_POST_INSTALL_PERMISSIONS_PROMPT_TITLE,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kHeadingIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_INSTALL_PROMPT_HEADING,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // Inline installs use the extension name.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // Heading for bundle installs depends on the bundle contents.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_RE_ENABLE_PROMPT_HEADING,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PERMISSIONS_PROMPT_HEADING,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // External installs use different strings for extensions/apps.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IDS_EXTENSION_POST_INSTALL_PERMISSIONS_PROMPT_HEADING,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const int kButtons[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::DIALOG_BUTTON_CANCEL,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kAcceptButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_RE_ENABLE_BUTTON,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_PERMISSIONS_BUTTON,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // External installs use different strings for extensions/apps.
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  IDS_EXTENSION_PROMPT_PERMISSIONS_CLEAR_RETAINED_FILES_BUTTON,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kAbortButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // These all use the platform's default cancel label.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_PERMISSIONS_ABORT_BUTTON,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ABORT_BUTTON,
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IDS_CLOSE,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kPermissionsHeaderIds[
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_THESE_WILL_HAVE_ACCESS_TO,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_WILL_NOW_HAVE_ACCESS_TO,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_WANTS_ACCESS_TO,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IDS_EXTENSION_PROMPT_CAN_ACCESS,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kOAuthHeaderIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_OAUTH_HEADER,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // Inline installs don't show OAuth permissions.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // Bundle installs don't show OAuth permissions.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_OAUTH_REENABLE_HEADER,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_OAUTH_PERMISSIONS_HEADER,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(mpcomplete): Do we need this for external install UI? If we do,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we need to update FetchOAuthIssueAdviceIfNeeded.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Size of extension icon in top left of dialog.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kIconSize = 69;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns pixel size under maximal scale factor for the icon whose device
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// independent size is |size_in_dip|
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetSizeForMaxScaleFactor(int size_in_dip) {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float max_scale_factor_scale =
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::GetScaleFactorScale(ui::GetMaxScaleFactor());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<int>(size_in_dip * max_scale_factor_scale);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns bitmap for the default icon with size equal to the default icon's
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pixel size under maximal supported scale factor.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap GetDefaultIconBitmapForMaxScaleFactor(bool is_app) {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::ImageSkia& image = is_app ?
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::IconsInfo::GetDefaultAppIcon() :
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::IconsInfo::GetDefaultExtensionIcon();
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return image.GetRepresentation(ui::GetMaxScaleFactor()).sk_bitmap();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If auto confirm is enabled then posts a task to proceed with or cancel the
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// install and returns true. Otherwise returns false.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AutoConfirmPrompt(ExtensionInstallPrompt::Delegate* delegate) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CommandLine* cmdline = CommandLine::ForCurrentProcess();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cmdline->HasSwitch(switches::kAppsGalleryInstallAutoConfirmForTests))
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value = cmdline->GetSwitchValueASCII(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kAppsGalleryInstallAutoConfirmForTests);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We use PostTask instead of calling the delegate directly here, because in
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the real implementations it's highly likely the message loop will be
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pumping a few times before the user clicks accept or cancel.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (value == "accept") {
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&ExtensionInstallPrompt::Delegate::InstallUIProceed,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(delegate)));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (value == "cancel") {
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&ExtensionInstallPrompt::Delegate::InstallUIAbort,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(delegate),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   true));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* ProfileForWebContents(content::WebContents* web_contents) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Profile::FromBrowserContext(web_contents->GetBrowserContext());
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::NativeWindow NativeWindowForWebContents(content::WebContents* contents) {
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!contents)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return contents->GetView()->GetTopLevelNativeWindow();
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::Prompt::Prompt(PromptType type)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_(NULL),
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bundle_(NULL),
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      average_rating_(0.0),
194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      rating_count_(0),
195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      show_user_count_(false) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInstallPrompt::Prompt::~Prompt() {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetPermissions(
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<string16>& permissions) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ExtensionInstallPrompt::Prompt::SetPermissionsDetails(
2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::vector<string16>& details) {
2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  details_ = details;
2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetOAuthIssueAdvice(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IssueAdviceInfo& issue_advice) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oauth_issue_advice_ = issue_advice;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetUserNameFromProfile(Profile* profile) {
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |profile| can be NULL in unit tests.
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (profile) {
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    oauth_user_name_ = UTF8ToUTF16(profile->GetPrefs()->GetString(
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        prefs::kGoogleServicesUsername));
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    oauth_user_name_.clear();
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetInlineInstallWebstoreData(
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_user_count,
228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool show_user_count,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double average_rating,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rating_count) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(INLINE_INSTALL_PROMPT, type_);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_user_count_ = localized_user_count;
233a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  show_user_count_ = show_user_count;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  average_rating_ = average_rating;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rating_count_ = rating_count;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetDialogTitle() const {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_id = kTitleIds[type_];
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == INSTALL_PROMPT) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_APP_PROMPT_TITLE;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_THEME_PROMPT_TITLE;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_EXTENSION_PROMPT_TITLE;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == EXTERNAL_INSTALL_PROMPT) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringFUTF16(
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        resource_id, UTF8ToUTF16(extension_->name()));
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(resource_id);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetHeading() const {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == INLINE_INSTALL_PROMPT) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToUTF16(extension_->name());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == BUNDLE_INSTALL_PROMPT) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return bundle_->GetHeadingTextFor(BundleInstaller::Item::STATE_PENDING);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == EXTERNAL_INSTALL_PROMPT) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int resource_id = -1;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_APP;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_THEME;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_EXTENSION;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(resource_id);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringFUTF16(
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kHeadingIds[type_], UTF8ToUTF16(extension_->name()));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ExtensionInstallPrompt::Prompt::GetDialogButtons() const {
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (type_ == POST_INSTALL_PERMISSIONS_PROMPT &&
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ShouldDisplayRevokeFilesButton()) {
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return kButtons[type_] | ui::DIALOG_BUTTON_OK;
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return kButtons[type_];
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ExtensionInstallPrompt::Prompt::HasAcceptButtonLabel() const {
286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (kAcceptButtonIds[type_] == 0)
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (type_ == POST_INSTALL_PERMISSIONS_PROMPT)
290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ShouldDisplayRevokeFilesButton();
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetAcceptButtonLabel() const {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == EXTERNAL_INSTALL_PROMPT) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id = -1;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_APP;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_THEME;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_EXTENSION;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(id);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kAcceptButtonIds[type_]);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::HasAbortButtonLabel() const {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kAbortButtonIds[type_] > 0;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetAbortButtonLabel() const {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(HasAbortButtonLabel());
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kAbortButtonIds[type_]);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetPermissionsHeading() const {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kPermissionsHeaderIds[type_]);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetOAuthHeading() const {
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return l10n_util::GetStringFUTF16(kOAuthHeaderIds[type_], oauth_user_name_);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetRetainedFilesHeading() const {
3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // TODO(finnur): Remove this once all platforms are using
3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // GetRetainedFilesHeadingWithCount().
329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_RETAINED_FILES);
330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstring16
3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochExtensionInstallPrompt::Prompt::GetRetainedFilesHeadingWithCount() const {
3347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return l10n_util::GetStringFUTF16(
3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      IDS_EXTENSION_PROMPT_RETAINED_FILES_WITH_COUNT,
3367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::IntToString16(GetRetainedFileCount()));
3377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldShowPermissions() const {
3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return GetPermissionCount() > 0 || type_ == POST_INSTALL_PERMISSIONS_PROMPT;
3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::AppendRatingStars(
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StarAppender appender, void* data) const {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(appender);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(INLINE_INSTALL_PROMPT, type_);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rating_integer = floor(average_rating_);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double rating_fractional = average_rating_ - rating_integer;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional > 0.66) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rating_integer++;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional < 0.33 || rating_fractional > 0.66) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rating_fractional = 0;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0; i < rating_integer; i++) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_ON), data);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional) {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_HALF_LEFT), data);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i++;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; i < kMaxExtensionRating; i++) {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_OFF), data);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetRatingCount() const {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(INLINE_INSTALL_PROMPT, type_);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringFUTF16(
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_EXTENSION_RATING_COUNT,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UTF8ToUTF16(base::IntToString(rating_count_)));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetUserCount() const {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(INLINE_INSTALL_PROMPT, type_);
381a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
382a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (show_user_count_) {
383a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return l10n_util::GetStringFUTF16(
384a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        IDS_EXTENSION_USER_COUNT,
385a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        UTF8ToUTF16(localized_user_count_));
386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  } else {
387a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return string16();
388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t ExtensionInstallPrompt::Prompt::GetPermissionCount() const {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return permissions_.size();
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochsize_t ExtensionInstallPrompt::Prompt::GetPermissionsDetailsCount() const {
3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return details_.size();
3977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetPermission(size_t index) const {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_LT(index, permissions_.size());
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return permissions_[index];
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstring16 ExtensionInstallPrompt::Prompt::GetPermissionsDetails(
4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    size_t index) const {
4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CHECK_LT(index, details_.size());
4077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return details_[index];
4087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t ExtensionInstallPrompt::Prompt::GetOAuthIssueCount() const {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return oauth_issue_advice_.size();
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const IssueAdviceInfoEntry& ExtensionInstallPrompt::Prompt::GetOAuthIssue(
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t index) const {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_LT(index, oauth_issue_advice_.size());
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return oauth_issue_advice_[index];
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)size_t ExtensionInstallPrompt::Prompt::GetRetainedFileCount() const {
421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return retained_files_.size();
422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetRetainedFile(size_t index) const {
425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CHECK_LT(index, retained_files_.size());
426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return base::UTF8ToUTF16(retained_files_[index].AsUTF8Unsafe());
427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldDisplayRevokeFilesButton() const {
430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return !retained_files_.empty();
431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ShowParams::ShowParams(content::WebContents* contents)
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : parent_web_contents(contents),
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_window(NativeWindowForWebContents(contents)),
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator(contents) {
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ShowParams::ShowParams(
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeWindow window,
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::PageNavigator* navigator)
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : parent_web_contents(NULL),
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_window(window),
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator(navigator) {
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension>
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionInstallPrompt::GetLocalizedExtensionForDisplay(
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DictionaryValue* manifest,
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags,
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& id,
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_name,
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_description,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* error) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> localized_manifest;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!localized_name.empty() || !localized_description.empty()) {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    localized_manifest.reset(manifest->DeepCopy());
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!localized_name.empty()) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      localized_manifest->SetString(extension_manifest_keys::kName,
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    localized_name);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!localized_description.empty()) {
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      localized_manifest->SetString(extension_manifest_keys::kDescription,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    localized_description);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Extension::Create(
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Manifest::INTERNAL,
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      localized_manifest.get() ? *localized_manifest.get() : *manifest,
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id,
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInstallPrompt::ExtensionInstallPrompt(
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebContents* contents)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : record_oauth2_grant_(false),
48190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ui_loop_(base::MessageLoop::current()),
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_(NULL),
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      install_ui_(ExtensionInstallUI::Create(ProfileForWebContents(contents))),
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_params_(contents),
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_(NULL),
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prompt_(UNSET_PROMPT_TYPE) {
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.SetUserNameFromProfile(install_ui_->profile());
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ExtensionInstallPrompt(
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* profile,
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeWindow native_window,
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::PageNavigator* navigator)
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : record_oauth2_grant_(false),
49590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ui_loop_(base::MessageLoop::current()),
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_(NULL),
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      install_ui_(ExtensionInstallUI::Create(profile)),
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_params_(native_window, navigator),
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate_(NULL),
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prompt_(UNSET_PROMPT_TYPE) {
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.SetUserNameFromProfile(install_ui_->profile());
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInstallPrompt::~ExtensionInstallPrompt() {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmBundleInstall(
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::BundleInstaller* bundle,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PermissionSet* permissions) {
51090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bundle_ = bundle;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = bundle;
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.set_type(BUNDLE_INSTALL_PROMPT);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FetchOAuthIssueAdviceIfNeeded();
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmStandaloneInstall(
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkBitmap* icon,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ExtensionInstallPrompt::Prompt& prompt) {
52490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = extension->GetActivePermissions();
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prompt_ = prompt;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FetchOAuthIssueAdviceIfNeeded();
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmWebstoreInstall(
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SkBitmap* icon,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback) {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetIcon requires |extension_| to be set. ConfirmInstall will setup the
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // remaining fields.
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConfirmInstall(delegate, extension, show_dialog_callback);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmInstall(
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback) {
55090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = extension->GetActivePermissions();
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.set_type(INSTALL_PROMPT);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  show_dialog_callback_ = show_dialog_callback;
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We special-case themes to not show any confirm UI. Instead they are
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // immediately installed, and then we show an infobar (see OnInstallSuccess)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to allow the user to revert if they don't like it.
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't do this in the case where off-store extension installs are
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled because in that case, we don't show the dangerous download UI, so
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we need the UI confirmation.
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extension->is_theme()) {
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension->from_webstore() ||
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extensions::FeatureSwitch::easy_off_store_install()->IsEnabled()) {
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate->InstallUIProceed();
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmReEnable(Delegate* delegate,
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const Extension* extension) {
57790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = extension->GetActivePermissions();
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.set_type(RE_ENABLE_PROMPT);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmExternalInstall(
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Delegate* delegate,
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Extension* extension,
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const ShowDialogCallback& show_dialog_callback) {
59090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = extension->GetActivePermissions();
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.set_type(EXTERNAL_INSTALL_PROMPT);
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  show_dialog_callback_ = show_dialog_callback;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmPermissions(
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PermissionSet* permissions) {
60490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.set_type(PERMISSIONS_PROMPT);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmIssueAdvice(
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IssueAdviceInfo& issue_advice) {
61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.set_type(PERMISSIONS_PROMPT);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  record_oauth2_grant_ = true;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prompt_.SetOAuthIssueAdvice(issue_advice);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ExtensionInstallPrompt::ReviewPermissions(
629868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Delegate* delegate,
630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const Extension* extension,
631868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::vector<base::FilePath>& retained_file_paths) {
63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extension_ = extension;
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  permissions_ = extension->GetActivePermissions();
635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  prompt_.set_retained_files(retained_file_paths);
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_ = delegate;
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.set_type(POST_INSTALL_PERMISSIONS_PROMPT);
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadImageIfNeeded();
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnInstallSuccess(const Extension* extension,
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              SkBitmap* icon) {
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_ui_->OnInstallSuccess(extension, &icon_);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnInstallFailure(
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const extensions::CrxInstallerError& error) {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_ui_->OnInstallFailure(error);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::SetIcon(const SkBitmap* image) {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (image)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = *image;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = SkBitmap();
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (icon_.empty()) {
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Let's set default icon bitmap whose size is equal to the default icon's
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // pixel size under maximal supported scale factor. If the bitmap is larger
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // than the one we need, it will be scaled down by the ui code.
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = GetDefaultIconBitmapForMaxScaleFactor(extension_->is_app());
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ExtensionInstallPrompt::OnImageLoaded(const gfx::Image& image) {
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(image.IsEmpty() ? NULL : image.ToSkBitmap());
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FetchOAuthIssueAdviceIfNeeded();
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::LoadImageIfNeeded() {
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bundle install prompts do not have an icon.
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also |install_ui_.profile()| can be NULL in unit tests.
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!icon_.empty() || !install_ui_->profile()) {
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FetchOAuthIssueAdviceIfNeeded();
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load the image asynchronously. For the response, check OnImageLoaded.
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionResource image = extensions::IconsInfo::GetIconResource(
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_,
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_misc::EXTENSION_ICON_LARGE,
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionIconSet::MATCH_BIGGER);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load the icon whose pixel size is large enough to be displayed under
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // maximal supported scale factor. UI code will scale the icon down if needed.
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(tbarzic): We should use IconImage here and load the required bitmap
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     lazily.
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pixel_size = GetSizeForMaxScaleFactor(kIconSize);
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ImageLoader::Get(install_ui_->profile())->LoadImageAsync(
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_, image, gfx::Size(pixel_size, pixel_size),
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ExtensionInstallPrompt::OnImageLoaded, AsWeakPtr()));
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::FetchOAuthIssueAdviceIfNeeded() {
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |extension_| may be NULL, e.g. in the bundle install case.
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!extension_ ||
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prompt_.type() == BUNDLE_INSTALL_PROMPT ||
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prompt_.type() == INLINE_INSTALL_PROMPT ||
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prompt_.type() == EXTERNAL_INSTALL_PROMPT ||
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prompt_.GetOAuthIssueCount() != 0U) {
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowConfirmation();
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::OAuth2Info& oauth2_info =
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::OAuth2Info::GetOAuth2Info(extension_);
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (oauth2_info.client_id.empty() ||
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      oauth2_info.scopes.empty()) {
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowConfirmation();
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ProfileOAuth2TokenService* token_service =
7167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ProfileOAuth2TokenServiceFactory::GetForProfile(install_ui_->profile());
7177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!token_service || !token_service->RefreshTokenIsAvailable()) {
718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ShowConfirmation();
719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Get an access token from the token service.
7237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  login_token_request_ = token_service->StartRequest(
7247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OAuth2TokenService::ScopeSet(), this);
7257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
7267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ExtensionInstallPrompt::OnGetTokenSuccess(
7287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const OAuth2TokenService::Request* request,
7297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& access_token,
7307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::Time& expiration_time) {
7317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_EQ(login_token_request_.get(), request);
7327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  login_token_request_.reset();
7337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const extensions::OAuth2Info& oauth2_info =
7357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      extensions::OAuth2Info::GetOAuth2Info(extension_);
7367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  token_flow_.reset(new OAuth2MintTokenFlow(
7387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      install_ui_->profile()->GetRequestContext(),
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this,
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OAuth2MintTokenFlow::Parameters(
7417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          access_token,
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extension_->id(),
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          oauth2_info.client_id,
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          oauth2_info.scopes,
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          OAuth2MintTokenFlow::MODE_ISSUE_ADVICE)));
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  token_flow_->Start();
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ExtensionInstallPrompt::OnGetTokenFailure(
7507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const OAuth2TokenService::Request* request,
7517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const GoogleServiceAuthError& error) {
7527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_EQ(login_token_request_.get(), request);
7537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  login_token_request_.reset();
7547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ShowConfirmation();
7557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
7567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnIssueAdviceSuccess(
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IssueAdviceInfo& advice_info) {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prompt_.SetOAuthIssueAdvice(advice_info);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  record_oauth2_grant_ = true;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowConfirmation();
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnMintTokenFailure(
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GoogleServiceAuthError& error) {
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowConfirmation();
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ShowConfirmation() {
770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (permissions_.get() &&
77190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      (!extension_ ||
77290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)       !extensions::PermissionsData::ShouldSkipPermissionWarnings(
77390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           extension_))) {
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Manifest::Type extension_type = extension_ ?
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        extension_->GetType() : Manifest::TYPE_UNKNOWN;
7767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    prompt_.SetPermissions(
7777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        permissions_->GetWarningMessages(extension_type));
7787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    prompt_.SetPermissionsDetails(
7797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        permissions_->GetWarningMessagesDetails(extension_type));
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (prompt_.type()) {
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PERMISSIONS_PROMPT:
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case RE_ENABLE_PROMPT:
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case INLINE_INSTALL_PROMPT:
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EXTERNAL_INSTALL_PROMPT:
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case INSTALL_PROMPT:
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case POST_INSTALL_PERMISSIONS_PROMPT: {
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prompt_.set_extension(extension_);
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prompt_.set_icon(gfx::Image::CreateFrom1xBitmap(icon_));
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BUNDLE_INSTALL_PROMPT: {
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prompt_.set_bundle(bundle_);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Unknown message";
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (AutoConfirmPrompt(delegate_))
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (show_dialog_callback_.is_null())
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetDefaultShowDialogCallback().Run(show_params_, delegate_, prompt_);
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_dialog_callback_.Run(show_params_, delegate_, prompt_);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
810