15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_WEBUI_EXTENSIONS_EXTENSION_SETTINGS_HANDLER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_WEBUI_EXTENSIONS_EXTENSION_SETTINGS_HANDLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/scoped_observer.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/error_console/error_console.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_install_prompt.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_install_ui.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_management.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_uninstall_dialog.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/requirements_checker.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/extensions/webstore_install_result.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_message_handler.h"
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "extensions/browser/extension_prefs.h"
27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/browser/extension_prefs_observer.h"
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "extensions/browser/extension_registry_observer.h"
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/warning_service.h"
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionService;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebUIDataSource;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable;
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace extensions {
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class Extension;
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ExtensionRegistry;
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class ManagementPolicy;
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Information about a page running in an extension, for example a popup bubble,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a background page, or a tab contents.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ExtensionPage {
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ExtensionPage(const GURL& url,
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                int render_process_id,
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                int render_view_id,
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                bool incognito,
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                bool generated_background_page);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_process_id;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_view_id;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool incognito;
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool generated_background_page;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extension Settings UI handler.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionSettingsHandler
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::WebUIMessageHandler,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public content::NotificationObserver,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public content::WebContentsObserver,
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      public ErrorConsole::Observer,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public ExtensionInstallPrompt::Delegate,
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      public ExtensionManagement::Observer,
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      public ExtensionPrefsObserver,
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      public ExtensionRegistryObserver,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public ExtensionUninstallDialog::Delegate,
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      public WarningService::Observer,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public base::SupportsWeakPtr<ExtensionSettingsHandler> {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSettingsHandler();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionSettingsHandler();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension Detail JSON Struct for page. |pages| is injected for unit
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // testing.
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note: |warning_service| can be NULL in unit tests.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* CreateExtensionDetailValue(
91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const Extension* extension,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<ExtensionPage>& pages,
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const WarningService* warning_service);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GetLocalizedValues(content::WebUIDataSource* source);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend class ExtensionUITest;
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  friend class BrokerDelegate;
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // content::WebContentsObserver implementation.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RenderViewDeleted(
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::RenderViewHost* render_view_host) OVERRIDE;
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void DidStartNavigationToPendingEntry(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NavigationController::ReloadType reload_type) OVERRIDE;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows injection for testing by friend classes.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSettingsHandler(ExtensionService* service,
110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                           ManagementPolicy* policy);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebUIMessageHandler implementation.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterMessages() OVERRIDE;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // ErrorConsole::Observer implementation.
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void OnErrorAdded(const ExtensionError* error) OVERRIDE;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::NotificationObserver implementation.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // ExtensionRegistryObserver implementation.
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 const Extension* extension) OVERRIDE;
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnExtensionUnloaded(
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      content::BrowserContext* browser_context,
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const Extension* extension,
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      UnloadedExtensionInfo::Reason reason) OVERRIDE;
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnExtensionUninstalled(
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::BrowserContext* browser_context,
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const Extension* extension,
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::UninstallReason reason) OVERRIDE;
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
135e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // ExtensionPrefsObserver implementation.
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnExtensionDisableReasonsChanged(const std::string& extension_id,
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                int disable_reasons) OVERRIDE;
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // ExtensionManagement::Observer implementation.
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnExtensionManagementSettingsChanged() OVERRIDE;
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionUninstallDialog::Delegate implementation, used for receiving
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notification about uninstall confirmation dialog selections.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ExtensionUninstallAccepted() OVERRIDE;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ExtensionUninstallCanceled() OVERRIDE;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // WarningService::Observer implementation.
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ExtensionWarningsChanged() OVERRIDE;
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ExtensionInstallPrompt::Delegate implementation.
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InstallUIProceed() OVERRIDE;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InstallUIAbort(bool user_initiated) OVERRIDE;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method that reloads all unpacked extensions.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReloadUnpackedExtensions();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "requestExtensionsData" message.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleRequestExtensionsData(const base::ListValue* args);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "toggleDeveloperMode" message.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleToggleDeveloperMode(const base::ListValue* args);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "inspect" message.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleInspectMessage(const base::ListValue* args);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Callback for "launch" message.
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void HandleLaunchMessage(const base::ListValue* args);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "reload" message.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleReloadMessage(const base::ListValue* args);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Callback for "repair" message.
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void HandleRepairMessage(const base::ListValue* args);
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "enable" message.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleEnableMessage(const base::ListValue* args);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "enableIncognito" message.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleEnableIncognitoMessage(const base::ListValue* args);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Callback for "enableErrorCollection" message.
1820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void HandleEnableErrorCollectionMessage(const base::ListValue* args);
1830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "allowFileAcces" message.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleAllowFileAccessMessage(const base::ListValue* args);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Callback for "allowOnAllUrls" message.
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void HandleAllowOnAllUrlsMessage(const base::ListValue* args);
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "uninstall" message.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleUninstallMessage(const base::ListValue* args);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "options" message.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleOptionsMessage(const base::ListValue* args);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Callback for "permissions" message.
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void HandlePermissionsMessage(const base::ListValue* args);
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "showButton" message.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleShowButtonMessage(const base::ListValue* args);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "autoupdate" message.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleAutoUpdateMessage(const base::ListValue* args);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Callback for the "dismissADTPromo" message.
2065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void HandleDismissADTPromoMessage(const base::ListValue* args);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Callback for the "showPath" message.
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void HandleShowPath(const base::ListValue* args);
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Utility for calling JavaScript window.alert in the page.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowAlert(const std::string& message);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Utility for callbacks that get an extension ID as the sole argument.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns NULL if the extension isn't active.
216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const Extension* GetActiveExtension(const base::ListValue* args);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Forces a UI update if appropriate after a notification is received.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MaybeUpdateAfterNotification();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register for notifications that we need to reload the page.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MaybeRegisterForNotifications();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper that lists the current inspectable html pages for an extension.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<ExtensionPage> GetInspectablePagesForExtension(
226a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const Extension* extension, bool extension_is_enabled);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetInspectablePagesForExtensionProcess(
228424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      const Extension* extension,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::set<content::RenderViewHost*>& views,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<ExtensionPage>* result);
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void GetAppWindowPagesForExtensionProfile(const Extension* extension,
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            Profile* profile,
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            std::vector<ExtensionPage>* result);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the ExtensionUninstallDialog object for this class, creating it if
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // needed.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionUninstallDialog* GetExtensionUninstallDialog();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Called when the reinstallation is complete.
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnReinstallComplete(bool success,
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           const std::string& error,
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           webstore_install::Result result);
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for RequirementsChecker.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRequirementsChecked(std::string extension_id,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             std::vector<std::string> requirement_errors);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Handles the load retry notification sent from
249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // ExtensionService::ReportExtensionLoadError. Attempts to retry loading
250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // extension from |path| if retry is true, otherwise removes |path| from the
251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // vector of currently loading extensions.
252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //
253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Does nothing if |path| is not a currently loading extension this object is
254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // tracking.
255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void HandleLoadRetryMessage(bool retry, const base::FilePath& path);
256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Our model.  Outlives us since it's owned by our containing profile.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionService* extension_service_;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A convenience member, filled once the extension_service_ is known.
261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ManagementPolicy* management_policy_;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to show confirmation UI for uninstalling extensions in incognito mode.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionUninstallDialog> extension_uninstall_dialog_;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The id of the extension we are prompting the user about.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string extension_id_prompting_;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If true, we will ignore notifications in ::Observe(). This is needed
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to prevent reloading the page when we were the cause of the
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notification.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ignore_notifications_;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The page may be refreshed in response to a RenderViewHost being destroyed,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but the iteration over RenderViewHosts will include the host because the
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notification is sent when it is in the process of being deleted (and before
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it is removed from the process). Keep a pointer to it so we can exclude
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it from the active views.
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* deleting_rvh_;
2800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Do the same for a deleting RenderWidgetHost ID and RenderProcessHost ID.
2810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  int deleting_rwh_id_;
2820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  int deleting_rph_id_;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We want to register for notifications only after we've responded at least
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // once to the page, otherwise we'd be calling JavaScript functions on objects
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that don't exist yet when notifications come in. This variable makes sure
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we do so only once.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool registered_for_notifications_;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This will not be empty when a requirements check is in progress. Doing
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // another Check() before the previous one is complete will cause the first
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one to abort.
295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<RequirementsChecker> requirements_checker_;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The UI for showing what permissions the extension has.
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ExtensionInstallPrompt> prompt_;
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScopedObserver<WarningService, WarningService::Observer>
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      warning_service_observer_;
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // An observer to listen for when Extension errors are reported.
30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedObserver<ErrorConsole, ErrorConsole::Observer> error_console_observer_;
30558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
306effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // An observer to listen for notable changes in the ExtensionPrefs, like
307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // a change in Disable Reasons.
308e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ScopedObserver<ExtensionPrefs, ExtensionPrefsObserver>
309effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      extension_prefs_observer_;
310effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      extension_registry_observer_;
313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScopedObserver<ExtensionManagement, ExtensionManagement::Observer>
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extension_management_observer_;
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Whether we found any DISABLE_NOT_VERIFIED extensions and want to kick off
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // a verification check to try and rescue them.
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool should_do_verification_check_;
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExtensionSettingsHandler);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace extensions
325a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_WEBUI_EXTENSIONS_EXTENSION_SETTINGS_HANDLER_H_
327