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 |
11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
12 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
13 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
14 #include "base/strings/stringprintf.h" | 14 #include "base/strings/stringprintf.h" |
15 #include "base/strings/utf_string_conversions.h" | 15 #include "base/strings/utf_string_conversions.h" |
16 #include "base/threading/sequenced_worker_pool.h" | 16 #include "base/threading/sequenced_worker_pool.h" |
17 #include "base/threading/thread_restrictions.h" | 17 #include "base/threading/thread_restrictions.h" |
18 #include "base/time/time.h" | 18 #include "base/time/time.h" |
19 #include "chrome/browser/browser_process.h" | 19 #include "chrome/browser/browser_process.h" |
20 #include "chrome/browser/chrome_notification_types.h" | 20 #include "chrome/browser/chrome_notification_types.h" |
21 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" | 21 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" |
22 #include "chrome/browser/extensions/component_loader.h" | 22 #include "chrome/browser/extensions/component_loader.h" |
23 #include "chrome/browser/extensions/crx_installer.h" | 23 #include "chrome/browser/extensions/crx_installer.h" |
24 #include "chrome/browser/extensions/data_deleter.h" | 24 #include "chrome/browser/extensions/data_deleter.h" |
25 #include "chrome/browser/extensions/extension_disabled_ui.h" | 25 #include "chrome/browser/extensions/extension_disabled_ui.h" |
26 #include "chrome/browser/extensions/extension_error_controller.h" | 26 #include "chrome/browser/extensions/extension_error_controller.h" |
27 #include "chrome/browser/extensions/extension_install_ui.h" | 27 #include "chrome/browser/extensions/extension_install_ui.h" |
28 #include "chrome/browser/extensions/extension_special_storage_policy.h" | 28 #include "chrome/browser/extensions/extension_special_storage_policy.h" |
29 #include "chrome/browser/extensions/extension_sync_service.h" | 29 #include "chrome/browser/extensions/extension_sync_service.h" |
| 30 #include "chrome/browser/extensions/extension_ui_util.h" |
30 #include "chrome/browser/extensions/extension_util.h" | 31 #include "chrome/browser/extensions/extension_util.h" |
31 #include "chrome/browser/extensions/external_install_ui.h" | 32 #include "chrome/browser/extensions/external_install_ui.h" |
32 #include "chrome/browser/extensions/external_provider_impl.h" | 33 #include "chrome/browser/extensions/external_provider_impl.h" |
33 #include "chrome/browser/extensions/install_verifier.h" | 34 #include "chrome/browser/extensions/install_verifier.h" |
34 #include "chrome/browser/extensions/installed_loader.h" | 35 #include "chrome/browser/extensions/installed_loader.h" |
35 #include "chrome/browser/extensions/pending_extension_manager.h" | 36 #include "chrome/browser/extensions/pending_extension_manager.h" |
36 #include "chrome/browser/extensions/permissions_updater.h" | 37 #include "chrome/browser/extensions/permissions_updater.h" |
37 #include "chrome/browser/extensions/shared_module_service.h" | 38 #include "chrome/browser/extensions/shared_module_service.h" |
38 #include "chrome/browser/extensions/unpacked_installer.h" | 39 #include "chrome/browser/extensions/unpacked_installer.h" |
39 #include "chrome/browser/extensions/updater/extension_cache.h" | 40 #include "chrome/browser/extensions/updater/extension_cache.h" |
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
568 // details. | 569 // details. |
569 if (extension && extension->from_bookmark()) | 570 if (extension && extension->from_bookmark()) |
570 creation_flags |= Extension::FROM_BOOKMARK; | 571 creation_flags |= Extension::FROM_BOOKMARK; |
571 | 572 |
572 if (extension && extension->was_installed_by_default()) | 573 if (extension && extension->was_installed_by_default()) |
573 creation_flags |= Extension::WAS_INSTALLED_BY_DEFAULT; | 574 creation_flags |= Extension::WAS_INSTALLED_BY_DEFAULT; |
574 | 575 |
575 if (extension && extension->was_installed_by_oem()) | 576 if (extension && extension->was_installed_by_oem()) |
576 creation_flags |= Extension::WAS_INSTALLED_BY_OEM; | 577 creation_flags |= Extension::WAS_INSTALLED_BY_OEM; |
577 | 578 |
578 if (extension && extension->is_ephemeral()) | |
579 creation_flags |= Extension::IS_EPHEMERAL; | |
580 | |
581 installer->set_creation_flags(creation_flags); | 579 installer->set_creation_flags(creation_flags); |
| 580 installer->set_is_ephemeral( |
| 581 extension_prefs_->IsEphemeralApp(extension->id())); |
582 | 582 |
583 installer->set_delete_source(file_ownership_passed); | 583 installer->set_delete_source(file_ownership_passed); |
584 installer->set_install_cause(extension_misc::INSTALL_CAUSE_UPDATE); | 584 installer->set_install_cause(extension_misc::INSTALL_CAUSE_UPDATE); |
585 installer->InstallCrx(extension_path); | 585 installer->InstallCrx(extension_path); |
586 | 586 |
587 if (out_crx_installer) | 587 if (out_crx_installer) |
588 *out_crx_installer = installer.get(); | 588 *out_crx_installer = installer.get(); |
589 | 589 |
590 return true; | 590 return true; |
591 } | 591 } |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
726 if (!GetFileTaskRunner()->PostTask( | 726 if (!GetFileTaskRunner()->PostTask( |
727 FROM_HERE, | 727 FROM_HERE, |
728 base::Bind(&extensions::file_util::UninstallExtension, | 728 base::Bind(&extensions::file_util::UninstallExtension, |
729 install_directory_, | 729 install_directory_, |
730 extension_id))) | 730 extension_id))) |
731 NOTREACHED(); | 731 NOTREACHED(); |
732 } | 732 } |
733 | 733 |
734 // Do not remove the data of ephemeral apps. They will be garbage collected by | 734 // Do not remove the data of ephemeral apps. They will be garbage collected by |
735 // EphemeralAppService. | 735 // EphemeralAppService. |
736 if (!extension->is_ephemeral()) | 736 if (!extension_prefs_->IsEphemeralApp(extension_id)) |
737 extensions::DataDeleter::StartDeleting(profile_, extension.get()); | 737 extensions::DataDeleter::StartDeleting(profile_, extension.get()); |
738 | 738 |
739 UntrackTerminatedExtension(extension_id); | 739 UntrackTerminatedExtension(extension_id); |
740 | 740 |
741 // Notify interested parties that we've uninstalled this extension. | 741 // Notify interested parties that we've uninstalled this extension. |
742 content::NotificationService::current()->Notify( | 742 content::NotificationService::current()->Notify( |
743 chrome::NOTIFICATION_EXTENSION_UNINSTALLED, | 743 chrome::NOTIFICATION_EXTENSION_UNINSTALLED, |
744 content::Source<Profile>(profile_), | 744 content::Source<Profile>(profile_), |
745 content::Details<const Extension>(extension.get())); | 745 content::Details<const Extension>(extension.get())); |
746 | 746 |
(...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1499 extensions::AddExtensionDisabledError(this, extension); | 1499 extensions::AddExtensionDisabledError(this, extension); |
1500 } | 1500 } |
1501 } else if (reloading) { | 1501 } else if (reloading) { |
1502 // Replace the old extension with the new version. | 1502 // Replace the old extension with the new version. |
1503 CHECK(!registry_->AddDisabled(extension)); | 1503 CHECK(!registry_->AddDisabled(extension)); |
1504 EnableExtension(extension->id()); | 1504 EnableExtension(extension->id()); |
1505 } else { | 1505 } else { |
1506 // All apps that are displayed in the launcher are ordered by their ordinals | 1506 // All apps that are displayed in the launcher are ordered by their ordinals |
1507 // so we must ensure they have valid ordinals. | 1507 // so we must ensure they have valid ordinals. |
1508 if (extension->RequiresSortOrdinal()) { | 1508 if (extension->RequiresSortOrdinal()) { |
1509 if (!extension->ShouldDisplayInNewTabPage()) { | 1509 if (!extensions::ui_util::ShouldDisplayInNewTabPage( |
| 1510 extension, profile_)) { |
1510 extension_prefs_->app_sorting()->MarkExtensionAsHidden(extension->id()); | 1511 extension_prefs_->app_sorting()->MarkExtensionAsHidden(extension->id()); |
1511 } | 1512 } |
1512 extension_prefs_->app_sorting()->EnsureValidOrdinals( | 1513 extension_prefs_->app_sorting()->EnsureValidOrdinals( |
1513 extension->id(), syncer::StringOrdinal()); | 1514 extension->id(), syncer::StringOrdinal()); |
1514 } | 1515 } |
1515 | 1516 |
1516 registry_->AddEnabled(extension); | 1517 registry_->AddEnabled(extension); |
1517 if (extension_sync_service_) | 1518 if (extension_sync_service_) |
1518 extension_sync_service_->SyncExtensionChangeIfNeeded(*extension); | 1519 extension_sync_service_->SyncExtensionChangeIfNeeded(*extension); |
1519 NotifyExtensionLoaded(extension); | 1520 NotifyExtensionLoaded(extension); |
1520 } | 1521 } |
1521 system_->runtime_data()->SetBeingUpgraded(extension, false); | 1522 system_->runtime_data()->SetBeingUpgraded(extension, false); |
1522 } | 1523 } |
1523 | 1524 |
1524 void ExtensionService::AddComponentExtension(const Extension* extension) { | 1525 void ExtensionService::AddComponentExtension(const Extension* extension) { |
1525 const std::string old_version_string( | 1526 const std::string old_version_string( |
1526 extension_prefs_->GetVersionString(extension->id())); | 1527 extension_prefs_->GetVersionString(extension->id())); |
1527 const Version old_version(old_version_string); | 1528 const Version old_version(old_version_string); |
1528 | 1529 |
1529 VLOG(1) << "AddComponentExtension " << extension->name(); | 1530 VLOG(1) << "AddComponentExtension " << extension->name(); |
1530 if (!old_version.IsValid() || !old_version.Equals(*extension->version())) { | 1531 if (!old_version.IsValid() || !old_version.Equals(*extension->version())) { |
1531 VLOG(1) << "Component extension " << extension->name() << " (" | 1532 VLOG(1) << "Component extension " << extension->name() << " (" |
1532 << extension->id() << ") installing/upgrading from '" | 1533 << extension->id() << ") installing/upgrading from '" |
1533 << old_version_string << "' to " << extension->version()->GetString(); | 1534 << old_version_string << "' to " << extension->version()->GetString(); |
1534 | 1535 |
1535 AddNewOrUpdatedExtension(extension, | 1536 AddNewOrUpdatedExtension(extension, |
1536 Extension::ENABLED_COMPONENT, | 1537 Extension::ENABLED_COMPONENT, |
1537 extensions::NOT_BLACKLISTED, | 1538 extensions::NOT_BLACKLISTED, |
| 1539 false, |
1538 syncer::StringOrdinal(), | 1540 syncer::StringOrdinal(), |
1539 std::string()); | 1541 std::string()); |
1540 return; | 1542 return; |
1541 } | 1543 } |
1542 | 1544 |
1543 AddExtension(extension); | 1545 AddExtension(extension); |
1544 } | 1546 } |
1545 | 1547 |
1546 void ExtensionService::UpdateActivePermissions(const Extension* extension) { | 1548 void ExtensionService::UpdateActivePermissions(const Extension* extension) { |
1547 // If the extension has used the optional permissions API, it will have a | 1549 // If the extension has used the optional permissions API, it will have a |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1689 // crash_keys::SetActiveExtensions is per-process. See | 1691 // crash_keys::SetActiveExtensions is per-process. See |
1690 // http://crbug.com/355029. | 1692 // http://crbug.com/355029. |
1691 crash_keys::SetActiveExtensions(extension_ids); | 1693 crash_keys::SetActiveExtensions(extension_ids); |
1692 } | 1694 } |
1693 | 1695 |
1694 void ExtensionService::OnExtensionInstalled( | 1696 void ExtensionService::OnExtensionInstalled( |
1695 const Extension* extension, | 1697 const Extension* extension, |
1696 const syncer::StringOrdinal& page_ordinal, | 1698 const syncer::StringOrdinal& page_ordinal, |
1697 bool has_requirement_errors, | 1699 bool has_requirement_errors, |
1698 extensions::BlacklistState blacklist_state, | 1700 extensions::BlacklistState blacklist_state, |
| 1701 bool is_ephemeral, |
1699 bool wait_for_idle) { | 1702 bool wait_for_idle) { |
1700 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1703 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1701 | 1704 |
1702 const std::string& id = extension->id(); | 1705 const std::string& id = extension->id(); |
1703 bool initial_enable = ShouldEnableOnInstall(extension); | 1706 bool initial_enable = ShouldEnableOnInstall(extension); |
1704 std::string install_parameter; | 1707 std::string install_parameter; |
1705 const extensions::PendingExtensionInfo* pending_extension_info = NULL; | 1708 const extensions::PendingExtensionInfo* pending_extension_info = NULL; |
1706 if ((pending_extension_info = pending_extension_manager()->GetById(id))) { | 1709 if ((pending_extension_info = pending_extension_manager()->GetById(id))) { |
1707 if (!pending_extension_info->ShouldAllowInstall(extension)) { | 1710 if (!pending_extension_info->ShouldAllowInstall(extension)) { |
1708 pending_extension_manager()->Remove(id); | 1711 pending_extension_manager()->Remove(id); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1783 AcknowledgeExternalExtension(extension->id()); | 1786 AcknowledgeExternalExtension(extension->id()); |
1784 const Extension::State initial_state = | 1787 const Extension::State initial_state = |
1785 initial_enable ? Extension::ENABLED : Extension::DISABLED; | 1788 initial_enable ? Extension::ENABLED : Extension::DISABLED; |
1786 const bool blacklisted_for_malware = | 1789 const bool blacklisted_for_malware = |
1787 blacklist_state == extensions::BLACKLISTED_MALWARE; | 1790 blacklist_state == extensions::BLACKLISTED_MALWARE; |
1788 if (ShouldDelayExtensionUpdate(id, wait_for_idle)) { | 1791 if (ShouldDelayExtensionUpdate(id, wait_for_idle)) { |
1789 extension_prefs_->SetDelayedInstallInfo( | 1792 extension_prefs_->SetDelayedInstallInfo( |
1790 extension, | 1793 extension, |
1791 initial_state, | 1794 initial_state, |
1792 blacklisted_for_malware, | 1795 blacklisted_for_malware, |
| 1796 is_ephemeral, |
1793 extensions::ExtensionPrefs::DELAY_REASON_WAIT_FOR_IDLE, | 1797 extensions::ExtensionPrefs::DELAY_REASON_WAIT_FOR_IDLE, |
1794 page_ordinal, | 1798 page_ordinal, |
1795 install_parameter); | 1799 install_parameter); |
1796 | 1800 |
1797 // Transfer ownership of |extension|. | 1801 // Transfer ownership of |extension|. |
1798 delayed_installs_.Insert(extension); | 1802 delayed_installs_.Insert(extension); |
1799 | 1803 |
1800 // Notify observers that app update is available. | 1804 // Notify observers that app update is available. |
1801 FOR_EACH_OBSERVER(extensions::UpdateObserver, update_observers_, | 1805 FOR_EACH_OBSERVER(extensions::UpdateObserver, update_observers_, |
1802 OnAppUpdateAvailable(extension)); | 1806 OnAppUpdateAvailable(extension)); |
1803 return; | 1807 return; |
1804 } | 1808 } |
1805 | 1809 |
1806 extensions::SharedModuleService::ImportStatus status = | 1810 extensions::SharedModuleService::ImportStatus status = |
1807 shared_module_service_->SatisfyImports(extension); | 1811 shared_module_service_->SatisfyImports(extension); |
1808 if (installs_delayed_for_gc_) { | 1812 if (installs_delayed_for_gc_) { |
1809 extension_prefs_->SetDelayedInstallInfo( | 1813 extension_prefs_->SetDelayedInstallInfo( |
1810 extension, | 1814 extension, |
1811 initial_state, | 1815 initial_state, |
1812 blacklisted_for_malware, | 1816 blacklisted_for_malware, |
| 1817 is_ephemeral, |
1813 extensions::ExtensionPrefs::DELAY_REASON_GC, | 1818 extensions::ExtensionPrefs::DELAY_REASON_GC, |
1814 page_ordinal, | 1819 page_ordinal, |
1815 install_parameter); | 1820 install_parameter); |
1816 delayed_installs_.Insert(extension); | 1821 delayed_installs_.Insert(extension); |
1817 } else if (status != SharedModuleService::IMPORT_STATUS_OK) { | 1822 } else if (status != SharedModuleService::IMPORT_STATUS_OK) { |
1818 if (status == SharedModuleService::IMPORT_STATUS_UNSATISFIED) { | 1823 if (status == SharedModuleService::IMPORT_STATUS_UNSATISFIED) { |
1819 extension_prefs_->SetDelayedInstallInfo( | 1824 extension_prefs_->SetDelayedInstallInfo( |
1820 extension, | 1825 extension, |
1821 initial_state, | 1826 initial_state, |
1822 blacklisted_for_malware, | 1827 blacklisted_for_malware, |
| 1828 is_ephemeral, |
1823 extensions::ExtensionPrefs::DELAY_REASON_WAIT_FOR_IMPORTS, | 1829 extensions::ExtensionPrefs::DELAY_REASON_WAIT_FOR_IMPORTS, |
1824 page_ordinal, | 1830 page_ordinal, |
1825 install_parameter); | 1831 install_parameter); |
1826 delayed_installs_.Insert(extension); | 1832 delayed_installs_.Insert(extension); |
1827 } | 1833 } |
1828 } else { | 1834 } else { |
1829 AddNewOrUpdatedExtension(extension, | 1835 AddNewOrUpdatedExtension(extension, |
1830 initial_state, | 1836 initial_state, |
1831 blacklist_state, | 1837 blacklist_state, |
| 1838 is_ephemeral, |
1832 page_ordinal, | 1839 page_ordinal, |
1833 install_parameter); | 1840 install_parameter); |
1834 } | 1841 } |
1835 } | 1842 } |
1836 | 1843 |
1837 void ExtensionService::AddNewOrUpdatedExtension( | 1844 void ExtensionService::AddNewOrUpdatedExtension( |
1838 const Extension* extension, | 1845 const Extension* extension, |
1839 Extension::State initial_state, | 1846 Extension::State initial_state, |
1840 extensions::BlacklistState blacklist_state, | 1847 extensions::BlacklistState blacklist_state, |
| 1848 bool is_ephemeral, |
1841 const syncer::StringOrdinal& page_ordinal, | 1849 const syncer::StringOrdinal& page_ordinal, |
1842 const std::string& install_parameter) { | 1850 const std::string& install_parameter) { |
1843 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1851 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1844 const bool blacklisted_for_malware = | 1852 const bool blacklisted_for_malware = |
1845 blacklist_state == extensions::BLACKLISTED_MALWARE; | 1853 blacklist_state == extensions::BLACKLISTED_MALWARE; |
1846 extension_prefs_->OnExtensionInstalled(extension, | 1854 extension_prefs_->OnExtensionInstalled(extension, |
1847 initial_state, | 1855 initial_state, |
1848 blacklisted_for_malware, | 1856 blacklisted_for_malware, |
| 1857 is_ephemeral, |
1849 page_ordinal, | 1858 page_ordinal, |
1850 install_parameter); | 1859 install_parameter); |
1851 delayed_installs_.Remove(extension->id()); | 1860 delayed_installs_.Remove(extension->id()); |
1852 if (InstallVerifier::NeedsVerification(*extension)) | 1861 if (InstallVerifier::NeedsVerification(*extension)) |
1853 system_->install_verifier()->VerifyExtension(extension->id()); | 1862 system_->install_verifier()->VerifyExtension(extension->id()); |
1854 FinishInstallation(extension); | 1863 FinishInstallation(extension); |
1855 } | 1864 } |
1856 | 1865 |
1857 void ExtensionService::MaybeFinishDelayedInstallation( | 1866 void ExtensionService::MaybeFinishDelayedInstallation( |
1858 const std::string& extension_id) { | 1867 const std::string& extension_id) { |
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2408 void ExtensionService::UnloadAllExtensionsInternal() { | 2417 void ExtensionService::UnloadAllExtensionsInternal() { |
2409 profile_->GetExtensionSpecialStoragePolicy()->RevokeRightsForAllExtensions(); | 2418 profile_->GetExtensionSpecialStoragePolicy()->RevokeRightsForAllExtensions(); |
2410 | 2419 |
2411 registry_->ClearAll(); | 2420 registry_->ClearAll(); |
2412 system_->runtime_data()->ClearAll(); | 2421 system_->runtime_data()->ClearAll(); |
2413 | 2422 |
2414 // TODO(erikkay) should there be a notification for this? We can't use | 2423 // TODO(erikkay) should there be a notification for this? We can't use |
2415 // EXTENSION_UNLOADED since that implies that the extension has been disabled | 2424 // EXTENSION_UNLOADED since that implies that the extension has been disabled |
2416 // or uninstalled. | 2425 // or uninstalled. |
2417 } | 2426 } |
OLD | NEW |