| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/api/permissions/permissions_api_helpers.h" |
| 6 |
| 5 #include <stddef.h> | 7 #include <stddef.h> |
| 6 | 8 |
| 9 #include <memory> |
| 10 |
| 7 #include "base/macros.h" | 11 #include "base/macros.h" |
| 8 #include "base/memory/scoped_ptr.h" | |
| 9 #include "base/values.h" | 12 #include "base/values.h" |
| 10 #include "chrome/browser/extensions/api/permissions/permissions_api_helpers.h" | |
| 11 #include "chrome/common/extensions/api/permissions.h" | 13 #include "chrome/common/extensions/api/permissions.h" |
| 12 #include "extensions/common/permissions/permission_set.h" | 14 #include "extensions/common/permissions/permission_set.h" |
| 13 #include "extensions/common/url_pattern_set.h" | 15 #include "extensions/common/url_pattern_set.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 15 #include "url/gurl.h" | 17 #include "url/gurl.h" |
| 16 | 18 |
| 17 using extensions::api::permissions::Permissions; | 19 using extensions::api::permissions::Permissions; |
| 18 using extensions::permissions_api_helpers::PackPermissionSet; | 20 using extensions::permissions_api_helpers::PackPermissionSet; |
| 19 using extensions::permissions_api_helpers::UnpackPermissionSet; | 21 using extensions::permissions_api_helpers::UnpackPermissionSet; |
| 20 | 22 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 36 apis.insert(APIPermission::kFileBrowserHandler); | 38 apis.insert(APIPermission::kFileBrowserHandler); |
| 37 // Note: kFileBrowserHandler implies kFileBrowserHandlerInternal. | 39 // Note: kFileBrowserHandler implies kFileBrowserHandlerInternal. |
| 38 URLPatternSet hosts; | 40 URLPatternSet hosts; |
| 39 AddPattern(&hosts, "http://a.com/*"); | 41 AddPattern(&hosts, "http://a.com/*"); |
| 40 AddPattern(&hosts, "http://b.com/*"); | 42 AddPattern(&hosts, "http://b.com/*"); |
| 41 | 43 |
| 42 PermissionSet permission_set(apis, ManifestPermissionSet(), hosts, | 44 PermissionSet permission_set(apis, ManifestPermissionSet(), hosts, |
| 43 URLPatternSet()); | 45 URLPatternSet()); |
| 44 | 46 |
| 45 // Pack the permission set to value and verify its contents. | 47 // Pack the permission set to value and verify its contents. |
| 46 scoped_ptr<Permissions> permissions(PackPermissionSet(permission_set)); | 48 std::unique_ptr<Permissions> permissions(PackPermissionSet(permission_set)); |
| 47 scoped_ptr<base::DictionaryValue> value(permissions->ToValue()); | 49 std::unique_ptr<base::DictionaryValue> value(permissions->ToValue()); |
| 48 base::ListValue* api_list = NULL; | 50 base::ListValue* api_list = NULL; |
| 49 base::ListValue* origin_list = NULL; | 51 base::ListValue* origin_list = NULL; |
| 50 EXPECT_TRUE(value->GetList("permissions", &api_list)); | 52 EXPECT_TRUE(value->GetList("permissions", &api_list)); |
| 51 EXPECT_TRUE(value->GetList("origins", &origin_list)); | 53 EXPECT_TRUE(value->GetList("origins", &origin_list)); |
| 52 | 54 |
| 53 EXPECT_EQ(3u, api_list->GetSize()); | 55 EXPECT_EQ(3u, api_list->GetSize()); |
| 54 EXPECT_EQ(2u, origin_list->GetSize()); | 56 EXPECT_EQ(2u, origin_list->GetSize()); |
| 55 | 57 |
| 56 std::string expected_apis[] = {"tabs", "fileBrowserHandler", | 58 std::string expected_apis[] = {"tabs", "fileBrowserHandler", |
| 57 "fileBrowserHandlerInternal"}; | 59 "fileBrowserHandlerInternal"}; |
| 58 for (size_t i = 0; i < arraysize(expected_apis); ++i) { | 60 for (size_t i = 0; i < arraysize(expected_apis); ++i) { |
| 59 scoped_ptr<base::Value> value(new base::StringValue(expected_apis[i])); | 61 std::unique_ptr<base::Value> value(new base::StringValue(expected_apis[i])); |
| 60 EXPECT_NE(api_list->end(), api_list->Find(*value)); | 62 EXPECT_NE(api_list->end(), api_list->Find(*value)); |
| 61 } | 63 } |
| 62 | 64 |
| 63 std::string expected_origins[] = { "http://a.com/*", "http://b.com/*" }; | 65 std::string expected_origins[] = { "http://a.com/*", "http://b.com/*" }; |
| 64 for (size_t i = 0; i < arraysize(expected_origins); ++i) { | 66 for (size_t i = 0; i < arraysize(expected_origins); ++i) { |
| 65 scoped_ptr<base::Value> value(new base::StringValue(expected_origins[i])); | 67 std::unique_ptr<base::Value> value( |
| 68 new base::StringValue(expected_origins[i])); |
| 66 EXPECT_NE(origin_list->end(), origin_list->Find(*value)); | 69 EXPECT_NE(origin_list->end(), origin_list->Find(*value)); |
| 67 } | 70 } |
| 68 | 71 |
| 69 // Unpack the value back to a permission set and make sure its equal to the | 72 // Unpack the value back to a permission set and make sure its equal to the |
| 70 // original one. | 73 // original one. |
| 71 std::string error; | 74 std::string error; |
| 72 Permissions permissions_object; | 75 Permissions permissions_object; |
| 73 EXPECT_TRUE(Permissions::Populate(*value, &permissions_object)); | 76 EXPECT_TRUE(Permissions::Populate(*value, &permissions_object)); |
| 74 scoped_ptr<const PermissionSet> from_value = | 77 std::unique_ptr<const PermissionSet> from_value = |
| 75 UnpackPermissionSet(permissions_object, true, &error); | 78 UnpackPermissionSet(permissions_object, true, &error); |
| 76 EXPECT_TRUE(error.empty()); | 79 EXPECT_TRUE(error.empty()); |
| 77 | 80 |
| 78 EXPECT_EQ(permission_set, *from_value); | 81 EXPECT_EQ(permission_set, *from_value); |
| 79 } | 82 } |
| 80 | 83 |
| 81 // Tests various error conditions and edge cases when unpacking values | 84 // Tests various error conditions and edge cases when unpacking values |
| 82 // into PermissionSets. | 85 // into PermissionSets. |
| 83 TEST(ExtensionPermissionsAPIHelpers, Unpack) { | 86 TEST(ExtensionPermissionsAPIHelpers, Unpack) { |
| 84 scoped_ptr<base::ListValue> apis(new base::ListValue()); | 87 std::unique_ptr<base::ListValue> apis(new base::ListValue()); |
| 85 apis->Append(new base::StringValue("tabs")); | 88 apis->Append(new base::StringValue("tabs")); |
| 86 scoped_ptr<base::ListValue> origins(new base::ListValue()); | 89 std::unique_ptr<base::ListValue> origins(new base::ListValue()); |
| 87 origins->Append(new base::StringValue("http://a.com/*")); | 90 origins->Append(new base::StringValue("http://a.com/*")); |
| 88 | 91 |
| 89 scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); | 92 std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); |
| 90 scoped_ptr<const PermissionSet> permissions; | 93 std::unique_ptr<const PermissionSet> permissions; |
| 91 std::string error; | 94 std::string error; |
| 92 | 95 |
| 93 // Origins shouldn't have to be present. | 96 // Origins shouldn't have to be present. |
| 94 { | 97 { |
| 95 Permissions permissions_object; | 98 Permissions permissions_object; |
| 96 value->Set("permissions", apis->DeepCopy()); | 99 value->Set("permissions", apis->DeepCopy()); |
| 97 EXPECT_TRUE(Permissions::Populate(*value, &permissions_object)); | 100 EXPECT_TRUE(Permissions::Populate(*value, &permissions_object)); |
| 98 permissions = UnpackPermissionSet(permissions_object, true, &error); | 101 permissions = UnpackPermissionSet(permissions_object, true, &error); |
| 99 EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kTab)); | 102 EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kTab)); |
| 100 EXPECT_TRUE(permissions.get()); | 103 EXPECT_TRUE(permissions.get()); |
| 101 EXPECT_TRUE(error.empty()); | 104 EXPECT_TRUE(error.empty()); |
| 102 } | 105 } |
| 103 | 106 |
| 104 // The api permissions don't need to be present either. | 107 // The api permissions don't need to be present either. |
| 105 { | 108 { |
| 106 Permissions permissions_object; | 109 Permissions permissions_object; |
| 107 value->Clear(); | 110 value->Clear(); |
| 108 value->Set("origins", origins->DeepCopy()); | 111 value->Set("origins", origins->DeepCopy()); |
| 109 EXPECT_TRUE(Permissions::Populate(*value, &permissions_object)); | 112 EXPECT_TRUE(Permissions::Populate(*value, &permissions_object)); |
| 110 permissions = UnpackPermissionSet(permissions_object, true, &error); | 113 permissions = UnpackPermissionSet(permissions_object, true, &error); |
| 111 EXPECT_TRUE(permissions.get()); | 114 EXPECT_TRUE(permissions.get()); |
| 112 EXPECT_TRUE(error.empty()); | 115 EXPECT_TRUE(error.empty()); |
| 113 EXPECT_TRUE(permissions->HasExplicitAccessToOrigin(GURL("http://a.com/"))); | 116 EXPECT_TRUE(permissions->HasExplicitAccessToOrigin(GURL("http://a.com/"))); |
| 114 } | 117 } |
| 115 | 118 |
| 116 // Throw errors for non-string API permissions. | 119 // Throw errors for non-string API permissions. |
| 117 { | 120 { |
| 118 Permissions permissions_object; | 121 Permissions permissions_object; |
| 119 value->Clear(); | 122 value->Clear(); |
| 120 scoped_ptr<base::ListValue> invalid_apis(apis->DeepCopy()); | 123 std::unique_ptr<base::ListValue> invalid_apis(apis->DeepCopy()); |
| 121 invalid_apis->Append(new base::FundamentalValue(3)); | 124 invalid_apis->Append(new base::FundamentalValue(3)); |
| 122 value->Set("permissions", invalid_apis->DeepCopy()); | 125 value->Set("permissions", invalid_apis->DeepCopy()); |
| 123 EXPECT_FALSE(Permissions::Populate(*value, &permissions_object)); | 126 EXPECT_FALSE(Permissions::Populate(*value, &permissions_object)); |
| 124 } | 127 } |
| 125 | 128 |
| 126 // Throw errors for non-string origins. | 129 // Throw errors for non-string origins. |
| 127 { | 130 { |
| 128 Permissions permissions_object; | 131 Permissions permissions_object; |
| 129 value->Clear(); | 132 value->Clear(); |
| 130 scoped_ptr<base::ListValue> invalid_origins(origins->DeepCopy()); | 133 std::unique_ptr<base::ListValue> invalid_origins(origins->DeepCopy()); |
| 131 invalid_origins->Append(new base::FundamentalValue(3)); | 134 invalid_origins->Append(new base::FundamentalValue(3)); |
| 132 value->Set("origins", invalid_origins->DeepCopy()); | 135 value->Set("origins", invalid_origins->DeepCopy()); |
| 133 EXPECT_FALSE(Permissions::Populate(*value, &permissions_object)); | 136 EXPECT_FALSE(Permissions::Populate(*value, &permissions_object)); |
| 134 } | 137 } |
| 135 | 138 |
| 136 // Throw errors when "origins" or "permissions" are not list values. | 139 // Throw errors when "origins" or "permissions" are not list values. |
| 137 { | 140 { |
| 138 Permissions permissions_object; | 141 Permissions permissions_object; |
| 139 value->Clear(); | 142 value->Clear(); |
| 140 value->Set("origins", new base::FundamentalValue(2)); | 143 value->Set("origins", new base::FundamentalValue(2)); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 158 permissions = UnpackPermissionSet(permissions_object, true, &error); | 161 permissions = UnpackPermissionSet(permissions_object, true, &error); |
| 159 EXPECT_TRUE(permissions.get()); | 162 EXPECT_TRUE(permissions.get()); |
| 160 EXPECT_TRUE(error.empty()); | 163 EXPECT_TRUE(error.empty()); |
| 161 EXPECT_TRUE(permissions->HasExplicitAccessToOrigin(GURL("http://a.com/"))); | 164 EXPECT_TRUE(permissions->HasExplicitAccessToOrigin(GURL("http://a.com/"))); |
| 162 } | 165 } |
| 163 | 166 |
| 164 // Unknown permissions should throw an error. | 167 // Unknown permissions should throw an error. |
| 165 { | 168 { |
| 166 Permissions permissions_object; | 169 Permissions permissions_object; |
| 167 value->Clear(); | 170 value->Clear(); |
| 168 scoped_ptr<base::ListValue> invalid_apis(apis->DeepCopy()); | 171 std::unique_ptr<base::ListValue> invalid_apis(apis->DeepCopy()); |
| 169 invalid_apis->Append(new base::StringValue("unknown_permission")); | 172 invalid_apis->Append(new base::StringValue("unknown_permission")); |
| 170 value->Set("permissions", invalid_apis->DeepCopy()); | 173 value->Set("permissions", invalid_apis->DeepCopy()); |
| 171 EXPECT_TRUE(Permissions::Populate(*value, &permissions_object)); | 174 EXPECT_TRUE(Permissions::Populate(*value, &permissions_object)); |
| 172 permissions = UnpackPermissionSet(permissions_object, true, &error); | 175 permissions = UnpackPermissionSet(permissions_object, true, &error); |
| 173 EXPECT_FALSE(permissions.get()); | 176 EXPECT_FALSE(permissions.get()); |
| 174 EXPECT_FALSE(error.empty()); | 177 EXPECT_FALSE(error.empty()); |
| 175 EXPECT_EQ(error, "'unknown_permission' is not a recognized permission."); | 178 EXPECT_EQ(error, "'unknown_permission' is not a recognized permission."); |
| 176 } | 179 } |
| 177 } | 180 } |
| 178 | 181 |
| 179 } // namespace extensions | 182 } // namespace extensions |
| OLD | NEW |