extension_install_prompt.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
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) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CommandLine* cmdline = CommandLine::ForCurrentProcess();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cmdline->HasSwitch(switches::kAppsGalleryInstallAutoConfirmForTests))
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value = cmdline->GetSwitchValueASCII(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kAppsGalleryInstallAutoConfirmForTests);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We use PostTask instead of calling the delegate directly here, because in
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the real implementations it's highly likely the message loop will be
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pumping a few times before the user clicks accept or cancel.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (value == "accept") {
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&ExtensionInstallPrompt::Delegate::InstallUIProceed,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(delegate)));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (value == "cancel") {
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&ExtensionInstallPrompt::Delegate::InstallUIAbort,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(delegate),
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   true));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* ProfileForWebContents(content::WebContents* web_contents) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Profile::FromBrowserContext(web_contents->GetBrowserContext());
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::NativeWindow NativeWindowForWebContents(content::WebContents* contents) {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!contents)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return contents->GetTopLevelNativeWindow();
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::Prompt::Prompt(PromptType type)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
182424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_retained_files_(false),
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_(NULL),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bundle_(NULL),
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      average_rating_(0.0),
186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      rating_count_(0),
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      show_user_count_(false),
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      has_webstore_data_(false) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInstallPrompt::Prompt::~Prompt() {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetPermissions(
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::vector<base::string16>& permissions) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ExtensionInstallPrompt::Prompt::SetPermissionsDetails(
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::vector<base::string16>& details) {
2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  details_ = details;
202424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  is_showing_details_for_permissions_.clear();
203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < details.size(); ++i)
204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    is_showing_details_for_permissions_.push_back(false);
205424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
206424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
207424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetIsShowingDetails(
208424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailsType type,
209424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    size_t index,
210424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool is_showing_details) {
211424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  switch (type) {
212424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case PERMISSIONS_DETAILS:
213424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_permissions_[index] = is_showing_details;
214424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      break;
215424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case RETAINED_FILES_DETAILS:
216424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      is_showing_details_for_retained_files_ = is_showing_details;
217424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      break;
218424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::SetWebstoreData(
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_user_count,
223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool show_user_count,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double average_rating,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rating_count) {
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(type_ == INLINE_INSTALL_PROMPT || type_ == EXTERNAL_INSTALL_PROMPT);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_user_count_ = localized_user_count;
228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  show_user_count_ = show_user_count;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  average_rating_ = average_rating;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rating_count_ = rating_count;
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  has_webstore_data_ = true;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetDialogTitle() const {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_id = kTitleIds[type_];
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == INSTALL_PROMPT) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_APP_PROMPT_TITLE;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_THEME_PROMPT_TITLE;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_INSTALL_EXTENSION_PROMPT_TITLE;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == EXTERNAL_INSTALL_PROMPT) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringFUTF16(
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        resource_id, base::UTF8ToUTF16(extension_->name()));
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (type_ == REMOTE_INSTALL_PROMPT) {
248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (extension_->is_app())
249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      resource_id = IDS_EXTENSION_REMOTE_INSTALL_APP_PROMPT_TITLE;
250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else
251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      resource_id = IDS_EXTENSION_REMOTE_INSTALL_EXTENSION_PROMPT_TITLE;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(resource_id);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetHeading() const {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == INLINE_INSTALL_PROMPT) {
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return base::UTF8ToUTF16(extension_->name());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == BUNDLE_INSTALL_PROMPT) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return bundle_->GetHeadingTextFor(BundleInstaller::Item::STATE_PENDING);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type_ == EXTERNAL_INSTALL_PROMPT) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int resource_id = -1;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_APP;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_THEME;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_EXTENSION;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(resource_id);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringFUTF16(
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        kHeadingIds[type_], base::UTF8ToUTF16(extension_->name()));
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ExtensionInstallPrompt::Prompt::GetDialogButtons() const {
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (type_ == POST_INSTALL_PERMISSIONS_PROMPT &&
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ShouldDisplayRevokeFilesButton()) {
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return kButtons[type_] | ui::DIALOG_BUTTON_OK;
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return kButtons[type_];
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldShowExplanationText() const {
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   return type_ == INSTALL_PROMPT &&
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       extension_->is_extension() && experiment_ && experiment_->text_only();
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ExtensionInstallPrompt::Prompt::HasAcceptButtonLabel() const {
292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (kAcceptButtonIds[type_] == 0)
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (type_ == POST_INSTALL_PERMISSIONS_PROMPT)
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ShouldDisplayRevokeFilesButton();
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetAcceptButtonLabel() const {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == EXTERNAL_INSTALL_PROMPT) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id = -1;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_->is_app())
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_APP;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (extension_->is_theme())
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_THEME;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_EXTENSION;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(id);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ShouldShowExplanationText())
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return experiment_->GetOkButtonText();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kAcceptButtonIds[type_]);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::HasAbortButtonLabel() const {
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ShouldShowExplanationText())
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kAbortButtonIds[type_] > 0;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetAbortButtonLabel() const {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(HasAbortButtonLabel());
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ShouldShowExplanationText())
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return experiment_->GetCancelButtonText();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kAbortButtonIds[type_]);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetPermissionsHeading() const {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(kPermissionsHeaderIds[type_]);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFilesHeading() const {
33568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const int kRetainedFilesMessageIDs[6] = {
33668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_DEFAULT,
33768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILE_SINGULAR,
33868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_ZERO,
33968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_TWO,
34068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_FEW,
34168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IDS_EXTENSION_PROMPT_RETAINED_FILES_MANY,
34268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  };
34368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<int> message_ids;
34468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kRetainedFilesMessageIDs); i++) {
34568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    message_ids.push_back(kRetainedFilesMessageIDs[i]);
34668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
34768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return l10n_util::GetPluralStringFUTF16(message_ids, GetRetainedFileCount());
3487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldShowPermissions() const {
3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return GetPermissionCount() > 0 || type_ == POST_INSTALL_PERMISSIONS_PROMPT;
3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::Prompt::AppendRatingStars(
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StarAppender appender, void* data) const {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(appender);
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(type_ == INLINE_INSTALL_PROMPT || type_ == EXTERNAL_INSTALL_PROMPT);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rating_integer = floor(average_rating_);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double rating_fractional = average_rating_ - rating_integer;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional > 0.66) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rating_integer++;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional < 0.33 || rating_fractional > 0.66) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rating_fractional = 0;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0; i < rating_integer; i++) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_ON), data);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rating_fractional) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_HALF_LEFT), data);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i++;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; i < kMaxExtensionRating; i++) {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appender(rb.GetImageSkiaNamed(IDR_EXTENSIONS_RATING_STAR_OFF), data);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetRatingCount() const {
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(type_ == INLINE_INSTALL_PROMPT || type_ == EXTERNAL_INSTALL_PROMPT);
3851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return l10n_util::GetStringFUTF16(IDS_EXTENSION_RATING_COUNT,
3861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                    base::IntToString16(rating_count_));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetUserCount() const {
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(type_ == INLINE_INSTALL_PROMPT || type_ == EXTERNAL_INSTALL_PROMPT);
391a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
392a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (show_user_count_) {
3931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return l10n_util::GetStringFUTF16(IDS_EXTENSION_USER_COUNT,
3941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                      base::UTF8ToUTF16(localized_user_count_));
395a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return base::string16();
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t ExtensionInstallPrompt::Prompt::GetPermissionCount() const {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return permissions_.size();
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochsize_t ExtensionInstallPrompt::Prompt::GetPermissionsDetailsCount() const {
4047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return details_.size();
4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetPermission(size_t index)
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_LT(index, permissions_.size());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return permissions_[index];
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetPermissionsDetails(
4147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    size_t index) const {
4157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CHECK_LT(index, details_.size());
4167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return details_[index];
4177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
419424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::GetIsShowingDetails(
420424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailsType type, size_t index) const {
421424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  switch (type) {
422424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case PERMISSIONS_DETAILS:
423424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CHECK_LT(index, is_showing_details_for_permissions_.size());
424424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return is_showing_details_for_permissions_[index];
425424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case RETAINED_FILES_DETAILS:
426424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return is_showing_details_for_retained_files_;
427424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
428424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return false;
429424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
430424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)size_t ExtensionInstallPrompt::Prompt::GetRetainedFileCount() const {
432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return retained_files_.size();
433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFile(size_t index)
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const {
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CHECK_LT(index, retained_files_.size());
4381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return retained_files_[index].AsUTF16Unsafe();
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool ExtensionInstallPrompt::Prompt::ShouldDisplayRevokeFilesButton() const {
442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return !retained_files_.empty();
443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ShowParams::ShowParams(content::WebContents* contents)
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : parent_web_contents(contents),
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_window(NativeWindowForWebContents(contents)),
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator(contents) {
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ShowParams::ShowParams(
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeWindow window,
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::PageNavigator* navigator)
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : parent_web_contents(NULL),
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_window(window),
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator(navigator) {
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension>
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionInstallPrompt::GetLocalizedExtensionForDisplay(
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* manifest,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& id,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_name,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& localized_description,
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* error) {
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> localized_manifest;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!localized_name.empty() || !localized_description.empty()) {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    localized_manifest.reset(manifest->DeepCopy());
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!localized_name.empty()) {
4723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      localized_manifest->SetString(extensions::manifest_keys::kName,
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    localized_name);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!localized_description.empty()) {
4763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      localized_manifest->SetString(extensions::manifest_keys::kDescription,
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    localized_description);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Extension::Create(
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Manifest::INTERNAL,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      localized_manifest.get() ? *localized_manifest.get() : *manifest,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags,
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ExtensionInstallPrompt::ExtensionInstallPrompt(content::WebContents* contents)
491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : ui_loop_(base::MessageLoop::current()),
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_(NULL),
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bundle_(NULL),
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      install_ui_(ExtensionInstallUI::Create(ProfileForWebContents(contents))),
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_params_(contents),
496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      delegate_(NULL) {
497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionInstallPrompt::ExtensionInstallPrompt(
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* profile,
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeWindow native_window,
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::PageNavigator* navigator)
503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : ui_loop_(base::MessageLoop::current()),
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_(NULL),
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bundle_(NULL),
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      install_ui_(ExtensionInstallUI::Create(profile)),
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_params_(native_window, navigator),
508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      delegate_(NULL) {
509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInstallPrompt::~ExtensionInstallPrompt() {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmBundleInstall(
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::BundleInstaller* bundle,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PermissionSet* permissions) {
51790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bundle_ = bundle;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = bundle;
521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(BUNDLE_INSTALL_PROMPT);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmStandaloneInstall(
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkBitmap* icon,
530f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<Prompt> prompt) {
53190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
53346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions_ = extension->permissions_data()->active_permissions();
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prompt_ = prompt;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
53858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmWebstoreInstall(
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SkBitmap* icon,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback) {
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetIcon requires |extension_| to be set. ConfirmInstall will setup the
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // remaining fields.
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConfirmInstall(delegate, extension, show_dialog_callback);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmInstall(
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback) {
55790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
55946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions_ = extension->permissions_data()->active_permissions();
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
561f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(INSTALL_PROMPT);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  show_dialog_callback_ = show_dialog_callback;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We special-case themes to not show any confirm UI. Instead they are
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // immediately installed, and then we show an infobar (see OnInstallSuccess)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to allow the user to revert if they don't like it.
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't do this in the case where off-store extension installs are
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled because in that case, we don't show the dangerous download UI, so
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we need the UI confirmation.
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extension->is_theme()) {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension->from_webstore() ||
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extensions::FeatureSwitch::easy_off_store_install()->IsEnabled()) {
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate->InstallUIProceed();
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmReEnable(Delegate* delegate,
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const Extension* extension) {
58490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
58646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions_ = extension->permissions_data()->active_permissions();
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_remote_install =
589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      install_ui_->profile() &&
590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::ExtensionPrefs::Get(install_ui_->profile())->HasDisableReason(
591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          extension->id(), extensions::Extension::DISABLE_REMOTE_INSTALL);
592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_ephemeral =
593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::util::IsEphemeralApp(extension->id(), install_ui_->profile());
594f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
595f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PromptType type = UNSET_PROMPT_TYPE;
596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (is_ephemeral)
597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    type = LAUNCH_PROMPT;
598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else if (is_remote_install)
599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    type = REMOTE_INSTALL_PROMPT;
600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else
601f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    type = RE_ENABLE_PROMPT;
602f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(type);
603f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmExternalInstall(
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Delegate* delegate,
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Extension* extension,
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ShowDialogCallback& show_dialog_callback,
611f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<Prompt> prompt) {
61290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
61446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions_ = extension->permissions_data()->active_permissions();
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prompt_ = prompt;
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  show_dialog_callback_ = show_dialog_callback;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ConfirmPermissions(
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension,
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PermissionSet* permissions) {
62690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permissions_ = permissions;
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(PERMISSIONS_PROMPT);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImageIfNeeded();
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ExtensionInstallPrompt::ReviewPermissions(
636868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Delegate* delegate,
637868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const Extension* extension,
638868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::vector<base::FilePath>& retained_file_paths) {
63990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ui_loop_ == base::MessageLoop::current());
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extension_ = extension;
64146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions_ = extension->permissions_data()->active_permissions();
642f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_ = new Prompt(POST_INSTALL_PERMISSIONS_PROMPT);
643f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  prompt_->set_retained_files(retained_file_paths);
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_ = delegate;
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadImageIfNeeded();
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnInstallSuccess(const Extension* extension,
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              SkBitmap* icon) {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_ = extension;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(icon);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_ui_->OnInstallSuccess(extension, &icon_);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::OnInstallFailure(
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const extensions::CrxInstallerError& error) {
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_ui_->OnInstallFailure(error);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::SetIcon(const SkBitmap* image) {
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (image)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = *image;
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = SkBitmap();
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (icon_.empty()) {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Let's set default icon bitmap whose size is equal to the default icon's
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // pixel size under maximal supported scale factor. If the bitmap is larger
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // than the one we need, it will be scaled down by the ui code.
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_ = GetDefaultIconBitmapForMaxScaleFactor(extension_->is_app());
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ExtensionInstallPrompt::OnImageLoaded(const gfx::Image& image) {
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIcon(image.IsEmpty() ? NULL : image.ToSkBitmap());
67758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowConfirmation();
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::LoadImageIfNeeded() {
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bundle install prompts do not have an icon.
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also |install_ui_.profile()| can be NULL in unit tests.
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!icon_.empty() || !install_ui_->profile()) {
68458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ShowConfirmation();
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionResource image = extensions::IconsInfo::GetIconResource(
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_,
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_misc::EXTENSION_ICON_LARGE,
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionIconSet::MATCH_BIGGER);
69246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
69346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Load the image asynchronously. The response will be sent to OnImageLoaded.
69446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  extensions::ImageLoader* loader =
69546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extensions::ImageLoader::Get(install_ui_->profile());
69646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
69746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::vector<extensions::ImageLoader::ImageRepresentation> images_list;
69846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  images_list.push_back(extensions::ImageLoader::ImageRepresentation(
69946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      image,
70046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extensions::ImageLoader::ImageRepresentation::NEVER_RESIZE,
70146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      gfx::Size(),
70246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ui::SCALE_FACTOR_100P));
70346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  loader->LoadImagesAsync(
70446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension_,
70546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      images_list,
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ExtensionInstallPrompt::OnImageLoaded, AsWeakPtr()));
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionInstallPrompt::ShowConfirmation() {
710f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (prompt_->type() == INSTALL_PROMPT)
711f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    prompt_->set_experiment(ExtensionInstallPromptExperiment::Find());
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  else
713f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    prompt_->set_experiment(ExtensionInstallPromptExperiment::ControlGroup());
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
71546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (permissions_.get()) {
71646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (extension_) {
71746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const extensions::PermissionsData* permissions_data =
71846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          extension_->permissions_data();
719f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->SetPermissions(permissions_data->GetPermissionMessageStrings());
720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->SetPermissionsDetails(
72146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          permissions_data->GetPermissionMessageDetailsStrings());
72246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    } else {
72346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const extensions::PermissionMessageProvider* message_provider =
72446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          extensions::PermissionMessageProvider::Get();
725f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->SetPermissions(message_provider->GetWarningMessages(
72646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          permissions_, Manifest::TYPE_UNKNOWN));
727f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->SetPermissionsDetails(
728f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          message_provider->GetWarningMessagesDetails(permissions_,
729f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      Manifest::TYPE_UNKNOWN));
73046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
733f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  switch (prompt_->type()) {
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PERMISSIONS_PROMPT:
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case RE_ENABLE_PROMPT:
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case INLINE_INSTALL_PROMPT:
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EXTERNAL_INSTALL_PROMPT:
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case INSTALL_PROMPT:
7391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case LAUNCH_PROMPT:
740cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case POST_INSTALL_PERMISSIONS_PROMPT:
741cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case REMOTE_INSTALL_PROMPT: {
742f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->set_extension(extension_);
743f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->set_icon(gfx::Image::CreateFrom1xBitmap(icon_));
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BUNDLE_INSTALL_PROMPT: {
747f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prompt_->set_bundle(bundle_);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Unknown message";
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (AutoConfirmPrompt(delegate_))
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (show_dialog_callback_.is_null())
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetDefaultShowDialogCallback().Run(show_params_, delegate_, prompt_);
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_dialog_callback_.Run(show_params_, delegate_, prompt_);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
763