| 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/common/extensions/feature.h" | 5 #include "chrome/common/extensions/feature.h" |
| 6 | 6 |
| 7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
| 8 | 8 |
| 9 using extensions::Feature; | 9 using extensions::Feature; |
| 10 | 10 |
| 11 namespace { | 11 namespace { |
| 12 | 12 |
| 13 struct IsAvailableTestData { | 13 struct IsAvailableTestData { |
| 14 std::string extension_id; | 14 std::string extension_id; |
| 15 Extension::Type extension_type; | 15 Extension::Type extension_type; |
| 16 Feature::Context context; |
| 16 Feature::Location location; | 17 Feature::Location location; |
| 17 Feature::Platform platform; | 18 Feature::Platform platform; |
| 18 int manifest_version; | 19 int manifest_version; |
| 19 Feature::Availability expected_result; | 20 Feature::Availability expected_result; |
| 20 }; | 21 }; |
| 21 | 22 |
| 22 } // namespace | 23 } // namespace |
| 23 | 24 |
| 24 TEST(ExtensionFeatureTest, IsAvailableNullCase) { | 25 TEST(ExtensionFeatureTest, IsAvailableNullCase) { |
| 25 const IsAvailableTestData tests[] = { | 26 const IsAvailableTestData tests[] = { |
| 26 { "", Extension::TYPE_UNKNOWN, | 27 { "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_CONTEXT, |
| 27 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, | 28 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, |
| 28 Feature::IS_AVAILABLE }, | 29 Feature::IS_AVAILABLE }, |
| 29 { "random-extension", Extension::TYPE_UNKNOWN, | 30 { "random-extension", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_CONTEXT, |
| 30 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, | 31 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, |
| 31 Feature::IS_AVAILABLE }, | 32 Feature::IS_AVAILABLE }, |
| 32 { "", Extension::TYPE_PACKAGED_APP, | 33 { "", Extension::TYPE_PACKAGED_APP, Feature::UNSPECIFIED_CONTEXT, |
| 33 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, | 34 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, |
| 34 Feature::IS_AVAILABLE }, | 35 Feature::IS_AVAILABLE }, |
| 35 { "", Extension::TYPE_UNKNOWN, | 36 { "", Extension::TYPE_UNKNOWN, Feature::BLESSED_EXTENSION_CONTEXT, |
| 36 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, | 37 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, |
| 37 Feature::IS_AVAILABLE }, | 38 Feature::IS_AVAILABLE }, |
| 38 { "", Extension::TYPE_UNKNOWN, | 39 { "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_CONTEXT, |
| 39 Feature::COMPONENT_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, | 40 Feature::COMPONENT_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, |
| 40 Feature::IS_AVAILABLE }, | 41 Feature::IS_AVAILABLE }, |
| 41 { "", Extension::TYPE_UNKNOWN, | 42 { "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_CONTEXT, |
| 42 Feature::UNSPECIFIED_LOCATION, Feature::CHROMEOS_PLATFORM, -1, | 43 Feature::UNSPECIFIED_LOCATION, Feature::CHROMEOS_PLATFORM, -1, |
| 43 Feature::IS_AVAILABLE }, | 44 Feature::IS_AVAILABLE }, |
| 44 { "", Extension::TYPE_UNKNOWN, | 45 { "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_CONTEXT, |
| 45 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, 25, | 46 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, 25, |
| 46 Feature::IS_AVAILABLE } | 47 Feature::IS_AVAILABLE } |
| 47 }; | 48 }; |
| 48 | 49 |
| 49 Feature feature; | 50 Feature feature; |
| 50 for (size_t i = 0; i < arraysize(tests); ++i) { | 51 for (size_t i = 0; i < arraysize(tests); ++i) { |
| 51 const IsAvailableTestData& test = tests[i]; | 52 const IsAvailableTestData& test = tests[i]; |
| 52 EXPECT_EQ(test.expected_result, | 53 EXPECT_EQ(test.expected_result, |
| 53 feature.IsAvailableToManifest(test.extension_id, | 54 feature.IsAvailable(test.extension_id, test.extension_type, |
| 54 test.extension_type, | 55 test.location, test.context, test.platform, |
| 55 test.location, | 56 test.manifest_version)); |
| 56 test.manifest_version, | |
| 57 test.platform)); | |
| 58 } | 57 } |
| 59 } | 58 } |
| 60 | 59 |
| 61 TEST(ExtensionFeatureTest, Whitelist) { | 60 TEST(ExtensionFeatureTest, Whitelist) { |
| 62 Feature feature; | 61 Feature feature; |
| 63 feature.whitelist()->insert("foo"); | 62 feature.whitelist()->insert("foo"); |
| 64 feature.whitelist()->insert("bar"); | 63 feature.whitelist()->insert("bar"); |
| 65 | 64 |
| 66 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( | 65 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailable( |
| 67 "foo", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, | 66 "foo", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 68 Feature::UNSPECIFIED_PLATFORM)); | 67 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 69 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( | 68 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailable( |
| 70 "bar", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, | 69 "bar", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 71 Feature::UNSPECIFIED_PLATFORM)); | 70 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 72 | 71 |
| 73 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailableToManifest( | 72 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailable( |
| 74 "baz", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, | 73 "baz", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 75 Feature::UNSPECIFIED_PLATFORM)); | 74 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 76 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailableToManifest( | 75 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailable( |
| 77 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, | 76 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 78 Feature::UNSPECIFIED_PLATFORM)); | 77 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 79 | 78 |
| 80 feature.extension_types()->insert(Extension::TYPE_PACKAGED_APP); | 79 feature.extension_types()->insert(Extension::TYPE_PACKAGED_APP); |
| 81 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailableToManifest( | 80 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailable( |
| 82 "baz", Extension::TYPE_PACKAGED_APP, Feature::UNSPECIFIED_LOCATION, -1, | 81 "baz", Extension::TYPE_PACKAGED_APP, Feature::UNSPECIFIED_LOCATION, |
| 83 Feature::UNSPECIFIED_PLATFORM)); | 82 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 84 } | 83 } |
| 85 | 84 |
| 86 TEST(ExtensionFeatureTest, PackageType) { | 85 TEST(ExtensionFeatureTest, PackageType) { |
| 87 Feature feature; | 86 Feature feature; |
| 88 feature.extension_types()->insert(Extension::TYPE_EXTENSION); | 87 feature.extension_types()->insert(Extension::TYPE_EXTENSION); |
| 89 feature.extension_types()->insert(Extension::TYPE_PACKAGED_APP); | 88 feature.extension_types()->insert(Extension::TYPE_PACKAGED_APP); |
| 90 | 89 |
| 91 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( | 90 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailable( |
| 92 "", Extension::TYPE_EXTENSION, Feature::UNSPECIFIED_LOCATION, -1, | 91 "", Extension::TYPE_EXTENSION, Feature::UNSPECIFIED_LOCATION, |
| 93 Feature::UNSPECIFIED_PLATFORM)); | 92 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 94 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( | 93 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailable( |
| 95 "", Extension::TYPE_PACKAGED_APP, Feature::UNSPECIFIED_LOCATION, -1, | 94 "", Extension::TYPE_PACKAGED_APP, Feature::UNSPECIFIED_LOCATION, |
| 96 Feature::UNSPECIFIED_PLATFORM)); | 95 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 97 | 96 |
| 98 EXPECT_EQ(Feature::INVALID_TYPE, feature.IsAvailableToManifest( | 97 EXPECT_EQ(Feature::INVALID_TYPE, feature.IsAvailable( |
| 99 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, | 98 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 100 Feature::UNSPECIFIED_PLATFORM)); | 99 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 101 EXPECT_EQ(Feature::INVALID_TYPE, feature.IsAvailableToManifest( | 100 EXPECT_EQ(Feature::INVALID_TYPE, feature.IsAvailable( |
| 102 "", Extension::TYPE_THEME, Feature::UNSPECIFIED_LOCATION, -1, | 101 "", Extension::TYPE_THEME, Feature::UNSPECIFIED_LOCATION, |
| 103 Feature::UNSPECIFIED_PLATFORM)); | 102 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 104 } | 103 } |
| 105 | 104 |
| 106 TEST(ExtensionFeatureTest, Context) { | 105 TEST(ExtensionFeatureTest, Context) { |
| 107 Feature feature; | 106 Feature feature; |
| 108 feature.contexts()->insert(Feature::BLESSED_EXTENSION_CONTEXT); | 107 feature.contexts()->insert(Feature::BLESSED_EXTENSION_CONTEXT); |
| 109 feature.extension_types()->insert(Extension::TYPE_PACKAGED_APP); | 108 feature.contexts()->insert(Feature::CONTENT_SCRIPT_CONTEXT); |
| 110 feature.set_platform(Feature::CHROMEOS_PLATFORM); | |
| 111 feature.set_min_manifest_version(21); | |
| 112 feature.set_max_manifest_version(25); | |
| 113 | 109 |
| 114 DictionaryValue manifest; | 110 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailable( |
| 115 manifest.SetString("name", "test"); | 111 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 116 manifest.SetString("version", "1"); | 112 Feature::BLESSED_EXTENSION_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 117 manifest.SetInteger("manifest_version", 21); | 113 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailable( |
| 118 manifest.SetString("app.launch.local_path", "foo.html"); | 114 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 115 Feature::CONTENT_SCRIPT_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 119 | 116 |
| 120 std::string error; | 117 EXPECT_EQ(Feature::INVALID_CONTEXT, feature.IsAvailable( |
| 121 scoped_refptr<const Extension> extension(Extension::Create( | 118 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 122 FilePath(), Extension::INTERNAL, manifest, Extension::NO_FLAGS, &error)); | 119 Feature::UNBLESSED_EXTENSION_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 123 EXPECT_EQ("", error); | 120 EXPECT_EQ(Feature::INVALID_CONTEXT, feature.IsAvailable( |
| 124 ASSERT_TRUE(extension.get()); | 121 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 125 | 122 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 126 feature.whitelist()->insert("monkey"); | |
| 127 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailableToContext( | |
| 128 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT, | |
| 129 Feature::CHROMEOS_PLATFORM)); | |
| 130 feature.whitelist()->clear(); | |
| 131 | |
| 132 feature.extension_types()->clear(); | |
| 133 feature.extension_types()->insert(Extension::TYPE_THEME); | |
| 134 EXPECT_EQ(Feature::INVALID_TYPE, feature.IsAvailableToContext( | |
| 135 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT, | |
| 136 Feature::CHROMEOS_PLATFORM)); | |
| 137 feature.extension_types()->clear(); | |
| 138 feature.extension_types()->insert(Extension::TYPE_PACKAGED_APP); | |
| 139 | |
| 140 feature.contexts()->clear(); | |
| 141 feature.contexts()->insert(Feature::UNBLESSED_EXTENSION_CONTEXT); | |
| 142 EXPECT_EQ(Feature::INVALID_CONTEXT, feature.IsAvailableToContext( | |
| 143 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT, | |
| 144 Feature::CHROMEOS_PLATFORM)); | |
| 145 feature.contexts()->clear(); | |
| 146 feature.contexts()->insert(Feature::BLESSED_EXTENSION_CONTEXT); | |
| 147 | |
| 148 feature.set_location(Feature::COMPONENT_LOCATION); | |
| 149 EXPECT_EQ(Feature::INVALID_LOCATION, feature.IsAvailableToContext( | |
| 150 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT, | |
| 151 Feature::CHROMEOS_PLATFORM)); | |
| 152 feature.set_location(Feature::UNSPECIFIED_LOCATION); | |
| 153 | |
| 154 EXPECT_EQ(Feature::INVALID_PLATFORM, feature.IsAvailableToContext( | |
| 155 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT, | |
| 156 Feature::UNSPECIFIED_PLATFORM)); | |
| 157 | |
| 158 feature.set_min_manifest_version(22); | |
| 159 EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION, feature.IsAvailableToContext( | |
| 160 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT, | |
| 161 Feature::CHROMEOS_PLATFORM)); | |
| 162 feature.set_min_manifest_version(21); | |
| 163 | |
| 164 feature.set_max_manifest_version(18); | |
| 165 EXPECT_EQ(Feature::INVALID_MAX_MANIFEST_VERSION, feature.IsAvailableToContext( | |
| 166 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT, | |
| 167 Feature::CHROMEOS_PLATFORM)); | |
| 168 feature.set_max_manifest_version(25); | |
| 169 } | 123 } |
| 170 | 124 |
| 171 TEST(ExtensionFeatureTest, Location) { | 125 TEST(ExtensionFeatureTest, Location) { |
| 172 Feature feature; | 126 Feature feature; |
| 173 | 127 |
| 174 // If the feature specifies "component" as its location, then only component | 128 // If the feature specifies "component" as its location, then only component |
| 175 // extensions can access it. | 129 // extensions can access it. |
| 176 feature.set_location(Feature::COMPONENT_LOCATION); | 130 feature.set_location(Feature::COMPONENT_LOCATION); |
| 177 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( | 131 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailable( |
| 178 "", Extension::TYPE_UNKNOWN, Feature::COMPONENT_LOCATION, -1, | 132 "", Extension::TYPE_UNKNOWN, Feature::COMPONENT_LOCATION, |
| 179 Feature::UNSPECIFIED_PLATFORM)); | 133 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 180 EXPECT_EQ(Feature::INVALID_LOCATION, feature.IsAvailableToManifest( | 134 EXPECT_EQ(Feature::INVALID_LOCATION, feature.IsAvailable( |
| 181 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, | 135 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 182 Feature::UNSPECIFIED_PLATFORM)); | 136 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 183 | 137 |
| 184 // But component extensions can access anything else, whatever their location. | 138 // But component extensions can access anything else, whatever their location. |
| 185 feature.set_location(Feature::UNSPECIFIED_LOCATION); | 139 feature.set_location(Feature::UNSPECIFIED_LOCATION); |
| 186 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( | 140 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailable( |
| 187 "", Extension::TYPE_UNKNOWN, Feature::COMPONENT_LOCATION, -1, | 141 "", Extension::TYPE_UNKNOWN, Feature::COMPONENT_LOCATION, |
| 188 Feature::UNSPECIFIED_PLATFORM)); | 142 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 189 } | 143 } |
| 190 | 144 |
| 191 TEST(ExtensionFeatureTest, Platform) { | 145 TEST(ExtensionFeatureTest, Platform) { |
| 192 Feature feature; | 146 Feature feature; |
| 193 feature.set_platform(Feature::CHROMEOS_PLATFORM); | 147 feature.set_platform(Feature::CHROMEOS_PLATFORM); |
| 194 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( | 148 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailable( |
| 195 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, | 149 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 196 Feature::CHROMEOS_PLATFORM)); | 150 Feature::UNSPECIFIED_CONTEXT, Feature::CHROMEOS_PLATFORM, -1)); |
| 197 EXPECT_EQ(Feature::INVALID_PLATFORM, feature.IsAvailableToManifest( | 151 EXPECT_EQ(Feature::INVALID_PLATFORM, feature.IsAvailable( |
| 198 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, | 152 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 199 Feature::UNSPECIFIED_PLATFORM)); | 153 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1)); |
| 200 } | 154 } |
| 201 | 155 |
| 202 TEST(ExtensionFeatureTest, Version) { | 156 TEST(ExtensionFeatureTest, Version) { |
| 203 Feature feature; | 157 Feature feature; |
| 204 feature.set_min_manifest_version(5); | 158 feature.set_min_manifest_version(5); |
| 205 | 159 |
| 206 EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION, | 160 EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION, feature.IsAvailable( |
| 207 feature.IsAvailableToManifest( | 161 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 208 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, | 162 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, 0)); |
| 209 0, Feature::UNSPECIFIED_PLATFORM)); | 163 EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION, feature.IsAvailable( |
| 210 EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION, | 164 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 211 feature.IsAvailableToManifest( | 165 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, 4)); |
| 212 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, | |
| 213 4, Feature::UNSPECIFIED_PLATFORM)); | |
| 214 | 166 |
| 215 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( | 167 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailable( |
| 216 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, | 168 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 217 5, Feature::UNSPECIFIED_PLATFORM)); | 169 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, 5)); |
| 218 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( | 170 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailable( |
| 219 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, | 171 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 220 10, Feature::UNSPECIFIED_PLATFORM)); | 172 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, 10)); |
| 221 | 173 |
| 222 feature.set_max_manifest_version(8); | 174 feature.set_max_manifest_version(8); |
| 223 | 175 |
| 224 EXPECT_EQ(Feature::INVALID_MAX_MANIFEST_VERSION, | 176 EXPECT_EQ(Feature::INVALID_MAX_MANIFEST_VERSION, feature.IsAvailable( |
| 225 feature.IsAvailableToManifest( | |
| 226 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, | |
| 227 10, Feature::UNSPECIFIED_PLATFORM)); | |
| 228 EXPECT_EQ(Feature::IS_AVAILABLE, | |
| 229 feature.IsAvailableToManifest( | |
| 230 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, | |
| 231 8, Feature::UNSPECIFIED_PLATFORM)); | |
| 232 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( | |
| 233 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, | 177 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 234 7, Feature::UNSPECIFIED_PLATFORM)); | 178 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, 10)); |
| 179 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailable( |
| 180 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 181 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, 8)); |
| 182 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailable( |
| 183 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, |
| 184 Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, 7)); |
| 235 } | 185 } |
| 236 | 186 |
| 237 TEST(ExtensionFeatureTest, ParseNull) { | 187 TEST(ExtensionFeatureTest, ParseNull) { |
| 238 scoped_ptr<DictionaryValue> value(new DictionaryValue()); | 188 scoped_ptr<DictionaryValue> value(new DictionaryValue()); |
| 239 scoped_ptr<Feature> feature(new Feature()); | 189 scoped_ptr<Feature> feature(Feature::Parse(value.get())); |
| 240 feature->Parse(value.get()); | |
| 241 EXPECT_TRUE(feature->whitelist()->empty()); | 190 EXPECT_TRUE(feature->whitelist()->empty()); |
| 242 EXPECT_TRUE(feature->extension_types()->empty()); | 191 EXPECT_TRUE(feature->extension_types()->empty()); |
| 243 EXPECT_TRUE(feature->contexts()->empty()); | 192 EXPECT_TRUE(feature->contexts()->empty()); |
| 244 EXPECT_EQ(Feature::UNSPECIFIED_LOCATION, feature->location()); | 193 EXPECT_EQ(Feature::UNSPECIFIED_LOCATION, feature->location()); |
| 245 EXPECT_EQ(Feature::UNSPECIFIED_PLATFORM, feature->platform()); | 194 EXPECT_EQ(Feature::UNSPECIFIED_PLATFORM, feature->platform()); |
| 246 EXPECT_EQ(0, feature->min_manifest_version()); | 195 EXPECT_EQ(0, feature->min_manifest_version()); |
| 247 EXPECT_EQ(0, feature->max_manifest_version()); | 196 EXPECT_EQ(0, feature->max_manifest_version()); |
| 248 } | 197 } |
| 249 | 198 |
| 250 TEST(ExtensionFeatureTest, ParseWhitelist) { | 199 TEST(ExtensionFeatureTest, ParseWhitelist) { |
| 251 scoped_ptr<DictionaryValue> value(new DictionaryValue()); | 200 scoped_ptr<DictionaryValue> value(new DictionaryValue()); |
| 252 ListValue* whitelist = new ListValue(); | 201 ListValue* whitelist = new ListValue(); |
| 253 whitelist->Append(Value::CreateStringValue("foo")); | 202 whitelist->Append(Value::CreateStringValue("foo")); |
| 254 whitelist->Append(Value::CreateStringValue("bar")); | 203 whitelist->Append(Value::CreateStringValue("bar")); |
| 255 value->Set("whitelist", whitelist); | 204 value->Set("whitelist", whitelist); |
| 256 scoped_ptr<Feature> feature(new Feature()); | 205 scoped_ptr<Feature> feature(Feature::Parse(value.get())); |
| 257 feature->Parse(value.get()); | |
| 258 EXPECT_EQ(2u, feature->whitelist()->size()); | 206 EXPECT_EQ(2u, feature->whitelist()->size()); |
| 259 EXPECT_TRUE(feature->whitelist()->count("foo")); | 207 EXPECT_TRUE(feature->whitelist()->count("foo")); |
| 260 EXPECT_TRUE(feature->whitelist()->count("bar")); | 208 EXPECT_TRUE(feature->whitelist()->count("bar")); |
| 261 } | 209 } |
| 262 | 210 |
| 263 TEST(ExtensionFeatureTest, ParsePackageTypes) { | 211 TEST(ExtensionFeatureTest, ParsePackageTypes) { |
| 264 scoped_ptr<DictionaryValue> value(new DictionaryValue()); | 212 scoped_ptr<DictionaryValue> value(new DictionaryValue()); |
| 265 ListValue* extension_types = new ListValue(); | 213 ListValue* extension_types = new ListValue(); |
| 266 extension_types->Append(Value::CreateStringValue("extension")); | 214 extension_types->Append(Value::CreateStringValue("extension")); |
| 267 extension_types->Append(Value::CreateStringValue("theme")); | 215 extension_types->Append(Value::CreateStringValue("theme")); |
| 268 extension_types->Append(Value::CreateStringValue("packaged_app")); | 216 extension_types->Append(Value::CreateStringValue("packaged_app")); |
| 269 extension_types->Append(Value::CreateStringValue("hosted_app")); | 217 extension_types->Append(Value::CreateStringValue("hosted_app")); |
| 270 extension_types->Append(Value::CreateStringValue("platform_app")); | 218 extension_types->Append(Value::CreateStringValue("platform_app")); |
| 271 value->Set("extension_types", extension_types); | 219 value->Set("extension_types", extension_types); |
| 272 scoped_ptr<Feature> feature(new Feature()); | 220 scoped_ptr<Feature> feature(Feature::Parse(value.get())); |
| 273 feature->Parse(value.get()); | |
| 274 EXPECT_EQ(5u, feature->extension_types()->size()); | 221 EXPECT_EQ(5u, feature->extension_types()->size()); |
| 275 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_EXTENSION)); | 222 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_EXTENSION)); |
| 276 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_THEME)); | 223 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_THEME)); |
| 277 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_PACKAGED_APP)); | 224 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_PACKAGED_APP)); |
| 278 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_HOSTED_APP)); | 225 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_HOSTED_APP)); |
| 279 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_PLATFORM_APP)); | 226 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_PLATFORM_APP)); |
| 280 | 227 |
| 281 value->SetString("extension_types", "all"); | 228 value->SetString("extension_types", "all"); |
| 282 scoped_ptr<Feature> feature2(new Feature()); | 229 scoped_ptr<Feature> feature2(Feature::Parse(value.get())); |
| 283 feature2->Parse(value.get()); | |
| 284 EXPECT_EQ(*(feature->extension_types()), *(feature2->extension_types())); | 230 EXPECT_EQ(*(feature->extension_types()), *(feature2->extension_types())); |
| 285 } | 231 } |
| 286 | 232 |
| 287 TEST(ExtensionFeatureTest, ParseContexts) { | 233 TEST(ExtensionFeatureTest, ParseContexts) { |
| 288 scoped_ptr<DictionaryValue> value(new DictionaryValue()); | 234 scoped_ptr<DictionaryValue> value(new DictionaryValue()); |
| 289 ListValue* contexts = new ListValue(); | 235 ListValue* contexts = new ListValue(); |
| 290 contexts->Append(Value::CreateStringValue("blessed_extension")); | 236 contexts->Append(Value::CreateStringValue("blessed_extension")); |
| 291 contexts->Append(Value::CreateStringValue("unblessed_extension")); | 237 contexts->Append(Value::CreateStringValue("unblessed_extension")); |
| 292 contexts->Append(Value::CreateStringValue("content_script")); | 238 contexts->Append(Value::CreateStringValue("content_script")); |
| 293 contexts->Append(Value::CreateStringValue("web_page")); | 239 contexts->Append(Value::CreateStringValue("web_page")); |
| 294 value->Set("contexts", contexts); | 240 value->Set("contexts", contexts); |
| 295 scoped_ptr<Feature> feature(new Feature()); | 241 scoped_ptr<Feature> feature(Feature::Parse(value.get())); |
| 296 feature->Parse(value.get()); | |
| 297 EXPECT_EQ(4u, feature->contexts()->size()); | 242 EXPECT_EQ(4u, feature->contexts()->size()); |
| 298 EXPECT_TRUE(feature->contexts()->count(Feature::BLESSED_EXTENSION_CONTEXT)); | 243 EXPECT_TRUE(feature->contexts()->count(Feature::BLESSED_EXTENSION_CONTEXT)); |
| 299 EXPECT_TRUE(feature->contexts()->count(Feature::UNBLESSED_EXTENSION_CONTEXT)); | 244 EXPECT_TRUE(feature->contexts()->count(Feature::UNBLESSED_EXTENSION_CONTEXT)); |
| 300 EXPECT_TRUE(feature->contexts()->count(Feature::CONTENT_SCRIPT_CONTEXT)); | 245 EXPECT_TRUE(feature->contexts()->count(Feature::CONTENT_SCRIPT_CONTEXT)); |
| 301 EXPECT_TRUE(feature->contexts()->count(Feature::WEB_PAGE_CONTEXT)); | 246 EXPECT_TRUE(feature->contexts()->count(Feature::WEB_PAGE_CONTEXT)); |
| 302 | 247 |
| 303 value->SetString("contexts", "all"); | 248 value->SetString("contexts", "all"); |
| 304 scoped_ptr<Feature> feature2(new Feature()); | 249 scoped_ptr<Feature> feature2(Feature::Parse(value.get())); |
| 305 feature2->Parse(value.get()); | |
| 306 EXPECT_EQ(*(feature->contexts()), *(feature2->contexts())); | 250 EXPECT_EQ(*(feature->contexts()), *(feature2->contexts())); |
| 307 } | 251 } |
| 308 | 252 |
| 309 TEST(ExtensionFeatureTest, ParseLocation) { | 253 TEST(ExtensionFeatureTest, ParseLocation) { |
| 310 scoped_ptr<DictionaryValue> value(new DictionaryValue()); | 254 scoped_ptr<DictionaryValue> value(new DictionaryValue()); |
| 311 value->SetString("location", "component"); | 255 value->SetString("location", "component"); |
| 312 scoped_ptr<Feature> feature(new Feature()); | 256 scoped_ptr<Feature> feature(Feature::Parse(value.get())); |
| 313 feature->Parse(value.get()); | |
| 314 EXPECT_EQ(Feature::COMPONENT_LOCATION, feature->location()); | 257 EXPECT_EQ(Feature::COMPONENT_LOCATION, feature->location()); |
| 315 } | 258 } |
| 316 | 259 |
| 317 TEST(ExtensionFeatureTest, ParsePlatform) { | 260 TEST(ExtensionFeatureTest, ParsePlatform) { |
| 318 scoped_ptr<DictionaryValue> value(new DictionaryValue()); | 261 scoped_ptr<DictionaryValue> value(new DictionaryValue()); |
| 319 value->SetString("platform", "chromeos"); | 262 value->SetString("platform", "chromeos"); |
| 320 scoped_ptr<Feature> feature(new Feature()); | 263 scoped_ptr<Feature> feature(Feature::Parse(value.get())); |
| 321 feature->Parse(value.get()); | |
| 322 EXPECT_EQ(Feature::CHROMEOS_PLATFORM, feature->platform()); | 264 EXPECT_EQ(Feature::CHROMEOS_PLATFORM, feature->platform()); |
| 323 } | 265 } |
| 324 | 266 |
| 325 TEST(ExtensionFeatureTest, ManifestVersion) { | 267 TEST(ExtensionFeatureTest, ManifestVersion) { |
| 326 scoped_ptr<DictionaryValue> value(new DictionaryValue()); | 268 scoped_ptr<DictionaryValue> value(new DictionaryValue()); |
| 327 value->SetInteger("min_manifest_version", 1); | 269 value->SetInteger("min_manifest_version", 1); |
| 328 value->SetInteger("max_manifest_version", 5); | 270 value->SetInteger("max_manifest_version", 5); |
| 329 scoped_ptr<Feature> feature(new Feature()); | 271 scoped_ptr<Feature> feature(Feature::Parse(value.get())); |
| 330 feature->Parse(value.get()); | |
| 331 EXPECT_EQ(1, feature->min_manifest_version()); | 272 EXPECT_EQ(1, feature->min_manifest_version()); |
| 332 EXPECT_EQ(5, feature->max_manifest_version()); | 273 EXPECT_EQ(5, feature->max_manifest_version()); |
| 333 } | 274 } |
| 334 | |
| 335 TEST(ExtensionFeatureTest, Inheritance) { | |
| 336 Feature feature; | |
| 337 feature.whitelist()->insert("foo"); | |
| 338 feature.extension_types()->insert(Extension::TYPE_THEME); | |
| 339 feature.contexts()->insert(Feature::BLESSED_EXTENSION_CONTEXT); | |
| 340 feature.set_location(Feature::COMPONENT_LOCATION); | |
| 341 feature.set_platform(Feature::CHROMEOS_PLATFORM); | |
| 342 feature.set_min_manifest_version(1); | |
| 343 feature.set_max_manifest_version(2); | |
| 344 | |
| 345 Feature feature2 = feature; | |
| 346 EXPECT_TRUE(feature2.Equals(feature)); | |
| 347 | |
| 348 DictionaryValue definition; | |
| 349 feature2.Parse(&definition); | |
| 350 EXPECT_TRUE(feature2.Equals(feature)); | |
| 351 | |
| 352 ListValue* whitelist = new ListValue(); | |
| 353 ListValue* extension_types = new ListValue(); | |
| 354 ListValue* contexts = new ListValue(); | |
| 355 whitelist->Append(Value::CreateStringValue("bar")); | |
| 356 extension_types->Append(Value::CreateStringValue("extension")); | |
| 357 contexts->Append(Value::CreateStringValue("unblessed_extension")); | |
| 358 definition.Set("whitelist", whitelist); | |
| 359 definition.Set("extension_types", extension_types); | |
| 360 definition.Set("contexts", contexts); | |
| 361 // Can't test location or platform because we only have one value so far. | |
| 362 definition.Set("min_manifest_version", Value::CreateIntegerValue(2)); | |
| 363 definition.Set("max_manifest_version", Value::CreateIntegerValue(3)); | |
| 364 | |
| 365 feature2.Parse(&definition); | |
| 366 EXPECT_FALSE(feature2.Equals(feature)); | |
| 367 EXPECT_EQ(1u, feature2.whitelist()->size()); | |
| 368 EXPECT_EQ(1u, feature2.extension_types()->size()); | |
| 369 EXPECT_EQ(1u, feature2.contexts()->size()); | |
| 370 EXPECT_EQ(1u, feature2.whitelist()->count("bar")); | |
| 371 EXPECT_EQ(1u, feature2.extension_types()->count(Extension::TYPE_EXTENSION)); | |
| 372 EXPECT_EQ(1u, | |
| 373 feature2.contexts()->count(Feature::UNBLESSED_EXTENSION_CONTEXT)); | |
| 374 EXPECT_EQ(2, feature2.min_manifest_version()); | |
| 375 EXPECT_EQ(3, feature2.max_manifest_version()); | |
| 376 } | |
| 377 | |
| 378 TEST(ExtensionFeatureTest, Equals) { | |
| 379 Feature feature; | |
| 380 feature.whitelist()->insert("foo"); | |
| 381 feature.extension_types()->insert(Extension::TYPE_THEME); | |
| 382 feature.contexts()->insert(Feature::UNBLESSED_EXTENSION_CONTEXT); | |
| 383 feature.set_location(Feature::COMPONENT_LOCATION); | |
| 384 feature.set_platform(Feature::CHROMEOS_PLATFORM); | |
| 385 feature.set_min_manifest_version(18); | |
| 386 feature.set_max_manifest_version(25); | |
| 387 | |
| 388 Feature feature2(feature); | |
| 389 EXPECT_TRUE(feature2.Equals(feature)); | |
| 390 | |
| 391 feature2.whitelist()->clear(); | |
| 392 EXPECT_FALSE(feature2.Equals(feature)); | |
| 393 | |
| 394 feature2 = feature; | |
| 395 feature2.extension_types()->clear(); | |
| 396 EXPECT_FALSE(feature2.Equals(feature)); | |
| 397 | |
| 398 feature2 = feature; | |
| 399 feature2.contexts()->clear(); | |
| 400 EXPECT_FALSE(feature2.Equals(feature)); | |
| 401 | |
| 402 feature2 = feature; | |
| 403 feature2.set_location(Feature::UNSPECIFIED_LOCATION); | |
| 404 EXPECT_FALSE(feature2.Equals(feature)); | |
| 405 | |
| 406 feature2 = feature; | |
| 407 feature2.set_platform(Feature::UNSPECIFIED_PLATFORM); | |
| 408 EXPECT_FALSE(feature2.Equals(feature)); | |
| 409 | |
| 410 feature2 = feature; | |
| 411 feature2.set_min_manifest_version(0); | |
| 412 EXPECT_FALSE(feature2.Equals(feature)); | |
| 413 | |
| 414 feature2 = feature; | |
| 415 feature2.set_max_manifest_version(0); | |
| 416 EXPECT_FALSE(feature2.Equals(feature)); | |
| 417 } | |
| OLD | NEW |