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"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/permissions_updater.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/chromium_strings.h"
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_prefs.h"
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_util.h"
306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "extensions/browser/image_loader.h"
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/constants.h"
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension_icon_set.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h"
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest_constants.h"
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/manifest_handlers/icons_handler.h"
398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "extensions/common/permissions/permission_message_provider.h"
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "extensions/common/permissions/permission_set.h"
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern.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)
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool AllowWebstoreData(ExtensionInstallPrompt::PromptType type) {
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return type == ExtensionInstallPrompt::INLINE_INSTALL_PROMPT ||
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         type == ExtensionInstallPrompt::EXTERNAL_INSTALL_PROMPT ||
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         type == ExtensionInstallPrompt::REPAIR_PROMPT;
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTitleIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // The regular install prompt depends on what's being installed.
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_INLINE_INSTALL_PROMPT_TITLE,
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_INSTALL_PROMPT_TITLE,
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_RE_ENABLE_PROMPT_TITLE,
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PERMISSIONS_PROMPT_TITLE,
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_TITLE,
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_POST_INSTALL_PERMISSIONS_PROMPT_TITLE,
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_LAUNCH_APP_PROMPT_TITLE,
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // The remote install prompt depends on what's being installed.
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    0,  // The repair install prompt depends on what's being installed.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kHeadingIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_INSTALL_PROMPT_HEADING,
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // Inline installs use the extension name.
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // Heading for bundle installs depends on the bundle contents.
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_RE_ENABLE_PROMPT_HEADING,
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PERMISSIONS_PROMPT_HEADING,
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // External installs use different strings for extensions/apps.
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_POST_INSTALL_PERMISSIONS_PROMPT_HEADING,
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_LAUNCH_APP_PROMPT_HEADING,
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_REMOTE_INSTALL_PROMPT_HEADING,
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IDS_EXTENSION_REPAIR_PROMPT_HEADING
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const int kButtons[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_CANCEL,
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kAcceptButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_RE_ENABLE_BUTTON,
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_PERMISSIONS_BUTTON,
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // External installs use different strings for extensions/apps.
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_PERMISSIONS_CLEAR_RETAINED_FILES_BUTTON,
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_LAUNCH_BUTTON,
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_REMOTE_INSTALL_BUTTON,
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IDS_EXTENSION_PROMPT_REPAIR_BUTTON,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kAbortButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // These all use the platform's default cancel label.
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_PROMPT_PERMISSIONS_ABORT_BUTTON,
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ABORT_BUTTON,
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IDS_CLOSE,
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,  // Platform dependent cancel button.
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    0,
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    0,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static const int
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    kPermissionsHeaderIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_THESE_WILL_HAVE_ACCESS_TO,
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_WILL_NOW_HAVE_ACCESS_TO,
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_WANTS_ACCESS_TO,
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_CAN_ACCESS,
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        IDS_EXTENSION_PROMPT_CAN_ACCESS,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns bitmap for the default icon with size equal to the default icon's
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pixel size under maximal supported scale factor.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap GetDefaultIconBitmapForMaxScaleFactor(bool is_app) {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::ImageSkia& image = is_app ?
1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      extensions::util::GetDefaultAppIcon() :
1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      extensions::util::GetDefaultExtensionIcon();
14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return image.GetRepresentation(
14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      gfx::ImageSkia::GetMaxSupportedScale()).sk_bitmap();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If auto confirm is enabled then posts a task to proceed with or cancel the
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// install and returns true. Otherwise returns false.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AutoConfirmPrompt(ExtensionInstallPrompt::Delegate* delegate) {
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  switch (ExtensionInstallPrompt::g_auto_confirm_for_tests) {
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case ExtensionInstallPrompt::NONE:
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return false;
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // We use PostTask instead of calling the delegate directly here, because in
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // the real implementations it's highly likely the message loop will be
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // pumping a few times before the user clicks accept or cancel.
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case ExtensionInstallPrompt::ACCEPT:
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::MessageLoop::current()->PostTask(
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          FROM_HERE,
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          base::Bind(&ExtensionInstallPrompt::Delegate::InstallUIProceed,
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     base::Unretained(delegate)));
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return true;
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case ExtensionInstallPrompt::CANCEL:
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::MessageLoop::current()->PostTask(
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          FROM_HERE,
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          base::Bind(&ExtensionInstallPrompt::Delegate::InstallUIAbort,
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     base::Unretained(delegate),
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     true));
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return true;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* ProfileForWebContents(content::WebContents* web_contents) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Profile::FromBrowserContext(web_contents->GetBrowserContext());
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::NativeWindow NativeWindowForWebContents(content::WebContents* contents) {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!contents)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return contents->GetTopLevelNativeWindow();
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciExtensionInstallPrompt::Prompt::InstallPromptPermissions::
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    InstallPromptPermissions() {
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciExtensionInstallPrompt::Prompt::InstallPromptPermissions::
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ~InstallPromptPermissions() {
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ExtensionInstallPrompt::AutoConfirmForTests
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ExtensionInstallPrompt::g_auto_confirm_for_tests = ExtensionInstallPrompt::NONE;
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// This should match the PromptType enum.
2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)std::string ExtensionInstallPrompt::PromptTypeToString(PromptType type) {
2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  switch (type) {
2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::INSTALL_PROMPT:
2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "INSTALL_PROMPT";
2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::INLINE_INSTALL_PROMPT:
2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "INLINE_INSTALL_PROMPT";
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::BUNDLE_INSTALL_PROMPT:
2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "BUNDLE_INSTALL_PROMPT";
2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::RE_ENABLE_PROMPT:
2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "RE_ENABLE_PROMPT";
2106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::PERMISSIONS_PROMPT:
2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "PERMISSIONS_PROMPT";
2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::EXTERNAL_INSTALL_PROMPT:
2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "EXTERNAL_INSTALL_PROMPT";
2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::POST_INSTALL_PERMISSIONS_PROMPT:
2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "POST_INSTALL_PERMISSIONS_PROMPT";
2166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::LAUNCH_PROMPT:
2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "LAUNCH_PROMPT";
2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::REMOTE_INSTALL_PROMPT:
2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "REMOTE_INSTALL_PROMPT";
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ExtensionInstallPrompt::REPAIR_PROMPT:
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return "REPAIR_PROMPT";
2226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::UNSET_PROMPT_TYPE:
2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ExtensionInstallPrompt::NUM_PROMPT_TYPES:
2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return "OTHER";
2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::Prompt::Prompt(PromptType type)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
231424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_retained_files_(false),
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_(NULL),
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bundle_(NULL),
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      average_rating_(0.0),
235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      rating_count_(0),
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      show_user_count_(false),
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      has_webstore_data_(false) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInstallPrompt::Prompt::~Prompt() {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetPermissions(
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<base::string16>& permissions,
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PermissionsType permissions_type) {
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetPermissionsForType(permissions_type).permissions = permissions;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ExtensionInstallPrompt::Prompt::SetPermissionsDetails(
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<base::string16>& details,
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PermissionsType permissions_type) {
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InstallPromptPermissions& install_permissions =
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetPermissionsForType(permissions_type);
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  install_permissions.details = details;
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  install_permissions.is_showing_details.clear();
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  install_permissions.is_showing_details.insert(
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      install_permissions.is_showing_details.begin(), details.size(), false);
258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
259424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
260424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetIsShowingDetails(
261424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailsType type,
262424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    size_t index,
263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool is_showing_details) {
264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  switch (type) {
265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case PERMISSIONS_DETAILS:
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      prompt_permissions_.is_showing_details[index] = is_showing_details;
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case WITHHELD_PERMISSIONS_DETAILS:
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      withheld_prompt_permissions_.is_showing_details[index] =
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          is_showing_details;
271424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      break;
272424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case RETAINED_FILES_DETAILS:
273424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_retained_files_ = is_showing_details;
274424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      break;
275424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetWebstoreData(
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_user_count,
280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool show_user_count,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double average_rating,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rating_count) {
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(AllowWebstoreData(type_));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_user_count_ = localized_user_count;
285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  show_user_count_ = show_user_count;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  average_rating_ = average_rating;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rating_count_ = rating_count;
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  has_webstore_data_ = true;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetDialogTitle() const {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_id = kTitleIds[type_];
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == INSTALL_PROMPT) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_APP_PROMPT_TITLE;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_THEME_PROMPT_TITLE;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_EXTENSION_PROMPT_TITLE;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == EXTERNAL_INSTALL_PROMPT) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringFUTF16(
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        resource_id, base::UTF8ToUTF16(extension_->name()));
304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (type_ == REMOTE_INSTALL_PROMPT) {
305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (extension_->is_app())
306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      resource_id = IDS_EXTENSION_REMOTE_INSTALL_APP_PROMPT_TITLE;
307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else
308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      resource_id = IDS_EXTENSION_REMOTE_INSTALL_EXTENSION_PROMPT_TITLE;
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (type_ == REPAIR_PROMPT) {
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (extension_->is_app())
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      resource_id = IDS_EXTENSION_REPAIR_APP_PROMPT_TITLE;
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      resource_id = IDS_EXTENSION_REPAIR_EXTENSION_PROMPT_TITLE;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(resource_id);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetHeading() const {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == INLINE_INSTALL_PROMPT) {
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return base::UTF8ToUTF16(extension_->name());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == BUNDLE_INSTALL_PROMPT) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return bundle_->GetHeadingTextFor(BundleInstaller::Item::STATE_PENDING);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == EXTERNAL_INSTALL_PROMPT) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int resource_id = -1;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_APP;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_THEME;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_EXTENSION;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(resource_id);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringFUTF16(
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        kHeadingIds[type_], base::UTF8ToUTF16(extension_->name()));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ExtensionInstallPrompt::Prompt::GetDialogButtons() const {
340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (type_ == POST_INSTALL_PERMISSIONS_PROMPT &&
341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ShouldDisplayRevokeFilesButton()) {
342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return kButtons[type_] | ui::DIALOG_BUTTON_OK;
343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return kButtons[type_];
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldShowExplanationText() const {
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return type_ == INSTALL_PROMPT && extension_->is_extension() &&
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         experiment_.get() && experiment_->text_only();
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ExtensionInstallPrompt::Prompt::HasAcceptButtonLabel() const {
354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (kAcceptButtonIds[type_] == 0)
355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (type_ == POST_INSTALL_PERMISSIONS_PROMPT)
358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ShouldDisplayRevokeFilesButton();
359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
360868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetAcceptButtonLabel() const {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == EXTERNAL_INSTALL_PROMPT) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id = -1;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_APP;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_THEME;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_EXTENSION;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(id);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ShouldShowExplanationText())
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return experiment_->GetOkButtonText();
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kAcceptButtonIds[type_]);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::HasAbortButtonLabel() const {
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ShouldShowExplanationText())
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kAbortButtonIds[type_] > 0;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetAbortButtonLabel() const {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(HasAbortButtonLabel());
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ShouldShowExplanationText())
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return experiment_->GetCancelButtonText();
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kAbortButtonIds[type_]);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::string16 ExtensionInstallPrompt::Prompt::GetPermissionsHeading(
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PermissionsType permissions_type) const {
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (permissions_type) {
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case REGULAR_PERMISSIONS:
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return l10n_util::GetStringUTF16(kPermissionsHeaderIds[type_]);
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case WITHHELD_PERMISSIONS:
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WITHHELD);
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ALL_PERMISSIONS:
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NOTREACHED();
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return base::string16();
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFilesHeading() const {
40768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const int kRetainedFilesMessageIDs[6] = {
40868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_DEFAULT,
40968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILE_SINGULAR,
41068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_ZERO,
41168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_TWO,
41268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_FEW,
41368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_MANY,
41468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  };
41568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<int> message_ids;
41668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kRetainedFilesMessageIDs); i++) {
41768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    message_ids.push_back(kRetainedFilesMessageIDs[i]);
41868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
41968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return l10n_util::GetPluralStringFUTF16(message_ids, GetRetainedFileCount());
4207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldShowPermissions() const {
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return GetPermissionCount(ALL_PERMISSIONS) > 0 ||
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         type_ == POST_INSTALL_PERMISSIONS_PROMPT;
4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::AppendRatingStars(
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StarAppender appender, void* data) const {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(appender);
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(AllowWebstoreData(type_));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rating_integer = floor(average_rating_);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double rating_fractional = average_rating_ - rating_integer;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional > 0.66) {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rating_integer++;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional < 0.33 || rating_fractional > 0.66) {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rating_fractional = 0;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0; i < rating_integer; i++) {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_ON), data);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional) {
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_HALF_LEFT), data);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i++;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; i < kMaxExtensionRating; i++) {
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_OFF), data);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetRatingCount() const {
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(AllowWebstoreData(type_));
4581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return l10n_util::GetStringFUTF16(IDS_EXTENSION_RATING_COUNT,
4591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                    base::IntToString16(rating_count_));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetUserCount() const {
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(AllowWebstoreData(type_));
464a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
465a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (show_user_count_) {
4661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return l10n_util::GetStringFUTF16(IDS_EXTENSION_USER_COUNT,
4671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                      base::UTF8ToUTF16(localized_user_count_));
468a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
4691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return base::string16();
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccisize_t ExtensionInstallPrompt::Prompt::GetPermissionCount(
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PermissionsType permissions_type) const {
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (permissions_type) {
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case REGULAR_PERMISSIONS:
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return prompt_permissions_.permissions.size();
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case WITHHELD_PERMISSIONS:
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return withheld_prompt_permissions_.permissions.size();
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ALL_PERMISSIONS:
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return prompt_permissions_.permissions.size() +
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             withheld_prompt_permissions_.permissions.size();
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NOTREACHED();
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0u;
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccisize_t ExtensionInstallPrompt::Prompt::GetPermissionsDetailsCount(
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PermissionsType permissions_type) const {
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (permissions_type) {
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case REGULAR_PERMISSIONS:
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return prompt_permissions_.details.size();
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case WITHHELD_PERMISSIONS:
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return withheld_prompt_permissions_.details.size();
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ALL_PERMISSIONS:
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return prompt_permissions_.details.size() +
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             withheld_prompt_permissions_.details.size();
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NOTREACHED();
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0u;
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
5037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::string16 ExtensionInstallPrompt::Prompt::GetPermission(
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    size_t index,
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PermissionsType permissions_type) const {
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const InstallPromptPermissions& install_permissions =
5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetPermissionsForType(permissions_type);
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_LT(index, install_permissions.permissions.size());
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return install_permissions.permissions[index];
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetPermissionsDetails(
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    size_t index,
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PermissionsType permissions_type) const {
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const InstallPromptPermissions& install_permissions =
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetPermissionsForType(permissions_type);
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_LT(index, install_permissions.details.size());
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return install_permissions.details[index];
5207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
5217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
522424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::GetIsShowingDetails(
523424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailsType type, size_t index) const {
524424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  switch (type) {
525424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case PERMISSIONS_DETAILS:
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CHECK_LT(index, prompt_permissions_.is_showing_details.size());
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return prompt_permissions_.is_showing_details[index];
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case WITHHELD_PERMISSIONS_DETAILS:
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CHECK_LT(index, withheld_prompt_permissions_.is_showing_details.size());
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return withheld_prompt_permissions_.is_showing_details[index];
531424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case RETAINED_FILES_DETAILS:
532424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return is_showing_details_for_retained_files_;
533424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
534424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return false;
535424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
536424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)size_t ExtensionInstallPrompt::Prompt::GetRetainedFileCount() const {
538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return retained_files_.size();
539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFile(size_t index)
5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const {
543868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CHECK_LT(index, retained_files_.size());
5441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return retained_files_[index].AsUTF16Unsafe();
545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciExtensionInstallPrompt::Prompt::InstallPromptPermissions&
5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciExtensionInstallPrompt::Prompt::GetPermissionsForType(
5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PermissionsType permissions_type) {
5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_NE(ALL_PERMISSIONS, permissions_type);
5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return permissions_type == REGULAR_PERMISSIONS ? prompt_permissions_
5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 : withheld_prompt_permissions_;
5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst ExtensionInstallPrompt::Prompt::InstallPromptPermissions&
5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciExtensionInstallPrompt::Prompt::GetPermissionsForType(
5571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PermissionsType permissions_type) const {
5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_NE(ALL_PERMISSIONS, permissions_type);
5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return permissions_type == REGULAR_PERMISSIONS ? prompt_permissions_
5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 : withheld_prompt_permissions_;
5611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldDisplayRevokeFilesButton() const {
564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return !retained_files_.empty();
565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ShowParams::ShowParams(content::WebContents* contents)
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : parent_web_contents(contents),
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_window(NativeWindowForWebContents(contents)),
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator(contents) {
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ShowParams::ShowParams(
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeWindow window,
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::PageNavigator* navigator)
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : parent_web_contents(NULL),
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_window(window),
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator(navigator) {
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension>
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionInstallPrompt::GetLocalizedExtensionForDisplay(
5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* manifest,
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& id,
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_name,
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_description,
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* error) {
5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> localized_manifest;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!localized_name.empty() || !localized_description.empty()) {
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    localized_manifest.reset(manifest->DeepCopy());
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!localized_name.empty()) {
5943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      localized_manifest->SetString(extensions::manifest_keys::kName,
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    localized_name);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!localized_description.empty()) {
5983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      localized_manifest->SetString(extensions::manifest_keys::kDescription,
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    localized_description);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Extension::Create(
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Manifest::INTERNAL,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      localized_manifest.get() ? *localized_manifest.get() : *manifest,
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags,
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id,
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ExtensionInstallPrompt::ExtensionInstallPrompt(content::WebContents* contents)
613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : ui_loop_(base::MessageLoop::current()),
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_(NULL),
6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bundle_(NULL),
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      install_ui_(ExtensionInstallUI::Create(ProfileForWebContents(contents))),
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_params_(contents),
618f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      delegate_(NULL) {
619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ExtensionInstallPrompt(
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* profile,
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeWindow native_window,
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::PageNavigator* navigator)
625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : ui_loop_(base::MessageLoop::current()),
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_(NULL),
6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bundle_(NULL),
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      install_ui_(ExtensionInstallUI::Create(profile)),
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_params_(native_window, navigator),
630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      delegate_(NULL) {
631f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInstallPrompt::~ExtensionInstallPrompt() {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmBundleInstall(
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::BundleInstaller* bundle,
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PermissionSet* permissions) {
63990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bundle_ = bundle;
6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  custom_permissions_ = permissions;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = bundle;
643f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(BUNDLE_INSTALL_PROMPT);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmStandaloneInstall(
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkBitmap* icon,
652f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<Prompt> prompt) {
65390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prompt_ = prompt;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
65958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmWebstoreInstall(
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SkBitmap* icon,
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback) {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetIcon requires |extension_| to be set. ConfirmInstall will setup the
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // remaining fields.
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConfirmInstall(delegate, extension, show_dialog_callback);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmInstall(
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback) {
67890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
681f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(INSTALL_PROMPT);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  show_dialog_callback_ = show_dialog_callback;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We special-case themes to not show any confirm UI. Instead they are
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // immediately installed, and then we show an infobar (see OnInstallSuccess)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to allow the user to revert if they don't like it.
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't do this in the case where off-store extension installs are
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled because in that case, we don't show the dangerous download UI, so
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we need the UI confirmation.
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extension->is_theme()) {
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension->from_webstore() ||
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extensions::FeatureSwitch::easy_off_store_install()->IsEnabled()) {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate->InstallUIProceed();
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmReEnable(Delegate* delegate,
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const Extension* extension) {
70490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
707cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_remote_install =
708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      install_ui_->profile() &&
709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::ExtensionPrefs::Get(install_ui_->profile())->HasDisableReason(
710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          extension->id(), extensions::Extension::DISABLE_REMOTE_INSTALL);
711cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_ephemeral =
712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::util::IsEphemeralApp(extension->id(), install_ui_->profile());
713f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
714f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PromptType type = UNSET_PROMPT_TYPE;
715cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (is_ephemeral)
716f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    type = LAUNCH_PROMPT;
717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else if (is_remote_install)
718f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    type = REMOTE_INSTALL_PROMPT;
719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else
720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    type = RE_ENABLE_PROMPT;
721f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(type);
722f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmExternalInstall(
727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Delegate* delegate,
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Extension* extension,
7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback,
730f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<Prompt> prompt) {
73190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prompt_ = prompt;
735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  show_dialog_callback_ = show_dialog_callback;
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmPermissions(
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PermissionSet* permissions) {
74490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
7461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  custom_permissions_ = permissions;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
748f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(PERMISSIONS_PROMPT);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
753868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ExtensionInstallPrompt::ReviewPermissions(
754868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Delegate* delegate,
755868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const Extension* extension,
756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::vector<base::FilePath>& retained_file_paths) {
75790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extension_ = extension;
759f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(POST_INSTALL_PERMISSIONS_PROMPT);
760f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_->set_retained_files(retained_file_paths);
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_ = delegate;
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadImageIfNeeded();
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnInstallSuccess(const Extension* extension,
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              SkBitmap* icon) {
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_ui_->OnInstallSuccess(extension, &icon_);
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnInstallFailure(
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const extensions::CrxInstallerError& error) {
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_ui_->OnInstallFailure(error);
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::SetIcon(const SkBitmap* image) {
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (image)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = *image;
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = SkBitmap();
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (icon_.empty()) {
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Let's set default icon bitmap whose size is equal to the default icon's
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // pixel size under maximal supported scale factor. If the bitmap is larger
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // than the one we need, it will be scaled down by the ui code.
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = GetDefaultIconBitmapForMaxScaleFactor(extension_->is_app());
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ExtensionInstallPrompt::OnImageLoaded(const gfx::Image& image) {
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(image.IsEmpty() ? NULL : image.ToSkBitmap());
79458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::LoadImageIfNeeded() {
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bundle install prompts do not have an icon.
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also |install_ui_.profile()| can be NULL in unit tests.
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!icon_.empty() || !install_ui_->profile()) {
80158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ShowConfirmation();
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionResource image = extensions::IconsInfo::GetIconResource(
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_,
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_misc::EXTENSION_ICON_LARGE,
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionIconSet::MATCH_BIGGER);
80946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
81046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Load the image asynchronously. The response will be sent to OnImageLoaded.
81146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  extensions::ImageLoader* loader =
81246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extensions::ImageLoader::Get(install_ui_->profile());
81346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
81446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::vector<extensions::ImageLoader::ImageRepresentation> images_list;
81546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  images_list.push_back(extensions::ImageLoader::ImageRepresentation(
81646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      image,
81746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extensions::ImageLoader::ImageRepresentation::NEVER_RESIZE,
81846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      gfx::Size(),
81946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ui::SCALE_FACTOR_100P));
82046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  loader->LoadImagesAsync(
82146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension_,
82246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      images_list,
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ExtensionInstallPrompt::OnImageLoaded, AsWeakPtr()));
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ShowConfirmation() {
827f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (prompt_->type() == INSTALL_PROMPT)
828f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    prompt_->set_experiment(ExtensionInstallPromptExperiment::Find());
8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  else
830f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    prompt_->set_experiment(ExtensionInstallPromptExperiment::ControlGroup());
8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<const PermissionSet> permissions_to_display;
8331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (custom_permissions_.get()) {
8341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    permissions_to_display = custom_permissions_;
8351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (extension_) {
8361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Initialize permissions if they have not already been set so that
8371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // withheld permissions are displayed properly in the install prompt.
8381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    extensions::PermissionsUpdater(
8391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        install_ui_->profile(),
8401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        extensions::PermissionsUpdater::INIT_FLAG_TRANSIENT)
8411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .InitializePermissions(extension_);
8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    permissions_to_display =
8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        extension_->permissions_data()->active_permissions();
8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (permissions_to_display.get() &&
8476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      (!extension_ ||
8486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)       !extensions::PermissionsData::ShouldSkipPermissionWarnings(
8496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)           extension_->id()))) {
8506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    Manifest::Type type =
8516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        extension_ ? extension_->GetType() : Manifest::TYPE_UNKNOWN;
8526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const extensions::PermissionMessageProvider* message_provider =
8536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        extensions::PermissionMessageProvider::Get();
8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    prompt_->SetPermissions(message_provider->GetWarningMessages(
8551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                permissions_to_display.get(), type),
8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            REGULAR_PERMISSIONS);
8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    prompt_->SetPermissionsDetails(message_provider->GetWarningMessagesDetails(
8581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       permissions_to_display.get(), type),
8591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   REGULAR_PERMISSIONS);
8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_refptr<const extensions::PermissionSet> withheld =
8621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        extension_->permissions_data()->withheld_permissions();
8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!withheld->IsEmpty()) {
8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      prompt_->SetPermissions(
8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          message_provider->GetWarningMessages(withheld.get(), type),
8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          PermissionsType::WITHHELD_PERMISSIONS);
8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      prompt_->SetPermissionsDetails(
8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          message_provider->GetWarningMessagesDetails(withheld.get(), type),
8691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          PermissionsType::WITHHELD_PERMISSIONS);
8701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
873f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  switch (prompt_->type()) {
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PERMISSIONS_PROMPT:
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case RE_ENABLE_PROMPT:
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case INLINE_INSTALL_PROMPT:
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EXTERNAL_INSTALL_PROMPT:
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case INSTALL_PROMPT:
8791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case LAUNCH_PROMPT:
880cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case POST_INSTALL_PERMISSIONS_PROMPT:
8811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case REMOTE_INSTALL_PROMPT:
8821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case REPAIR_PROMPT: {
883f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->set_extension(extension_);
884f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->set_icon(gfx::Image::CreateFrom1xBitmap(icon_));
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BUNDLE_INSTALL_PROMPT: {
888f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->set_bundle(bundle_);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Unknown message";
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (AutoConfirmPrompt(delegate_))
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (show_dialog_callback_.is_null())
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetDefaultShowDialogCallback().Run(show_params_, delegate_, prompt_);
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_dialog_callback_.Run(show_params_, delegate_, prompt_);
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
904