1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_INSTALL_UI_H_ 6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_INSTALL_UI_H_ 7 #pragma once 8 9 #include <string> 10 #include <vector> 11 12 #include "base/string16.h" 13 #include "chrome/browser/extensions/image_loading_tracker.h" 14 #include "chrome/common/extensions/url_pattern.h" 15 #include "third_party/skia/include/core/SkBitmap.h" 16 #include "ui/gfx/native_widget_types.h" 17 18 class Extension; 19 class MessageLoop; 20 class Profile; 21 class InfoBarDelegate; 22 class TabContents; 23 24 // Displays all the UI around extension installation and uninstallation. 25 class ExtensionInstallUI : public ImageLoadingTracker::Observer { 26 public: 27 enum PromptType { 28 UNSET_PROMPT_TYPE = -1, 29 INSTALL_PROMPT = 0, 30 RE_ENABLE_PROMPT, 31 NUM_PROMPT_TYPES 32 }; 33 34 // A mapping from PromptType to message ID for various dialog content. 35 static const int kTitleIds[NUM_PROMPT_TYPES]; 36 static const int kHeadingIds[NUM_PROMPT_TYPES]; 37 static const int kButtonIds[NUM_PROMPT_TYPES]; 38 static const int kWarningIds[NUM_PROMPT_TYPES]; 39 40 class Delegate { 41 public: 42 // We call this method to signal that the installation should continue. 43 virtual void InstallUIProceed() = 0; 44 45 // We call this method to signal that the installation should stop. 46 virtual void InstallUIAbort() = 0; 47 48 protected: 49 virtual ~Delegate() {} 50 }; 51 52 explicit ExtensionInstallUI(Profile* profile); 53 virtual ~ExtensionInstallUI(); 54 55 // This is called by the installer to verify whether the installation should 56 // proceed. This is declared virtual for testing. 57 // 58 // We *MUST* eventually call either Proceed() or Abort() on |delegate|. 59 virtual void ConfirmInstall(Delegate* delegate, const Extension* extension); 60 61 // This is called by the app handler launcher to verify whether the app 62 // should be re-enabled. This is declared virtual for testing. 63 // 64 // We *MUST* eventually call either Proceed() or Abort() on |delegate|. 65 virtual void ConfirmReEnable(Delegate* delegate, const Extension* extension); 66 67 // Installation was successful. This is declared virtual for testing. 68 virtual void OnInstallSuccess(const Extension* extension, SkBitmap* icon); 69 70 // Installation failed. This is declared virtual for testing. 71 virtual void OnInstallFailure(const std::string& error); 72 73 // ImageLoadingTracker::Observer: 74 virtual void OnImageLoaded( 75 SkBitmap* image, const ExtensionResource& resource, int index); 76 77 // Show an infobar for a newly-installed theme. previous_theme_id 78 // should be empty if the previous theme was the system/default 79 // theme. 80 // 81 // TODO(akalin): Find a better home for this (and 82 // GetNewThemeInstalledInfoBarDelegate()). 83 static void ShowThemeInfoBar( 84 const std::string& previous_theme_id, bool previous_use_system_theme, 85 const Extension* new_theme, Profile* profile); 86 87 private: 88 // Sets the icon that will be used in any UI. If |icon| is NULL, or contains 89 // an empty bitmap, then a default icon will be used instead. 90 void SetIcon(SkBitmap* icon); 91 92 // Starts the process of showing a confirmation UI, which is split into two. 93 // 1) Set off a 'load icon' task. 94 // 2) Handle the load icon response and show the UI (OnImageLoaded). 95 void ShowConfirmation(PromptType prompt_type); 96 97 // Returns the delegate to control the browser's info bar. This is 98 // within its own function due to its platform-specific nature. 99 static InfoBarDelegate* GetNewThemeInstalledInfoBarDelegate( 100 TabContents* tab_contents, 101 const Extension* new_theme, 102 const std::string& previous_theme_id, 103 bool previous_use_system_theme); 104 105 Profile* profile_; 106 MessageLoop* ui_loop_; 107 108 // Used to undo theme installation. 109 std::string previous_theme_id_; 110 bool previous_use_system_theme_; 111 112 // The extensions installation icon. 113 SkBitmap icon_; 114 115 // The extension we are showing the UI for. 116 const Extension* extension_; 117 118 // The delegate we will call Proceed/Abort on after confirmation UI. 119 Delegate* delegate_; 120 121 // The type of prompt we are going to show. 122 PromptType prompt_type_; 123 124 // Keeps track of extension images being loaded on the File thread for the 125 // purpose of showing the install UI. 126 ImageLoadingTracker tracker_; 127 }; 128 129 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_INSTALL_UI_H_ 130