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