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