| 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 <stddef.h> | 7 #include <stddef.h> | 
| 8 | 8 | 
| 9 #include <algorithm> | 9 #include <algorithm> | 
| 10 #include <iterator> | 10 #include <iterator> | 
| (...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 563       pending_extension_manager()->GetById(id); | 563       pending_extension_manager()->GetById(id); | 
| 564 | 564 | 
| 565   const Extension* extension = GetInstalledExtension(id); | 565   const Extension* extension = GetInstalledExtension(id); | 
| 566   if (!pending_extension_info && !extension) { | 566   if (!pending_extension_info && !extension) { | 
| 567     LOG(WARNING) << "Will not update extension " << id | 567     LOG(WARNING) << "Will not update extension " << id | 
| 568                  << " because it is not installed or pending"; | 568                  << " because it is not installed or pending"; | 
| 569     // Delete extension_path since we're not creating a CrxInstaller | 569     // Delete extension_path since we're not creating a CrxInstaller | 
| 570     // that would do it for us. | 570     // that would do it for us. | 
| 571     if (file_ownership_passed && | 571     if (file_ownership_passed && | 
| 572         !GetFileTaskRunner()->PostTask( | 572         !GetFileTaskRunner()->PostTask( | 
| 573             FROM_HERE, | 573             FROM_HERE, base::BindOnce(&extensions::file_util::DeleteFile, | 
| 574             base::Bind(&extensions::file_util::DeleteFile, file.path, false))) | 574                                       file.path, false))) | 
| 575       NOTREACHED(); | 575       NOTREACHED(); | 
| 576 | 576 | 
| 577     return false; | 577     return false; | 
| 578   } | 578   } | 
| 579 | 579 | 
| 580   scoped_refptr<CrxInstaller> installer(CrxInstaller::CreateSilent(this)); | 580   scoped_refptr<CrxInstaller> installer(CrxInstaller::CreateSilent(this)); | 
| 581   installer->set_expected_id(id); | 581   installer->set_expected_id(id); | 
| 582   installer->set_expected_hash(file.expected_hash); | 582   installer->set_expected_hash(file.expected_hash); | 
| 583   int creation_flags = Extension::NO_FLAGS; | 583   int creation_flags = Extension::NO_FLAGS; | 
| 584   if (pending_extension_info) { | 584   if (pending_extension_info) { | 
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 822   // Unload before doing more cleanup to ensure that nothing is hanging on to | 822   // Unload before doing more cleanup to ensure that nothing is hanging on to | 
| 823   // any of these resources. | 823   // any of these resources. | 
| 824   UnloadExtension(extension->id(), UnloadedExtensionInfo::REASON_UNINSTALL); | 824   UnloadExtension(extension->id(), UnloadedExtensionInfo::REASON_UNINSTALL); | 
| 825   if (registry_->blacklisted_extensions().Contains(extension->id())) | 825   if (registry_->blacklisted_extensions().Contains(extension->id())) | 
| 826     registry_->RemoveBlacklisted(extension->id()); | 826     registry_->RemoveBlacklisted(extension->id()); | 
| 827 | 827 | 
| 828   // Tell the backend to start deleting installed extensions on the file thread. | 828   // Tell the backend to start deleting installed extensions on the file thread. | 
| 829   if (!Manifest::IsUnpackedLocation(extension->location())) { | 829   if (!Manifest::IsUnpackedLocation(extension->location())) { | 
| 830     if (!GetFileTaskRunner()->PostTask( | 830     if (!GetFileTaskRunner()->PostTask( | 
| 831             FROM_HERE, | 831             FROM_HERE, | 
| 832             base::Bind(&ExtensionService::UninstallExtensionOnFileThread, | 832             base::BindOnce(&ExtensionService::UninstallExtensionOnFileThread, | 
| 833                        extension->id(), | 833                            extension->id(), profile_, install_directory_, | 
| 834                        profile_, | 834                            extension->path()))) | 
| 835                        install_directory_, |  | 
| 836                        extension->path()))) |  | 
| 837       NOTREACHED(); | 835       NOTREACHED(); | 
| 838   } | 836   } | 
| 839 | 837 | 
| 840   extensions::DataDeleter::StartDeleting( | 838   extensions::DataDeleter::StartDeleting( | 
| 841       profile_, extension.get(), deletion_done_callback); | 839       profile_, extension.get(), deletion_done_callback); | 
| 842 | 840 | 
| 843   UntrackTerminatedExtension(extension->id()); | 841   UntrackTerminatedExtension(extension->id()); | 
| 844 | 842 | 
| 845   // Notify interested parties that we've uninstalled this extension. | 843   // Notify interested parties that we've uninstalled this extension. | 
| 846   ExtensionRegistry::Get(profile_) | 844   ExtensionRegistry::Get(profile_) | 
| (...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1807 | 1805 | 
| 1808       LOG(WARNING) << "ShouldAllowInstall() returned false for " | 1806       LOG(WARNING) << "ShouldAllowInstall() returned false for " | 
| 1809                    << id << " of type " << extension->GetType() | 1807                    << id << " of type " << extension->GetType() | 
| 1810                    << " and update URL " | 1808                    << " and update URL " | 
| 1811                    << extensions::ManifestURL::GetUpdateURL(extension).spec() | 1809                    << extensions::ManifestURL::GetUpdateURL(extension).spec() | 
| 1812                    << "; not installing"; | 1810                    << "; not installing"; | 
| 1813 | 1811 | 
| 1814       // Delete the extension directory since we're not going to | 1812       // Delete the extension directory since we're not going to | 
| 1815       // load it. | 1813       // load it. | 
| 1816       if (!GetFileTaskRunner()->PostTask( | 1814       if (!GetFileTaskRunner()->PostTask( | 
| 1817               FROM_HERE, | 1815               FROM_HERE, base::BindOnce(&extensions::file_util::DeleteFile, | 
| 1818               base::Bind(&extensions::file_util::DeleteFile, | 1816                                         extension->path(), true))) { | 
| 1819                          extension->path(), |  | 
| 1820                          true))) { |  | 
| 1821         NOTREACHED(); | 1817         NOTREACHED(); | 
| 1822       } | 1818       } | 
| 1823       return; | 1819       return; | 
| 1824     } | 1820     } | 
| 1825 | 1821 | 
| 1826     install_parameter = pending_extension_info->install_parameter(); | 1822     install_parameter = pending_extension_info->install_parameter(); | 
| 1827     pending_extension_manager()->Remove(id); | 1823     pending_extension_manager()->Remove(id); | 
| 1828   } else { | 1824   } else { | 
| 1829     // We explicitly want to re-enable an uninstalled external | 1825     // We explicitly want to re-enable an uninstalled external | 
| 1830     // extension; if we're here, that means the user is manually | 1826     // extension; if we're here, that means the user is manually | 
| (...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2208       // do. | 2204       // do. | 
| 2209       if (!extensions_being_terminated_.insert(host->extension_id()).second) | 2205       if (!extensions_being_terminated_.insert(host->extension_id()).second) | 
| 2210         break; | 2206         break; | 
| 2211 | 2207 | 
| 2212       // Mark the extension as terminated and Unload it. We want it to | 2208       // Mark the extension as terminated and Unload it. We want it to | 
| 2213       // be in a consistent state: either fully working or not loaded | 2209       // be in a consistent state: either fully working or not loaded | 
| 2214       // at all, but never half-crashed.  We do it in a PostTask so | 2210       // at all, but never half-crashed.  We do it in a PostTask so | 
| 2215       // that other handlers of this notification will still have | 2211       // that other handlers of this notification will still have | 
| 2216       // access to the Extension and ExtensionHost. | 2212       // access to the Extension and ExtensionHost. | 
| 2217       base::ThreadTaskRunnerHandle::Get()->PostTask( | 2213       base::ThreadTaskRunnerHandle::Get()->PostTask( | 
| 2218           FROM_HERE, base::Bind(&ExtensionService::TrackTerminatedExtension, | 2214           FROM_HERE, base::BindOnce(&ExtensionService::TrackTerminatedExtension, | 
| 2219                                 AsWeakPtr(), host->extension()->id())); | 2215                                     AsWeakPtr(), host->extension()->id())); | 
| 2220       break; | 2216       break; | 
| 2221     } | 2217     } | 
| 2222     case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: { | 2218     case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: { | 
| 2223       content::RenderProcessHost* process = | 2219       content::RenderProcessHost* process = | 
| 2224           content::Source<content::RenderProcessHost>(source).ptr(); | 2220           content::Source<content::RenderProcessHost>(source).ptr(); | 
| 2225       Profile* host_profile = | 2221       Profile* host_profile = | 
| 2226           Profile::FromBrowserContext(process->GetBrowserContext()); | 2222           Profile::FromBrowserContext(process->GetBrowserContext()); | 
| 2227       if (!profile_->IsSameProfile(host_profile->GetOriginalProfile())) | 2223       if (!profile_->IsSameProfile(host_profile->GetOriginalProfile())) | 
| 2228           break; | 2224           break; | 
| 2229 | 2225 | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
| 2252             import_ids.insert((*import_it).extension_id); | 2248             import_ids.insert((*import_it).extension_id); | 
| 2253           } | 2249           } | 
| 2254         } | 2250         } | 
| 2255         extension_ids.insert(import_ids.begin(), import_ids.end()); | 2251         extension_ids.insert(import_ids.begin(), import_ids.end()); | 
| 2256 | 2252 | 
| 2257         for (std::set<std::string>::const_iterator it = extension_ids.begin(); | 2253         for (std::set<std::string>::const_iterator it = extension_ids.begin(); | 
| 2258              it != extension_ids.end(); ++it) { | 2254              it != extension_ids.end(); ++it) { | 
| 2259           if (delayed_installs_.Contains(*it)) { | 2255           if (delayed_installs_.Contains(*it)) { | 
| 2260             base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 2256             base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 
| 2261                 FROM_HERE, | 2257                 FROM_HERE, | 
| 2262                 base::Bind(&ExtensionService::MaybeFinishDelayedInstallation, | 2258                 base::BindOnce( | 
| 2263                            AsWeakPtr(), *it), | 2259                     &ExtensionService::MaybeFinishDelayedInstallation, | 
|  | 2260                     AsWeakPtr(), *it), | 
| 2264                 base::TimeDelta::FromSeconds(kUpdateIdleDelay)); | 2261                 base::TimeDelta::FromSeconds(kUpdateIdleDelay)); | 
| 2265           } | 2262           } | 
| 2266         } | 2263         } | 
| 2267       } | 2264       } | 
| 2268 | 2265 | 
| 2269       process_map->RemoveAllFromProcess(process->GetID()); | 2266       process_map->RemoveAllFromProcess(process->GetID()); | 
| 2270       BrowserThread::PostTask( | 2267       BrowserThread::PostTask( | 
| 2271           BrowserThread::IO, | 2268           BrowserThread::IO, FROM_HERE, | 
| 2272           FROM_HERE, | 2269           base::BindOnce(&extensions::InfoMap::UnregisterAllExtensionsInProcess, | 
| 2273           base::Bind(&extensions::InfoMap::UnregisterAllExtensionsInProcess, | 2270                          system_->info_map(), process->GetID())); | 
| 2274                      system_->info_map(), |  | 
| 2275                      process->GetID())); |  | 
| 2276       break; | 2271       break; | 
| 2277     } | 2272     } | 
| 2278     case chrome::NOTIFICATION_UPGRADE_RECOMMENDED: { | 2273     case chrome::NOTIFICATION_UPGRADE_RECOMMENDED: { | 
| 2279       // Notify observers that chrome update is available. | 2274       // Notify observers that chrome update is available. | 
| 2280       for (auto& observer : update_observers_) | 2275       for (auto& observer : update_observers_) | 
| 2281         observer.OnChromeUpdateAvailable(); | 2276         observer.OnChromeUpdateAvailable(); | 
| 2282       break; | 2277       break; | 
| 2283     } | 2278     } | 
| 2284     case chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED: { | 2279     case chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED: { | 
| 2285       OnProfileDestructionStarted(); | 2280       OnProfileDestructionStarted(); | 
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2558 } | 2553 } | 
| 2559 | 2554 | 
| 2560 void ExtensionService::OnProfileDestructionStarted() { | 2555 void ExtensionService::OnProfileDestructionStarted() { | 
| 2561   ExtensionIdSet ids_to_unload = registry_->enabled_extensions().GetIDs(); | 2556   ExtensionIdSet ids_to_unload = registry_->enabled_extensions().GetIDs(); | 
| 2562   for (ExtensionIdSet::iterator it = ids_to_unload.begin(); | 2557   for (ExtensionIdSet::iterator it = ids_to_unload.begin(); | 
| 2563        it != ids_to_unload.end(); | 2558        it != ids_to_unload.end(); | 
| 2564        ++it) { | 2559        ++it) { | 
| 2565     UnloadExtension(*it, UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN); | 2560     UnloadExtension(*it, UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN); | 
| 2566   } | 2561   } | 
| 2567 } | 2562 } | 
| OLD | NEW | 
|---|