172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extensions_ui.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <algorithm>
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/base64.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h"
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/utf_string_conversions.h"
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/version.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/debugger/devtools_manager.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/debugger/devtools_toggle_action.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/crx_installer.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_disabled_infobar_delegate.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_error_reporter.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_function_dispatcher.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_host.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_message_service.h"
2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h"
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_updater.h"
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/google/google_util.h"
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h"
3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/background_contents.h"
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h"
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/extension_icon_source.h"
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h"
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/extensions/extension_icon_set.h"
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/url_pattern.h"
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/extensions/user_script.h"
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/jstemplate_builder.h"
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h"
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h"
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_process_host.h"
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/renderer_host/render_widget_host.h"
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents_view.h"
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "googleurl/src/gurl.h"
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/browser_resources.h"
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/chromium_strings.h"
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/theme_resources.h"
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_util.h"
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59513209b27ff55e2841eac0e4120199c23acce758Ben Murdochbool ShouldShowExtension(const Extension* extension) {
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Don't show themes since this page's UI isn't really useful for themes.
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (extension->is_theme())
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Don't show component extensions because they are only extensions as an
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // implementation detail of Chrome.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (extension->location() == Extension::COMPONENT)
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Always show unpacked extensions and apps.
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (extension->location() == Extension::LOAD)
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return true;
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Unless they are unpacked, never show hosted apps.
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (extension->is_hosted_app())
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return false;
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExtensionsHTMLSource
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionsUIHTMLSource::ExtensionsUIHTMLSource()
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : DataSource(chrome::kChromeUIExtensionsHost, MessageLoop::current()) {
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionsUIHTMLSource::StartDataRequest(const std::string& path,
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    bool is_incognito, int request_id) {
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue localized_strings;
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("title",
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_TITLE));
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("devModeLink",
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_DEVELOPER_MODE_LINK));
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("devModePrefix",
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_DEVELOPER_MODE_PREFIX));
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("loadUnpackedButton",
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_LOAD_UNPACKED_BUTTON));
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("packButton",
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_PACK_BUTTON));
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("updateButton",
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_UPDATE_BUTTON));
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("noExtensions",
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_NONE_INSTALLED));
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("suggestGallery",
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringFUTF16(IDS_EXTENSIONS_NONE_INSTALLED_SUGGEST_GALLERY,
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          ASCIIToUTF16("<a href='") +
112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick              ASCIIToUTF16(google_util::AppendGoogleLocaleParam(
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                  GURL(Extension::ChromeStoreLaunchURL())).spec()) +
114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick              ASCIIToUTF16("'>"),
1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          ASCIIToUTF16("</a>")));
1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("getMoreExtensions",
1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ASCIIToUTF16("<a href='") +
118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ASCIIToUTF16(google_util::AppendGoogleLocaleParam(
119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          GURL(Extension::ChromeStoreLaunchURL())).spec()) +
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ASCIIToUTF16("'>") +
121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      l10n_util::GetStringUTF16(IDS_GET_MORE_EXTENSIONS) +
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ASCIIToUTF16("</a>"));
12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  localized_strings.SetString("extensionCrashed",
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF16(IDS_EXTENSIONS_CRASHED_EXTENSION));
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("extensionDisabled",
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_DISABLED_EXTENSION));
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("inDevelopment",
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_IN_DEVELOPMENT));
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("viewIncognito",
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_VIEW_INCOGNITO));
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("extensionId",
1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ID));
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings.SetString("extensionPath",
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF16(IDS_EXTENSIONS_PATH));
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("extensionVersion",
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_VERSION));
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("inspectViews",
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_INSPECT_VIEWS));
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("inspectPopupsInstructions",
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_INSPECT_POPUPS_INSTRUCTIONS));
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("disable",
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_DISABLE));
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("enable",
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ENABLE));
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("enableIncognito",
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ENABLE_INCOGNITO));
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("allowFileAccess",
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ALLOW_FILE_ACCESS));
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("incognitoWarning",
150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      l10n_util::GetStringFUTF16(IDS_EXTENSIONS_INCOGNITO_WARNING,
151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)));
1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("reload",
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_RELOAD));
1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("uninstall",
1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_UNINSTALL));
1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("options",
1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSIONS_OPTIONS));
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings.SetString("policyControlled",
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF16(IDS_EXTENSIONS_POLICY_CONTROLLED));
1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("packDialogTitle",
1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_DIALOG_TITLE));
1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("packDialogHeading",
1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_DIALOG_HEADING));
1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("rootDirectoryLabel",
1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(
1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          IDS_EXTENSION_PACK_DIALOG_ROOT_DIRECTORY_LABEL));
1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("packDialogBrowse",
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_DIALOG_BROWSE));
1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("privateKeyLabel",
1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_DIALOG_PRIVATE_KEY_LABEL));
1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("okButton",
1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_OK));
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("cancelButton",
1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_CANCEL));
175201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings.SetString("showButton",
176201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringUTF16(IDS_EXTENSIONS_SHOW_BUTTON));
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetFontAndTextDirection(&localized_strings);
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const base::StringPiece extensions_html(
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ResourceBundle::GetSharedInstance().GetRawDataResource(
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          IDR_EXTENSIONS_UI_HTML));
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string full_html(extensions_html.data(), extensions_html.size());
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  jstemplate_builder::AppendJsonHtml(&localized_strings, &full_html);
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  jstemplate_builder::AppendI18nTemplateSourceHtml(&full_html);
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  jstemplate_builder::AppendI18nTemplateProcessHtml(&full_html);
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  jstemplate_builder::AppendJsTemplateSourceHtml(&full_html);
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes);
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  html_bytes->data.resize(full_html.size());
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin());
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SendResponse(request_id, html_bytes);
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenstd::string ExtensionsUIHTMLSource::GetMimeType(const std::string&) const {
19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return "text/html";
19821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExtensionsDOMHandler
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenExtensionsDOMHandler::ExtensionsDOMHandler(ExtensionService* extension_service)
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : extensions_service_(extension_service),
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ignore_notifications_(false),
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      deleting_rvh_(NULL) {
210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  RegisterForNotifications();
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionsDOMHandler::RegisterMessages() {
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("requestExtensionsData",
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &ExtensionsDOMHandler::HandleRequestExtensionsData));
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("toggleDeveloperMode",
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &ExtensionsDOMHandler::HandleToggleDeveloperMode));
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("inspect",
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &ExtensionsDOMHandler::HandleInspectMessage));
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("reload",
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &ExtensionsDOMHandler::HandleReloadMessage));
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("enable",
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &ExtensionsDOMHandler::HandleEnableMessage));
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("enableIncognito",
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &ExtensionsDOMHandler::HandleEnableIncognitoMessage));
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("allowFileAccess",
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &ExtensionsDOMHandler::HandleAllowFileAccessMessage));
22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("uninstall",
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &ExtensionsDOMHandler::HandleUninstallMessage));
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("options",
231201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      NewCallback(this, &ExtensionsDOMHandler::HandleOptionsMessage));
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("showButton",
233201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      NewCallback(this, &ExtensionsDOMHandler::HandleShowButtonMessage));
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("load",
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &ExtensionsDOMHandler::HandleLoadMessage));
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("pack",
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &ExtensionsDOMHandler::HandlePackMessage));
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("autoupdate",
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &ExtensionsDOMHandler::HandleAutoUpdateMessage));
24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("selectFilePath",
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &ExtensionsDOMHandler::HandleSelectFilePathMessage));
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::HandleRequestExtensionsData(const ListValue* args) {
245dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DictionaryValue results;
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add the extensions to the results structure.
248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ListValue* extensions_list = new ListValue();
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const ExtensionList* extensions = extensions_service_->extensions();
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (ExtensionList::const_iterator extension = extensions->begin();
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       extension != extensions->end(); ++extension) {
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (ShouldShowExtension(*extension)) {
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      extensions_list->Append(CreateExtensionDetailValue(
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          extensions_service_.get(),
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          *extension,
2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          GetActivePagesForExtension(*extension),
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          true, false));  // enabled, terminated
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  extensions = extensions_service_->disabled_extensions();
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (ExtensionList::const_iterator extension = extensions->begin();
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       extension != extensions->end(); ++extension) {
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (ShouldShowExtension(*extension)) {
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      extensions_list->Append(CreateExtensionDetailValue(
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          extensions_service_.get(),
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          *extension,
2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          GetActivePagesForExtension(*extension),
26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          false, false));  // enabled, terminated
27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  extensions = extensions_service_->terminated_extensions();
27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<ExtensionPage> empty_pages;
27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (ExtensionList::const_iterator extension = extensions->begin();
27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen       extension != extensions->end(); ++extension) {
27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (ShouldShowExtension(*extension)) {
27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      extensions_list->Append(CreateExtensionDetailValue(
27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extensions_service_.get(),
27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          *extension,
28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          empty_pages,  // Terminated process has no active pages.
28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          false, true));  // enabled, terminated
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  results.Set("extensions", extensions_list);
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool developer_mode = web_ui_->GetProfile()->GetPrefs()
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ->GetBoolean(prefs::kExtensionsUIDeveloperMode);
288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  results.SetBoolean("developerMode", developer_mode);
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction("returnExtensionsData", results);
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
293dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ExtensionsDOMHandler::RegisterForNotifications() {
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Register for notifications that we need to reload the page.
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::EXTENSION_LOADED,
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationService::AllSources());
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::EXTENSION_PROCESS_CREATED,
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationService::AllSources());
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::EXTENSION_UNLOADED,
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationService::AllSources());
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::EXTENSION_UPDATE_DISABLED,
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationService::AllSources());
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::EXTENSION_FUNCTION_DISPATCHER_CREATED,
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationService::AllSources());
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this,
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationType::EXTENSION_FUNCTION_DISPATCHER_DESTROYED,
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationService::AllSources());
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this,
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationType::NAV_ENTRY_COMMITTED,
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationService::AllSources());
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this,
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationType::RENDER_VIEW_HOST_DELETED,
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationService::AllSources());
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this,
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationType::BACKGROUND_CONTENTS_NAVIGATED,
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationService::AllSources());
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this,
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationType::BACKGROUND_CONTENTS_DELETED,
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationService::AllSources());
320201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  registrar_.Add(this,
321201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      NotificationType::EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED,
322201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      NotificationService::AllSources());
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenExtensionUninstallDialog* ExtensionsDOMHandler::GetExtensionUninstallDialog() {
326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!extension_uninstall_dialog_.get()) {
327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    extension_uninstall_dialog_.reset(
328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        new ExtensionUninstallDialog(web_ui_->GetProfile()));
329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return extension_uninstall_dialog_.get();
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::HandleToggleDeveloperMode(const ListValue* args) {
33472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool developer_mode = web_ui_->GetProfile()->GetPrefs()
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ->GetBoolean(prefs::kExtensionsUIDeveloperMode);
33672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->GetProfile()->GetPrefs()->SetBoolean(
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      prefs::kExtensionsUIDeveloperMode, !developer_mode);
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::HandleInspectMessage(const ListValue* args) {
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string render_process_id_str;
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string render_view_id_str;
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int render_process_id;
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int render_view_id;
3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetSize() == 2);
3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(0, &render_process_id_str));
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(1, &render_view_id_str));
3483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(base::StringToInt(render_process_id_str, &render_process_id));
3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(base::StringToInt(render_view_id_str, &render_view_id));
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RenderViewHost* host = RenderViewHost::FromID(render_process_id,
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                render_view_id);
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!host) {
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // This can happen if the host has gone away since the page was displayed.
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DevToolsManager::GetInstance()->OpenDevToolsWindow(host);
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::HandleReloadMessage(const ListValue* args) {
361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string extension_id = UTF16ToASCII(ExtractStringValue(args));
3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(!extension_id.empty());
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  extensions_service_->ReloadExtension(extension_id);
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::HandleEnableMessage(const ListValue* args) {
3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetSize() == 2);
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string extension_id, enable_str;
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(0, &extension_id));
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(1, &enable_str));
371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const Extension* extension =
372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      extensions_service_->GetExtensionById(extension_id, true);
373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(extension);
374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!Extension::UserMayDisable(extension->location())) {
375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    LOG(ERROR) << "Attempt to enable an extension that is non-usermanagable was"
376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen               << "made. Extension id: " << extension->id();
377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (enable_str == "true") {
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ExtensionPrefs* prefs = extensions_service_->extension_prefs();
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (prefs->DidExtensionEscalatePermissions(extension_id)) {
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ShowExtensionDisabledDialog(extensions_service_,
38472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  web_ui_->GetProfile(), extension);
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      extensions_service_->EnableExtension(extension_id);
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    extensions_service_->DisableExtension(extension_id);
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::HandleEnableIncognitoMessage(const ListValue* args) {
3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetSize() == 2);
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string extension_id, enable_str;
3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(0, &extension_id));
3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(1, &enable_str));
398513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* extension =
399513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      extensions_service_->GetExtensionById(extension_id, true);
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(extension);
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Flipping the incognito bit will generate unload/load notifications for the
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // extension, but we don't want to reload the page, because a) we've already
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // updated the UI to reflect the change, and b) we want the yellow warning
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // text to stay until the user has left the page.
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(aa): This creates crapiness in some cases. For example, in a main
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // window, when toggling this, the browser action will flicker because it gets
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // unloaded, then reloaded. It would be better to have a dedicated
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // notification for this case.
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Bug: http://crbug.com/41384
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ignore_notifications_ = true;
414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extensions_service_->SetIsIncognitoEnabled(extension_id,
415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             enable_str == "true");
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ignore_notifications_ = false;
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::HandleAllowFileAccessMessage(const ListValue* args) {
4203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetSize() == 2);
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string extension_id, allow_str;
4223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(0, &extension_id));
4233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(1, &allow_str));
424513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* extension =
425513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      extensions_service_->GetExtensionById(extension_id, true);
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(extension);
427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!Extension::UserMayDisable(extension->location())) {
428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    LOG(ERROR) << "Attempt to change allow file access of an extension that is "
429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen               << "non-usermanagable was made. Extension id : "
430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen               << extension->id();
431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  extensions_service_->SetAllowFileAccess(extension, allow_str == "true");
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::HandleUninstallMessage(const ListValue* args) {
438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string extension_id = UTF16ToASCII(ExtractStringValue(args));
439dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CHECK(!extension_id.empty());
440dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const Extension* extension =
441dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      extensions_service_->GetExtensionById(extension_id, true);
442dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!extension)
443dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    extension = extensions_service_->GetTerminatedExtension(extension_id);
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!extension)
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!Extension::UserMayDisable(extension->location())) {
448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    LOG(ERROR) << "Attempt to uninstall an extension that is non-usermanagable "
449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen               << "was made. Extension id : " << extension->id();
450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!extension_id_prompting_.empty())
4543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;  // Only one prompt at a time.
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  extension_id_prompting_ = extension_id;
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GetExtensionUninstallDialog()->ConfirmUninstall(this, extension);
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ExtensionsDOMHandler::ExtensionDialogAccepted() {
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!extension_id_prompting_.empty());
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
464dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool was_terminated = false;
465dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The extension can be uninstalled in another window while the UI was
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // showing. Do nothing in that case.
468513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* extension =
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      extensions_service_->GetExtensionById(extension_id_prompting_, true);
470dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!extension) {
471dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    extension = extensions_service_->GetTerminatedExtension(
472dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        extension_id_prompting_);
473dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    was_terminated = true;
474dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!extension)
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  extensions_service_->UninstallExtension(extension_id_prompting_,
479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                          false /* external_uninstall */, NULL);
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  extension_id_prompting_ = "";
481dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
482dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // There will be no EXTENSION_UNLOADED notification for terminated
483dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // extensions as they were already unloaded.
484dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (was_terminated)
485dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    HandleRequestExtensionsData(NULL);
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ExtensionsDOMHandler::ExtensionDialogCanceled() {
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  extension_id_prompting_ = "";
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::HandleOptionsMessage(const ListValue* args) {
493513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* extension = GetExtension(args);
4943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!extension || extension->options_url().is_empty())
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
49672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->GetProfile()->GetExtensionProcessManager()->OpenOptionsPage(
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      extension, NULL);
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
500201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid ExtensionsDOMHandler::HandleShowButtonMessage(const ListValue* args) {
501201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const Extension* extension = GetExtension(args);
502201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  extensions_service_->SetBrowserActionVisibility(extension, true);
503201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
504201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
5053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::HandleLoadMessage(const ListValue* args) {
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath::StringType string_path;
5073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetSize() == 1) << args->GetSize();
5083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(0, &string_path));
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  extensions_service_->LoadExtension(FilePath(string_path));
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionsDOMHandler::ShowAlert(const std::string& message) {
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ListValue arguments;
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  arguments.Append(Value::CreateStringValue(message));
515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction("alert", arguments);
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::HandlePackMessage(const ListValue* args) {
5193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string extension_path;
5203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string private_key_path;
5213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetSize() == 2);
5223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(0, &extension_path));
5233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(1, &private_key_path));
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath root_directory =
5263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      FilePath::FromWStringHack(UTF8ToWide(extension_path));
5273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath key_file = FilePath::FromWStringHack(UTF8ToWide(private_key_path));
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (root_directory.empty()) {
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (extension_path.empty()) {
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ShowAlert(l10n_util::GetStringUTF8(
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          IDS_EXTENSION_PACK_DIALOG_ERROR_ROOT_REQUIRED));
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ShowAlert(l10n_util::GetStringUTF8(
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          IDS_EXTENSION_PACK_DIALOG_ERROR_ROOT_INVALID));
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!private_key_path.empty() && key_file.empty()) {
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowAlert(l10n_util::GetStringUTF8(
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        IDS_EXTENSION_PACK_DIALOG_ERROR_KEY_INVALID));
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pack_job_ = new PackExtensionJob(this, root_directory, key_file);
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pack_job_->Start();
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionsDOMHandler::OnPackSuccess(const FilePath& crx_file,
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         const FilePath& pem_file) {
5533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ShowAlert(UTF16ToUTF8(PackExtensionJob::StandardSuccessMessage(crx_file,
5543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                                                 pem_file)));
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ListValue results;
557ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction("hidePackDialog", results);
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::OnPackFailure(const std::string& error) {
5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ShowAlert(error);
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::HandleAutoUpdateMessage(const ListValue* args) {
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionUpdater* updater = extensions_service_->updater();
5663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (updater)
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    updater->CheckNow();
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::HandleSelectFilePathMessage(const ListValue* args) {
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string select_type;
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string operation;
5733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetSize() == 2);
5743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(0, &select_type));
5753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(1, &operation));
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SelectFileDialog::Type type = SelectFileDialog::SELECT_FOLDER;
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static SelectFileDialog::FileTypeInfo info;
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int file_type_index = 0;
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (select_type == "file")
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    type = SelectFileDialog::SELECT_OPEN_FILE;
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 select_title;
5843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (operation == "load") {
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    select_title = l10n_util::GetStringUTF16(IDS_EXTENSION_LOAD_FROM_DIRECTORY);
5863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else if (operation == "packRoot") {
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    select_title = l10n_util::GetStringUTF16(
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        IDS_EXTENSION_PACK_DIALOG_SELECT_ROOT);
5893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else if (operation == "pem") {
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    select_title = l10n_util::GetStringUTF16(
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        IDS_EXTENSION_PACK_DIALOG_SELECT_KEY);
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    info.extensions.push_back(std::vector<FilePath::StringType>());
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        info.extensions.front().push_back(FILE_PATH_LITERAL("pem"));
5943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        info.extension_description_overrides.push_back(
5953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            l10n_util::GetStringUTF16(
5963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                IDS_EXTENSION_PACK_DIALOG_KEY_FILE_TYPE_DESCRIPTION));
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        info.include_all_files = true;
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    file_type_index = 1;
599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  load_extension_dialog_ = SelectFileDialog::Create(this);
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  load_extension_dialog_->SelectFile(type, select_title, FilePath(), &info,
606ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      file_type_index, FILE_PATH_LITERAL(""), web_ui_->tab_contents(),
60772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      web_ui_->tab_contents()->view()->GetTopLevelNativeWindow(), NULL);
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionsDOMHandler::FileSelected(const FilePath& path, int index,
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        void* params) {
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add the extensions to the results structure.
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ListValue results;
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  results.Append(Value::CreateStringValue(path.value()));
616ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction("window.handleFilePathSelected", results);
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ExtensionsDOMHandler::MultiFilesSelected(
62021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::vector<FilePath>& files, void* params) {
62121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  NOTREACHED();
62221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
62321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionsDOMHandler::Observe(NotificationType type,
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const NotificationSource& source,
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const NotificationDetails& details) {
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (type.value) {
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // We listen for notifications that will result in the page being
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // repopulated with data twice for the same event in certain cases.
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // For instance, EXTENSION_LOADED & EXTENSION_PROCESS_CREATED because
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // we don't know about the views for an extension at EXTENSION_LOADED, but
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // if we only listen to EXTENSION_PROCESS_CREATED, we'll miss extensions
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // that don't have a process at startup. Similarly, NAV_ENTRY_COMMITTED &
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // EXTENSION_FUNCTION_DISPATCHER_CREATED because we want to handle both
635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // the case of live app pages (which don't have an EFD) and
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // chrome-extension:// urls which are served in a TabContents.
637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    //
638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Doing it this way gets everything but causes the page to be rendered
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // more than we need. It doesn't seem to result in any noticeable flicker.
640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NotificationType::RENDER_VIEW_HOST_DELETED:
641ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      deleting_rvh_ = Source<RenderViewHost>(source).ptr();
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      MaybeUpdateAfterNotification();
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NotificationType::BACKGROUND_CONTENTS_DELETED:
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      deleting_rvh_ = Details<BackgroundContents>(details)->render_view_host();
646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      MaybeUpdateAfterNotification();
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NotificationType::EXTENSION_LOADED:
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NotificationType::EXTENSION_PROCESS_CREATED:
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NotificationType::EXTENSION_UNLOADED:
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NotificationType::EXTENSION_UPDATE_DISABLED:
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NotificationType::EXTENSION_FUNCTION_DISPATCHER_CREATED:
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NotificationType::EXTENSION_FUNCTION_DISPATCHER_DESTROYED:
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NotificationType::NAV_ENTRY_COMMITTED:
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NotificationType::BACKGROUND_CONTENTS_NAVIGATED:
656201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case NotificationType::EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED:
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      MaybeUpdateAfterNotification();
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
664513209b27ff55e2841eac0e4120199c23acce758Ben Murdochconst Extension* ExtensionsDOMHandler::GetExtension(const ListValue* args) {
665ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string extension_id = UTF16ToASCII(ExtractStringValue(args));
6663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(!extension_id.empty());
6673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return extensions_service_->GetExtensionById(extension_id, true);
6683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
6693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionsDOMHandler::MaybeUpdateAfterNotification() {
671dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!ignore_notifications_ &&
672dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      web_ui_->tab_contents() &&
673dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      web_ui_->tab_contents()->render_view_host()) {
674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    HandleRequestExtensionsData(NULL);
675dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  deleting_rvh_ = NULL;
677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Static
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDictionaryValue* ExtensionsDOMHandler::CreateExtensionDetailValue(
68121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    ExtensionService* service, const Extension* extension,
68272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::vector<ExtensionPage>& pages, bool enabled, bool terminated) {
683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue* extension_data = new DictionaryValue();
684dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  GURL icon =
685dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      ExtensionIconSource::GetIconURL(extension,
686dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                      Extension::EXTENSION_ICON_MEDIUM,
687dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                      ExtensionIconSet::MATCH_BIGGER,
688dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                      !enabled);
6893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  extension_data->SetString("id", extension->id());
6903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  extension_data->SetString("name", extension->name());
6913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  extension_data->SetString("description", extension->description());
692ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (extension->location() == Extension::LOAD)
693ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    extension_data->SetString("path", extension->path().value());
6943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  extension_data->SetString("version", extension->version()->GetString());
695dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  extension_data->SetString("icon", icon.spec());
696ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension_data->SetBoolean("isUnpacked",
697ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             extension->location() == Extension::LOAD);
698ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension_data->SetBoolean("mayDisable",
699ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             Extension::UserMayDisable(extension->location()));
7003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  extension_data->SetBoolean("enabled", enabled);
70172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  extension_data->SetBoolean("terminated", terminated);
7023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  extension_data->SetBoolean("enabledIncognito",
703ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      service ? service->IsIncognitoEnabled(extension->id()) : false);
704ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension_data->SetBoolean("wantsFileAccess", extension->wants_file_access());
7053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  extension_data->SetBoolean("allowFileAccess",
706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      service ? service->AllowFileAccess(extension) : false);
7073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  extension_data->SetBoolean("allow_reload",
708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             extension->location() == Extension::LOAD);
7093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  extension_data->SetBoolean("is_hosted_app", extension->is_hosted_app());
710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Determine the sort order: Extensions loaded through --load-extensions show
712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // up at the top. Disabled extensions show up at the bottom.
713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (extension->location() == Extension::LOAD)
7143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    extension_data->SetInteger("order", 1);
715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  else
7163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    extension_data->SetInteger("order", 2);
717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!extension->options_url().is_empty())
7193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    extension_data->SetString("options_url", extension->options_url().spec());
720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
721201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (service && !service->GetBrowserActionVisibility(extension))
722201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    extension_data->SetBoolean("enable_show_button", true);
723201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add views
725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ListValue* views = new ListValue;
726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (std::vector<ExtensionPage>::const_iterator iter = pages.begin();
727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       iter != pages.end(); ++iter) {
728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DictionaryValue* view_value = new DictionaryValue;
729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (iter->url.scheme() == chrome::kExtensionScheme) {
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // No leading slash.
7313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      view_value->SetString("path", iter->url.path().substr(1));
732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // For live pages, use the full URL.
7343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      view_value->SetString("path", iter->url.spec());
735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
7363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    view_value->SetInteger("renderViewId", iter->render_view_id);
7373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    view_value->SetInteger("renderProcessId", iter->render_process_id);
7383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    view_value->SetBoolean("incognito", iter->incognito);
739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    views->Append(view_value);
740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
7413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  extension_data->Set("views", views);
7423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  extension_data->SetBoolean("hasPopupAction",
743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      extension->browser_action() || extension->page_action());
744513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  extension_data->SetString("homepageUrl", extension->GetHomepageURL().spec());
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return extension_data;
747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::vector<ExtensionPage> ExtensionsDOMHandler::GetActivePagesForExtension(
750513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const Extension* extension) {
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<ExtensionPage> result;
7523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Get the extension process's active views.
7543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ExtensionProcessManager* process_manager =
7553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      extensions_service_->profile()->GetExtensionProcessManager();
7563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GetActivePagesForExtensionProcess(
7573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      process_manager->GetExtensionProcess(extension->url()),
7583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      extension, &result);
7593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Repeat for the incognito process, if applicable.
7613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (extensions_service_->profile()->HasOffTheRecordProfile() &&
7623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      extension->incognito_split_mode()) {
7633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ExtensionProcessManager* process_manager =
7643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        extensions_service_->profile()->GetOffTheRecordProfile()->
7653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            GetExtensionProcessManager();
7663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    GetActivePagesForExtensionProcess(
7673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        process_manager->GetExtensionProcess(extension->url()),
7683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        extension, &result);
7693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
7703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return result;
7723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionsDOMHandler::GetActivePagesForExtensionProcess(
7753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    RenderProcessHost* process,
776513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const Extension* extension,
7773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::vector<ExtensionPage> *result) {
778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!process)
7793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RenderProcessHost::listeners_iterator iter = process->ListenersIterator();
782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (; !iter.IsAtEnd(); iter.Advance()) {
783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const RenderWidgetHost* widget =
784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        static_cast<const RenderWidgetHost*>(iter.GetCurrentValue());
785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(widget);
786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!widget || !widget->IsRenderView())
787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      continue;
788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const RenderViewHost* host = static_cast<const RenderViewHost*>(widget);
789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (host == deleting_rvh_ ||
790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ViewType::EXTENSION_POPUP == host->delegate()->GetRenderViewType())
791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      continue;
792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GURL url = host->delegate()->GetURL();
794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (url.SchemeIs(chrome::kExtensionScheme)) {
795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (url.host() != extension->id())
796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        continue;
797c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (!extension->web_extent().ContainsURL(url)) {
798c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      continue;
799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    result->push_back(ExtensionPage(url, process->id(), host->routing_id(),
8023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                    process->profile()->IsOffTheRecord()));
803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
806c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionsDOMHandler::~ExtensionsDOMHandler() {
807ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // There may be pending file dialogs, we need to tell them that we've gone
808ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // away so they don't try and call back to us.
809ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (load_extension_dialog_.get())
810ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    load_extension_dialog_->ListenerDestroyed();
811ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (pack_job_.get())
813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    pack_job_->ClearClient();
814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
815dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  registrar_.RemoveAll();
816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExtensionsDOMHandler, public: -----------------------------------------------
819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenExtensionsUI::ExtensionsUI(TabContents* contents) : WebUI(contents) {
82121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ExtensionService *exstension_service =
82221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      GetProfile()->GetOriginalProfile()->GetExtensionService();
823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionsDOMHandler* handler = new ExtensionsDOMHandler(exstension_service);
825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddMessageHandler(handler);
826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  handler->Attach(this);
827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionsUIHTMLSource* html_source = new ExtensionsUIHTMLSource();
829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set up the chrome://extensions/ source.
83172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  contents->profile()->GetChromeURLDataManager()->AddDataSource(html_source);
832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
835c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochRefCountedMemory* ExtensionsUI::GetFaviconResourceBytes() {
836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return ResourceBundle::GetSharedInstance().
837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LoadDataResourceBytes(IDR_PLUGIN);
838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
840c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionsUI::RegisterUserPrefs(PrefService* prefs) {
842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  prefs->RegisterBooleanPref(prefs::kExtensionsUIDeveloperMode, false);
843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
844