Chromium Code Reviews| Index: chrome/common/extensions/extension.cc |
| diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc |
| index dcd5360d00dcf433aa9742f735c29e63f07582d8..6a4cfa044353335fdc08daa1689ae8b5de2c0c11 100644 |
| --- a/chrome/common/extensions/extension.cc |
| +++ b/chrome/common/extensions/extension.cc |
| @@ -3337,7 +3337,10 @@ bool Extension::ParsePermissions(const char* key, |
| for (size_t i = 0; i < permissions->GetSize(); ++i) { |
| std::string permission_str; |
| - if (!permissions->GetString(i, &permission_str)) { |
| + base::ListValue *permission_list = NULL; |
| + if (!permissions->GetString(i, &permission_str) && |
| + !(permissions->GetList(i, &permission_list) && |
| + permission_list->GetString(0, &permission_str))) { |
| *error = ExtensionErrorUtils::FormatErrorMessageUTF16( |
| errors::kInvalidPermission, base::IntToString(i)); |
| return false; |
| @@ -3381,7 +3384,17 @@ bool Extension::ParsePermissions(const char* key, |
| } |
| } |
| - api_permissions->insert(permission->id()); |
| + scoped_refptr<APIPermissionDetail> detail = permission->CreateDetail(); |
| + base::Value *value = NULL; |
| + if (permission_list) { |
| + if (!(permission_list->Get(1, &value) && detail->FromValue(value))) { |
| + *error = ExtensionErrorUtils::FormatErrorMessageUTF16( |
| + errors::kInvalidPermission, base::IntToString(i)); |
| + return false; |
| + } |
| + } |
| + |
| + api_permissions->insert(detail); |
| continue; |
| } |
| @@ -3478,6 +3491,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_); |
|
miket_OOO
2012/08/06 21:04:06
It looks like this follows the existing pattern fo
Peng
2012/08/07 21:31:55
I guess this AutoLock protects runtime_data_ which
|
| + 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(); |