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