Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 561 extension_prefs_->GetAllDelayedInstallInfo()); | 561 extension_prefs_->GetAllDelayedInstallInfo()); |
| 562 UMA_HISTOGRAM_COUNTS_100("Extensions.UpdateOnLoad", | 562 UMA_HISTOGRAM_COUNTS_100("Extensions.UpdateOnLoad", |
| 563 delayed_info2->size() - delayed_info->size()); | 563 delayed_info2->size() - delayed_info->size()); |
| 564 | 564 |
| 565 SetReadyAndNotifyListeners(); | 565 SetReadyAndNotifyListeners(); |
| 566 | 566 |
| 567 // TODO(erikkay) this should probably be deferred to a future point | 567 // TODO(erikkay) this should probably be deferred to a future point |
| 568 // rather than running immediately at startup. | 568 // rather than running immediately at startup. |
| 569 CheckForExternalUpdates(); | 569 CheckForExternalUpdates(); |
| 570 | 570 |
| 571 InstallVerifier* verifier = | |
| 572 extensions::ExtensionSystem::Get(profile_)->install_verifier(); | |
| 573 if (verifier->NeedsBootstrap()) | |
| 574 VerifyAllExtensions(); | |
| 575 | |
| 571 base::MessageLoop::current()->PostDelayedTask( | 576 base::MessageLoop::current()->PostDelayedTask( |
| 572 FROM_HERE, | 577 FROM_HERE, |
| 573 base::Bind(&ExtensionService::GarbageCollectExtensions, AsWeakPtr()), | 578 base::Bind(&ExtensionService::GarbageCollectExtensions, AsWeakPtr()), |
| 574 base::TimeDelta::FromSeconds(kGarbageCollectStartupDelay)); | 579 base::TimeDelta::FromSeconds(kGarbageCollectStartupDelay)); |
| 575 | 580 |
| 576 if (extension_prefs_->NeedsStorageGarbageCollection()) { | 581 if (extension_prefs_->NeedsStorageGarbageCollection()) { |
| 577 GarbageCollectIsolatedStorage(); | 582 GarbageCollectIsolatedStorage(); |
| 578 extension_prefs_->SetNeedsStorageGarbageCollection(false); | 583 extension_prefs_->SetNeedsStorageGarbageCollection(false); |
| 579 } | 584 } |
| 580 system_->management_policy()->RegisterProvider( | 585 system_->management_policy()->RegisterProvider( |
| 581 shared_module_policy_provider_.get()); | 586 shared_module_policy_provider_.get()); |
| 582 } | 587 } |
| 583 | 588 |
| 584 UMA_HISTOGRAM_TIMES("Extensions.ExtensionServiceInitTime", | 589 UMA_HISTOGRAM_TIMES("Extensions.ExtensionServiceInitTime", |
| 585 base::Time::Now() - begin_time); | 590 base::Time::Now() - begin_time); |
| 586 } | 591 } |
| 587 | 592 |
| 593 void ExtensionService::VerifyAllExtensions() { | |
| 594 ExtensionIdSet to_add; | |
| 595 scoped_ptr<ExtensionSet> all_extensions = GenerateInstalledExtensionsSet(); | |
| 596 | |
| 597 for (ExtensionSet::const_iterator i = all_extensions->begin(); | |
| 598 i != all_extensions->end(); ++i) { | |
| 599 const Extension& extension = **i; | |
| 600 | |
| 601 if (extensions::ManifestURL::UpdatesFromGallery(&extension) && | |
| 602 extension.is_extension()) | |
| 603 to_add.insert(extension.id()); | |
| 604 } | |
| 605 extensions::ExtensionSystem::Get(profile_)->install_verifier()->AddMany( | |
| 606 to_add, base::Bind(&ExtensionService::FinishVerifyAllExtensions, | |
| 607 AsWeakPtr())); | |
| 608 } | |
| 609 | |
| 610 void ExtensionService::FinishVerifyAllExtensions(bool success) { | |
| 611 if (success) { | |
| 612 // Check to see if any currently unverified extensions became verified. | |
| 613 InstallVerifier* verifier = | |
| 614 extensions::ExtensionSystem::Get(profile_)->install_verifier(); | |
| 615 for (ExtensionSet::const_iterator i = disabled_extensions_.begin(); | |
| 616 i != disabled_extensions_.end(); ++i) { | |
| 617 const Extension& extension = **i; | |
| 618 int disable_reasons = extension_prefs_->GetDisableReasons(extension.id()); | |
| 619 if (disable_reasons & Extension::DISABLE_NOT_VERIFIED && | |
| 620 !verifier->MustRemainDisabled(&extension, NULL, NULL)) { | |
| 621 extension_prefs_->RemoveDisableReason(extension.id(), | |
| 622 Extension::DISABLE_NOT_VERIFIED); | |
| 623 // Notify interested observers (eg the extensions settings page) by | |
| 624 // sending an UNLOADED notification. | |
| 625 // | |
| 626 // TODO(asargent) - this is a slight hack because it's already | |
| 627 // disabled; the right solution might be to add a separate listener | |
| 628 // interface for DisableReason's changing. | |
|
Finnur
2013/12/16 14:21:51
Log a bug for this?
asargent_no_longer_on_chrome
2013/12/16 18:47:10
Done.
| |
| 629 UnloadedExtensionInfo details(&extension, | |
| 630 UnloadedExtensionInfo::REASON_DISABLE); | |
| 631 content::NotificationService::current()->Notify( | |
| 632 chrome::NOTIFICATION_EXTENSION_UNLOADED, | |
| 633 content::Source<Profile>(profile_), | |
| 634 content::Details<UnloadedExtensionInfo>(&details)); | |
| 635 } | |
| 636 } | |
| 637 // Might disable some extensions. | |
| 638 CheckManagementPolicy(); | |
| 639 } | |
| 640 } | |
| 641 | |
| 588 bool ExtensionService::UpdateExtension(const std::string& id, | 642 bool ExtensionService::UpdateExtension(const std::string& id, |
| 589 const base::FilePath& extension_path, | 643 const base::FilePath& extension_path, |
| 590 const GURL& download_url, | 644 const GURL& download_url, |
| 591 CrxInstaller** out_crx_installer) { | 645 CrxInstaller** out_crx_installer) { |
| 592 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 646 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 593 if (browser_terminating_) { | 647 if (browser_terminating_) { |
| 594 LOG(WARNING) << "Skipping UpdateExtension due to browser shutdown"; | 648 LOG(WARNING) << "Skipping UpdateExtension due to browser shutdown"; |
| 595 // Leak the temp file at extension_path. We don't want to add to the disk | 649 // Leak the temp file at extension_path. We don't want to add to the disk |
| 596 // I/O burden at shutdown, we can't rely on the I/O completing anyway, and | 650 // I/O burden at shutdown, we can't rely on the I/O completing anyway, and |
| 597 // the file is in the OS temp directory which should be cleaned up for us. | 651 // the file is in the OS temp directory which should be cleaned up for us. |
| (...skipping 2191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2789 } | 2843 } |
| 2790 | 2844 |
| 2791 void ExtensionService::AddUpdateObserver(extensions::UpdateObserver* observer) { | 2845 void ExtensionService::AddUpdateObserver(extensions::UpdateObserver* observer) { |
| 2792 update_observers_.AddObserver(observer); | 2846 update_observers_.AddObserver(observer); |
| 2793 } | 2847 } |
| 2794 | 2848 |
| 2795 void ExtensionService::RemoveUpdateObserver( | 2849 void ExtensionService::RemoveUpdateObserver( |
| 2796 extensions::UpdateObserver* observer) { | 2850 extensions::UpdateObserver* observer) { |
| 2797 update_observers_.RemoveObserver(observer); | 2851 update_observers_.RemoveObserver(observer); |
| 2798 } | 2852 } |
| OLD | NEW |