| Index: chrome/common/extensions/extension.cc
|
| diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc
|
| index 7066091ec35d96b901f240454aeffd236d0f9347..48555a42a254cf14694a09e55c664014df5f2782 100644
|
| --- a/chrome/common/extensions/extension.cc
|
| +++ b/chrome/common/extensions/extension.cc
|
| @@ -3337,10 +3337,18 @@ bool Extension::ParsePermissions(const char* key,
|
|
|
| for (size_t i = 0; i < permissions->GetSize(); ++i) {
|
| std::string permission_str;
|
| + const base::Value* permission_detail = NULL;
|
| if (!permissions->GetString(i, &permission_str)) {
|
| - *error = ExtensionErrorUtils::FormatErrorMessageUTF16(
|
| - errors::kInvalidPermission, base::IntToString(i));
|
| - return false;
|
| + const base::DictionaryValue *dict = NULL;
|
| + // permission should be a string or a single key dict.
|
| + if (!permissions->GetDictionary(i, &dict) || dict->size() != 1) {
|
| + *error = ExtensionErrorUtils::FormatErrorMessageUTF16(
|
| + errors::kInvalidPermission, base::IntToString(i));
|
| + return false;
|
| + }
|
| + base::DictionaryValue::Iterator it(*dict);
|
| + permission_str = it.key();
|
| + permission_detail = &it.value();
|
| }
|
|
|
| // NOTE: We need to get the APIPermission before the Feature
|
| @@ -3381,7 +3389,14 @@ bool Extension::ParsePermissions(const char* key,
|
| }
|
| }
|
|
|
| - api_permissions->insert(permission->id());
|
| + scoped_refptr<APIPermissionDetail> detail = permission->CreateDetail();
|
| + if (!detail->FromValue(permission_detail)) {
|
| + *error = ExtensionErrorUtils::FormatErrorMessageUTF16(
|
| + errors::kInvalidPermission, base::IntToString(i));
|
| + return false;
|
| + }
|
| +
|
| + api_permissions->insert(detail);
|
| continue;
|
| }
|
|
|
| @@ -3478,6 +3493,13 @@ bool Extension::HasAPIPermissionForTab(int tab_id,
|
| tab_specific_permissions->HasAPIPermission(permission);
|
| }
|
|
|
| +bool Extension::CheckAPIPermissionWithDetail(APIPermission::ID permission,
|
| + const APIPermissionDetail::CheckParam* param) const {
|
| + base::AutoLock auto_lock(runtime_data_lock_);
|
| + return runtime_data_.GetActivePermissions()->
|
| + CheckAPIPermissionWithDetail(permission, param);
|
| +}
|
| +
|
| const URLPatternSet& Extension::GetEffectiveHostPermissions() const {
|
| base::AutoLock auto_lock(runtime_data_lock_);
|
| return runtime_data_.GetActivePermissions()->effective_hosts();
|
|
|