extension_install_prompt.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
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"
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/extensions/extension_util.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/chromium_strings.h"
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_prefs.h"
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_util.h"
296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "extensions/browser/image_loader.h"
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/constants.h"
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension_icon_set.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h"
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest_constants.h"
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/manifest_handlers/icons_handler.h"
388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "extensions/common/permissions/permission_message_provider.h"
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "extensions/common/permissions/permission_set.h"
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern.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] = {
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // The regular install prompt depends on what's being installed.
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_INLINE_INSTALL_PROMPT_TITLE,
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_INSTALL_PROMPT_TITLE,
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_RE_ENABLE_PROMPT_TITLE,
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PERMISSIONS_PROMPT_TITLE,
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_TITLE,
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_POST_INSTALL_PERMISSIONS_PROMPT_TITLE,
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_LAUNCH_APP_PROMPT_TITLE,
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // The remote install prompt depends on what's being installed.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kHeadingIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_INSTALL_PROMPT_HEADING,
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // Inline installs use the extension name.
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // Heading for bundle installs depends on the bundle contents.
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_RE_ENABLE_PROMPT_HEADING,
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PERMISSIONS_PROMPT_HEADING,
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // External installs use different strings for extensions/apps.
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_POST_INSTALL_PERMISSIONS_PROMPT_HEADING,
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_LAUNCH_APP_PROMPT_HEADING,
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_REMOTE_INSTALL_PROMPT_HEADING,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const int kButtons[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_CANCEL,
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kAcceptButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_RE_ENABLE_BUTTON,
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_PERMISSIONS_BUTTON,
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // External installs use different strings for extensions/apps.
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_PERMISSIONS_CLEAR_RETAINED_FILES_BUTTON,
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_LAUNCH_BUTTON,
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_REMOTE_INSTALL_BUTTON,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kAbortButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // These all use the platform's default cancel label.
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_PERMISSIONS_ABORT_BUTTON,
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ABORT_BUTTON,
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_CLOSE,
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // Platform dependent cancel button.
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static const int
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    kPermissionsHeaderIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_THESE_WILL_HAVE_ACCESS_TO,
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_WILL_NOW_HAVE_ACCESS_TO,
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_WANTS_ACCESS_TO,
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_CAN_ACCESS,
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns bitmap for the default icon with size equal to the default icon's
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pixel size under maximal supported scale factor.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap GetDefaultIconBitmapForMaxScaleFactor(bool is_app) {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::ImageSkia& image = is_app ?
1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      extensions::util::GetDefaultAppIcon() :
1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      extensions::util::GetDefaultExtensionIcon();
12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return image.GetRepresentation(
12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      gfx::ImageSkia::GetMaxSupportedScale()).sk_bitmap();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If auto confirm is enabled then posts a task to proceed with or cancel the
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// install and returns true. Otherwise returns false.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AutoConfirmPrompt(ExtensionInstallPrompt::Delegate* delegate) {
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  switch (ExtensionInstallPrompt::g_auto_confirm_for_tests) {
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case ExtensionInstallPrompt::NONE:
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return false;
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // We use PostTask instead of calling the delegate directly here, because in
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // the real implementations it's highly likely the message loop will be
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // pumping a few times before the user clicks accept or cancel.
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case ExtensionInstallPrompt::ACCEPT:
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::MessageLoop::current()->PostTask(
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          FROM_HERE,
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          base::Bind(&ExtensionInstallPrompt::Delegate::InstallUIProceed,
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     base::Unretained(delegate)));
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return true;
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case ExtensionInstallPrompt::CANCEL:
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::MessageLoop::current()->PostTask(
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          FROM_HERE,
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          base::Bind(&ExtensionInstallPrompt::Delegate::InstallUIAbort,
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     base::Unretained(delegate),
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     true));
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return true;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* ProfileForWebContents(content::WebContents* web_contents) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Profile::FromBrowserContext(web_contents->GetBrowserContext());
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::NativeWindow NativeWindowForWebContents(content::WebContents* contents) {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!contents)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return contents->GetTopLevelNativeWindow();
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ExtensionInstallPrompt::AutoConfirmForTests
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ExtensionInstallPrompt::g_auto_confirm_for_tests = ExtensionInstallPrompt::NONE;
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// This should match the PromptType enum.
1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)std::string ExtensionInstallPrompt::PromptTypeToString(PromptType type) {
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  switch (type) {
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::INSTALL_PROMPT:
1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "INSTALL_PROMPT";
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::INLINE_INSTALL_PROMPT:
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "INLINE_INSTALL_PROMPT";
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::BUNDLE_INSTALL_PROMPT:
1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "BUNDLE_INSTALL_PROMPT";
1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::RE_ENABLE_PROMPT:
1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "RE_ENABLE_PROMPT";
1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::PERMISSIONS_PROMPT:
1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "PERMISSIONS_PROMPT";
1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::EXTERNAL_INSTALL_PROMPT:
1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "EXTERNAL_INSTALL_PROMPT";
1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::POST_INSTALL_PERMISSIONS_PROMPT:
1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "POST_INSTALL_PERMISSIONS_PROMPT";
1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::LAUNCH_PROMPT:
1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "LAUNCH_PROMPT";
1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::REMOTE_INSTALL_PROMPT:
1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "REMOTE_INSTALL_PROMPT";
2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::UNSET_PROMPT_TYPE:
2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::NUM_PROMPT_TYPES:
2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return "OTHER";
2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::Prompt::Prompt(PromptType type)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
209424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_retained_files_(false),
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_(NULL),
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bundle_(NULL),
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      average_rating_(0.0),
213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      rating_count_(0),
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      show_user_count_(false),
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      has_webstore_data_(false) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInstallPrompt::Prompt::~Prompt() {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetPermissions(
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::vector<base::string16>& permissions) {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ExtensionInstallPrompt::Prompt::SetPermissionsDetails(
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::vector<base::string16>& details) {
2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  details_ = details;
229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  is_showing_details_for_permissions_.clear();
230424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < details.size(); ++i)
231424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    is_showing_details_for_permissions_.push_back(false);
232424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetIsShowingDetails(
235424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailsType type,
236424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    size_t index,
237424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool is_showing_details) {
238424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  switch (type) {
239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case PERMISSIONS_DETAILS:
240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_permissions_[index] = is_showing_details;
241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      break;
242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case RETAINED_FILES_DETAILS:
243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_retained_files_ = is_showing_details;
244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      break;
245424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
2467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetWebstoreData(
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_user_count,
250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool show_user_count,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double average_rating,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rating_count) {
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(type_ == INLINE_INSTALL_PROMPT || type_ == EXTERNAL_INSTALL_PROMPT);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_user_count_ = localized_user_count;
255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  show_user_count_ = show_user_count;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  average_rating_ = average_rating;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rating_count_ = rating_count;
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  has_webstore_data_ = true;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetDialogTitle() const {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_id = kTitleIds[type_];
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == INSTALL_PROMPT) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_APP_PROMPT_TITLE;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_THEME_PROMPT_TITLE;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_EXTENSION_PROMPT_TITLE;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == EXTERNAL_INSTALL_PROMPT) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringFUTF16(
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        resource_id, base::UTF8ToUTF16(extension_->name()));
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (type_ == REMOTE_INSTALL_PROMPT) {
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (extension_->is_app())
276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      resource_id = IDS_EXTENSION_REMOTE_INSTALL_APP_PROMPT_TITLE;
277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else
278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      resource_id = IDS_EXTENSION_REMOTE_INSTALL_EXTENSION_PROMPT_TITLE;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(resource_id);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetHeading() const {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == INLINE_INSTALL_PROMPT) {
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return base::UTF8ToUTF16(extension_->name());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == BUNDLE_INSTALL_PROMPT) {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return bundle_->GetHeadingTextFor(BundleInstaller::Item::STATE_PENDING);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == EXTERNAL_INSTALL_PROMPT) {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int resource_id = -1;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_APP;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_THEME;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_EXTENSION;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(resource_id);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringFUTF16(
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        kHeadingIds[type_], base::UTF8ToUTF16(extension_->name()));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ExtensionInstallPrompt::Prompt::GetDialogButtons() const {
305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (type_ == POST_INSTALL_PERMISSIONS_PROMPT &&
306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ShouldDisplayRevokeFilesButton()) {
307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return kButtons[type_] | ui::DIALOG_BUTTON_OK;
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return kButtons[type_];
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldShowExplanationText() const {
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   return type_ == INSTALL_PROMPT &&
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       extension_->is_extension() && experiment_ && experiment_->text_only();
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ExtensionInstallPrompt::Prompt::HasAcceptButtonLabel() const {
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (kAcceptButtonIds[type_] == 0)
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (type_ == POST_INSTALL_PERMISSIONS_PROMPT)
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ShouldDisplayRevokeFilesButton();
324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetAcceptButtonLabel() const {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == EXTERNAL_INSTALL_PROMPT) {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id = -1;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_APP;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_THEME;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_EXTENSION;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(id);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ShouldShowExplanationText())
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return experiment_->GetOkButtonText();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kAcceptButtonIds[type_]);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::HasAbortButtonLabel() const {
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ShouldShowExplanationText())
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kAbortButtonIds[type_] > 0;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetAbortButtonLabel() const {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(HasAbortButtonLabel());
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ShouldShowExplanationText())
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return experiment_->GetCancelButtonText();
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kAbortButtonIds[type_]);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetPermissionsHeading() const {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kPermissionsHeaderIds[type_]);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFilesHeading() const {
36268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const int kRetainedFilesMessageIDs[6] = {
36368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_DEFAULT,
36468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILE_SINGULAR,
36568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_ZERO,
36668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_TWO,
36768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_FEW,
36868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_MANY,
36968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  };
37068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<int> message_ids;
37168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kRetainedFilesMessageIDs); i++) {
37268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    message_ids.push_back(kRetainedFilesMessageIDs[i]);
37368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
37468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return l10n_util::GetPluralStringFUTF16(message_ids, GetRetainedFileCount());
3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldShowPermissions() const {
3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return GetPermissionCount() > 0 || type_ == POST_INSTALL_PERMISSIONS_PROMPT;
3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::AppendRatingStars(
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StarAppender appender, void* data) const {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(appender);
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(type_ == INLINE_INSTALL_PROMPT || type_ == EXTERNAL_INSTALL_PROMPT);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rating_integer = floor(average_rating_);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double rating_fractional = average_rating_ - rating_integer;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional > 0.66) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rating_integer++;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional < 0.33 || rating_fractional > 0.66) {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rating_fractional = 0;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0; i < rating_integer; i++) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_ON), data);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional) {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_HALF_LEFT), data);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i++;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; i < kMaxExtensionRating; i++) {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_OFF), data);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetRatingCount() const {
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(type_ == INLINE_INSTALL_PROMPT || type_ == EXTERNAL_INSTALL_PROMPT);
4121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return l10n_util::GetStringFUTF16(IDS_EXTENSION_RATING_COUNT,
4131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                    base::IntToString16(rating_count_));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetUserCount() const {
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(type_ == INLINE_INSTALL_PROMPT || type_ == EXTERNAL_INSTALL_PROMPT);
418a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
419a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (show_user_count_) {
4201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return l10n_util::GetStringFUTF16(IDS_EXTENSION_USER_COUNT,
4211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                      base::UTF8ToUTF16(localized_user_count_));
422a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return base::string16();
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t ExtensionInstallPrompt::Prompt::GetPermissionCount() const {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return permissions_.size();
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochsize_t ExtensionInstallPrompt::Prompt::GetPermissionsDetailsCount() const {
4317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return details_.size();
4327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetPermission(size_t index)
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const {
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_LT(index, permissions_.size());
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return permissions_[index];
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetPermissionsDetails(
4417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    size_t index) const {
4427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CHECK_LT(index, details_.size());
4437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return details_[index];
4447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
446424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::GetIsShowingDetails(
447424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailsType type, size_t index) const {
448424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  switch (type) {
449424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case PERMISSIONS_DETAILS:
450424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CHECK_LT(index, is_showing_details_for_permissions_.size());
451424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return is_showing_details_for_permissions_[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)
458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)size_t ExtensionInstallPrompt::Prompt::GetRetainedFileCount() const {
459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return retained_files_.size();
460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFile(size_t index)
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const {
464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CHECK_LT(index, retained_files_.size());
4651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return retained_files_[index].AsUTF16Unsafe();
466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldDisplayRevokeFilesButton() const {
469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return !retained_files_.empty();
470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ShowParams::ShowParams(content::WebContents* contents)
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : parent_web_contents(contents),
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_window(NativeWindowForWebContents(contents)),
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator(contents) {
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ShowParams::ShowParams(
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeWindow window,
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::PageNavigator* navigator)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : parent_web_contents(NULL),
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_window(window),
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator(navigator) {
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension>
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionInstallPrompt::GetLocalizedExtensionForDisplay(
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* manifest,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& id,
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_name,
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_description,
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* error) {
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> localized_manifest;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!localized_name.empty() || !localized_description.empty()) {
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    localized_manifest.reset(manifest->DeepCopy());
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!localized_name.empty()) {
4993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      localized_manifest->SetString(extensions::manifest_keys::kName,
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    localized_name);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!localized_description.empty()) {
5033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      localized_manifest->SetString(extensions::manifest_keys::kDescription,
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    localized_description);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Extension::Create(
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Manifest::INTERNAL,
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      localized_manifest.get() ? *localized_manifest.get() : *manifest,
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags,
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ExtensionInstallPrompt::ExtensionInstallPrompt(content::WebContents* contents)
518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : ui_loop_(base::MessageLoop::current()),
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_(NULL),
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bundle_(NULL),
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      install_ui_(ExtensionInstallUI::Create(ProfileForWebContents(contents))),
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_params_(contents),
523f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      delegate_(NULL) {
524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ExtensionInstallPrompt(
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* profile,
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeWindow native_window,
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::PageNavigator* navigator)
530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : ui_loop_(base::MessageLoop::current()),
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_(NULL),
5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bundle_(NULL),
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      install_ui_(ExtensionInstallUI::Create(profile)),
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_params_(native_window, navigator),
535f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      delegate_(NULL) {
536f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInstallPrompt::~ExtensionInstallPrompt() {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmBundleInstall(
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::BundleInstaller* bundle,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PermissionSet* permissions) {
54490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bundle_ = bundle;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = bundle;
548f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(BUNDLE_INSTALL_PROMPT);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmStandaloneInstall(
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkBitmap* icon,
557f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<Prompt> prompt) {
55890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
56046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions_ = extension->permissions_data()->active_permissions();
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prompt_ = prompt;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
56558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmWebstoreInstall(
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SkBitmap* icon,
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback) {
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetIcon requires |extension_| to be set. ConfirmInstall will setup the
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // remaining fields.
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConfirmInstall(delegate, extension, show_dialog_callback);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmInstall(
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback) {
58490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
58646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions_ = extension->permissions_data()->active_permissions();
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
588f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(INSTALL_PROMPT);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  show_dialog_callback_ = show_dialog_callback;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We special-case themes to not show any confirm UI. Instead they are
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // immediately installed, and then we show an infobar (see OnInstallSuccess)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to allow the user to revert if they don't like it.
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't do this in the case where off-store extension installs are
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled because in that case, we don't show the dangerous download UI, so
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we need the UI confirmation.
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extension->is_theme()) {
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension->from_webstore() ||
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extensions::FeatureSwitch::easy_off_store_install()->IsEnabled()) {
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate->InstallUIProceed();
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmReEnable(Delegate* delegate,
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const Extension* extension) {
61190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
61346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions_ = extension->permissions_data()->active_permissions();
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_remote_install =
616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      install_ui_->profile() &&
617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::ExtensionPrefs::Get(install_ui_->profile())->HasDisableReason(
618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          extension->id(), extensions::Extension::DISABLE_REMOTE_INSTALL);
619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_ephemeral =
620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::util::IsEphemeralApp(extension->id(), install_ui_->profile());
621f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PromptType type = UNSET_PROMPT_TYPE;
623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (is_ephemeral)
624f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    type = LAUNCH_PROMPT;
625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else if (is_remote_install)
626f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    type = REMOTE_INSTALL_PROMPT;
627cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else
628f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    type = RE_ENABLE_PROMPT;
629f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(type);
630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmExternalInstall(
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Delegate* delegate,
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Extension* extension,
6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback,
638f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<Prompt> prompt) {
63990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
64146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions_ = extension->permissions_data()->active_permissions();
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prompt_ = prompt;
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  show_dialog_callback_ = show_dialog_callback;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmPermissions(
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PermissionSet* permissions) {
65390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
657f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(PERMISSIONS_PROMPT);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ExtensionInstallPrompt::ReviewPermissions(
663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Delegate* delegate,
664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const Extension* extension,
665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::vector<base::FilePath>& retained_file_paths) {
66690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extension_ = extension;
66846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions_ = extension->permissions_data()->active_permissions();
669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(POST_INSTALL_PERMISSIONS_PROMPT);
670f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_->set_retained_files(retained_file_paths);
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_ = delegate;
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadImageIfNeeded();
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnInstallSuccess(const Extension* extension,
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              SkBitmap* icon) {
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_ui_->OnInstallSuccess(extension, &icon_);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnInstallFailure(
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const extensions::CrxInstallerError& error) {
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_ui_->OnInstallFailure(error);
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::SetIcon(const SkBitmap* image) {
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (image)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = *image;
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = SkBitmap();
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (icon_.empty()) {
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Let's set default icon bitmap whose size is equal to the default icon's
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // pixel size under maximal supported scale factor. If the bitmap is larger
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // than the one we need, it will be scaled down by the ui code.
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = GetDefaultIconBitmapForMaxScaleFactor(extension_->is_app());
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ExtensionInstallPrompt::OnImageLoaded(const gfx::Image& image) {
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(image.IsEmpty() ? NULL : image.ToSkBitmap());
70458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::LoadImageIfNeeded() {
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bundle install prompts do not have an icon.
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also |install_ui_.profile()| can be NULL in unit tests.
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!icon_.empty() || !install_ui_->profile()) {
71158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ShowConfirmation();
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionResource image = extensions::IconsInfo::GetIconResource(
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_,
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_misc::EXTENSION_ICON_LARGE,
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionIconSet::MATCH_BIGGER);
71946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
72046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Load the image asynchronously. The response will be sent to OnImageLoaded.
72146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  extensions::ImageLoader* loader =
72246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extensions::ImageLoader::Get(install_ui_->profile());
72346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
72446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::vector<extensions::ImageLoader::ImageRepresentation> images_list;
72546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  images_list.push_back(extensions::ImageLoader::ImageRepresentation(
72646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      image,
72746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extensions::ImageLoader::ImageRepresentation::NEVER_RESIZE,
72846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      gfx::Size(),
72946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ui::SCALE_FACTOR_100P));
73046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  loader->LoadImagesAsync(
73146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension_,
73246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      images_list,
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ExtensionInstallPrompt::OnImageLoaded, AsWeakPtr()));
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ShowConfirmation() {
737f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (prompt_->type() == INSTALL_PROMPT)
738f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    prompt_->set_experiment(ExtensionInstallPromptExperiment::Find());
7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  else
740f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    prompt_->set_experiment(ExtensionInstallPromptExperiment::ControlGroup());
7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (permissions_.get() &&
7436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      (!extension_ ||
7446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)       !extensions::PermissionsData::ShouldSkipPermissionWarnings(
7456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)           extension_->id()))) {
7466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    Manifest::Type type =
7476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        extension_ ? extension_->GetType() : Manifest::TYPE_UNKNOWN;
7486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const extensions::PermissionMessageProvider* message_provider =
7496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        extensions::PermissionMessageProvider::Get();
7506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    prompt_->SetPermissions(
7516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        message_provider->GetWarningMessages(permissions_, type));
7526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    prompt_->SetPermissionsDetails(
7536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        message_provider->GetWarningMessagesDetails(permissions_, type));
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
756f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  switch (prompt_->type()) {
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PERMISSIONS_PROMPT:
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case RE_ENABLE_PROMPT:
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case INLINE_INSTALL_PROMPT:
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EXTERNAL_INSTALL_PROMPT:
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case INSTALL_PROMPT:
7621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case LAUNCH_PROMPT:
763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case POST_INSTALL_PERMISSIONS_PROMPT:
764cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case REMOTE_INSTALL_PROMPT: {
765f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->set_extension(extension_);
766f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->set_icon(gfx::Image::CreateFrom1xBitmap(icon_));
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BUNDLE_INSTALL_PROMPT: {
770f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->set_bundle(bundle_);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Unknown message";
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (AutoConfirmPrompt(delegate_))
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (show_dialog_callback_.is_null())
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetDefaultShowDialogCallback().Run(show_params_, delegate_, prompt_);
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_dialog_callback_.Run(show_params_, delegate_, prompt_);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
786