extension_install_prompt.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_prefs.h"
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_util.h"
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "extensions/browser/image_loader.h"
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/constants.h"
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension_icon_set.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h"
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest_constants.h"
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/manifest_handlers/icons_handler.h"
368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "extensions/common/permissions/permission_message_provider.h"
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "extensions/common/permissions/permission_set.h"
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::BundleInstaller;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Manifest;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::PermissionSet;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTitleIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
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)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::Prompt::Prompt(PromptType type)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
181424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_retained_files_(false),
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_(NULL),
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bundle_(NULL),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      average_rating_(0.0),
185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      rating_count_(0),
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      show_user_count_(false),
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      has_webstore_data_(false) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInstallPrompt::Prompt::~Prompt() {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetPermissions(
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::vector<base::string16>& permissions) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ExtensionInstallPrompt::Prompt::SetPermissionsDetails(
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::vector<base::string16>& details) {
2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  details_ = details;
201424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  is_showing_details_for_permissions_.clear();
202424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < details.size(); ++i)
203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    is_showing_details_for_permissions_.push_back(false);
204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
205424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
206424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetIsShowingDetails(
207424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailsType type,
208424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    size_t index,
209424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool is_showing_details) {
210424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  switch (type) {
211424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case PERMISSIONS_DETAILS:
212424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_permissions_[index] = is_showing_details;
213424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      break;
214424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case RETAINED_FILES_DETAILS:
215424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_retained_files_ = is_showing_details;
216424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      break;
217424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetWebstoreData(
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_user_count,
222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool show_user_count,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double average_rating,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rating_count) {
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(type_ == INLINE_INSTALL_PROMPT || type_ == EXTERNAL_INSTALL_PROMPT);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_user_count_ = localized_user_count;
227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  show_user_count_ = show_user_count;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  average_rating_ = average_rating;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rating_count_ = rating_count;
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  has_webstore_data_ = true;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetDialogTitle() const {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_id = kTitleIds[type_];
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == INSTALL_PROMPT) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_APP_PROMPT_TITLE;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_THEME_PROMPT_TITLE;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_EXTENSION_PROMPT_TITLE;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == EXTERNAL_INSTALL_PROMPT) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringFUTF16(
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        resource_id, base::UTF8ToUTF16(extension_->name()));
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (type_ == REMOTE_INSTALL_PROMPT) {
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (extension_->is_app())
248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      resource_id = IDS_EXTENSION_REMOTE_INSTALL_APP_PROMPT_TITLE;
249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else
250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      resource_id = IDS_EXTENSION_REMOTE_INSTALL_EXTENSION_PROMPT_TITLE;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(resource_id);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetHeading() const {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == INLINE_INSTALL_PROMPT) {
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return base::UTF8ToUTF16(extension_->name());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == BUNDLE_INSTALL_PROMPT) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return bundle_->GetHeadingTextFor(BundleInstaller::Item::STATE_PENDING);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == EXTERNAL_INSTALL_PROMPT) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int resource_id = -1;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_APP;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_THEME;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_EXTENSION;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(resource_id);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringFUTF16(
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        kHeadingIds[type_], base::UTF8ToUTF16(extension_->name()));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ExtensionInstallPrompt::Prompt::GetDialogButtons() const {
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (type_ == POST_INSTALL_PERMISSIONS_PROMPT &&
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ShouldDisplayRevokeFilesButton()) {
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return kButtons[type_] | ui::DIALOG_BUTTON_OK;
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return kButtons[type_];
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldShowExplanationText() const {
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   return type_ == INSTALL_PROMPT &&
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       extension_->is_extension() && experiment_ && experiment_->text_only();
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ExtensionInstallPrompt::Prompt::HasAcceptButtonLabel() const {
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (kAcceptButtonIds[type_] == 0)
292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (type_ == POST_INSTALL_PERMISSIONS_PROMPT)
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ShouldDisplayRevokeFilesButton();
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetAcceptButtonLabel() const {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == EXTERNAL_INSTALL_PROMPT) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id = -1;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_APP;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_THEME;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_EXTENSION;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(id);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ShouldShowExplanationText())
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return experiment_->GetOkButtonText();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kAcceptButtonIds[type_]);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::HasAbortButtonLabel() const {
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ShouldShowExplanationText())
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kAbortButtonIds[type_] > 0;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetAbortButtonLabel() const {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(HasAbortButtonLabel());
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ShouldShowExplanationText())
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return experiment_->GetCancelButtonText();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kAbortButtonIds[type_]);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetPermissionsHeading() const {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kPermissionsHeaderIds[type_]);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFilesHeading() const {
33468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const int kRetainedFilesMessageIDs[6] = {
33568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_DEFAULT,
33668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILE_SINGULAR,
33768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_ZERO,
33868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_TWO,
33968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_FEW,
34068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_MANY,
34168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  };
34268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<int> message_ids;
34368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kRetainedFilesMessageIDs); i++) {
34468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    message_ids.push_back(kRetainedFilesMessageIDs[i]);
34568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
34668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return l10n_util::GetPluralStringFUTF16(message_ids, GetRetainedFileCount());
3477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldShowPermissions() const {
3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return GetPermissionCount() > 0 || type_ == POST_INSTALL_PERMISSIONS_PROMPT;
3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::AppendRatingStars(
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StarAppender appender, void* data) const {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(appender);
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(type_ == INLINE_INSTALL_PROMPT || type_ == EXTERNAL_INSTALL_PROMPT);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rating_integer = floor(average_rating_);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double rating_fractional = average_rating_ - rating_integer;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional > 0.66) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rating_integer++;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional < 0.33 || rating_fractional > 0.66) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rating_fractional = 0;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0; i < rating_integer; i++) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_ON), data);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_HALF_LEFT), data);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i++;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; i < kMaxExtensionRating; i++) {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_OFF), data);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetRatingCount() const {
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(type_ == INLINE_INSTALL_PROMPT || type_ == EXTERNAL_INSTALL_PROMPT);
3841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return l10n_util::GetStringFUTF16(IDS_EXTENSION_RATING_COUNT,
3851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                    base::IntToString16(rating_count_));
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetUserCount() const {
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(type_ == INLINE_INSTALL_PROMPT || type_ == EXTERNAL_INSTALL_PROMPT);
390a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
391a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (show_user_count_) {
3921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return l10n_util::GetStringFUTF16(IDS_EXTENSION_USER_COUNT,
3931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                      base::UTF8ToUTF16(localized_user_count_));
394a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
3951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return base::string16();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t ExtensionInstallPrompt::Prompt::GetPermissionCount() const {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return permissions_.size();
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochsize_t ExtensionInstallPrompt::Prompt::GetPermissionsDetailsCount() const {
4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return details_.size();
4047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetPermission(size_t index)
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const {
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_LT(index, permissions_.size());
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return permissions_[index];
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetPermissionsDetails(
4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    size_t index) const {
4147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CHECK_LT(index, details_.size());
4157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return details_[index];
4167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
418424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::GetIsShowingDetails(
419424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailsType type, size_t index) const {
420424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  switch (type) {
421424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case PERMISSIONS_DETAILS:
422424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CHECK_LT(index, is_showing_details_for_permissions_.size());
423424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return is_showing_details_for_permissions_[index];
424424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case RETAINED_FILES_DETAILS:
425424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return is_showing_details_for_retained_files_;
426424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
427424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return false;
428424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
429424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)size_t ExtensionInstallPrompt::Prompt::GetRetainedFileCount() const {
431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return retained_files_.size();
432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFile(size_t index)
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const {
436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CHECK_LT(index, retained_files_.size());
4371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return retained_files_[index].AsUTF16Unsafe();
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldDisplayRevokeFilesButton() const {
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return !retained_files_.empty();
442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ShowParams::ShowParams(content::WebContents* contents)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : parent_web_contents(contents),
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_window(NativeWindowForWebContents(contents)),
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator(contents) {
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ShowParams::ShowParams(
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeWindow window,
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::PageNavigator* navigator)
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : parent_web_contents(NULL),
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_window(window),
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator(navigator) {
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension>
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionInstallPrompt::GetLocalizedExtensionForDisplay(
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* manifest,
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& id,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_name,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_description,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* error) {
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> localized_manifest;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!localized_name.empty() || !localized_description.empty()) {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    localized_manifest.reset(manifest->DeepCopy());
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!localized_name.empty()) {
4713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      localized_manifest->SetString(extensions::manifest_keys::kName,
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    localized_name);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!localized_description.empty()) {
4753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      localized_manifest->SetString(extensions::manifest_keys::kDescription,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    localized_description);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Extension::Create(
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Manifest::INTERNAL,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      localized_manifest.get() ? *localized_manifest.get() : *manifest,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id,
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ExtensionInstallPrompt::ExtensionInstallPrompt(content::WebContents* contents)
490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : ui_loop_(base::MessageLoop::current()),
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_(NULL),
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bundle_(NULL),
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      install_ui_(ExtensionInstallUI::Create(ProfileForWebContents(contents))),
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_params_(contents),
495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      delegate_(NULL) {
496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ExtensionInstallPrompt(
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* profile,
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeWindow native_window,
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::PageNavigator* navigator)
502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : ui_loop_(base::MessageLoop::current()),
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_(NULL),
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bundle_(NULL),
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      install_ui_(ExtensionInstallUI::Create(profile)),
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_params_(native_window, navigator),
507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      delegate_(NULL) {
508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInstallPrompt::~ExtensionInstallPrompt() {
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmBundleInstall(
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::BundleInstaller* bundle,
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PermissionSet* permissions) {
51690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bundle_ = bundle;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = bundle;
520f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(BUNDLE_INSTALL_PROMPT);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmStandaloneInstall(
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkBitmap* icon,
529f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<Prompt> prompt) {
53090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
53246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions_ = extension->permissions_data()->active_permissions();
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prompt_ = prompt;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
53758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmWebstoreInstall(
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SkBitmap* icon,
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback) {
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetIcon requires |extension_| to be set. ConfirmInstall will setup the
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // remaining fields.
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConfirmInstall(delegate, extension, show_dialog_callback);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmInstall(
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback) {
55690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
55846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions_ = extension->permissions_data()->active_permissions();
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
560f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(INSTALL_PROMPT);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  show_dialog_callback_ = show_dialog_callback;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We special-case themes to not show any confirm UI. Instead they are
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // immediately installed, and then we show an infobar (see OnInstallSuccess)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to allow the user to revert if they don't like it.
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't do this in the case where off-store extension installs are
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled because in that case, we don't show the dangerous download UI, so
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we need the UI confirmation.
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extension->is_theme()) {
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension->from_webstore() ||
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extensions::FeatureSwitch::easy_off_store_install()->IsEnabled()) {
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate->InstallUIProceed();
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmReEnable(Delegate* delegate,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const Extension* extension) {
58390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
58546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions_ = extension->permissions_data()->active_permissions();
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_remote_install =
588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      install_ui_->profile() &&
589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::ExtensionPrefs::Get(install_ui_->profile())->HasDisableReason(
590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          extension->id(), extensions::Extension::DISABLE_REMOTE_INSTALL);
591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_ephemeral =
592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::util::IsEphemeralApp(extension->id(), install_ui_->profile());
593f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
594f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PromptType type = UNSET_PROMPT_TYPE;
595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (is_ephemeral)
596f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    type = LAUNCH_PROMPT;
597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else if (is_remote_install)
598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    type = REMOTE_INSTALL_PROMPT;
599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else
600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    type = RE_ENABLE_PROMPT;
601f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(type);
602f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmExternalInstall(
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Delegate* delegate,
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Extension* extension,
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback,
610f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<Prompt> prompt) {
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;
6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prompt_ = prompt;
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  show_dialog_callback_ = show_dialog_callback;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmPermissions(
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PermissionSet* permissions) {
62590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
629f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(PERMISSIONS_PROMPT);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ExtensionInstallPrompt::ReviewPermissions(
635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Delegate* delegate,
636868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const Extension* extension,
637868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::vector<base::FilePath>& retained_file_paths) {
63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extension_ = extension;
64046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions_ = extension->permissions_data()->active_permissions();
641f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(POST_INSTALL_PERMISSIONS_PROMPT);
642f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_->set_retained_files(retained_file_paths);
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_ = delegate;
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadImageIfNeeded();
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnInstallSuccess(const Extension* extension,
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              SkBitmap* icon) {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_ui_->OnInstallSuccess(extension, &icon_);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnInstallFailure(
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const extensions::CrxInstallerError& error) {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_ui_->OnInstallFailure(error);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::SetIcon(const SkBitmap* image) {
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (image)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = *image;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = SkBitmap();
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (icon_.empty()) {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Let's set default icon bitmap whose size is equal to the default icon's
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // pixel size under maximal supported scale factor. If the bitmap is larger
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // than the one we need, it will be scaled down by the ui code.
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = GetDefaultIconBitmapForMaxScaleFactor(extension_->is_app());
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ExtensionInstallPrompt::OnImageLoaded(const gfx::Image& image) {
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(image.IsEmpty() ? NULL : image.ToSkBitmap());
67658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::LoadImageIfNeeded() {
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bundle install prompts do not have an icon.
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also |install_ui_.profile()| can be NULL in unit tests.
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!icon_.empty() || !install_ui_->profile()) {
68358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ShowConfirmation();
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionResource image = extensions::IconsInfo::GetIconResource(
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_,
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_misc::EXTENSION_ICON_LARGE,
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionIconSet::MATCH_BIGGER);
69146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
69246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Load the image asynchronously. The response will be sent to OnImageLoaded.
69346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  extensions::ImageLoader* loader =
69446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extensions::ImageLoader::Get(install_ui_->profile());
69546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
69646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::vector<extensions::ImageLoader::ImageRepresentation> images_list;
69746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  images_list.push_back(extensions::ImageLoader::ImageRepresentation(
69846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      image,
69946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extensions::ImageLoader::ImageRepresentation::NEVER_RESIZE,
70046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      gfx::Size(),
70146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ui::SCALE_FACTOR_100P));
70246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  loader->LoadImagesAsync(
70346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension_,
70446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      images_list,
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ExtensionInstallPrompt::OnImageLoaded, AsWeakPtr()));
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ShowConfirmation() {
709f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (prompt_->type() == INSTALL_PROMPT)
710f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    prompt_->set_experiment(ExtensionInstallPromptExperiment::Find());
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  else
712f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    prompt_->set_experiment(ExtensionInstallPromptExperiment::ControlGroup());
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
71446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (permissions_.get()) {
71546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (extension_) {
71646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const extensions::PermissionsData* permissions_data =
71746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          extension_->permissions_data();
718f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->SetPermissions(permissions_data->GetPermissionMessageStrings());
719f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->SetPermissionsDetails(
72046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          permissions_data->GetPermissionMessageDetailsStrings());
72146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    } else {
72246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const extensions::PermissionMessageProvider* message_provider =
72346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          extensions::PermissionMessageProvider::Get();
724f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->SetPermissions(message_provider->GetWarningMessages(
72546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          permissions_, Manifest::TYPE_UNKNOWN));
726f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->SetPermissionsDetails(
727f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          message_provider->GetWarningMessagesDetails(permissions_,
728f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      Manifest::TYPE_UNKNOWN));
72946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  switch (prompt_->type()) {
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PERMISSIONS_PROMPT:
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case RE_ENABLE_PROMPT:
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case INLINE_INSTALL_PROMPT:
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EXTERNAL_INSTALL_PROMPT:
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case INSTALL_PROMPT:
7381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case LAUNCH_PROMPT:
739cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case POST_INSTALL_PERMISSIONS_PROMPT:
740cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case REMOTE_INSTALL_PROMPT: {
741f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->set_extension(extension_);
742f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->set_icon(gfx::Image::CreateFrom1xBitmap(icon_));
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BUNDLE_INSTALL_PROMPT: {
746f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->set_bundle(bundle_);
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Unknown message";
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (AutoConfirmPrompt(delegate_))
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (show_dialog_callback_.is_null())
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetDefaultShowDialogCallback().Run(show_params_, delegate_, prompt_);
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_dialog_callback_.Run(show_params_, delegate_, prompt_);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
762