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