Index: chrome/browser/extensions/extension_management_internal.cc |
diff --git a/chrome/browser/extensions/extension_management_internal.cc b/chrome/browser/extensions/extension_management_internal.cc |
index 73bd132fbf831a7ee68bcbe04a9957153a721472..ca7c5fb710d264f19ed0e30f8f747b91477dd5e9 100644 |
--- a/chrome/browser/extensions/extension_management_internal.cc |
+++ b/chrome/browser/extensions/extension_management_internal.cc |
@@ -67,12 +67,64 @@ bool IndividualSettings::Parse(const base::DictionaryValue* dict, |
} |
} |
+ // Parses the blocked permission settings. |
+ const base::ListValue* list_value = nullptr; |
+ base::string16 error; |
+ |
+ // If applicable, inherit from global block list and remove all explicitly |
+ // allowed permissions. |
+ if (scope != SCOPE_DEFAULT && |
+ dict->GetListWithoutPathExpansion(schema_constants::kAllowedPermissions, |
+ &list_value)) { |
+ // It is assumed that Parse() is already called for SCOPE_DEFAULT and |
+ // settings specified for |this| is initialized by copying from default |
+ // settings, including the |blocked_permissions| setting here. |
+ // That is, |blocked_permissions| should be the default block permissions |
+ // list settings here. |
+ APIPermissionSet globally_blocked_permissions = blocked_permissions; |
+ APIPermissionSet explicitly_allowed_permissions; |
+ // Reuses code for parsing API permissions from manifest. But note that we |
+ // only support list of strings type. |
+ if (!APIPermissionSet::ParseFromJSON( |
+ list_value, |
+ APIPermissionSet::kDisallowInternalPermissions, |
+ &explicitly_allowed_permissions, |
+ &error, |
+ nullptr)) { |
+ // There might be unknown permissions, warn and just ignore them; |
+ LOG(WARNING) << error; |
+ } |
+ APIPermissionSet::Difference(globally_blocked_permissions, |
+ explicitly_allowed_permissions, |
+ &blocked_permissions); |
+ } |
+ |
+ // Then add all newly blocked permissions to the list. |
+ if (dict->GetListWithoutPathExpansion(schema_constants::kBlockedPermissions, |
+ &list_value)) { |
+ // The |blocked_permissions| might be the result of the routines above, |
+ // or remains the same as default block permissions settings. |
+ APIPermissionSet permissions_to_merge_from = blocked_permissions; |
+ APIPermissionSet permissions_parsed; |
+ if (!APIPermissionSet::ParseFromJSON( |
+ list_value, |
+ APIPermissionSet::kDisallowInternalPermissions, |
+ &permissions_parsed, |
+ &error, |
+ nullptr)) { |
+ LOG(WARNING) << error; |
+ } |
+ APIPermissionSet::Union( |
+ permissions_to_merge_from, permissions_parsed, &blocked_permissions); |
+ } |
+ |
return true; |
} |
void IndividualSettings::Reset() { |
installation_mode = ExtensionManagement::INSTALLATION_ALLOWED; |
update_url.clear(); |
+ blocked_permissions.clear(); |
} |
GlobalSettings::GlobalSettings() { |