Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/extension_service.h" | 5 #include "chrome/browser/extensions/extension_service.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <iterator> | 8 #include <iterator> |
| 9 #include <set> | 9 #include <set> |
| 10 | 10 |
| (...skipping 839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 850 } | 850 } |
| 851 | 851 |
| 852 const Extension* extension = GetInstalledExtension(extension_id); | 852 const Extension* extension = GetInstalledExtension(extension_id); |
| 853 // |extension| can be NULL if sync disables an extension that is not | 853 // |extension| can be NULL if sync disables an extension that is not |
| 854 // installed yet. | 854 // installed yet. |
| 855 // EXTERNAL_COMPONENT extensions are not generally modifiable by users, but | 855 // EXTERNAL_COMPONENT extensions are not generally modifiable by users, but |
| 856 // can be uninstalled by the browser if the user sets extension-specific | 856 // can be uninstalled by the browser if the user sets extension-specific |
| 857 // preferences. | 857 // preferences. |
| 858 if (extension && | 858 if (extension && |
| 859 disable_reason != Extension::DISABLE_RELOAD && | 859 disable_reason != Extension::DISABLE_RELOAD && |
| 860 disable_reason != Extension::DISABLE_UPDATE_REQUIRED_BY_POLICY && | |
| 860 !system_->management_policy()->UserMayModifySettings(extension, NULL) && | 861 !system_->management_policy()->UserMayModifySettings(extension, NULL) && |
| 861 extension->location() != Manifest::EXTERNAL_COMPONENT) { | 862 extension->location() != Manifest::EXTERNAL_COMPONENT) { |
| 862 return; | 863 return; |
| 863 } | 864 } |
| 864 | 865 |
| 865 extension_prefs_->SetExtensionState(extension_id, Extension::DISABLED); | 866 extension_prefs_->SetExtensionState(extension_id, Extension::DISABLED); |
| 866 extension_prefs_->AddDisableReason(extension_id, disable_reason); | 867 extension_prefs_->AddDisableReason(extension_id, disable_reason); |
| 867 | 868 |
| 868 int include_mask = | 869 int include_mask = |
| 869 ExtensionRegistry::EVERYTHING & ~ExtensionRegistry::DISABLED; | 870 ExtensionRegistry::EVERYTHING & ~ExtensionRegistry::DISABLED; |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1111 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); | 1112 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); |
| 1112 return file_task_runner_.get(); | 1113 return file_task_runner_.get(); |
| 1113 } | 1114 } |
| 1114 | 1115 |
| 1115 void ExtensionService::CheckManagementPolicy() { | 1116 void ExtensionService::CheckManagementPolicy() { |
| 1116 std::vector<std::string> to_unload; | 1117 std::vector<std::string> to_unload; |
| 1117 std::map<std::string, Extension::DisableReason> to_disable; | 1118 std::map<std::string, Extension::DisableReason> to_disable; |
| 1118 | 1119 |
| 1119 // Loop through the extensions list, finding extensions we need to unload or | 1120 // Loop through the extensions list, finding extensions we need to unload or |
| 1120 // disable. | 1121 // disable. |
| 1121 const ExtensionSet& extensions = registry_->enabled_extensions(); | 1122 for (scoped_refptr<const Extension> extension : |
| 1122 for (ExtensionSet::const_iterator iter = extensions.begin(); | 1123 registry_->enabled_extensions()) { |
| 1123 iter != extensions.end(); ++iter) { | 1124 if (!system_->management_policy()->UserMayLoad(extension.get(), nullptr)) |
| 1124 const Extension* extension = (iter->get()); | |
| 1125 if (!system_->management_policy()->UserMayLoad(extension, NULL)) | |
| 1126 to_unload.push_back(extension->id()); | 1125 to_unload.push_back(extension->id()); |
| 1127 Extension::DisableReason disable_reason = Extension::DISABLE_NONE; | 1126 Extension::DisableReason disable_reason = Extension::DISABLE_NONE; |
| 1128 if (system_->management_policy()->MustRemainDisabled( | 1127 if (system_->management_policy()->MustRemainDisabled( |
| 1129 extension, &disable_reason, NULL)) | 1128 extension.get(), &disable_reason, nullptr)) |
| 1130 to_disable[extension->id()] = disable_reason; | 1129 to_disable[extension->id()] = disable_reason; |
| 1131 } | 1130 } |
| 1132 | 1131 |
| 1133 for (size_t i = 0; i < to_unload.size(); ++i) | 1132 for (size_t i = 0; i < to_unload.size(); ++i) |
| 1134 UnloadExtension(to_unload[i], UnloadedExtensionInfo::REASON_DISABLE); | 1133 UnloadExtension(to_unload[i], UnloadedExtensionInfo::REASON_DISABLE); |
| 1135 | 1134 |
| 1136 for (std::map<std::string, Extension::DisableReason>::const_iterator i = | 1135 for (std::map<std::string, Extension::DisableReason>::const_iterator i = |
| 1137 to_disable.begin(); i != to_disable.end(); ++i) | 1136 to_disable.begin(); i != to_disable.end(); ++i) |
| 1138 DisableExtension(i->first, i->second); | 1137 DisableExtension(i->first, i->second); |
| 1138 | |
| 1139 if (updater_.get()) { | |
| 1140 // Find all extensions (including the ones got disabled just now) disabled | |
|
pastarmovj
2014/11/11 12:50:55
nit: ...ones _that_ got...
binjin
2014/11/11 19:10:37
Done.
| |
| 1141 // due to minimum version requirement from policy, and check for update. | |
| 1142 extensions::ExtensionUpdater::CheckParams params; | |
| 1143 for (scoped_refptr<const Extension> extension : | |
| 1144 registry_->disabled_extensions()) { | |
| 1145 if (extension_prefs_->HasDisableReason( | |
| 1146 extension->id(), Extension::DISABLE_UPDATE_REQUIRED_BY_POLICY)) { | |
| 1147 params.ids.push_back(extension->id()); | |
| 1148 } | |
| 1149 } | |
| 1150 if (!params.ids.empty()) | |
| 1151 updater_->CheckNow(params); | |
| 1152 } | |
| 1139 } | 1153 } |
| 1140 | 1154 |
| 1141 void ExtensionService::CheckForUpdatesSoon() { | 1155 void ExtensionService::CheckForUpdatesSoon() { |
| 1142 // This can legitimately happen in unit tests. | 1156 // This can legitimately happen in unit tests. |
| 1143 if (!updater_.get()) | 1157 if (!updater_.get()) |
| 1144 return; | 1158 return; |
| 1145 | 1159 |
| 1146 if (AreAllExternalProvidersReady()) { | 1160 if (AreAllExternalProvidersReady()) { |
| 1147 updater_->CheckSoon(); | 1161 updater_->CheckSoon(); |
| 1148 } else { | 1162 } else { |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1615 id, Extension::DISABLE_UNSUPPORTED_REQUIREMENT); | 1629 id, Extension::DISABLE_UNSUPPORTED_REQUIREMENT); |
| 1616 // If the extension was disabled because of unsupported requirements but | 1630 // If the extension was disabled because of unsupported requirements but |
| 1617 // now supports all requirements after an update and there are not other | 1631 // now supports all requirements after an update and there are not other |
| 1618 // disable reasons, enable it. | 1632 // disable reasons, enable it. |
| 1619 } else if (extension_prefs_->GetDisableReasons(id) == | 1633 } else if (extension_prefs_->GetDisableReasons(id) == |
| 1620 Extension::DISABLE_UNSUPPORTED_REQUIREMENT) { | 1634 Extension::DISABLE_UNSUPPORTED_REQUIREMENT) { |
| 1621 initial_enable = true; | 1635 initial_enable = true; |
| 1622 extension_prefs_->ClearDisableReasons(id); | 1636 extension_prefs_->ClearDisableReasons(id); |
| 1623 } | 1637 } |
| 1624 | 1638 |
| 1639 // If the extension was disabled because of the minimum version requirements | |
| 1640 // from enterprise policy, and now satisfies it now and there are not other | |
|
pastarmovj
2014/11/11 12:50:55
nit: remove the first "now". Also s/not/no/
binjin
2014/11/11 19:10:37
Done.
| |
| 1641 // disable reasons, enable it. | |
| 1642 if (extension_prefs_->GetDisableReasons(id) == | |
| 1643 Extension::DISABLE_UPDATE_REQUIRED_BY_POLICY && | |
| 1644 extensions::ExtensionManagementFactory::GetForBrowserContext(profile()) | |
| 1645 ->CheckMinimumVersion(extension, nullptr)) { | |
| 1646 initial_enable = true; | |
| 1647 extension_prefs_->ClearDisableReasons(id); | |
| 1648 } | |
| 1649 | |
| 1625 if (install_flags & extensions::kInstallFlagIsBlacklistedForMalware) { | 1650 if (install_flags & extensions::kInstallFlagIsBlacklistedForMalware) { |
| 1626 // Installation of a blacklisted extension can happen from sync, policy, | 1651 // Installation of a blacklisted extension can happen from sync, policy, |
| 1627 // etc, where to maintain consistency we need to install it, just never | 1652 // etc, where to maintain consistency we need to install it, just never |
| 1628 // load it (see AddExtension). Usually it should be the job of callers to | 1653 // load it (see AddExtension). Usually it should be the job of callers to |
| 1629 // incercept blacklisted extension earlier (e.g. CrxInstaller, before even | 1654 // incercept blacklisted extension earlier (e.g. CrxInstaller, before even |
| 1630 // showing the install dialogue). | 1655 // showing the install dialogue). |
| 1631 extension_prefs_->AcknowledgeBlacklistedExtension(id); | 1656 extension_prefs_->AcknowledgeBlacklistedExtension(id); |
| 1632 UMA_HISTOGRAM_ENUMERATION("ExtensionBlacklist.SilentInstall", | 1657 UMA_HISTOGRAM_ENUMERATION("ExtensionBlacklist.SilentInstall", |
| 1633 extension->location(), | 1658 extension->location(), |
| 1634 Manifest::NUM_LOCATIONS); | 1659 Manifest::NUM_LOCATIONS); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 1647 UMA_HISTOGRAM_ENUMERATION("Extensions.UpdateSource", | 1672 UMA_HISTOGRAM_ENUMERATION("Extensions.UpdateSource", |
| 1648 extension->location(), Manifest::NUM_LOCATIONS); | 1673 extension->location(), Manifest::NUM_LOCATIONS); |
| 1649 | 1674 |
| 1650 // A fully installed app cannot be demoted to an ephemeral app. | 1675 // A fully installed app cannot be demoted to an ephemeral app. |
| 1651 if ((install_flags & extensions::kInstallFlagIsEphemeral) && | 1676 if ((install_flags & extensions::kInstallFlagIsEphemeral) && |
| 1652 !extension_prefs_->IsEphemeralApp(id)) { | 1677 !extension_prefs_->IsEphemeralApp(id)) { |
| 1653 install_flags &= ~static_cast<int>(extensions::kInstallFlagIsEphemeral); | 1678 install_flags &= ~static_cast<int>(extensions::kInstallFlagIsEphemeral); |
| 1654 } | 1679 } |
| 1655 } | 1680 } |
| 1656 | 1681 |
| 1682 // WIP(binjin): need to figure out a way to check MustRemainDisabled here and | |
|
pastarmovj
2014/11/11 12:50:55
nit: AFAIK WIP is not officially used in Chromium
binjin
2014/11/11 19:10:37
It's a mark for myself, reminding that there are u
| |
| 1683 // pass reasons to extension prefs. | |
| 1657 const Extension::State initial_state = | 1684 const Extension::State initial_state = |
| 1658 initial_enable ? Extension::ENABLED : Extension::DISABLED; | 1685 initial_enable ? Extension::ENABLED : Extension::DISABLED; |
| 1659 if (ShouldDelayExtensionUpdate( | 1686 if (ShouldDelayExtensionUpdate( |
| 1660 id, | 1687 id, |
| 1661 !!(install_flags & extensions::kInstallFlagInstallImmediately))) { | 1688 !!(install_flags & extensions::kInstallFlagInstallImmediately))) { |
| 1662 extension_prefs_->SetDelayedInstallInfo( | 1689 extension_prefs_->SetDelayedInstallInfo( |
| 1663 extension, | 1690 extension, |
| 1664 initial_state, | 1691 initial_state, |
| 1665 install_flags, | 1692 install_flags, |
| 1666 extensions::ExtensionPrefs::DELAY_REASON_WAIT_FOR_IDLE, | 1693 extensions::ExtensionPrefs::DELAY_REASON_WAIT_FOR_IDLE, |
| (...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2388 } | 2415 } |
| 2389 | 2416 |
| 2390 void ExtensionService::OnProfileDestructionStarted() { | 2417 void ExtensionService::OnProfileDestructionStarted() { |
| 2391 ExtensionIdSet ids_to_unload = registry_->enabled_extensions().GetIDs(); | 2418 ExtensionIdSet ids_to_unload = registry_->enabled_extensions().GetIDs(); |
| 2392 for (ExtensionIdSet::iterator it = ids_to_unload.begin(); | 2419 for (ExtensionIdSet::iterator it = ids_to_unload.begin(); |
| 2393 it != ids_to_unload.end(); | 2420 it != ids_to_unload.end(); |
| 2394 ++it) { | 2421 ++it) { |
| 2395 UnloadExtension(*it, UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN); | 2422 UnloadExtension(*it, UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN); |
| 2396 } | 2423 } |
| 2397 } | 2424 } |
| OLD | NEW |