1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file.
4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#ifndef CHROME_BROWSER_UI_WEBUI_OPTIONS_EXTENSION_SETTINGS_HANDLER_H_
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#define CHROME_BROWSER_UI_WEBUI_OPTIONS_EXTENSION_SETTINGS_HANDLER_H_
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#pragma once
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <string>
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <vector>
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_uninstall_dialog.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/pack_extension_job.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/shell_dialogs.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/chrome_url_data_manager.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/extensions/extension_resource.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/webui/web_ui.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "googleurl/src/gurl.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass DictionaryValue;
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass Extension;
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ExtensionService;
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass FilePath;
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ListValue;
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass PrefService;
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass RenderProcessHost;
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass UserScript;
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Information about a page running in an extension, for example a toolstrip,
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// a background page, or a tab contents.
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstruct ExtensionPage {
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionPage(const GURL& url, int render_process_id, int render_view_id,
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                bool incognito)
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : url(url),
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      render_process_id(render_process_id),
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      render_view_id(render_view_id),
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      incognito(incognito) {}
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL url;
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int render_process_id;
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int render_view_id;
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool incognito;
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ExtensionsUIHTMLSource : public ChromeURLDataManager::DataSource {
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionsUIHTMLSource();
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Called when the network layer has requested a resource underneath
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // the path we registered.
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void StartDataRequest(const std::string& path,
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                bool is_incognito,
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                int request_id);
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual std::string GetMimeType(const std::string&) const;
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ~ExtensionsUIHTMLSource() {}
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(ExtensionsUIHTMLSource);
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// The handler for JavaScript messages related to the "extensions" view.
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ExtensionsDOMHandler : public WebUIMessageHandler,
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             public NotificationObserver,
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             public PackExtensionJob::Client,
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             public SelectFileDialog::Listener,
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             public ExtensionUninstallDialog::Delegate {
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Helper class that loads the icons for the extensions in the management UI.
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // We do this with native code instead of just using chrome-extension:// URLs
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // for two reasons:
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // 1. We need to support the disabled extensions, too, and using URLs won't
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //    work for them.
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // 2. We want to desaturate the icons of the disabled extensions to make them
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //    look disabled.
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  class IconLoader : public base::RefCountedThreadSafe<IconLoader> {
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   public:
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    explicit IconLoader(ExtensionsDOMHandler* handler);
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Load |icons|. Will call handler->OnIconsLoaded when complete. IconLoader
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // takes ownership of both arguments.
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void LoadIcons(std::vector<ExtensionResource>* icons,
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   DictionaryValue* json);
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Cancel the load. IconLoader won't try to call back to the handler after
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // this.
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void Cancel();
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   private:
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Load the icons and call ReportResultOnUIThread when done. This method
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // takes ownership of both arguments.
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void LoadIconsOnFileThread(std::vector<ExtensionResource>* icons,
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               DictionaryValue* json);
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Report back to the handler. This method takes ownership of |json|.
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void ReportResultOnUIThread(DictionaryValue* json);
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // The handler we will report back to.
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ExtensionsDOMHandler* handler_;
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  explicit ExtensionsDOMHandler(ExtensionService* extension_service);
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~ExtensionsDOMHandler();
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // WebUIMessageHandler implementation.
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RegisterMessages();
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Extension Detail JSON Struct for page. (static for ease of testing).
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Note: service can be NULL in unit tests.
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static DictionaryValue* CreateExtensionDetailValue(
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ExtensionService* service,
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const Extension* extension,
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::vector<ExtensionPage>& pages,
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      bool enabled,
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      bool terminated);
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // ContentScript JSON Struct for page. (static for ease of testing).
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static DictionaryValue* CreateContentScriptDetailValue(
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const UserScript& script,
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const FilePath& extension_path);
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // ExtensionPackJob::Client
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnPackSuccess(const FilePath& crx_file,
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             const FilePath& key_file);
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnPackFailure(const std::string& error);
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // ExtensionUninstallDialog::Delegate:
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ExtensionDialogAccepted();
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ExtensionDialogCanceled();
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback for "requestExtensionsData" message.
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleRequestExtensionsData(const ListValue* args);
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback for "toggleDeveloperMode" message.
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleToggleDeveloperMode(const ListValue* args);
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback for "inspect" message.
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleInspectMessage(const ListValue* args);
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback for "reload" message.
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleReloadMessage(const ListValue* args);
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback for "enable" message.
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleEnableMessage(const ListValue* args);
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback for "enableIncognito" message.
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleEnableIncognitoMessage(const ListValue* args);
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback for "allowFileAcces" message.
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleAllowFileAccessMessage(const ListValue* args);
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback for "uninstall" message.
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleUninstallMessage(const ListValue* args);
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback for "options" message.
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleOptionsMessage(const ListValue* args);
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback for "showButton" message.
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleShowButtonMessage(const ListValue* args);
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback for "load" message.
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleLoadMessage(const ListValue* args);
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback for "pack" message.
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandlePackMessage(const ListValue* args);
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback for "autoupdate" message.
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleAutoUpdateMessage(const ListValue* args);
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Utility for calling javascript window.alert in the page.
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void ShowAlert(const std::string& message);
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback for "selectFilePath" message.
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleSelectFilePathMessage(const ListValue* args);
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Utility for callbacks that get an extension ID as the sole argument.
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const Extension* GetExtension(const ListValue* args);
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Forces a UI update if appropriate after a notification is received.
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void MaybeUpdateAfterNotification();
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // SelectFileDialog::Listener
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void FileSelected(const FilePath& path,
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            int index, void* params);
191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void MultiFilesSelected(
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::vector<FilePath>& files, void* params);
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void FileSelectionCanceled(void* params) {}
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // NotificationObserver
196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Observe(NotificationType type,
197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const NotificationSource& source,
198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const NotificationDetails& details);
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Helper that lists the current active html pages for an extension.
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<ExtensionPage> GetActivePagesForExtension(
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const Extension* extension);
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void GetActivePagesForExtensionProcess(
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      RenderProcessHost* process,
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const Extension* extension,
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::vector<ExtensionPage> *result);
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns the best icon to display in the UI for an extension, or an empty
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // ExtensionResource if no good icon exists.
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionResource PickExtensionIcon(const Extension* extension);
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Loads the extension resources into the json data, then calls OnIconsLoaded.
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Takes ownership of |icons|.
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Called on the file thread.
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void LoadExtensionIcons(std::vector<ExtensionResource>* icons,
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          DictionaryValue* json_data);
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Takes ownership of |json_data| and tells HTML about it.
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Called on the UI thread.
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnIconsLoaded(DictionaryValue* json_data);
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns the ExtensionUninstallDialog object for this class, creating it if
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // needed.
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionUninstallDialog* GetExtensionUninstallDialog();
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Our model.
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<ExtensionService> extensions_service_;
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Used to pick the directory when loading an extension.
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<SelectFileDialog> load_extension_dialog_;
231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Used to package the extension.
233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<PackExtensionJob> pack_job_;
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Used to load icons asynchronously on the file thread.
236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<IconLoader> icon_loader_;
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Used to show confirmation UI for uninstalling extensions in incognito mode.
239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<ExtensionUninstallDialog> extension_uninstall_dialog_;
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The id of the extension we are prompting the user about.
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string extension_id_prompting_;
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // We monitor changes to the extension system so that we can reload when
245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // necessary.
246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NotificationRegistrar registrar_;
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // If true, we will ignore notifications in ::Observe(). This is needed
249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // to prevent reloading the page when we were the cause of the
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // notification.
251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool ignore_notifications_;
252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The page may be refreshed in response to a RENDER_VIEW_HOST_DELETED,
254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // but the iteration over RenderViewHosts will include the host because the
255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // notification is sent when it is in the process of being deleted (and before
256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // it is removed from the process). Keep a pointer to it so we can exclude
257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // it from the active views.
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  RenderViewHost* deleting_rvh_;
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(ExtensionsDOMHandler);
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ExtensionsUI : public WebUI {
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  explicit ExtensionsUI(TabContents* contents);
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static RefCountedMemory* GetFaviconResourceBytes();
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void RegisterUserPrefs(PrefService* prefs);
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(ExtensionsUI);
273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif  // CHROME_BROWSER_UI_WEBUI_OPTIONS_EXTENSION_SETTINGS_HANDLER_H_
276