Chromium Code Reviews| Index: chrome/browser/extensions/extension_service.cc |
| diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc |
| index d8e601beb50ac115f6528daf73bf231b02b4ae96..9fcf18ad20bb6e4dc05a2d56dff6d3eec8cc3a52 100644 |
| --- a/chrome/browser/extensions/extension_service.cc |
| +++ b/chrome/browser/extensions/extension_service.cc |
| @@ -378,7 +378,8 @@ const Extension* ExtensionService::GetExtensionById( |
| // callers of this function, and many might assume that this includes those |
| // that have been disabled due to blacklisting. |
|
not at google - send to devlin
2014/11/12 18:23:00
Update comment?
Mike Lerman
2014/11/12 20:58:42
Done.
|
| include_mask |= ExtensionRegistry::DISABLED | |
| - ExtensionRegistry::BLACKLISTED; |
| + ExtensionRegistry::BLACKLISTED | |
| + ExtensionRegistry::LOCKED; |
| } |
| return registry_->GetExtensionById(id, include_mask); |
| } |
| @@ -579,12 +580,14 @@ void ExtensionService::ReloadExtensionImpl( |
| return; |
| } |
| - // Ignore attempts to reload a blacklisted extension. Sometimes this can |
| - // happen in a convoluted reload sequence triggered by the termination of a |
| - // blacklisted extension and a naive attempt to reload it. For an example see |
| - // http://crbug.com/373842. |
| - if (registry_->blacklisted_extensions().Contains(transient_extension_id)) |
| + // Ignore attempts to reload a blacklisted or locked extension. Sometimes this |
|
not at google - send to devlin
2014/11/12 18:22:59
Also update this comment.
Mike Lerman
2014/11/12 20:58:41
Ah, I'd only done half! Thanks. Done.
|
| + // can happen in a convoluted reload sequence triggered by the termination of |
| + // a blacklisted extension and a naive attempt to reload it. For an example |
| + // see http://crbug.com/373842. |
| + if (registry_->blacklisted_extensions().Contains(transient_extension_id) || |
| + registry_->locked_extensions().Contains(transient_extension_id)) { |
| return; |
| + } |
| base::FilePath path; |
| @@ -789,7 +792,8 @@ bool ExtensionService::IsExtensionEnabled( |
| } |
| if (registry_->disabled_extensions().Contains(extension_id) || |
| - registry_->blacklisted_extensions().Contains(extension_id)) { |
| + registry_->blacklisted_extensions().Contains(extension_id) || |
| + registry_->locked_extensions().Contains(extension_id)) { |
| return false; |
| } |
| @@ -797,6 +801,7 @@ bool ExtensionService::IsExtensionEnabled( |
| // enabled unless otherwise noted. |
| return !extension_prefs_->IsExtensionDisabled(extension_id) && |
| !extension_prefs_->IsExtensionBlacklisted(extension_id) && |
| + !extension_prefs_->IsExtensionLocked(extension_id) && |
| !extension_prefs_->IsExternalExtensionUninstalled(extension_id); |
| } |
| @@ -920,6 +925,77 @@ void ExtensionService::DisableUserExtensions( |
| } |
| } |
| + |
|
not at google - send to devlin
2014/11/12 18:23:00
Remove redundant new line.
Mike Lerman
2014/11/12 20:58:42
Done.
|
| +// Extensions specified by |extension_ids| should become locked. Extensions |
| +// are no longer considered enabled or disabled. Blacklisted extensions are |
| +// now considered both blacklisted and locked. |
| +void ExtensionService::LockAllExtensions() { |
| + scoped_ptr<ExtensionSet> extensions = |
| + registry_->GenerateInstalledExtensionsSet(); |
| + |
| + ExtensionIdSet to_lock; |
| + for (ExtensionSet::const_iterator extension = extensions->begin(); |
|
not at google - send to devlin
2014/11/12 18:23:00
You could use the new : foreach syntax?
Mike Lerman
2014/11/12 20:58:42
Done.
|
| + extension != extensions->end(); |
| + ++extension) { |
| + const std::string& id = (*extension)->id(); |
| + if (!registry_->locked_extensions().Contains(id)) |
| + to_lock.insert(id); |
| + } |
| + |
| + for (ExtensionIdSet::iterator id = to_lock.begin(); |
| + id != to_lock.end(); ++id) { |
| + scoped_refptr<const Extension> extension = GetInstalledExtension(*id); |
|
not at google - send to devlin
2014/11/12 18:23:00
Unless something is very wrong, this shouldn't be
Mike Lerman
2014/11/12 20:58:42
That saves a lot of code. Thanks!
|
| + if (!extension.get()) { |
| + NOTREACHED() << "Extension " << *id << " needs to be " |
| + << "locked, but it's not installed."; |
| + continue; |
| + } |
| + |
| + // Don't lock core components. |
| + if (extension.get()->location() == Manifest::COMPONENT || |
| + extension.get()->location() == Manifest::EXTERNAL_COMPONENT) { |
|
not at google - send to devlin
2014/11/12 18:23:00
Hm, it's surprising that this is the first time we
Mike Lerman
2014/11/12 20:58:42
It seems like this DCHECK in DisableExtension woul
|
| + continue; |
| + } |
| + |
| + if (system_->management_policy()->MustRemainEnabled(extension.get(), NULL)) |
| + continue; |
| + |
| + // Blacklisted extensions remain in the blacklisted list. |
|
not at google - send to devlin
2014/11/12 18:23:00
What about terminated extensions? Those need to go
Mike Lerman
2014/11/12 20:58:42
I had assumed that a terminated extension was A) A
not at google - send to devlin
2014/11/12 23:41:42
You can restart a terminated extension by going to
Mike Lerman
2014/11/13 15:30:04
Acknowledged.
|
| + if (registry_->enabled_extensions().Contains(*id)) { |
| + registry_->RemoveEnabled(*id); |
| + } else if (registry_->disabled_extensions().Contains(*id)) { |
| + registry_->RemoveDisabled(*id); |
| + } |
|
not at google - send to devlin
2014/11/12 18:23:00
I don't actually think the "if"s here are necessar
Mike Lerman
2014/11/12 20:58:42
Done.
|
| + registry_->AddLocked(extension.get()); |
| + extension_prefs_->SetExtensionState(*id, Extension::LOCKED); |
| + UnloadExtension( |
| + *id, extensions::UnloadedExtensionInfo::REASON_PROFILE_LOCK); |
| + } |
| +} |
| + |
| +// All locked extensions should revert to being either enabled or disabled |
| +// as appropriate. |
| +void ExtensionService::UnlockAllLockedExtensions() { |
| + ExtensionIdSet to_unlock = registry_->locked_extensions().GetIDs(); |
| + |
| + for (ExtensionIdSet::iterator it = to_unlock.begin(); |
| + it != to_unlock.end(); ++it) { |
| + scoped_refptr<const Extension> extension = GetInstalledExtension(*it); |
| + if (!extension.get()) { |
| + NOTREACHED() << "Extension " << *it << " needs to be " |
|
not at google - send to devlin
2014/11/12 18:23:00
Again; not possible, and this code is perfectly sa
Mike Lerman
2014/11/12 20:58:42
Really? I can't loop directory of registry->locked
not at google - send to devlin
2014/11/12 23:41:42
Oh right, good point, I guess you need to take a c
|
| + << "unlocked, but it's not installed."; |
| + continue; |
| + } |
| + |
| + registry_->RemoveLocked(*it); |
| + if (extension_prefs_->GetDisableReasons(*it)) |
| + extension_prefs_->SetExtensionState(*it, Extension::DISABLED); |
| + else |
| + extension_prefs_->SetExtensionState(*it, Extension::ENABLED); |
|
not at google - send to devlin
2014/11/12 18:23:00
Again: terminated extensions.
Mike Lerman
2014/11/12 20:58:42
Done.
|
| + AddExtension(extension.get()); |
| + } |
| +} |
| + |
| void ExtensionService::GrantPermissionsAndEnableExtension( |
| const Extension* extension) { |
| GrantPermissions(extension); |
| @@ -1373,6 +1449,8 @@ void ExtensionService::AddExtension(const Extension* extension) { |
| // installation then threads through the install and pending install flow |
| // of this class, and we check when loading installed extensions. |
| registry_->AddBlacklisted(extension); |
| + } else if (extension_prefs_->IsExtensionLocked(extension->id())) { |
| + registry_->AddLocked(extension); |
| } else if (!reloading && |
| extension_prefs_->IsExtensionDisabled(extension->id())) { |
| registry_->AddDisabled(extension); |