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

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

Issue 132003: Disable extensions besides externally installed ones and themes. (Closed)
Patch Set: Fix ui test bustage Created 11 years, 6 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
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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/extensions_service.h" 5 #include "chrome/browser/extensions/extensions_service.h"
6 6
7 #include "app/l10n_util.h" 7 #include "app/l10n_util.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/crypto/signature_verifier.h" 9 #include "base/crypto/signature_verifier.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 // already. 209 // already.
210 bool got_response_; 210 bool got_response_;
211 }; 211 };
212 212
213 ExtensionsService::ExtensionsService(Profile* profile, 213 ExtensionsService::ExtensionsService(Profile* profile,
214 MessageLoop* frontend_loop, 214 MessageLoop* frontend_loop,
215 MessageLoop* backend_loop) 215 MessageLoop* backend_loop)
216 : extension_prefs_(new ExtensionPrefs(profile->GetPrefs())), 216 : extension_prefs_(new ExtensionPrefs(profile->GetPrefs())),
217 backend_loop_(backend_loop), 217 backend_loop_(backend_loop),
218 install_directory_(profile->GetPath().AppendASCII(kInstallDirectoryName)), 218 install_directory_(profile->GetPath().AppendASCII(kInstallDirectoryName)),
219 extensions_enabled_( 219 extensions_enabled_(false),
220 CommandLine::ForCurrentProcess()->
221 HasSwitch(switches::kEnableExtensions)),
222 show_extensions_prompts_(true), 220 show_extensions_prompts_(true),
223 ready_(false) { 221 ready_(false) {
224 // We pass ownership of this object to the Backend. 222 // We pass ownership of this object to the Backend.
225 DictionaryValue* extensions = extension_prefs_->CopyCurrentExtensions(); 223 DictionaryValue* extensions = extension_prefs_->CopyCurrentExtensions();
226 backend_ = new ExtensionsServiceBackend( 224 backend_ = new ExtensionsServiceBackend(
227 install_directory_, g_browser_process->resource_dispatcher_host(), 225 install_directory_, g_browser_process->resource_dispatcher_host(),
228 frontend_loop, extensions); 226 frontend_loop, extensions, extensions_enabled());
229 } 227 }
230 228
231 ExtensionsService::~ExtensionsService() { 229 ExtensionsService::~ExtensionsService() {
232 UnloadAllExtensions(); 230 UnloadAllExtensions();
233 } 231 }
234 232
233 void ExtensionsService::SetExtensionsEnabled(bool enabled) {
234 extensions_enabled_ = true;
235 backend_loop_->PostTask(FROM_HERE, NewRunnableMethod(backend_.get(),
236 &ExtensionsServiceBackend::set_extensions_enabled, enabled));
237 }
238
235 void ExtensionsService::Init() { 239 void ExtensionsService::Init() {
236 DCHECK(extensions_.size() == 0); 240 DCHECK(extensions_.size() == 0);
237 241
238 // Start up the extension event routers. 242 // Start up the extension event routers.
239 ExtensionBrowserEventRouter::GetInstance()->Init(); 243 ExtensionBrowserEventRouter::GetInstance()->Init();
240 244
241 LoadAllExtensions(); 245 LoadAllExtensions();
242 246
243 // TODO(erikkay) this should probably be deferred to a future point 247 // TODO(erikkay) this should probably be deferred to a future point
244 // rather than running immediately at startup. 248 // rather than running immediately at startup.
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 ready_ = true; 351 ready_ = true;
348 NotificationService::current()->Notify( 352 NotificationService::current()->Notify(
349 NotificationType::EXTENSIONS_READY, 353 NotificationType::EXTENSIONS_READY,
350 Source<ExtensionsService>(this), 354 Source<ExtensionsService>(this),
351 NotificationService::NoDetails()); 355 NotificationService::NoDetails());
352 } 356 }
353 357
354 void ExtensionsService::OnExtensionsLoaded(ExtensionList* new_extensions) { 358 void ExtensionsService::OnExtensionsLoaded(ExtensionList* new_extensions) {
355 scoped_ptr<ExtensionList> cleanup(new_extensions); 359 scoped_ptr<ExtensionList> cleanup(new_extensions);
356 360
357 // Filter out any extensions we don't want to enable. Themes are always 361 // Filter out any extensions that shouldn't be loaded. Themes are always
358 // enabled, but other extensions are only loaded if --enable-extensions is 362 // loaded, but other extensions are only loaded if the extensions system is
359 // present. 363 // enabled.
360 ExtensionList enabled_extensions; 364 ExtensionList enabled_extensions;
361 for (ExtensionList::iterator iter = new_extensions->begin(); 365 for (ExtensionList::iterator iter = new_extensions->begin();
362 iter != new_extensions->end(); ++iter) { 366 iter != new_extensions->end(); ++iter) {
363 if (extensions_enabled() || (*iter)->IsTheme()) { 367 if (extensions_enabled() || (*iter)->IsTheme() ||
368 (*iter)->location() == Extension::EXTERNAL_REGISTRY) {
364 Extension* old = GetExtensionById((*iter)->id()); 369 Extension* old = GetExtensionById((*iter)->id());
365 if (old) { 370 if (old) {
366 if ((*iter)->version()->CompareTo(*(old->version())) > 0) { 371 if ((*iter)->version()->CompareTo(*(old->version())) > 0) {
367 // To upgrade an extension in place, unload the old one and 372 // To upgrade an extension in place, unload the old one and
368 // then load the new one. 373 // then load the new one.
369 // TODO(erikkay) issue 12399 374 // TODO(erikkay) issue 12399
370 UnloadExtension(old->id()); 375 UnloadExtension(old->id());
371 } else { 376 } else {
372 // We already have the extension of the same or older version. 377 // We already have the extension of the same or older version.
373 LOG(WARNING) << "Duplicate extension load attempt: " << (*iter)->id(); 378 LOG(WARNING) << "Duplicate extension load attempt: " << (*iter)->id();
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 Extension::Location location, ExternalExtensionProvider* test_provider) { 449 Extension::Location location, ExternalExtensionProvider* test_provider) {
445 backend_loop_->PostTask(FROM_HERE, NewRunnableMethod(backend_.get(), 450 backend_loop_->PostTask(FROM_HERE, NewRunnableMethod(backend_.get(),
446 &ExtensionsServiceBackend::SetProviderForTesting, 451 &ExtensionsServiceBackend::SetProviderForTesting,
447 location, test_provider)); 452 location, test_provider));
448 } 453 }
449 454
450 // ExtensionsServicesBackend 455 // ExtensionsServicesBackend
451 456
452 ExtensionsServiceBackend::ExtensionsServiceBackend( 457 ExtensionsServiceBackend::ExtensionsServiceBackend(
453 const FilePath& install_directory, ResourceDispatcherHost* rdh, 458 const FilePath& install_directory, ResourceDispatcherHost* rdh,
454 MessageLoop* frontend_loop, DictionaryValue* extension_prefs) 459 MessageLoop* frontend_loop, DictionaryValue* extension_prefs,
460 bool extensions_enabled)
455 : frontend_(NULL), 461 : frontend_(NULL),
456 install_directory_(install_directory), 462 install_directory_(install_directory),
457 resource_dispatcher_host_(rdh), 463 resource_dispatcher_host_(rdh),
458 alert_on_error_(false), 464 alert_on_error_(false),
459 frontend_loop_(frontend_loop) { 465 frontend_loop_(frontend_loop),
466 extensions_enabled_(false) {
460 external_extension_providers_[Extension::EXTERNAL_PREF] = 467 external_extension_providers_[Extension::EXTERNAL_PREF] =
461 linked_ptr<ExternalExtensionProvider>( 468 linked_ptr<ExternalExtensionProvider>(
462 new ExternalPrefExtensionProvider(extension_prefs)); 469 new ExternalPrefExtensionProvider(extension_prefs));
463 #if defined(OS_WIN) 470 #if defined(OS_WIN)
464 external_extension_providers_[Extension::EXTERNAL_REGISTRY] = 471 external_extension_providers_[Extension::EXTERNAL_REGISTRY] =
465 linked_ptr<ExternalExtensionProvider>( 472 linked_ptr<ExternalExtensionProvider>(
466 new ExternalRegistryExtensionProvider()); 473 new ExternalRegistryExtensionProvider());
467 #endif 474 #endif
468 } 475 }
469 476
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after
949 const std::vector< Tuple2<SkBitmap, FilePath> >& images) { 956 const std::vector< Tuple2<SkBitmap, FilePath> >& images) {
950 Extension extension; 957 Extension extension;
951 std::string error; 958 std::string error;
952 if (!extension.InitFromValue(manifest, 959 if (!extension.InitFromValue(manifest,
953 true, // require ID 960 true, // require ID
954 &error)) { 961 &error)) {
955 ReportExtensionInstallError(extension_path, "Invalid extension manifest."); 962 ReportExtensionInstallError(extension_path, "Invalid extension manifest.");
956 return; 963 return;
957 } 964 }
958 965
959 if (!frontend_->extensions_enabled() && !extension.IsTheme()) {
960 #if defined(OS_WIN)
961 if (frontend_->show_extensions_prompts()) {
962 win_util::MessageBox(GetForegroundWindow(),
963 L"Extensions are not enabled. Add --enable-extensions to the "
964 L"command-line to enable extensions.\n\n"
965 L"This is a temporary message and it will be removed when extensions "
966 L"UI is finalized.",
967 l10n_util::GetString(IDS_PRODUCT_NAME).c_str(), MB_OK);
968 }
969 #endif
970 ReportExtensionInstallError(extension_path,
971 "Extensions are not enabled.");
972 return;
973 }
974
975 Extension::Location location = Extension::INTERNAL; 966 Extension::Location location = Extension::INTERNAL;
976 LookupExternalExtension(extension.id(), NULL, &location); 967 LookupExternalExtension(extension.id(), NULL, &location);
968
969 // We currently only allow themes and registry-installed extensions to be
970 // installed.
971 if (!extensions_enabled_ &&
972 !extension.IsTheme() &&
973 location != Extension::EXTERNAL_REGISTRY) {
974 ReportExtensionInstallError(extension_path,
975 "Extensions are not enabled (yet!)");
976 return;
977 }
978
977 #if defined(OS_WIN) 979 #if defined(OS_WIN)
978 bool from_external = Extension::IsExternalLocation(location); 980 if (!extension.IsTheme() &&
979 981 !Extension::IsExternalLocation(location) &&
980 if (!extension.IsTheme() && !from_external &&
981 frontend_->show_extensions_prompts() && 982 frontend_->show_extensions_prompts() &&
982 win_util::MessageBox(GetForegroundWindow(), 983 win_util::MessageBox(GetForegroundWindow(),
983 L"Are you sure you want to install this extension?\n\n" 984 L"Are you sure you want to install this extension?\n\n"
984 L"This is a temporary message and it will be removed when extensions " 985 L"This is a temporary message and it will be removed when extensions "
985 L"UI is finalized.", 986 L"UI is finalized.",
986 l10n_util::GetString(IDS_PRODUCT_NAME).c_str(), 987 l10n_util::GetString(IDS_PRODUCT_NAME).c_str(),
987 MB_OKCANCEL) != IDOK) { 988 MB_OKCANCEL) != IDOK) {
988 ReportExtensionInstallError(extension_path, 989 ReportExtensionInstallError(extension_path,
989 "User did not allow extension to be installed."); 990 "User did not allow extension to be installed.");
990 return; 991 return;
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
1273 Extension::InstallType install_type = 1274 Extension::InstallType install_type =
1274 CompareToInstalledVersion(id, version->GetString(), &current_version); 1275 CompareToInstalledVersion(id, version->GetString(), &current_version);
1275 1276
1276 if (install_type == Extension::DOWNGRADE) 1277 if (install_type == Extension::DOWNGRADE)
1277 return false; 1278 return false;
1278 1279
1279 return (install_type == Extension::UPGRADE || 1280 return (install_type == Extension::UPGRADE ||
1280 install_type == Extension::NEW_INSTALL || 1281 install_type == Extension::NEW_INSTALL ||
1281 NeedsReinstall(id, current_version)); 1282 NeedsReinstall(id, current_version));
1282 } 1283 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extensions_service.h ('k') | chrome/browser/extensions/extensions_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698