| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <iterator> | 8 #include <iterator> |
| 9 #include <set> | 9 #include <set> |
| 10 | 10 |
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 } | 405 } |
| 406 | 406 |
| 407 component_loader_.reset( | 407 component_loader_.reset( |
| 408 new extensions::ComponentLoader(this, | 408 new extensions::ComponentLoader(this, |
| 409 profile->GetPrefs(), | 409 profile->GetPrefs(), |
| 410 g_browser_process->local_state())); | 410 g_browser_process->local_state())); |
| 411 | 411 |
| 412 app_notification_manager_->Init(); | 412 app_notification_manager_->Init(); |
| 413 | 413 |
| 414 if (extensions_enabled_) { | 414 if (extensions_enabled_) { |
| 415 if (!command_line->HasSwitch(switches::kImport) && | 415 CHECK(!ProfileManager::IsImportProcess(*command_line)); |
| 416 !command_line->HasSwitch(switches::kImportFromFile)) { | 416 extensions::ExternalProviderImpl::CreateExternalProviders( |
| 417 extensions::ExternalProviderImpl::CreateExternalProviders( | 417 this, profile_, &external_extension_providers_); |
| 418 this, profile_, &external_extension_providers_); | |
| 419 } | |
| 420 } | 418 } |
| 421 | 419 |
| 422 // Set this as the ExtensionService for extension sorting to ensure it | 420 // Set this as the ExtensionService for extension sorting to ensure it |
| 423 // cause syncs if required. | 421 // cause syncs if required. |
| 424 extension_prefs_->extension_sorting()->SetExtensionService(this); | 422 extension_prefs_->extension_sorting()->SetExtensionService(this); |
| 425 | 423 |
| 426 #if defined(ENABLE_EXTENSIONS) | 424 #if defined(ENABLE_EXTENSIONS) |
| 427 extension_action_storage_manager_.reset( | 425 extension_action_storage_manager_.reset( |
| 428 new extensions::ExtensionActionStorageManager(profile_)); | 426 new extensions::ExtensionActionStorageManager(profile_)); |
| 429 #endif | 427 #endif |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 | 495 |
| 498 void ExtensionService::RegisterForImportFinished() { | 496 void ExtensionService::RegisterForImportFinished() { |
| 499 if (!registrar_.IsRegistered(this, chrome::NOTIFICATION_IMPORT_FINISHED, | 497 if (!registrar_.IsRegistered(this, chrome::NOTIFICATION_IMPORT_FINISHED, |
| 500 content::Source<Profile>(profile_))) { | 498 content::Source<Profile>(profile_))) { |
| 501 registrar_.Add(this, chrome::NOTIFICATION_IMPORT_FINISHED, | 499 registrar_.Add(this, chrome::NOTIFICATION_IMPORT_FINISHED, |
| 502 content::Source<Profile>(profile_)); | 500 content::Source<Profile>(profile_)); |
| 503 } | 501 } |
| 504 } | 502 } |
| 505 | 503 |
| 506 void ExtensionService::InitAfterImport() { | 504 void ExtensionService::InitAfterImport() { |
| 505 component_loader_->BulkLoadDeferred(); |
| 506 |
| 507 CheckForExternalUpdates(); | 507 CheckForExternalUpdates(); |
| 508 | 508 |
| 509 GarbageCollectExtensions(); | 509 GarbageCollectExtensions(); |
| 510 | 510 |
| 511 // Idempotent, so although there is a possible race if the import | 511 // Idempotent, so although there is a possible race if the import |
| 512 // process finished sometime in the middle of ProfileImpl::InitExtensions, | 512 // process finished sometime in the middle of ProfileImpl::InitExtensions, |
| 513 // it cannot happen twice. | 513 // it cannot happen twice. |
| 514 InitEventRouters(); | 514 InitEventRouters(); |
| 515 } | 515 } |
| 516 | 516 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 } | 584 } |
| 585 return NULL; | 585 return NULL; |
| 586 } | 586 } |
| 587 | 587 |
| 588 void ExtensionService::Init() { | 588 void ExtensionService::Init() { |
| 589 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 589 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 590 | 590 |
| 591 DCHECK(!ready_); // Can't redo init. | 591 DCHECK(!ready_); // Can't redo init. |
| 592 DCHECK_EQ(extensions_.size(), 0u); | 592 DCHECK_EQ(extensions_.size(), 0u); |
| 593 | 593 |
| 594 CHECK(!ProfileManager::IsImportProcess(*CommandLine::ForCurrentProcess())); |
| 595 |
| 594 // TODO(mek): It might be cleaner to do the FinishDelayedInstallInfo stuff | 596 // TODO(mek): It might be cleaner to do the FinishDelayedInstallInfo stuff |
| 595 // here instead of in installedloader. | 597 // here instead of in installedloader. |
| 596 component_loader_->LoadAll(); | 598 if (g_browser_process->profile_manager() && |
| 597 extensions::InstalledLoader(this).LoadAllExtensions(); | 599 g_browser_process->profile_manager()->will_import()) { |
| 600 |
| 601 // Defer component extensions with background pages, since they may conflict |
| 602 // with the import process. |
| 603 component_loader_->BulkLoadDeferBackgroundPages(); |
| 604 extensions::InstalledLoader(this).LoadAllExtensions(); |
| 605 RegisterForImportFinished(); |
| 606 } else { |
| 607 component_loader_->BulkLoadAll(); |
| 608 extensions::InstalledLoader(this).LoadAllExtensions(); |
| 609 |
| 610 // TODO(erikkay) this should probably be deferred to a future point |
| 611 // rather than running immediately at startup. |
| 612 CheckForExternalUpdates(); |
| 613 |
| 614 // TODO(erikkay) this should probably be deferred as well. |
| 615 GarbageCollectExtensions(); |
| 616 } |
| 598 | 617 |
| 599 // The Sideload Wipeout effort takes place during load (see above), so once | 618 // The Sideload Wipeout effort takes place during load (see above), so once |
| 600 // that is done the flag can be set so that we don't have to check again. | 619 // that is done the flag can be set so that we don't have to check again. |
| 601 if (wipeout_is_active_) { | 620 if (wipeout_is_active_) { |
| 602 extension_prefs_->SetSideloadWipeoutDone(); | 621 extension_prefs_->SetSideloadWipeoutDone(); |
| 603 wipeout_is_active_ = false; // Wipeout is only on during load. | 622 wipeout_is_active_ = false; // Wipeout is only on during load. |
| 604 } | 623 } |
| 605 | 624 |
| 606 // If we are running in the import process, don't bother initializing the | |
| 607 // extension service since this can interfere with the main browser process | |
| 608 // that is already running an extension service for this profile. | |
| 609 // TODO(aa): can we start up even less of ExtensionService? | |
| 610 // http://crbug.com/107636 | |
| 611 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kImport) && | |
| 612 !CommandLine::ForCurrentProcess()->HasSwitch(switches::kImportFromFile)) { | |
| 613 if (g_browser_process->profile_manager() && | |
| 614 g_browser_process->profile_manager()->will_import()) { | |
| 615 RegisterForImportFinished(); | |
| 616 } else { | |
| 617 // TODO(erikkay) this should probably be deferred to a future point | |
| 618 // rather than running immediately at startup. | |
| 619 CheckForExternalUpdates(); | |
| 620 | |
| 621 // TODO(erikkay) this should probably be deferred as well. | |
| 622 GarbageCollectExtensions(); | |
| 623 } | |
| 624 } | |
| 625 | |
| 626 if (extension_prefs_->NeedsStorageGarbageCollection()) { | 625 if (extension_prefs_->NeedsStorageGarbageCollection()) { |
| 627 GarbageCollectIsolatedStorage(); | 626 GarbageCollectIsolatedStorage(); |
| 628 extension_prefs_->SetNeedsStorageGarbageCollection(false); | 627 extension_prefs_->SetNeedsStorageGarbageCollection(false); |
| 629 } | 628 } |
| 630 } | 629 } |
| 631 | 630 |
| 632 bool ExtensionService::UpdateExtension(const std::string& id, | 631 bool ExtensionService::UpdateExtension(const std::string& id, |
| 633 const FilePath& extension_path, | 632 const FilePath& extension_path, |
| 634 const GURL& download_url, | 633 const GURL& download_url, |
| 635 CrxInstaller** out_crx_installer) { | 634 CrxInstaller** out_crx_installer) { |
| (...skipping 1372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2008 terminated_extensions_.Clear(); | 2007 terminated_extensions_.Clear(); |
| 2009 extension_runtime_data_.clear(); | 2008 extension_runtime_data_.clear(); |
| 2010 | 2009 |
| 2011 // TODO(erikkay) should there be a notification for this? We can't use | 2010 // TODO(erikkay) should there be a notification for this? We can't use |
| 2012 // EXTENSION_UNLOADED since that implies that the extension has been disabled | 2011 // EXTENSION_UNLOADED since that implies that the extension has been disabled |
| 2013 // or uninstalled, and UnloadAll is just part of shutdown. | 2012 // or uninstalled, and UnloadAll is just part of shutdown. |
| 2014 } | 2013 } |
| 2015 | 2014 |
| 2016 void ExtensionService::ReloadExtensions() { | 2015 void ExtensionService::ReloadExtensions() { |
| 2017 UnloadAllExtensions(); | 2016 UnloadAllExtensions(); |
| 2018 component_loader_->LoadAll(); | 2017 component_loader_->BulkLoadAll(); |
| 2019 extensions::InstalledLoader(this).LoadAllExtensions(); | 2018 extensions::InstalledLoader(this).LoadAllExtensions(); |
| 2020 } | 2019 } |
| 2021 | 2020 |
| 2022 void ExtensionService::GarbageCollectExtensions() { | 2021 void ExtensionService::GarbageCollectExtensions() { |
| 2023 if (extension_prefs_->pref_service()->ReadOnly()) | 2022 if (extension_prefs_->pref_service()->ReadOnly()) |
| 2024 return; | 2023 return; |
| 2025 | 2024 |
| 2026 if (pending_extension_manager()->HasPendingExtensions()) { | 2025 if (pending_extension_manager()->HasPendingExtensions()) { |
| 2027 // Don't garbage collect while there are pending installations, which may | 2026 // Don't garbage collect while there are pending installations, which may |
| 2028 // be using the temporary installation directory. Try to garbage collect | 2027 // be using the temporary installation directory. Try to garbage collect |
| (...skipping 1120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3149 scoped_refptr<const Extension> extension = GetInstalledExtension(*it); | 3148 scoped_refptr<const Extension> extension = GetInstalledExtension(*it); |
| 3150 DCHECK(extension); | 3149 DCHECK(extension); |
| 3151 if (!extension) | 3150 if (!extension) |
| 3152 continue; | 3151 continue; |
| 3153 blacklisted_extensions_.Insert(extension); | 3152 blacklisted_extensions_.Insert(extension); |
| 3154 UnloadExtension(*it, extension_misc::UNLOAD_REASON_BLACKLIST); | 3153 UnloadExtension(*it, extension_misc::UNLOAD_REASON_BLACKLIST); |
| 3155 } | 3154 } |
| 3156 | 3155 |
| 3157 IdentifyAlertableExtensions(); | 3156 IdentifyAlertableExtensions(); |
| 3158 } | 3157 } |
| OLD | NEW |