Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Side by Side Diff: chrome/browser/extensions/extension_service.cc

Issue 8202011: Notify users about certain changes in installed extensions. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/extension_service.h" 5 #include "chrome/browser/extensions/extension_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/callback.h"
12 #include "base/file_util.h" 13 #include "base/file_util.h"
13 #include "base/logging.h" 14 #include "base/logging.h"
14 #include "base/metrics/histogram.h" 15 #include "base/metrics/histogram.h"
15 #include "base/path_service.h" 16 #include "base/path_service.h"
16 #include "base/stl_util.h" 17 #include "base/stl_util.h"
17 #include "base/string16.h" 18 #include "base/string16.h"
18 #include "base/string_number_conversions.h" 19 #include "base/string_number_conversions.h"
19 #include "base/string_util.h" 20 #include "base/string_util.h"
20 #include "base/stringprintf.h" 21 #include "base/stringprintf.h"
21 #include "base/threading/thread_restrictions.h" 22 #include "base/threading/thread_restrictions.h"
22 #include "base/time.h" 23 #include "base/time.h"
23 #include "base/utf_string_conversions.h" 24 #include "base/utf_string_conversions.h"
24 #include "base/values.h" 25 #include "base/values.h"
25 #include "base/version.h" 26 #include "base/version.h"
26 #include "chrome/browser/browser_process.h" 27 #include "chrome/browser/browser_process.h"
27 #include "chrome/browser/chrome_plugin_service_filter.h" 28 #include "chrome/browser/chrome_plugin_service_filter.h"
28 #include "chrome/browser/extensions/apps_promo.h" 29 #include "chrome/browser/extensions/apps_promo.h"
29 #include "chrome/browser/extensions/crx_installer.h" 30 #include "chrome/browser/extensions/crx_installer.h"
30 #include "chrome/browser/extensions/extension_accessibility_api.h" 31 #include "chrome/browser/extensions/extension_accessibility_api.h"
31 #include "chrome/browser/extensions/extension_bookmarks_module.h" 32 #include "chrome/browser/extensions/extension_bookmarks_module.h"
32 #include "chrome/browser/extensions/extension_browser_event_router.h" 33 #include "chrome/browser/extensions/extension_browser_event_router.h"
33 #include "chrome/browser/extensions/extension_cookies_api.h" 34 #include "chrome/browser/extensions/extension_cookies_api.h"
34 #include "chrome/browser/extensions/extension_data_deleter.h" 35 #include "chrome/browser/extensions/extension_data_deleter.h"
35 #include "chrome/browser/extensions/extension_downloads_api.h" 36 #include "chrome/browser/extensions/extension_downloads_api.h"
36 #include "chrome/browser/extensions/extension_error_reporter.h" 37 #include "chrome/browser/extensions/extension_error_reporter.h"
38 #include "chrome/browser/extensions/extension_global_error.h"
37 #include "chrome/browser/extensions/extension_history_api.h" 39 #include "chrome/browser/extensions/extension_history_api.h"
38 #include "chrome/browser/extensions/extension_host.h" 40 #include "chrome/browser/extensions/extension_host.h"
39 #include "chrome/browser/extensions/extension_input_ime_api.h" 41 #include "chrome/browser/extensions/extension_input_ime_api.h"
40 #include "chrome/browser/extensions/extension_install_ui.h" 42 #include "chrome/browser/extensions/extension_install_ui.h"
41 #include "chrome/browser/extensions/extension_management_api.h" 43 #include "chrome/browser/extensions/extension_management_api.h"
42 #include "chrome/browser/extensions/extension_preference_api.h" 44 #include "chrome/browser/extensions/extension_preference_api.h"
43 #include "chrome/browser/extensions/extension_process_manager.h" 45 #include "chrome/browser/extensions/extension_process_manager.h"
44 #include "chrome/browser/extensions/extension_processes_api.h" 46 #include "chrome/browser/extensions/extension_processes_api.h"
45 #include "chrome/browser/extensions/extension_special_storage_policy.h" 47 #include "chrome/browser/extensions/extension_special_storage_policy.h"
46 #include "chrome/browser/extensions/extension_sync_data.h" 48 #include "chrome/browser/extensions/extension_sync_data.h"
47 #include "chrome/browser/extensions/extension_updater.h" 49 #include "chrome/browser/extensions/extension_updater.h"
48 #include "chrome/browser/extensions/extension_web_ui.h" 50 #include "chrome/browser/extensions/extension_web_ui.h"
49 #include "chrome/browser/extensions/extension_webnavigation_api.h" 51 #include "chrome/browser/extensions/extension_webnavigation_api.h"
50 #include "chrome/browser/extensions/external_extension_provider_impl.h" 52 #include "chrome/browser/extensions/external_extension_provider_impl.h"
51 #include "chrome/browser/extensions/external_extension_provider_interface.h" 53 #include "chrome/browser/extensions/external_extension_provider_interface.h"
52 #include "chrome/browser/extensions/pending_extension_manager.h" 54 #include "chrome/browser/extensions/pending_extension_manager.h"
53 #include "chrome/browser/net/chrome_url_request_context.h" 55 #include "chrome/browser/net/chrome_url_request_context.h"
54 #include "chrome/browser/prefs/pref_service.h" 56 #include "chrome/browser/prefs/pref_service.h"
55 #include "chrome/browser/profiles/profile.h" 57 #include "chrome/browser/profiles/profile.h"
56 #include "chrome/browser/search_engines/template_url_service.h" 58 #include "chrome/browser/search_engines/template_url_service.h"
57 #include "chrome/browser/search_engines/template_url_service_factory.h" 59 #include "chrome/browser/search_engines/template_url_service_factory.h"
58 #include "chrome/browser/sync/api/sync_change.h" 60 #include "chrome/browser/sync/api/sync_change.h"
59 #include "chrome/browser/themes/theme_service.h" 61 #include "chrome/browser/themes/theme_service.h"
60 #include "chrome/browser/themes/theme_service_factory.h" 62 #include "chrome/browser/themes/theme_service_factory.h"
63 #include "chrome/browser/ui/browser.h"
64 #include "chrome/browser/ui/global_error_service.h"
65 #include "chrome/browser/ui/global_error_service_factory.h"
61 #include "chrome/browser/ui/webui/chrome_url_data_manager.h" 66 #include "chrome/browser/ui/webui/chrome_url_data_manager.h"
62 #include "chrome/browser/ui/webui/favicon_source.h" 67 #include "chrome/browser/ui/webui/favicon_source.h"
63 #include "chrome/browser/ui/webui/ntp/shown_sections_handler.h" 68 #include "chrome/browser/ui/webui/ntp/shown_sections_handler.h"
64 #include "chrome/common/child_process_logging.h" 69 #include "chrome/common/child_process_logging.h"
65 #include "chrome/common/chrome_notification_types.h" 70 #include "chrome/common/chrome_notification_types.h"
66 #include "chrome/common/chrome_paths.h" 71 #include "chrome/common/chrome_paths.h"
67 #include "chrome/common/chrome_switches.h" 72 #include "chrome/common/chrome_switches.h"
68 #include "chrome/common/extensions/extension.h" 73 #include "chrome/common/extensions/extension.h"
69 #include "chrome/common/extensions/extension_constants.h" 74 #include "chrome/common/extensions/extension_constants.h"
70 #include "chrome/common/extensions/extension_error_utils.h" 75 #include "chrome/common/extensions/extension_error_utils.h"
(...skipping 2060 matching lines...) Expand 10 before | Expand all | Expand 10 after
2131 } 2136 }
2132 2137
2133 // Uninstall all the unclaimed extensions. 2138 // Uninstall all the unclaimed extensions.
2134 scoped_ptr<ExtensionPrefs::ExtensionsInfo> extensions_info( 2139 scoped_ptr<ExtensionPrefs::ExtensionsInfo> extensions_info(
2135 extension_prefs_->GetInstalledExtensionsInfo()); 2140 extension_prefs_->GetInstalledExtensionsInfo());
2136 for (size_t i = 0; i < extensions_info->size(); ++i) { 2141 for (size_t i = 0; i < extensions_info->size(); ++i) {
2137 ExtensionInfo* info = extensions_info->at(i).get(); 2142 ExtensionInfo* info = extensions_info->at(i).get();
2138 if (Extension::IsExternalLocation(info->extension_location)) 2143 if (Extension::IsExternalLocation(info->extension_location))
2139 CheckExternalUninstall(info->extension_id); 2144 CheckExternalUninstall(info->extension_id);
2140 } 2145 }
2146
2147 #if false
2148 // TODO(miket): enable upon completion of feature.
2149 IdentifyAlertableExtensions();
asargent_no_longer_on_chrome 2011/10/07 21:25:34 Here's a thought for you to consider - I think it
miket_OOO 2011/10/07 22:38:22 Agreed. I have a bad bug that's related, as descri
2150 #endif
2151 }
2152
2153 void ExtensionService::IdentifyAlertableExtensions() {
2154 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2155
2156 // Build up the lists of extensions that require acknowledgment.
2157 // If this is the first time, grandfather extensions that would have
2158 // caused notification.
2159 scoped_ptr<ExtensionGlobalError> global_error(
2160 new ExtensionGlobalError(this));
2161 bool needs_alert = false;
2162 for (ExtensionList::const_iterator iter = extensions_.begin();
2163 iter != extensions_.end(); ++iter) {
2164 const Extension* e = *iter;
2165 if (!IsExtensionEnabled(e->id())) {
2166 continue;
2167 }
2168 if (Extension::IsExternalLocation(e->location())) {
2169 if (!extension_prefs_->IsExternalExtensionAcknowledged(e->id())) {
2170 global_error->AddExternalExtension(e->id());
2171 needs_alert = true;
2172 }
2173 }
2174 if (extension_prefs_->IsExtensionBlacklisted(e->id())) {
2175 if (!extension_prefs_->IsBlacklistedExtensionAcknowledged(e->id())) {
2176 global_error->AddBlacklistedExtension(e->id());
2177 needs_alert = true;
2178 }
2179 }
2180 if (extension_prefs_->IsExtensionOrphaned(e->id())) {
2181 if (!extension_prefs_->IsOrphanedExtensionAcknowledged(e->id())) {
2182 global_error->AddOrphanedExtension(e->id());
2183 needs_alert = true;
2184 }
2185 }
2186 }
2187
2188 if (needs_alert) {
2189 if (extension_prefs_->IsNotificationSystemInitialized()) {
2190 global_error->set_accept_callback(
2191 base::Bind(&ExtensionService::HandleNotificationAlertAccept,
2192 base::Unretained(this)));
2193 global_error->set_cancel_callback(
2194 base::Bind(&ExtensionService::HandleNotificationAlertDetails,
2195 base::Unretained(this)));
2196 GlobalErrorServiceFactory::GetForProfile(profile_)->AddGlobalError(
2197 global_error.release());
2198 } else {
2199 // First run. Just acknowledge all the extensions, silently, by
2200 // shortcutting the display of the UI and going straight to the
2201 // callback for pressing the Accept button.
2202 HandleNotificationAlertAccept(*global_error.get());
2203 }
2204 }
2205 }
2206
2207 void ExtensionService::HandleNotificationAlertAccept(
2208 const ExtensionGlobalError& global_error) {
2209 const ExtensionIdSet *extension_ids =
2210 global_error.get_external_extension_ids();
2211 for (ExtensionIdSet::const_iterator iter = extension_ids->begin();
2212 iter != extension_ids->end(); ++iter) {
2213 extension_prefs_->AcknowledgeExternalExtension(*iter);
2214 }
2215 extension_ids = global_error.get_blacklisted_extension_ids();
2216 for (ExtensionIdSet::const_iterator iter = extension_ids->begin();
2217 iter != extension_ids->end(); ++iter) {
2218 extension_prefs_->AcknowledgeBlacklistedExtension(*iter);
2219 }
2220 extension_ids = global_error.get_orphaned_extension_ids();
2221 for (ExtensionIdSet::const_iterator iter = extension_ids->begin();
2222 iter != extension_ids->end(); ++iter) {
2223 extension_prefs_->AcknowledgeOrphanedExtension(*iter);
2224 }
2225 }
2226
2227 void ExtensionService::HandleNotificationAlertDetails(
2228 const ExtensionGlobalError& global_error) {
2229 Browser::OpenExtensionsWindow(profile_);
2141 } 2230 }
2142 2231
2143 void ExtensionService::UnloadExtension( 2232 void ExtensionService::UnloadExtension(
2144 const std::string& extension_id, 2233 const std::string& extension_id,
2145 extension_misc::UnloadedExtensionReason reason) { 2234 extension_misc::UnloadedExtensionReason reason) {
2146 // Make sure the extension gets deleted after we return from this function. 2235 // Make sure the extension gets deleted after we return from this function.
2147 scoped_refptr<const Extension> extension( 2236 scoped_refptr<const Extension> extension(
2148 GetExtensionByIdInternal(extension_id, true, true, false)); 2237 GetExtensionByIdInternal(extension_id, true, true, false));
2149 2238
2150 // This method can be called via PostTask, so the extension may have been 2239 // This method can be called via PostTask, so the extension may have been
(...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after
2900 2989
2901 ExtensionService::NaClModuleInfoList::iterator 2990 ExtensionService::NaClModuleInfoList::iterator
2902 ExtensionService::FindNaClModule(const GURL& url) { 2991 ExtensionService::FindNaClModule(const GURL& url) {
2903 for (NaClModuleInfoList::iterator iter = nacl_module_list_.begin(); 2992 for (NaClModuleInfoList::iterator iter = nacl_module_list_.begin();
2904 iter != nacl_module_list_.end(); ++iter) { 2993 iter != nacl_module_list_.end(); ++iter) {
2905 if (iter->url == url) 2994 if (iter->url == url)
2906 return iter; 2995 return iter;
2907 } 2996 }
2908 return nacl_module_list_.end(); 2997 return nacl_module_list_.end();
2909 } 2998 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698