Chromium Code Reviews| Index: chrome/common/extensions/chrome_manifest_permission_set.cc |
| diff --git a/chrome/common/extensions/chrome_manifest_permission_set.cc b/chrome/common/extensions/chrome_manifest_permission_set.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..6345427d92aa487c0cce8ea2f8063e20aa604501 |
| --- /dev/null |
| +++ b/chrome/common/extensions/chrome_manifest_permission_set.cc |
| @@ -0,0 +1,96 @@ |
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/common/extensions/chrome_manifest_permission_set.h" |
| + |
| +#include "base/logging.h" |
| +#include "base/strings/string_number_conversions.h" |
| +#include "base/values.h" |
| +#include "extensions/common/error_utils.h" |
| +#include "extensions/common/manifest_constants.h" |
| +#include "extensions/common/manifest_handler.h" |
| +#include "extensions/common/permissions/api_permission.h" |
| +#include "extensions/common/permissions/api_permission_set.h" |
| + |
| +namespace { |
| + |
| +using extensions::ErrorUtils; |
| +using extensions::ManifestPermission; |
| +using extensions::ManifestPermissionSet; |
| +using extensions::ManifestHandler; |
| +namespace errors = extensions::manifest_errors; |
| + |
| +bool CreateManifestPermission( |
| + const std::string& permission_name, |
| + const base::Value* permission_value, |
| + ManifestPermissionSet* manifest_permissions, |
| + string16* error, |
| + std::vector<std::string>* unhandled_permissions) { |
| + |
| + scoped_ptr<ManifestPermission> permission( |
| + ManifestHandler::CreatePermission(permission_name)); |
| + |
| + if (!permission) { |
| + if (unhandled_permissions) |
| + unhandled_permissions->push_back(permission_name); |
| + else |
| + LOG(WARNING) << "Unknown permission[" << permission_name << "]."; |
| + return true; |
| + } |
| + |
| + if (!permission->FromValue(permission_value)) { |
| + if (error) { |
| + *error = ErrorUtils::FormatErrorMessageUTF16( |
| + errors::kInvalidPermission, permission_name); |
| + return false; |
| + } |
| + LOG(WARNING) << "Parse permission failed."; |
| + return true; |
| + } else { |
| + manifest_permissions->insert(permission.release()); |
| + return true; |
| + } |
| +} |
| + |
| +} // namespace |
| + |
| +namespace extensions { |
| + |
| +// static |
| +bool ChromeManifestPermissionSet::ParseFromJSON( |
| + const base::ListValue* permissions, |
| + ManifestPermissionSet* manifest_permissions, |
| + string16* error, |
| + std::vector<std::string>* unhandled_permissions) { |
| + // TODO(rpaquay): Update name of local variables to reflect we are dealing |
|
Yoyo Zhou
2013/11/12 02:39:29
Does this still need to be done?
rpaquay
2013/11/12 21:40:31
Nope. Removed comment.
|
| + // with manifest_permissions entries. |
| + for (size_t i = 0; i < permissions->GetSize(); ++i) { |
| + std::string permission_name; |
| + const base::Value* permission_value = NULL; |
| + if (!permissions->GetString(i, &permission_name)) { |
| + const base::DictionaryValue* dict = NULL; |
| + // permission should be a string or a single key dict. |
| + if (!permissions->GetDictionary(i, &dict) || dict->size() != 1) { |
| + if (error) { |
| + *error = ErrorUtils::FormatErrorMessageUTF16( |
| + errors::kInvalidPermission, base::IntToString(i)); |
| + return false; |
| + } |
| + LOG(WARNING) << "Permission is not a string or single key dict."; |
| + continue; |
| + } |
| + base::DictionaryValue::Iterator it(*dict); |
| + permission_name = it.key(); |
| + permission_value = &it.value(); |
| + } |
| + |
| + if (!CreateManifestPermission(permission_name, permission_value, |
| + manifest_permissions, error, |
| + unhandled_permissions)) |
| + return false; |
| + } |
| + return true; |
| +} |
| + |
| +} // namespace extensions |