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