| 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 | 
|---|