| Index: chrome/browser/extensions/extensions_service.cc
|
| diff --git a/chrome/browser/extensions/extensions_service.cc b/chrome/browser/extensions/extensions_service.cc
|
| index a9f81cab2d77570808c546f1ab7c842405528f43..7960664fbe73bc1307685d2810662330f3db79ec 100644
|
| --- a/chrome/browser/extensions/extensions_service.cc
|
| +++ b/chrome/browser/extensions/extensions_service.cc
|
| @@ -216,22 +216,26 @@ ExtensionsService::ExtensionsService(Profile* profile,
|
| : extension_prefs_(new ExtensionPrefs(profile->GetPrefs())),
|
| backend_loop_(backend_loop),
|
| install_directory_(profile->GetPath().AppendASCII(kInstallDirectoryName)),
|
| - extensions_enabled_(
|
| - CommandLine::ForCurrentProcess()->
|
| - HasSwitch(switches::kEnableExtensions)),
|
| + extensions_enabled_(false),
|
| show_extensions_prompts_(true),
|
| ready_(false) {
|
| // We pass ownership of this object to the Backend.
|
| DictionaryValue* extensions = extension_prefs_->CopyCurrentExtensions();
|
| backend_ = new ExtensionsServiceBackend(
|
| install_directory_, g_browser_process->resource_dispatcher_host(),
|
| - frontend_loop, extensions);
|
| + frontend_loop, extensions, extensions_enabled());
|
| }
|
|
|
| ExtensionsService::~ExtensionsService() {
|
| UnloadAllExtensions();
|
| }
|
|
|
| +void ExtensionsService::SetExtensionsEnabled(bool enabled) {
|
| + extensions_enabled_ = true;
|
| + backend_loop_->PostTask(FROM_HERE, NewRunnableMethod(backend_.get(),
|
| + &ExtensionsServiceBackend::set_extensions_enabled, enabled));
|
| +}
|
| +
|
| void ExtensionsService::Init() {
|
| DCHECK(extensions_.size() == 0);
|
|
|
| @@ -354,13 +358,14 @@ void ExtensionsService::OnLoadedInstalledExtensions() {
|
| void ExtensionsService::OnExtensionsLoaded(ExtensionList* new_extensions) {
|
| scoped_ptr<ExtensionList> cleanup(new_extensions);
|
|
|
| - // Filter out any extensions we don't want to enable. Themes are always
|
| - // enabled, but other extensions are only loaded if --enable-extensions is
|
| - // present.
|
| + // Filter out any extensions that shouldn't be loaded. Themes are always
|
| + // loaded, but other extensions are only loaded if the extensions system is
|
| + // enabled.
|
| ExtensionList enabled_extensions;
|
| for (ExtensionList::iterator iter = new_extensions->begin();
|
| iter != new_extensions->end(); ++iter) {
|
| - if (extensions_enabled() || (*iter)->IsTheme()) {
|
| + if (extensions_enabled() || (*iter)->IsTheme() ||
|
| + (*iter)->location() == Extension::EXTERNAL_REGISTRY) {
|
| Extension* old = GetExtensionById((*iter)->id());
|
| if (old) {
|
| if ((*iter)->version()->CompareTo(*(old->version())) > 0) {
|
| @@ -451,12 +456,14 @@ void ExtensionsService::SetProviderForTesting(
|
|
|
| ExtensionsServiceBackend::ExtensionsServiceBackend(
|
| const FilePath& install_directory, ResourceDispatcherHost* rdh,
|
| - MessageLoop* frontend_loop, DictionaryValue* extension_prefs)
|
| + MessageLoop* frontend_loop, DictionaryValue* extension_prefs,
|
| + bool extensions_enabled)
|
| : frontend_(NULL),
|
| install_directory_(install_directory),
|
| resource_dispatcher_host_(rdh),
|
| alert_on_error_(false),
|
| - frontend_loop_(frontend_loop) {
|
| + frontend_loop_(frontend_loop),
|
| + extensions_enabled_(false) {
|
| external_extension_providers_[Extension::EXTERNAL_PREF] =
|
| linked_ptr<ExternalExtensionProvider>(
|
| new ExternalPrefExtensionProvider(extension_prefs));
|
| @@ -956,28 +963,22 @@ void ExtensionsServiceBackend::OnExtensionUnpacked(
|
| return;
|
| }
|
|
|
| - if (!frontend_->extensions_enabled() && !extension.IsTheme()) {
|
| -#if defined(OS_WIN)
|
| - if (frontend_->show_extensions_prompts()) {
|
| - win_util::MessageBox(GetForegroundWindow(),
|
| - L"Extensions are not enabled. Add --enable-extensions to the "
|
| - L"command-line to enable extensions.\n\n"
|
| - L"This is a temporary message and it will be removed when extensions "
|
| - L"UI is finalized.",
|
| - l10n_util::GetString(IDS_PRODUCT_NAME).c_str(), MB_OK);
|
| - }
|
| -#endif
|
| + Extension::Location location = Extension::INTERNAL;
|
| + LookupExternalExtension(extension.id(), NULL, &location);
|
| +
|
| + // We currently only allow themes and registry-installed extensions to be
|
| + // installed.
|
| + if (!extensions_enabled_ &&
|
| + !extension.IsTheme() &&
|
| + location != Extension::EXTERNAL_REGISTRY) {
|
| ReportExtensionInstallError(extension_path,
|
| - "Extensions are not enabled.");
|
| + "Extensions are not enabled (yet!)");
|
| return;
|
| }
|
|
|
| - Extension::Location location = Extension::INTERNAL;
|
| - LookupExternalExtension(extension.id(), NULL, &location);
|
| #if defined(OS_WIN)
|
| - bool from_external = Extension::IsExternalLocation(location);
|
| -
|
| - if (!extension.IsTheme() && !from_external &&
|
| + if (!extension.IsTheme() &&
|
| + !Extension::IsExternalLocation(location) &&
|
| frontend_->show_extensions_prompts() &&
|
| win_util::MessageBox(GetForegroundWindow(),
|
| L"Are you sure you want to install this extension?\n\n"
|
|
|