| 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 648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 creation_flags |= Extension::WAS_INSTALLED_BY_DEFAULT; | 659 creation_flags |= Extension::WAS_INSTALLED_BY_DEFAULT; |
| 660 | 660 |
| 661 installer->set_creation_flags(creation_flags); | 661 installer->set_creation_flags(creation_flags); |
| 662 | 662 |
| 663 installer->set_delete_source(true); | 663 installer->set_delete_source(true); |
| 664 installer->set_download_url(download_url); | 664 installer->set_download_url(download_url); |
| 665 installer->set_install_cause(extension_misc::INSTALL_CAUSE_UPDATE); | 665 installer->set_install_cause(extension_misc::INSTALL_CAUSE_UPDATE); |
| 666 installer->InstallCrx(extension_path); | 666 installer->InstallCrx(extension_path); |
| 667 | 667 |
| 668 if (out_crx_installer) | 668 if (out_crx_installer) |
| 669 *out_crx_installer = installer; | 669 *out_crx_installer = installer.get(); |
| 670 | 670 |
| 671 return true; | 671 return true; |
| 672 } | 672 } |
| 673 | 673 |
| 674 void ExtensionService::ReloadExtension(const std::string& extension_id) { | 674 void ExtensionService::ReloadExtension(const std::string& extension_id) { |
| 675 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 675 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 676 | 676 |
| 677 // If the extension is already reloading, don't reload again. | 677 // If the extension is already reloading, don't reload again. |
| 678 if (extension_prefs_->GetDisableReasons(extension_id) & | 678 if (extension_prefs_->GetDisableReasons(extension_id) & |
| 679 Extension::DISABLE_RELOAD) { | 679 Extension::DISABLE_RELOAD) { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 | 737 |
| 738 bool ExtensionService::UninstallExtension( | 738 bool ExtensionService::UninstallExtension( |
| 739 std::string extension_id, | 739 std::string extension_id, |
| 740 bool external_uninstall, | 740 bool external_uninstall, |
| 741 string16* error) { | 741 string16* error) { |
| 742 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 742 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 743 | 743 |
| 744 scoped_refptr<const Extension> extension(GetInstalledExtension(extension_id)); | 744 scoped_refptr<const Extension> extension(GetInstalledExtension(extension_id)); |
| 745 | 745 |
| 746 // Callers should not send us nonexistent extensions. | 746 // Callers should not send us nonexistent extensions. |
| 747 CHECK(extension); | 747 CHECK(extension.get()); |
| 748 | 748 |
| 749 // Policy change which triggers an uninstall will always set | 749 // Policy change which triggers an uninstall will always set |
| 750 // |external_uninstall| to true so this is the only way to uninstall | 750 // |external_uninstall| to true so this is the only way to uninstall |
| 751 // managed extensions. | 751 // managed extensions. |
| 752 if (!external_uninstall && | 752 if (!external_uninstall && |
| 753 !system_->management_policy()->UserMayModifySettings( | 753 !system_->management_policy()->UserMayModifySettings( |
| 754 extension.get(), error)) { | 754 extension.get(), error)) { |
| 755 content::NotificationService::current()->Notify( | 755 content::NotificationService::current()->Notify( |
| 756 chrome::NOTIFICATION_EXTENSION_UNINSTALL_NOT_ALLOWED, | 756 chrome::NOTIFICATION_EXTENSION_UNINSTALL_NOT_ALLOWED, |
| 757 content::Source<Profile>(profile_), | 757 content::Source<Profile>(profile_), |
| 758 content::Details<const Extension>(extension)); | 758 content::Details<const Extension>(extension.get())); |
| 759 return false; | 759 return false; |
| 760 } | 760 } |
| 761 | 761 |
| 762 // Extract the data we need for sync now, but don't actually sync until we've | 762 // Extract the data we need for sync now, but don't actually sync until we've |
| 763 // completed the uninstallation. | 763 // completed the uninstallation. |
| 764 syncer::SyncChange sync_change; | 764 syncer::SyncChange sync_change; |
| 765 if (app_sync_bundle_.HandlesApp(*extension)) { | 765 if (app_sync_bundle_.HandlesApp(*extension.get())) { |
| 766 sync_change = app_sync_bundle_.CreateSyncChangeToDelete(extension); | 766 sync_change = app_sync_bundle_.CreateSyncChangeToDelete(extension.get()); |
| 767 } else if (extension_sync_bundle_.HandlesExtension(*extension)) { | 767 } else if (extension_sync_bundle_.HandlesExtension(*extension.get())) { |
| 768 sync_change = extension_sync_bundle_.CreateSyncChangeToDelete(extension); | 768 sync_change = |
| 769 extension_sync_bundle_.CreateSyncChangeToDelete(extension.get()); |
| 769 } | 770 } |
| 770 | 771 |
| 771 if (IsUnacknowledgedExternalExtension(extension)) { | 772 if (IsUnacknowledgedExternalExtension(extension.get())) { |
| 772 UMA_HISTOGRAM_ENUMERATION("Extensions.ExternalExtensionEvent", | 773 UMA_HISTOGRAM_ENUMERATION("Extensions.ExternalExtensionEvent", |
| 773 EXTERNAL_EXTENSION_UNINSTALLED, | 774 EXTERNAL_EXTENSION_UNINSTALLED, |
| 774 EXTERNAL_EXTENSION_BUCKET_BOUNDARY); | 775 EXTERNAL_EXTENSION_BUCKET_BOUNDARY); |
| 775 } | 776 } |
| 776 UMA_HISTOGRAM_ENUMERATION("Extensions.UninstallType", | 777 UMA_HISTOGRAM_ENUMERATION("Extensions.UninstallType", |
| 777 extension->GetType(), 100); | 778 extension->GetType(), 100); |
| 778 RecordPermissionMessagesHistogram( | 779 RecordPermissionMessagesHistogram(extension.get(), |
| 779 extension, "Extensions.Permissions_Uninstall"); | 780 "Extensions.Permissions_Uninstall"); |
| 780 | 781 |
| 781 // Unload before doing more cleanup to ensure that nothing is hanging on to | 782 // Unload before doing more cleanup to ensure that nothing is hanging on to |
| 782 // any of these resources. | 783 // any of these resources. |
| 783 UnloadExtension(extension_id, extension_misc::UNLOAD_REASON_UNINSTALL); | 784 UnloadExtension(extension_id, extension_misc::UNLOAD_REASON_UNINSTALL); |
| 784 | 785 |
| 785 extension_prefs_->OnExtensionUninstalled(extension_id, extension->location(), | 786 extension_prefs_->OnExtensionUninstalled(extension_id, extension->location(), |
| 786 external_uninstall); | 787 external_uninstall); |
| 787 | 788 |
| 788 // Tell the backend to start deleting installed extensions on the file thread. | 789 // Tell the backend to start deleting installed extensions on the file thread. |
| 789 if (!Manifest::IsUnpackedLocation(extension->location())) { | 790 if (!Manifest::IsUnpackedLocation(extension->location())) { |
| 790 if (!GetFileTaskRunner()->PostTask( | 791 if (!GetFileTaskRunner()->PostTask( |
| 791 FROM_HERE, | 792 FROM_HERE, |
| 792 base::Bind( | 793 base::Bind( |
| 793 &extension_file_util::UninstallExtension, | 794 &extension_file_util::UninstallExtension, |
| 794 install_directory_, | 795 install_directory_, |
| 795 extension_id))) | 796 extension_id))) |
| 796 NOTREACHED(); | 797 NOTREACHED(); |
| 797 } | 798 } |
| 798 | 799 |
| 799 GURL launch_web_url_origin(extension->launch_web_url()); | 800 GURL launch_web_url_origin(extension->launch_web_url()); |
| 800 launch_web_url_origin = launch_web_url_origin.GetOrigin(); | 801 launch_web_url_origin = launch_web_url_origin.GetOrigin(); |
| 801 bool is_storage_isolated = | 802 bool is_storage_isolated = |
| 802 extensions::AppIsolationInfo::HasIsolatedStorage(extension); | 803 extensions::AppIsolationInfo::HasIsolatedStorage(extension.get()); |
| 803 | 804 |
| 804 if (is_storage_isolated) { | 805 if (is_storage_isolated) { |
| 805 BrowserContext::AsyncObliterateStoragePartition( | 806 BrowserContext::AsyncObliterateStoragePartition( |
| 806 profile_, | 807 profile_, |
| 807 GetSiteForExtensionId(extension_id), | 808 GetSiteForExtensionId(extension_id), |
| 808 base::Bind(&ExtensionService::OnNeedsToGarbageCollectIsolatedStorage, | 809 base::Bind(&ExtensionService::OnNeedsToGarbageCollectIsolatedStorage, |
| 809 AsWeakPtr())); | 810 AsWeakPtr())); |
| 810 } else { | 811 } else { |
| 811 if (extension->is_hosted_app() && | 812 if (extension->is_hosted_app() && |
| 812 !profile_->GetExtensionSpecialStoragePolicy()-> | 813 !profile_->GetExtensionSpecialStoragePolicy()-> |
| 813 IsStorageProtected(launch_web_url_origin)) { | 814 IsStorageProtected(launch_web_url_origin)) { |
| 814 extensions::DataDeleter::StartDeleting( | 815 extensions::DataDeleter::StartDeleting( |
| 815 profile_, extension_id, launch_web_url_origin); | 816 profile_, extension_id, launch_web_url_origin); |
| 816 } | 817 } |
| 817 extensions::DataDeleter::StartDeleting(profile_, extension_id, | 818 extensions::DataDeleter::StartDeleting(profile_, extension_id, |
| 818 extension->url()); | 819 extension->url()); |
| 819 } | 820 } |
| 820 | 821 |
| 821 UntrackTerminatedExtension(extension_id); | 822 UntrackTerminatedExtension(extension_id); |
| 822 | 823 |
| 823 // Notify interested parties that we've uninstalled this extension. | 824 // Notify interested parties that we've uninstalled this extension. |
| 824 content::NotificationService::current()->Notify( | 825 content::NotificationService::current()->Notify( |
| 825 chrome::NOTIFICATION_EXTENSION_UNINSTALLED, | 826 chrome::NOTIFICATION_EXTENSION_UNINSTALLED, |
| 826 content::Source<Profile>(profile_), | 827 content::Source<Profile>(profile_), |
| 827 content::Details<const Extension>(extension)); | 828 content::Details<const Extension>(extension.get())); |
| 828 | 829 |
| 829 if (app_sync_bundle_.HasExtensionId(extension_id) && | 830 if (app_sync_bundle_.HasExtensionId(extension_id) && |
| 830 sync_change.sync_data().GetDataType() == syncer::APPS) { | 831 sync_change.sync_data().GetDataType() == syncer::APPS) { |
| 831 app_sync_bundle_.ProcessDeletion(extension_id, sync_change); | 832 app_sync_bundle_.ProcessDeletion(extension_id, sync_change); |
| 832 } else if (extension_sync_bundle_.HasExtensionId(extension_id) && | 833 } else if (extension_sync_bundle_.HasExtensionId(extension_id) && |
| 833 sync_change.sync_data().GetDataType() == syncer::EXTENSIONS) { | 834 sync_change.sync_data().GetDataType() == syncer::EXTENSIONS) { |
| 834 extension_sync_bundle_.ProcessDeletion(extension_id, sync_change); | 835 extension_sync_bundle_.ProcessDeletion(extension_id, sync_change); |
| 835 } | 836 } |
| 836 | 837 |
| 837 delayed_updates_for_idle_.Remove(extension_id); | 838 delayed_updates_for_idle_.Remove(extension_id); |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1129 | 1130 |
| 1130 extensions::ContentSettingsStore* ExtensionService::GetContentSettingsStore() { | 1131 extensions::ContentSettingsStore* ExtensionService::GetContentSettingsStore() { |
| 1131 return extension_prefs()->content_settings_store(); | 1132 return extension_prefs()->content_settings_store(); |
| 1132 } | 1133 } |
| 1133 | 1134 |
| 1134 bool ExtensionService::is_ready() { | 1135 bool ExtensionService::is_ready() { |
| 1135 return ready_->is_signaled(); | 1136 return ready_->is_signaled(); |
| 1136 } | 1137 } |
| 1137 | 1138 |
| 1138 base::SequencedTaskRunner* ExtensionService::GetFileTaskRunner() { | 1139 base::SequencedTaskRunner* ExtensionService::GetFileTaskRunner() { |
| 1139 if (file_task_runner_) | 1140 if (file_task_runner_.get()) |
| 1140 return file_task_runner_; | 1141 return file_task_runner_.get(); |
| 1141 | 1142 |
| 1142 // We should be able to interrupt any part of extension install process during | 1143 // We should be able to interrupt any part of extension install process during |
| 1143 // shutdown. SKIP_ON_SHUTDOWN ensures that not started extension install tasks | 1144 // shutdown. SKIP_ON_SHUTDOWN ensures that not started extension install tasks |
| 1144 // will be ignored/deleted while we will block on started tasks. | 1145 // will be ignored/deleted while we will block on started tasks. |
| 1145 std::string token("ext_install-"); | 1146 std::string token("ext_install-"); |
| 1146 token.append(profile_->GetPath().AsUTF8Unsafe()); | 1147 token.append(profile_->GetPath().AsUTF8Unsafe()); |
| 1147 file_task_runner_ = BrowserThread::GetBlockingPool()-> | 1148 file_task_runner_ = BrowserThread::GetBlockingPool()-> |
| 1148 GetSequencedTaskRunnerWithShutdownBehavior( | 1149 GetSequencedTaskRunnerWithShutdownBehavior( |
| 1149 BrowserThread::GetBlockingPool()->GetNamedSequenceToken(token), | 1150 BrowserThread::GetBlockingPool()->GetNamedSequenceToken(token), |
| 1150 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); | 1151 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); |
| 1151 return file_task_runner_; | 1152 return file_task_runner_.get(); |
| 1152 } | 1153 } |
| 1153 | 1154 |
| 1154 extensions::ExtensionUpdater* ExtensionService::updater() { | 1155 extensions::ExtensionUpdater* ExtensionService::updater() { |
| 1155 return updater_.get(); | 1156 return updater_.get(); |
| 1156 } | 1157 } |
| 1157 | 1158 |
| 1158 void ExtensionService::CheckManagementPolicy() { | 1159 void ExtensionService::CheckManagementPolicy() { |
| 1159 std::vector<std::string> to_be_removed; | 1160 std::vector<std::string> to_be_removed; |
| 1160 | 1161 |
| 1161 // Loop through extensions list, unload installed extensions. | 1162 // Loop through extensions list, unload installed extensions. |
| (...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1794 void ExtensionService::UnloadExtension( | 1795 void ExtensionService::UnloadExtension( |
| 1795 const std::string& extension_id, | 1796 const std::string& extension_id, |
| 1796 extension_misc::UnloadedExtensionReason reason) { | 1797 extension_misc::UnloadedExtensionReason reason) { |
| 1797 // Make sure the extension gets deleted after we return from this function. | 1798 // Make sure the extension gets deleted after we return from this function. |
| 1798 int include_mask = INCLUDE_EVERYTHING & ~INCLUDE_TERMINATED; | 1799 int include_mask = INCLUDE_EVERYTHING & ~INCLUDE_TERMINATED; |
| 1799 scoped_refptr<const Extension> extension( | 1800 scoped_refptr<const Extension> extension( |
| 1800 GetExtensionById(extension_id, include_mask)); | 1801 GetExtensionById(extension_id, include_mask)); |
| 1801 | 1802 |
| 1802 // This method can be called via PostTask, so the extension may have been | 1803 // This method can be called via PostTask, so the extension may have been |
| 1803 // unloaded by the time this runs. | 1804 // unloaded by the time this runs. |
| 1804 if (!extension) { | 1805 if (!extension.get()) { |
| 1805 // In case the extension may have crashed/uninstalled. Allow the profile to | 1806 // In case the extension may have crashed/uninstalled. Allow the profile to |
| 1806 // clean up its RequestContexts. | 1807 // clean up its RequestContexts. |
| 1807 system_->UnregisterExtensionWithRequestContexts(extension_id, reason); | 1808 system_->UnregisterExtensionWithRequestContexts(extension_id, reason); |
| 1808 return; | 1809 return; |
| 1809 } | 1810 } |
| 1810 | 1811 |
| 1811 // If uninstalling let RuntimeEventRouter know. | 1812 // If uninstalling let RuntimeEventRouter know. |
| 1812 if (reason == extension_misc::UNLOAD_REASON_UNINSTALL) | 1813 if (reason == extension_misc::UNLOAD_REASON_UNINSTALL) |
| 1813 extensions::RuntimeEventRouter::OnExtensionUninstalled( | 1814 extensions::RuntimeEventRouter::OnExtensionUninstalled( |
| 1814 profile_, extension_id); | 1815 profile_, extension_id); |
| 1815 | 1816 |
| 1816 // Keep information about the extension so that we can reload it later | 1817 // Keep information about the extension so that we can reload it later |
| 1817 // even if it's not permanently installed. | 1818 // even if it's not permanently installed. |
| 1818 unloaded_extension_paths_[extension->id()] = extension->path(); | 1819 unloaded_extension_paths_[extension->id()] = extension->path(); |
| 1819 | 1820 |
| 1820 // Clean up if the extension is meant to be enabled after a reload. | 1821 // Clean up if the extension is meant to be enabled after a reload. |
| 1821 reloading_extensions_.erase(extension->id()); | 1822 reloading_extensions_.erase(extension->id()); |
| 1822 | 1823 |
| 1823 // Clean up runtime data. | 1824 // Clean up runtime data. |
| 1824 extension_runtime_data_.erase(extension_id); | 1825 extension_runtime_data_.erase(extension_id); |
| 1825 | 1826 |
| 1826 if (disabled_extensions_.Contains(extension->id())) { | 1827 if (disabled_extensions_.Contains(extension->id())) { |
| 1827 UnloadedExtensionInfo details(extension, reason); | 1828 UnloadedExtensionInfo details(extension.get(), reason); |
| 1828 details.already_disabled = true; | 1829 details.already_disabled = true; |
| 1829 disabled_extensions_.Remove(extension->id()); | 1830 disabled_extensions_.Remove(extension->id()); |
| 1830 content::NotificationService::current()->Notify( | 1831 content::NotificationService::current()->Notify( |
| 1831 chrome::NOTIFICATION_EXTENSION_UNLOADED, | 1832 chrome::NOTIFICATION_EXTENSION_UNLOADED, |
| 1832 content::Source<Profile>(profile_), | 1833 content::Source<Profile>(profile_), |
| 1833 content::Details<UnloadedExtensionInfo>(&details)); | 1834 content::Details<UnloadedExtensionInfo>(&details)); |
| 1834 // Make sure the profile cleans up its RequestContexts when an already | 1835 // Make sure the profile cleans up its RequestContexts when an already |
| 1835 // disabled extension is unloaded (since they are also tracking the disabled | 1836 // disabled extension is unloaded (since they are also tracking the disabled |
| 1836 // extensions). | 1837 // extensions). |
| 1837 system_->UnregisterExtensionWithRequestContexts(extension_id, reason); | 1838 system_->UnregisterExtensionWithRequestContexts(extension_id, reason); |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2038 AddExtension(extension); | 2039 AddExtension(extension); |
| 2039 } | 2040 } |
| 2040 | 2041 |
| 2041 void ExtensionService::UpdateActivePermissions(const Extension* extension) { | 2042 void ExtensionService::UpdateActivePermissions(const Extension* extension) { |
| 2042 // If the extension has used the optional permissions API, it will have a | 2043 // If the extension has used the optional permissions API, it will have a |
| 2043 // custom set of active permissions defined in the extension prefs. Here, | 2044 // custom set of active permissions defined in the extension prefs. Here, |
| 2044 // we update the extension's active permissions based on the prefs. | 2045 // we update the extension's active permissions based on the prefs. |
| 2045 scoped_refptr<PermissionSet> active_permissions = | 2046 scoped_refptr<PermissionSet> active_permissions = |
| 2046 extension_prefs()->GetActivePermissions(extension->id()); | 2047 extension_prefs()->GetActivePermissions(extension->id()); |
| 2047 | 2048 |
| 2048 if (active_permissions) { | 2049 if (active_permissions.get()) { |
| 2049 // We restrict the active permissions to be within the bounds defined in the | 2050 // We restrict the active permissions to be within the bounds defined in the |
| 2050 // extension's manifest. | 2051 // extension's manifest. |
| 2051 // a) active permissions must be a subset of optional + default permissions | 2052 // a) active permissions must be a subset of optional + default permissions |
| 2052 // b) active permissions must contains all default permissions | 2053 // b) active permissions must contains all default permissions |
| 2053 scoped_refptr<PermissionSet> total_permissions = | 2054 scoped_refptr<PermissionSet> total_permissions = |
| 2054 PermissionSet::CreateUnion( | 2055 PermissionSet::CreateUnion( |
| 2055 extensions::PermissionsData::GetRequiredPermissions(extension), | 2056 extensions::PermissionsData::GetRequiredPermissions(extension), |
| 2056 extensions::PermissionsData::GetOptionalPermissions(extension)); | 2057 extensions::PermissionsData::GetOptionalPermissions(extension)); |
| 2057 | 2058 |
| 2058 // Make sure the active permissions contain no more than optional + default. | 2059 // Make sure the active permissions contain no more than optional + default. |
| 2059 scoped_refptr<PermissionSet> adjusted_active = | 2060 scoped_refptr<PermissionSet> adjusted_active = |
| 2060 PermissionSet::CreateIntersection( | 2061 PermissionSet::CreateIntersection( |
| 2061 total_permissions.get(), active_permissions.get()); | 2062 total_permissions.get(), active_permissions.get()); |
| 2062 | 2063 |
| 2063 // Make sure the active permissions contain the default permissions. | 2064 // Make sure the active permissions contain the default permissions. |
| 2064 adjusted_active = PermissionSet::CreateUnion( | 2065 adjusted_active = PermissionSet::CreateUnion( |
| 2065 extensions::PermissionsData::GetRequiredPermissions(extension), | 2066 extensions::PermissionsData::GetRequiredPermissions(extension), |
| 2066 adjusted_active.get()); | 2067 adjusted_active.get()); |
| 2067 | 2068 |
| 2068 extensions::PermissionsUpdater perms_updater(profile()); | 2069 extensions::PermissionsUpdater perms_updater(profile()); |
| 2069 perms_updater.UpdateActivePermissions(extension, adjusted_active); | 2070 perms_updater.UpdateActivePermissions(extension, adjusted_active.get()); |
| 2070 } | 2071 } |
| 2071 } | 2072 } |
| 2072 | 2073 |
| 2073 void ExtensionService::CheckPermissionsIncrease(const Extension* extension, | 2074 void ExtensionService::CheckPermissionsIncrease(const Extension* extension, |
| 2074 bool is_extension_upgrade) { | 2075 bool is_extension_upgrade) { |
| 2075 UpdateActivePermissions(extension); | 2076 UpdateActivePermissions(extension); |
| 2076 | 2077 |
| 2077 // We keep track of all permissions the user has granted each extension. | 2078 // We keep track of all permissions the user has granted each extension. |
| 2078 // This allows extensions to gracefully support backwards compatibility | 2079 // This allows extensions to gracefully support backwards compatibility |
| 2079 // by including unknown permissions in their manifests. When the user | 2080 // by including unknown permissions in their manifests. When the user |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2309 if (!IsExtensionIdle(extension_id)) | 2310 if (!IsExtensionIdle(extension_id)) |
| 2310 return; | 2311 return; |
| 2311 | 2312 |
| 2312 FinishDelayedInstallation(extension_id); | 2313 FinishDelayedInstallation(extension_id); |
| 2313 } | 2314 } |
| 2314 | 2315 |
| 2315 void ExtensionService::FinishDelayedInstallation( | 2316 void ExtensionService::FinishDelayedInstallation( |
| 2316 const std::string& extension_id) { | 2317 const std::string& extension_id) { |
| 2317 scoped_refptr<const Extension> extension( | 2318 scoped_refptr<const Extension> extension( |
| 2318 GetPendingExtensionUpdate(extension_id)); | 2319 GetPendingExtensionUpdate(extension_id)); |
| 2319 CHECK(extension); | 2320 CHECK(extension.get()); |
| 2320 delayed_updates_for_idle_.Remove(extension_id); | 2321 delayed_updates_for_idle_.Remove(extension_id); |
| 2321 | 2322 |
| 2322 if (!extension_prefs_->FinishDelayedInstallInfo(extension_id)) | 2323 if (!extension_prefs_->FinishDelayedInstallInfo(extension_id)) |
| 2323 NOTREACHED(); | 2324 NOTREACHED(); |
| 2324 | 2325 |
| 2325 FinishInstallation(extension); | 2326 FinishInstallation(extension.get()); |
| 2326 } | 2327 } |
| 2327 | 2328 |
| 2328 void ExtensionService::FinishInstallation(const Extension* extension) { | 2329 void ExtensionService::FinishInstallation(const Extension* extension) { |
| 2329 const extensions::Extension* existing_extension = | 2330 const extensions::Extension* existing_extension = |
| 2330 GetInstalledExtension(extension->id()); | 2331 GetInstalledExtension(extension->id()); |
| 2331 bool is_update = false; | 2332 bool is_update = false; |
| 2332 std::string old_name; | 2333 std::string old_name; |
| 2333 if (existing_extension) { | 2334 if (existing_extension) { |
| 2334 is_update = true; | 2335 is_update = true; |
| 2335 old_name = existing_extension->name(); | 2336 old_name = existing_extension->name(); |
| (...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2850 std::set<std::string> not_yet_blacklisted; | 2851 std::set<std::string> not_yet_blacklisted; |
| 2851 std::set_difference(new_blacklisted_ids.begin(), new_blacklisted_ids.end(), | 2852 std::set_difference(new_blacklisted_ids.begin(), new_blacklisted_ids.end(), |
| 2852 old_blacklisted_ids.begin(), old_blacklisted_ids.end(), | 2853 old_blacklisted_ids.begin(), old_blacklisted_ids.end(), |
| 2853 std::inserter(not_yet_blacklisted, | 2854 std::inserter(not_yet_blacklisted, |
| 2854 not_yet_blacklisted.begin())); | 2855 not_yet_blacklisted.begin())); |
| 2855 | 2856 |
| 2856 for (std::set<std::string>::iterator it = no_longer_blacklisted.begin(); | 2857 for (std::set<std::string>::iterator it = no_longer_blacklisted.begin(); |
| 2857 it != no_longer_blacklisted.end(); ++it) { | 2858 it != no_longer_blacklisted.end(); ++it) { |
| 2858 scoped_refptr<const Extension> extension = | 2859 scoped_refptr<const Extension> extension = |
| 2859 blacklisted_extensions_.GetByID(*it); | 2860 blacklisted_extensions_.GetByID(*it); |
| 2860 DCHECK(extension); | 2861 DCHECK(extension.get()); |
| 2861 if (!extension) | 2862 if (!extension.get()) |
| 2862 continue; | 2863 continue; |
| 2863 blacklisted_extensions_.Remove(*it); | 2864 blacklisted_extensions_.Remove(*it); |
| 2864 AddExtension(extension); | 2865 AddExtension(extension.get()); |
| 2865 UMA_HISTOGRAM_ENUMERATION("ExtensionBlacklist.UnblacklistInstalled", | 2866 UMA_HISTOGRAM_ENUMERATION("ExtensionBlacklist.UnblacklistInstalled", |
| 2866 extension->location(), Manifest::NUM_LOCATIONS); | 2867 extension->location(), |
| 2868 Manifest::NUM_LOCATIONS); |
| 2867 } | 2869 } |
| 2868 | 2870 |
| 2869 for (std::set<std::string>::iterator it = not_yet_blacklisted.begin(); | 2871 for (std::set<std::string>::iterator it = not_yet_blacklisted.begin(); |
| 2870 it != not_yet_blacklisted.end(); ++it) { | 2872 it != not_yet_blacklisted.end(); ++it) { |
| 2871 scoped_refptr<const Extension> extension = GetInstalledExtension(*it); | 2873 scoped_refptr<const Extension> extension = GetInstalledExtension(*it); |
| 2872 DCHECK(extension); | 2874 DCHECK(extension.get()); |
| 2873 if (!extension) | 2875 if (!extension.get()) |
| 2874 continue; | 2876 continue; |
| 2875 blacklisted_extensions_.Insert(extension); | 2877 blacklisted_extensions_.Insert(extension); |
| 2876 UnloadExtension(*it, extension_misc::UNLOAD_REASON_BLACKLIST); | 2878 UnloadExtension(*it, extension_misc::UNLOAD_REASON_BLACKLIST); |
| 2877 UMA_HISTOGRAM_ENUMERATION("ExtensionBlacklist.BlacklistInstalled", | 2879 UMA_HISTOGRAM_ENUMERATION("ExtensionBlacklist.BlacklistInstalled", |
| 2878 extension->location(), Manifest::NUM_LOCATIONS); | 2880 extension->location(), Manifest::NUM_LOCATIONS); |
| 2879 } | 2881 } |
| 2880 | 2882 |
| 2881 IdentifyAlertableExtensions(); | 2883 IdentifyAlertableExtensions(); |
| 2882 } | 2884 } |
| 2883 | 2885 |
| 2884 void ExtensionService::AddUpdateObserver(extensions::UpdateObserver* observer) { | 2886 void ExtensionService::AddUpdateObserver(extensions::UpdateObserver* observer) { |
| 2885 update_observers_.AddObserver(observer); | 2887 update_observers_.AddObserver(observer); |
| 2886 } | 2888 } |
| 2887 | 2889 |
| 2888 void ExtensionService::RemoveUpdateObserver( | 2890 void ExtensionService::RemoveUpdateObserver( |
| 2889 extensions::UpdateObserver* observer) { | 2891 extensions::UpdateObserver* observer) { |
| 2890 update_observers_.RemoveObserver(observer); | 2892 update_observers_.RemoveObserver(observer); |
| 2891 } | 2893 } |
| OLD | NEW |