extension_install_ui.h revision 513209b27ff55e2841eac0e4120199c23acce758
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 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 "gfx/native_widget_types.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/skia/include/core/SkBitmap.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 {
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    INSTALL_PROMPT = 0,
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UNINSTALL_PROMPT,
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NUM_PROMPT_TYPES
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A mapping from PromptType to message ID for various dialog content.
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const int kTitleIds[NUM_PROMPT_TYPES];
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const int kHeadingIds[NUM_PROMPT_TYPES];
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const int kButtonIds[NUM_PROMPT_TYPES];
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class Delegate {
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // We call this method after ConfirmInstall()/ConfirmUninstall() to signal
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // that the installation/uninstallation should continue.
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    virtual void InstallUIProceed() = 0;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // We call this method after ConfirmInstall()/ConfirmUninstall() to signal
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // that the installation/uninstallation 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);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~ExtensionInstallUI();
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is called by the installer to verify whether the installation should
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // proceed. This is declared virtual for testing.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We *MUST* eventually call either Proceed() or Abort()
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // on |delegate|.
61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void ConfirmInstall(Delegate* delegate, const Extension* extension);
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is called by the extensions management page to verify whether the
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // uninstallation should proceed. This is declared virtual for testing.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We *MUST* eventually call either Proceed() or Abort()
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // on |delegate|.
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void ConfirmUninstall(Delegate* delegate, const Extension* extension);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Installation was successful. This is declared virtual for testing.
71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void OnInstallSuccess(const Extension* extension);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Installation failed. This is declared virtual for testing.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnInstallFailure(const std::string& error);
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ImageLoadingTracker::Observer overrides.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnImageLoaded(
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SkBitmap* image, ExtensionResource resource, int index);
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Show an infobar for a newly-installed theme.  previous_theme_id
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // should be empty if the previous theme was the system/default
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // theme.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(akalin): Find a better home for this (and
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // GetNewThemeInstalledInfoBarDelegate()).
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void ShowThemeInfoBar(
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const std::string& previous_theme_id, bool previous_use_system_theme,
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      const Extension* new_theme, Profile* profile);
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Starts the process of showing a confirmation UI, which is split into two.
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 1) Set off a 'load icon' task.
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 2) Handle the load icon response and show the UI (OnImageLoaded).
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ShowConfirmation(PromptType prompt_type);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // When an extension is installed on Mac with neither browser action nor
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // page action icons, show an infobar instead of a popup bubble.
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void ShowGenericExtensionInstalledInfoBar(const Extension* new_extension);
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the delegate to control the browser's info bar. This is
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // within its own function due to its platform-specific nature.
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static InfoBarDelegate* GetNewThemeInstalledInfoBarDelegate(
105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      TabContents* tab_contents, const Extension* new_theme,
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const std::string& previous_theme_id, bool previous_use_system_theme);
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implements the showing of the install/uninstall dialog prompt.
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NOTE: The implementations of this function is platform-specific.
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void ShowExtensionInstallUIPromptImpl(
111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      Profile* profile, Delegate* delegate, const Extension* extension,
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      SkBitmap* icon, PromptType type);
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implements the showing of the new install dialog. The implementations of
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // this function are platform-specific.
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void ShowExtensionInstallUIPrompt2Impl(
117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      Profile* profile, Delegate* delegate, const Extension* extension,
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SkBitmap* icon, const std::vector<string16>& permissions);
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile_;
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop* ui_loop_;
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to undo theme installation.
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string previous_theme_id_;
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool previous_use_system_theme_;
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkBitmap icon_;  // The extensions installation icon.
128513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* extension_;  // The extension we are showing the UI for.
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Delegate* delegate_;    // The delegate we will call Proceed/Abort on after
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          // confirmation UI.
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PromptType prompt_type_;  // The type of prompt we are going to show.
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Keeps track of extension images being loaded on the File thread for the
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // purpose of showing the install UI.
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ImageLoadingTracker tracker_;
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_INSTALL_UI_H_
139