1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_UI_WEBUI_EXTENSIONS_EXTENSION_SETTINGS_HANDLER_H_ 6 #define CHROME_BROWSER_UI_WEBUI_EXTENSIONS_EXTENSION_SETTINGS_HANDLER_H_ 7 8 #include <set> 9 #include <string> 10 #include <vector> 11 12 #include "base/memory/scoped_ptr.h" 13 #include "base/scoped_observer.h" 14 #include "chrome/browser/extensions/error_console/error_console.h" 15 #include "chrome/browser/extensions/extension_install_prompt.h" 16 #include "chrome/browser/extensions/extension_install_ui.h" 17 #include "chrome/browser/extensions/extension_management.h" 18 #include "chrome/browser/extensions/extension_uninstall_dialog.h" 19 #include "chrome/browser/extensions/requirements_checker.h" 20 #include "chrome/common/extensions/webstore_install_result.h" 21 #include "content/public/browser/navigation_controller.h" 22 #include "content/public/browser/notification_observer.h" 23 #include "content/public/browser/notification_registrar.h" 24 #include "content/public/browser/web_contents_observer.h" 25 #include "content/public/browser/web_ui_message_handler.h" 26 #include "extensions/browser/extension_prefs.h" 27 #include "extensions/browser/extension_prefs_observer.h" 28 #include "extensions/browser/extension_registry_observer.h" 29 #include "extensions/browser/warning_service.h" 30 #include "url/gurl.h" 31 32 class ExtensionService; 33 34 namespace base { 35 class DictionaryValue; 36 class FilePath; 37 class ListValue; 38 } 39 40 namespace content { 41 class WebUIDataSource; 42 } 43 44 namespace user_prefs { 45 class PrefRegistrySyncable; 46 } 47 48 namespace extensions { 49 class Extension; 50 class ExtensionRegistry; 51 class ManagementPolicy; 52 53 // Information about a page running in an extension, for example a popup bubble, 54 // a background page, or a tab contents. 55 struct ExtensionPage { 56 ExtensionPage(const GURL& url, 57 int render_process_id, 58 int render_view_id, 59 bool incognito, 60 bool generated_background_page); 61 GURL url; 62 int render_process_id; 63 int render_view_id; 64 bool incognito; 65 bool generated_background_page; 66 }; 67 68 // Extension Settings UI handler. 69 class ExtensionSettingsHandler 70 : public content::WebUIMessageHandler, 71 public content::NotificationObserver, 72 public content::WebContentsObserver, 73 public ErrorConsole::Observer, 74 public ExtensionInstallPrompt::Delegate, 75 public ExtensionManagement::Observer, 76 public ExtensionPrefsObserver, 77 public ExtensionRegistryObserver, 78 public ExtensionUninstallDialog::Delegate, 79 public WarningService::Observer, 80 public base::SupportsWeakPtr<ExtensionSettingsHandler> { 81 public: 82 ExtensionSettingsHandler(); 83 virtual ~ExtensionSettingsHandler(); 84 85 static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 86 87 // Extension Detail JSON Struct for page. |pages| is injected for unit 88 // testing. 89 // Note: |warning_service| can be NULL in unit tests. 90 base::DictionaryValue* CreateExtensionDetailValue( 91 const Extension* extension, 92 const std::vector<ExtensionPage>& pages, 93 const WarningService* warning_service); 94 95 void GetLocalizedValues(content::WebUIDataSource* source); 96 97 private: 98 friend class ExtensionUITest; 99 friend class BrokerDelegate; 100 101 // content::WebContentsObserver implementation. 102 virtual void RenderViewDeleted( 103 content::RenderViewHost* render_view_host) OVERRIDE; 104 virtual void DidStartNavigationToPendingEntry( 105 const GURL& url, 106 content::NavigationController::ReloadType reload_type) OVERRIDE; 107 108 // Allows injection for testing by friend classes. 109 ExtensionSettingsHandler(ExtensionService* service, 110 ManagementPolicy* policy); 111 112 // WebUIMessageHandler implementation. 113 virtual void RegisterMessages() OVERRIDE; 114 115 // ErrorConsole::Observer implementation. 116 virtual void OnErrorAdded(const ExtensionError* error) OVERRIDE; 117 118 // content::NotificationObserver implementation. 119 virtual void Observe(int type, 120 const content::NotificationSource& source, 121 const content::NotificationDetails& details) OVERRIDE; 122 123 // ExtensionRegistryObserver implementation. 124 virtual void OnExtensionLoaded(content::BrowserContext* browser_context, 125 const Extension* extension) OVERRIDE; 126 virtual void OnExtensionUnloaded( 127 content::BrowserContext* browser_context, 128 const Extension* extension, 129 UnloadedExtensionInfo::Reason reason) OVERRIDE; 130 virtual void OnExtensionUninstalled( 131 content::BrowserContext* browser_context, 132 const Extension* extension, 133 extensions::UninstallReason reason) OVERRIDE; 134 135 // ExtensionPrefsObserver implementation. 136 virtual void OnExtensionDisableReasonsChanged(const std::string& extension_id, 137 int disable_reasons) OVERRIDE; 138 139 // ExtensionManagement::Observer implementation. 140 virtual void OnExtensionManagementSettingsChanged() OVERRIDE; 141 142 // ExtensionUninstallDialog::Delegate implementation, used for receiving 143 // notification about uninstall confirmation dialog selections. 144 virtual void ExtensionUninstallAccepted() OVERRIDE; 145 virtual void ExtensionUninstallCanceled() OVERRIDE; 146 147 // WarningService::Observer implementation. 148 virtual void ExtensionWarningsChanged() OVERRIDE; 149 150 // ExtensionInstallPrompt::Delegate implementation. 151 virtual void InstallUIProceed() OVERRIDE; 152 virtual void InstallUIAbort(bool user_initiated) OVERRIDE; 153 154 // Helper method that reloads all unpacked extensions. 155 void ReloadUnpackedExtensions(); 156 157 // Callback for "requestExtensionsData" message. 158 void HandleRequestExtensionsData(const base::ListValue* args); 159 160 // Callback for "toggleDeveloperMode" message. 161 void HandleToggleDeveloperMode(const base::ListValue* args); 162 163 // Callback for "inspect" message. 164 void HandleInspectMessage(const base::ListValue* args); 165 166 // Callback for "launch" message. 167 void HandleLaunchMessage(const base::ListValue* args); 168 169 // Callback for "reload" message. 170 void HandleReloadMessage(const base::ListValue* args); 171 172 // Callback for "repair" message. 173 void HandleRepairMessage(const base::ListValue* args); 174 175 // Callback for "enable" message. 176 void HandleEnableMessage(const base::ListValue* args); 177 178 // Callback for "enableIncognito" message. 179 void HandleEnableIncognitoMessage(const base::ListValue* args); 180 181 // Callback for "enableErrorCollection" message. 182 void HandleEnableErrorCollectionMessage(const base::ListValue* args); 183 184 // Callback for "allowFileAcces" message. 185 void HandleAllowFileAccessMessage(const base::ListValue* args); 186 187 // Callback for "allowOnAllUrls" message. 188 void HandleAllowOnAllUrlsMessage(const base::ListValue* args); 189 190 // Callback for "uninstall" message. 191 void HandleUninstallMessage(const base::ListValue* args); 192 193 // Callback for "options" message. 194 void HandleOptionsMessage(const base::ListValue* args); 195 196 // Callback for "permissions" message. 197 void HandlePermissionsMessage(const base::ListValue* args); 198 199 // Callback for "showButton" message. 200 void HandleShowButtonMessage(const base::ListValue* args); 201 202 // Callback for "autoupdate" message. 203 void HandleAutoUpdateMessage(const base::ListValue* args); 204 205 // Callback for the "dismissADTPromo" message. 206 void HandleDismissADTPromoMessage(const base::ListValue* args); 207 208 // Callback for the "showPath" message. 209 void HandleShowPath(const base::ListValue* args); 210 211 // Utility for calling JavaScript window.alert in the page. 212 void ShowAlert(const std::string& message); 213 214 // Utility for callbacks that get an extension ID as the sole argument. 215 // Returns NULL if the extension isn't active. 216 const Extension* GetActiveExtension(const base::ListValue* args); 217 218 // Forces a UI update if appropriate after a notification is received. 219 void MaybeUpdateAfterNotification(); 220 221 // Register for notifications that we need to reload the page. 222 void MaybeRegisterForNotifications(); 223 224 // Helper that lists the current inspectable html pages for an extension. 225 std::vector<ExtensionPage> GetInspectablePagesForExtension( 226 const Extension* extension, bool extension_is_enabled); 227 void GetInspectablePagesForExtensionProcess( 228 const Extension* extension, 229 const std::set<content::RenderViewHost*>& views, 230 std::vector<ExtensionPage>* result); 231 void GetAppWindowPagesForExtensionProfile(const Extension* extension, 232 Profile* profile, 233 std::vector<ExtensionPage>* result); 234 235 // Returns the ExtensionUninstallDialog object for this class, creating it if 236 // needed. 237 ExtensionUninstallDialog* GetExtensionUninstallDialog(); 238 239 // Called when the reinstallation is complete. 240 void OnReinstallComplete(bool success, 241 const std::string& error, 242 webstore_install::Result result); 243 244 // Callback for RequirementsChecker. 245 void OnRequirementsChecked(std::string extension_id, 246 std::vector<std::string> requirement_errors); 247 248 // Handles the load retry notification sent from 249 // ExtensionService::ReportExtensionLoadError. Attempts to retry loading 250 // extension from |path| if retry is true, otherwise removes |path| from the 251 // vector of currently loading extensions. 252 // 253 // Does nothing if |path| is not a currently loading extension this object is 254 // tracking. 255 void HandleLoadRetryMessage(bool retry, const base::FilePath& path); 256 257 // Our model. Outlives us since it's owned by our containing profile. 258 ExtensionService* extension_service_; 259 260 // A convenience member, filled once the extension_service_ is known. 261 ManagementPolicy* management_policy_; 262 263 // Used to show confirmation UI for uninstalling extensions in incognito mode. 264 scoped_ptr<ExtensionUninstallDialog> extension_uninstall_dialog_; 265 266 // The id of the extension we are prompting the user about. 267 std::string extension_id_prompting_; 268 269 // If true, we will ignore notifications in ::Observe(). This is needed 270 // to prevent reloading the page when we were the cause of the 271 // notification. 272 bool ignore_notifications_; 273 274 // The page may be refreshed in response to a RenderViewHost being destroyed, 275 // but the iteration over RenderViewHosts will include the host because the 276 // notification is sent when it is in the process of being deleted (and before 277 // it is removed from the process). Keep a pointer to it so we can exclude 278 // it from the active views. 279 content::RenderViewHost* deleting_rvh_; 280 // Do the same for a deleting RenderWidgetHost ID and RenderProcessHost ID. 281 int deleting_rwh_id_; 282 int deleting_rph_id_; 283 284 // We want to register for notifications only after we've responded at least 285 // once to the page, otherwise we'd be calling JavaScript functions on objects 286 // that don't exist yet when notifications come in. This variable makes sure 287 // we do so only once. 288 bool registered_for_notifications_; 289 290 content::NotificationRegistrar registrar_; 291 292 // This will not be empty when a requirements check is in progress. Doing 293 // another Check() before the previous one is complete will cause the first 294 // one to abort. 295 scoped_ptr<RequirementsChecker> requirements_checker_; 296 297 // The UI for showing what permissions the extension has. 298 scoped_ptr<ExtensionInstallPrompt> prompt_; 299 300 ScopedObserver<WarningService, WarningService::Observer> 301 warning_service_observer_; 302 303 // An observer to listen for when Extension errors are reported. 304 ScopedObserver<ErrorConsole, ErrorConsole::Observer> error_console_observer_; 305 306 // An observer to listen for notable changes in the ExtensionPrefs, like 307 // a change in Disable Reasons. 308 ScopedObserver<ExtensionPrefs, ExtensionPrefsObserver> 309 extension_prefs_observer_; 310 311 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> 312 extension_registry_observer_; 313 314 ScopedObserver<ExtensionManagement, ExtensionManagement::Observer> 315 extension_management_observer_; 316 317 // Whether we found any DISABLE_NOT_VERIFIED extensions and want to kick off 318 // a verification check to try and rescue them. 319 bool should_do_verification_check_; 320 321 DISALLOW_COPY_AND_ASSIGN(ExtensionSettingsHandler); 322 }; 323 324 } // namespace extensions 325 326 #endif // CHROME_BROWSER_UI_WEBUI_EXTENSIONS_EXTENSION_SETTINGS_HANDLER_H_ 327