extension_install_prompt.cc revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
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/feature_switch.h"
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/icons_handler.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/permissions/permission_set.h"
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/common/extensions/permissions/permissions_data.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_view.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h"
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest_constants.h"
398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "extensions/common/permissions/permission_message_provider.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::BundleInstaller;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Manifest;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::PermissionSet;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTitleIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // The regular install prompt depends on what's being installed.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_INLINE_INSTALL_PROMPT_TITLE,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_INSTALL_PROMPT_TITLE,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_RE_ENABLE_PROMPT_TITLE,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PERMISSIONS_PROMPT_TITLE,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_TITLE,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IDS_EXTENSION_POST_INSTALL_PERMISSIONS_PROMPT_TITLE,
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  IDS_EXTENSION_FIRST_RUN_PROMPT_TITLE,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kHeadingIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_INSTALL_PROMPT_HEADING,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // Inline installs use the extension name.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // Heading for bundle installs depends on the bundle contents.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_RE_ENABLE_PROMPT_HEADING,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PERMISSIONS_PROMPT_HEADING,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // External installs use different strings for extensions/apps.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IDS_EXTENSION_POST_INSTALL_PERMISSIONS_PROMPT_HEADING,
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  IDS_EXTENSION_FIRST_RUN_PROMPT_HEADING,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const int kButtons[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
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_OK | ui::DIALOG_BUTTON_CANCEL,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::DIALOG_BUTTON_CANCEL,
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kAcceptButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_RE_ENABLE_BUTTON,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_PERMISSIONS_BUTTON,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // External installs use different strings for extensions/apps.
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  IDS_EXTENSION_PROMPT_PERMISSIONS_CLEAR_RETAINED_FILES_BUTTON,
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  IDS_EXTENSION_PROMPT_FIRST_RUN_ACCEPT_BUTTON
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kAbortButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // These all use the platform's default cancel label.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_PERMISSIONS_ABORT_BUTTON,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ABORT_BUTTON,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IDS_CLOSE,
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0,  // Platform dependent cancel button.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kPermissionsHeaderIds[
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_THESE_WILL_HAVE_ACCESS_TO,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_WILL_NOW_HAVE_ACCESS_TO,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_WANTS_ACCESS_TO,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IDS_EXTENSION_PROMPT_CAN_ACCESS,
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  IDS_EXTENSION_PROMPT_CAN_ACCESS,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kOAuthHeaderIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_OAUTH_HEADER,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // Inline installs don't show OAuth permissions.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,  // Bundle installs don't show OAuth permissions.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_OAUTH_REENABLE_HEADER,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_EXTENSION_PROMPT_OAUTH_PERMISSIONS_HEADER,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0,
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  IDS_EXTENSION_PROMPT_OAUTH_HEADER,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Size of extension icon in top left of dialog.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kIconSize = 69;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns pixel size under maximal scale factor for the icon whose device
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// independent size is |size_in_dip|
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetSizeForMaxScaleFactor(int size_in_dip) {
13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return static_cast<int>(size_in_dip * gfx::ImageSkia::GetMaxSupportedScale());
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns bitmap for the default icon with size equal to the default icon's
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pixel size under maximal supported scale factor.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap GetDefaultIconBitmapForMaxScaleFactor(bool is_app) {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::ImageSkia& image = is_app ?
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::IconsInfo::GetDefaultAppIcon() :
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::IconsInfo::GetDefaultExtensionIcon();
14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return image.GetRepresentation(
14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      gfx::ImageSkia::GetMaxSupportedScale()).sk_bitmap();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If auto confirm is enabled then posts a task to proceed with or cancel the
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// install and returns true. Otherwise returns false.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AutoConfirmPrompt(ExtensionInstallPrompt::Delegate* delegate) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CommandLine* cmdline = CommandLine::ForCurrentProcess();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cmdline->HasSwitch(switches::kAppsGalleryInstallAutoConfirmForTests))
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value = cmdline->GetSwitchValueASCII(
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kAppsGalleryInstallAutoConfirmForTests);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We use PostTask instead of calling the delegate directly here, because in
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the real implementations it's highly likely the message loop will be
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pumping a few times before the user clicks accept or cancel.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (value == "accept") {
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&ExtensionInstallPrompt::Delegate::InstallUIProceed,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(delegate)));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (value == "cancel") {
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&ExtensionInstallPrompt::Delegate::InstallUIAbort,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(delegate),
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   true));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* ProfileForWebContents(content::WebContents* web_contents) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Profile::FromBrowserContext(web_contents->GetBrowserContext());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::NativeWindow NativeWindowForWebContents(content::WebContents* contents) {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!contents)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return contents->GetView()->GetTopLevelNativeWindow();
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::Prompt::Prompt(PromptType type)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
196424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_retained_files_(false),
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_(NULL),
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bundle_(NULL),
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      average_rating_(0.0),
200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      rating_count_(0),
201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      show_user_count_(false) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInstallPrompt::Prompt::~Prompt() {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetPermissions(
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<string16>& permissions) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ExtensionInstallPrompt::Prompt::SetPermissionsDetails(
2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::vector<string16>& details) {
2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  details_ = details;
215424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  is_showing_details_for_permissions_.clear();
216424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < details.size(); ++i)
217424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    is_showing_details_for_permissions_.push_back(false);
218424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
219424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
220424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetIsShowingDetails(
221424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailsType type,
222424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    size_t index,
223424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool is_showing_details) {
224424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  switch (type) {
225424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case PERMISSIONS_DETAILS:
226424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_permissions_[index] = is_showing_details;
227424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      break;
228424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case OAUTH_DETAILS:
229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_oauth_[index] = is_showing_details;
230424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      break;
231424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case RETAINED_FILES_DETAILS:
232424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_retained_files_ = is_showing_details;
233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      break;
234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetOAuthIssueAdvice(
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IssueAdviceInfo& issue_advice) {
239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  is_showing_details_for_oauth_.clear();
240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < issue_advice.size(); ++i)
241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    is_showing_details_for_oauth_.push_back(false);
242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oauth_issue_advice_ = issue_advice;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetUserNameFromProfile(Profile* profile) {
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |profile| can be NULL in unit tests.
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (profile) {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    oauth_user_name_ = UTF8ToUTF16(profile->GetPrefs()->GetString(
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        prefs::kGoogleServicesUsername));
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    oauth_user_name_.clear();
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetInlineInstallWebstoreData(
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_user_count,
258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool show_user_count,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double average_rating,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rating_count) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(INLINE_INSTALL_PROMPT, type_);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_user_count_ = localized_user_count;
263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  show_user_count_ = show_user_count;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  average_rating_ = average_rating;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rating_count_ = rating_count;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetDialogTitle() const {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_id = kTitleIds[type_];
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == INSTALL_PROMPT) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_APP_PROMPT_TITLE;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_THEME_PROMPT_TITLE;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_EXTENSION_PROMPT_TITLE;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == EXTERNAL_INSTALL_PROMPT) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringFUTF16(
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        resource_id, UTF8ToUTF16(extension_->name()));
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(resource_id);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetHeading() const {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == INLINE_INSTALL_PROMPT) {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToUTF16(extension_->name());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == BUNDLE_INSTALL_PROMPT) {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return bundle_->GetHeadingTextFor(BundleInstaller::Item::STATE_PENDING);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == EXTERNAL_INSTALL_PROMPT) {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int resource_id = -1;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_APP;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_THEME;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_EXTENSION;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(resource_id);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringFUTF16(
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kHeadingIds[type_], UTF8ToUTF16(extension_->name()));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ExtensionInstallPrompt::Prompt::GetDialogButtons() const {
307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (type_ == POST_INSTALL_PERMISSIONS_PROMPT &&
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ShouldDisplayRevokeFilesButton()) {
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return kButtons[type_] | ui::DIALOG_BUTTON_OK;
310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return kButtons[type_];
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ExtensionInstallPrompt::Prompt::HasAcceptButtonLabel() const {
316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (kAcceptButtonIds[type_] == 0)
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (type_ == POST_INSTALL_PERMISSIONS_PROMPT)
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ShouldDisplayRevokeFilesButton();
321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetAcceptButtonLabel() const {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == EXTERNAL_INSTALL_PROMPT) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id = -1;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_APP;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_THEME;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_EXTENSION;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(id);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kAcceptButtonIds[type_]);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::HasAbortButtonLabel() const {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kAbortButtonIds[type_] > 0;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetAbortButtonLabel() const {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(HasAbortButtonLabel());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kAbortButtonIds[type_]);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetPermissionsHeading() const {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kPermissionsHeaderIds[type_]);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetOAuthHeading() const {
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return l10n_util::GetStringFUTF16(kOAuthHeaderIds[type_], oauth_user_name_);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetRetainedFilesHeading() const {
35768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const int kRetainedFilesMessageIDs[6] = {
35868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_DEFAULT,
35968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILE_SINGULAR,
36068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_ZERO,
36168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_TWO,
36268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_FEW,
36368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_MANY,
36468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  };
36568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<int> message_ids;
36668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kRetainedFilesMessageIDs); i++) {
36768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    message_ids.push_back(kRetainedFilesMessageIDs[i]);
36868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
36968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return l10n_util::GetPluralStringFUTF16(message_ids, GetRetainedFileCount());
3707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldShowPermissions() const {
3737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return GetPermissionCount() > 0 || type_ == POST_INSTALL_PERMISSIONS_PROMPT;
3747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::AppendRatingStars(
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StarAppender appender, void* data) const {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(appender);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(INLINE_INSTALL_PROMPT, type_);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rating_integer = floor(average_rating_);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double rating_fractional = average_rating_ - rating_integer;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional > 0.66) {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rating_integer++;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional < 0.33 || rating_fractional > 0.66) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rating_fractional = 0;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0; i < rating_integer; i++) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_ON), data);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_HALF_LEFT), data);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i++;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; i < kMaxExtensionRating; i++) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_OFF), data);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetRatingCount() const {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(INLINE_INSTALL_PROMPT, type_);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringFUTF16(
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_EXTENSION_RATING_COUNT,
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UTF8ToUTF16(base::IntToString(rating_count_)));
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetUserCount() const {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(INLINE_INSTALL_PROMPT, type_);
414a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
415a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (show_user_count_) {
416a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return l10n_util::GetStringFUTF16(
417a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        IDS_EXTENSION_USER_COUNT,
418a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        UTF8ToUTF16(localized_user_count_));
419a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  } else {
420a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return string16();
421a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t ExtensionInstallPrompt::Prompt::GetPermissionCount() const {
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return permissions_.size();
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochsize_t ExtensionInstallPrompt::Prompt::GetPermissionsDetailsCount() const {
4297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return details_.size();
4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetPermission(size_t index) const {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_LT(index, permissions_.size());
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return permissions_[index];
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstring16 ExtensionInstallPrompt::Prompt::GetPermissionsDetails(
4387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    size_t index) const {
4397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CHECK_LT(index, details_.size());
4407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return details_[index];
4417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
443424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::GetIsShowingDetails(
444424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailsType type, size_t index) const {
445424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  switch (type) {
446424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case PERMISSIONS_DETAILS:
447424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CHECK_LT(index, is_showing_details_for_permissions_.size());
448424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return is_showing_details_for_permissions_[index];
449424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case OAUTH_DETAILS:
450424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CHECK_LT(index, is_showing_details_for_oauth_.size());
451424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return is_showing_details_for_oauth_[index];
452424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case RETAINED_FILES_DETAILS:
453424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return is_showing_details_for_retained_files_;
454424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
455424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return false;
456424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
457424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t ExtensionInstallPrompt::Prompt::GetOAuthIssueCount() const {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return oauth_issue_advice_.size();
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const IssueAdviceInfoEntry& ExtensionInstallPrompt::Prompt::GetOAuthIssue(
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t index) const {
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_LT(index, oauth_issue_advice_.size());
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return oauth_issue_advice_[index];
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)size_t ExtensionInstallPrompt::Prompt::GetRetainedFileCount() const {
469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return retained_files_.size();
470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)string16 ExtensionInstallPrompt::Prompt::GetRetainedFile(size_t index) const {
473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CHECK_LT(index, retained_files_.size());
474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return base::UTF8ToUTF16(retained_files_[index].AsUTF8Unsafe());
475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldDisplayRevokeFilesButton() const {
478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return !retained_files_.empty();
479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ShowParams::ShowParams(content::WebContents* contents)
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : parent_web_contents(contents),
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_window(NativeWindowForWebContents(contents)),
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator(contents) {
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ShowParams::ShowParams(
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeWindow window,
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::PageNavigator* navigator)
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : parent_web_contents(NULL),
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_window(window),
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator(navigator) {
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension>
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionInstallPrompt::GetLocalizedExtensionForDisplay(
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DictionaryValue* manifest,
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags,
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& id,
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_name,
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_description,
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* error) {
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> localized_manifest;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!localized_name.empty() || !localized_description.empty()) {
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    localized_manifest.reset(manifest->DeepCopy());
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!localized_name.empty()) {
5083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      localized_manifest->SetString(extensions::manifest_keys::kName,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    localized_name);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!localized_description.empty()) {
5123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      localized_manifest->SetString(extensions::manifest_keys::kDescription,
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    localized_description);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Extension::Create(
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Manifest::INTERNAL,
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      localized_manifest.get() ? *localized_manifest.get() : *manifest,
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags,
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInstallPrompt::ExtensionInstallPrompt(
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebContents* contents)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : record_oauth2_grant_(false),
52990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ui_loop_(base::MessageLoop::current()),
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_(NULL),
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      install_ui_(ExtensionInstallUI::Create(ProfileForWebContents(contents))),
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_params_(contents),
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_(NULL),
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prompt_(UNSET_PROMPT_TYPE) {
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.SetUserNameFromProfile(install_ui_->profile());
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ExtensionInstallPrompt(
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* profile,
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeWindow native_window,
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::PageNavigator* navigator)
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : record_oauth2_grant_(false),
54390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ui_loop_(base::MessageLoop::current()),
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_(NULL),
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      install_ui_(ExtensionInstallUI::Create(profile)),
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_params_(native_window, navigator),
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate_(NULL),
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prompt_(UNSET_PROMPT_TYPE) {
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.SetUserNameFromProfile(install_ui_->profile());
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInstallPrompt::~ExtensionInstallPrompt() {
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmBundleInstall(
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::BundleInstaller* bundle,
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PermissionSet* permissions) {
55890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bundle_ = bundle;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = bundle;
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.set_type(BUNDLE_INSTALL_PROMPT);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmStandaloneInstall(
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkBitmap* icon,
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ExtensionInstallPrompt::Prompt& prompt) {
57290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = extension->GetActivePermissions();
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prompt_ = prompt;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmWebstoreInstall(
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SkBitmap* icon,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetIcon requires |extension_| to be set. ConfirmInstall will setup the
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // remaining fields.
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConfirmInstall(delegate, extension, show_dialog_callback);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmInstall(
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback) {
59890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = extension->GetActivePermissions();
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.set_type(INSTALL_PROMPT);
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  show_dialog_callback_ = show_dialog_callback;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We special-case themes to not show any confirm UI. Instead they are
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // immediately installed, and then we show an infobar (see OnInstallSuccess)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to allow the user to revert if they don't like it.
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't do this in the case where off-store extension installs are
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled because in that case, we don't show the dangerous download UI, so
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we need the UI confirmation.
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extension->is_theme()) {
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension->from_webstore() ||
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extensions::FeatureSwitch::easy_off_store_install()->IsEnabled()) {
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate->InstallUIProceed();
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmReEnable(Delegate* delegate,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const Extension* extension) {
62590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = extension->GetActivePermissions();
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.set_type(RE_ENABLE_PROMPT);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ExtensionInstallPrompt::ConfirmDefaultInstallFirstRun(
6354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    Delegate* delegate,
6364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const Extension* extension) {
6374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  extension_ = extension;
6394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  permissions_ = extension->GetActivePermissions();
6404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  delegate_ = delegate;
6414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  prompt_.set_type(DEFAULT_INSTALL_FIRST_RUN_PROMPT);
6424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LoadImageIfNeeded();
6434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
6444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmExternalInstall(
646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Delegate* delegate,
647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Extension* extension,
648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const ShowDialogCallback& show_dialog_callback) {
64990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = extension->GetActivePermissions();
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.set_type(EXTERNAL_INSTALL_PROMPT);
654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  show_dialog_callback_ = show_dialog_callback;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmPermissions(
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PermissionSet* permissions) {
66390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.set_type(PERMISSIONS_PROMPT);
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmIssueAdvice(
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IssueAdviceInfo& issue_advice) {
67690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.set_type(PERMISSIONS_PROMPT);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  record_oauth2_grant_ = true;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prompt_.SetOAuthIssueAdvice(issue_advice);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
687868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ExtensionInstallPrompt::ReviewPermissions(
688868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Delegate* delegate,
689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const Extension* extension,
690868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::vector<base::FilePath>& retained_file_paths) {
69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extension_ = extension;
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  permissions_ = extension->GetActivePermissions();
694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  prompt_.set_retained_files(retained_file_paths);
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_ = delegate;
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prompt_.set_type(POST_INSTALL_PERMISSIONS_PROMPT);
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadImageIfNeeded();
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnInstallSuccess(const Extension* extension,
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              SkBitmap* icon) {
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_ui_->OnInstallSuccess(extension, &icon_);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnInstallFailure(
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const extensions::CrxInstallerError& error) {
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_ui_->OnInstallFailure(error);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::SetIcon(const SkBitmap* image) {
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (image)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = *image;
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = SkBitmap();
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (icon_.empty()) {
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Let's set default icon bitmap whose size is equal to the default icon's
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // pixel size under maximal supported scale factor. If the bitmap is larger
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // than the one we need, it will be scaled down by the ui code.
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = GetDefaultIconBitmapForMaxScaleFactor(extension_->is_app());
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ExtensionInstallPrompt::OnImageLoaded(const gfx::Image& image) {
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(image.IsEmpty() ? NULL : image.ToSkBitmap());
72958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::LoadImageIfNeeded() {
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bundle install prompts do not have an icon.
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also |install_ui_.profile()| can be NULL in unit tests.
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!icon_.empty() || !install_ui_->profile()) {
73658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ShowConfirmation();
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load the image asynchronously. For the response, check OnImageLoaded.
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionResource image = extensions::IconsInfo::GetIconResource(
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_,
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_misc::EXTENSION_ICON_LARGE,
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionIconSet::MATCH_BIGGER);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load the icon whose pixel size is large enough to be displayed under
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // maximal supported scale factor. UI code will scale the icon down if needed.
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(tbarzic): We should use IconImage here and load the required bitmap
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     lazily.
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pixel_size = GetSizeForMaxScaleFactor(kIconSize);
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ImageLoader::Get(install_ui_->profile())->LoadImageAsync(
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_, image, gfx::Size(pixel_size, pixel_size),
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ExtensionInstallPrompt::OnImageLoaded, AsWeakPtr()));
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ExtensionInstallPrompt::OnGetTokenSuccess(
7567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const OAuth2TokenService::Request* request,
7577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& access_token,
7587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::Time& expiration_time) {
7597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_EQ(login_token_request_.get(), request);
7607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  login_token_request_.reset();
7617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const extensions::OAuth2Info& oauth2_info =
7637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      extensions::OAuth2Info::GetOAuth2Info(extension_);
7647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  token_flow_.reset(new OAuth2MintTokenFlow(
7667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      install_ui_->profile()->GetRequestContext(),
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this,
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OAuth2MintTokenFlow::Parameters(
7697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          access_token,
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extension_->id(),
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          oauth2_info.client_id,
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          oauth2_info.scopes,
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          OAuth2MintTokenFlow::MODE_ISSUE_ADVICE)));
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  token_flow_->Start();
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ExtensionInstallPrompt::OnGetTokenFailure(
7787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const OAuth2TokenService::Request* request,
7797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const GoogleServiceAuthError& error) {
7807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_EQ(login_token_request_.get(), request);
7817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  login_token_request_.reset();
7827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ShowConfirmation();
7837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
7847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnIssueAdviceSuccess(
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IssueAdviceInfo& advice_info) {
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prompt_.SetOAuthIssueAdvice(advice_info);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  record_oauth2_grant_ = true;
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowConfirmation();
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnMintTokenFailure(
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GoogleServiceAuthError& error) {
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowConfirmation();
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ShowConfirmation() {
798868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (permissions_.get() &&
79990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      (!extension_ ||
80090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)       !extensions::PermissionsData::ShouldSkipPermissionWarnings(
80190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           extension_))) {
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Manifest::Type extension_type = extension_ ?
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        extension_->GetType() : Manifest::TYPE_UNKNOWN;
8047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    prompt_.SetPermissions(
8058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        extensions::PermissionMessageProvider::Get()->
8068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            GetWarningMessages(permissions_, extension_type));
8077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    prompt_.SetPermissionsDetails(
8088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        extensions::PermissionMessageProvider::Get()->
8098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            GetWarningMessagesDetails(permissions_, extension_type));
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (prompt_.type()) {
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PERMISSIONS_PROMPT:
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case RE_ENABLE_PROMPT:
8154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    case DEFAULT_INSTALL_FIRST_RUN_PROMPT:
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case INLINE_INSTALL_PROMPT:
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EXTERNAL_INSTALL_PROMPT:
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case INSTALL_PROMPT:
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case POST_INSTALL_PERMISSIONS_PROMPT: {
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prompt_.set_extension(extension_);
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prompt_.set_icon(gfx::Image::CreateFrom1xBitmap(icon_));
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BUNDLE_INSTALL_PROMPT: {
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prompt_.set_bundle(bundle_);
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Unknown message";
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (AutoConfirmPrompt(delegate_))
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (show_dialog_callback_.is_null())
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetDefaultShowDialogCallback().Run(show_params_, delegate_, prompt_);
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_dialog_callback_.Run(show_params_, delegate_, prompt_);
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
841