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