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