1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "extensions/common/features/simple_feature.h"
9 #include "base/values.h"
10 #include "extensions/common/manifest.h"
11 #include "extensions/common/value_builder.h"
12 #include "testing/gtest/include/gtest/gtest.h"
14 namespace extensions
{
18 struct IsAvailableTestData
{
19 std::string extension_id
;
20 Manifest::Type extension_type
;
21 Manifest::Location location
;
22 Feature::Platform platform
;
24 Feature::AvailabilityResult expected_result
;
27 bool LocationIsAvailable(SimpleFeature::Location feature_location
,
28 Manifest::Location manifest_location
) {
29 SimpleFeature feature
;
30 feature
.set_location(feature_location
);
31 Feature::AvailabilityResult availability_result
=
32 feature
.IsAvailableToManifest(std::string(),
33 Manifest::TYPE_UNKNOWN
,
36 Feature::UNSPECIFIED_PLATFORM
).result();
37 return availability_result
== Feature::IS_AVAILABLE
;
42 TEST(SimpleFeatureTest
, IsAvailableNullCase
) {
43 const IsAvailableTestData tests
[] = {
44 {"", Manifest::TYPE_UNKNOWN
, Manifest::INVALID_LOCATION
,
45 Feature::UNSPECIFIED_PLATFORM
, -1, Feature::IS_AVAILABLE
},
46 {"random-extension", Manifest::TYPE_UNKNOWN
, Manifest::INVALID_LOCATION
,
47 Feature::UNSPECIFIED_PLATFORM
, -1, Feature::IS_AVAILABLE
},
48 {"", Manifest::TYPE_LEGACY_PACKAGED_APP
, Manifest::INVALID_LOCATION
,
49 Feature::UNSPECIFIED_PLATFORM
, -1, Feature::IS_AVAILABLE
},
50 {"", Manifest::TYPE_UNKNOWN
, Manifest::INVALID_LOCATION
,
51 Feature::UNSPECIFIED_PLATFORM
, -1, Feature::IS_AVAILABLE
},
52 {"", Manifest::TYPE_UNKNOWN
, Manifest::COMPONENT
,
53 Feature::UNSPECIFIED_PLATFORM
, -1, Feature::IS_AVAILABLE
},
54 {"", Manifest::TYPE_UNKNOWN
, Manifest::INVALID_LOCATION
,
55 Feature::CHROMEOS_PLATFORM
, -1, Feature::IS_AVAILABLE
},
56 {"", Manifest::TYPE_UNKNOWN
, Manifest::INVALID_LOCATION
,
57 Feature::UNSPECIFIED_PLATFORM
, 25, Feature::IS_AVAILABLE
}};
59 SimpleFeature feature
;
60 for (size_t i
= 0; i
< arraysize(tests
); ++i
) {
61 const IsAvailableTestData
& test
= tests
[i
];
62 EXPECT_EQ(test
.expected_result
,
63 feature
.IsAvailableToManifest(test
.extension_id
,
66 test
.manifest_version
,
67 test
.platform
).result());
71 TEST(SimpleFeatureTest
, Whitelist
) {
72 const std::string
kIdFoo("fooabbbbccccddddeeeeffffgggghhhh");
73 const std::string
kIdBar("barabbbbccccddddeeeeffffgggghhhh");
74 const std::string
kIdBaz("bazabbbbccccddddeeeeffffgggghhhh");
75 SimpleFeature feature
;
76 feature
.whitelist()->insert(kIdFoo
);
77 feature
.whitelist()->insert(kIdBar
);
80 Feature::IS_AVAILABLE
,
81 feature
.IsAvailableToManifest(kIdFoo
,
82 Manifest::TYPE_UNKNOWN
,
83 Manifest::INVALID_LOCATION
,
85 Feature::UNSPECIFIED_PLATFORM
).result());
87 Feature::IS_AVAILABLE
,
88 feature
.IsAvailableToManifest(kIdBar
,
89 Manifest::TYPE_UNKNOWN
,
90 Manifest::INVALID_LOCATION
,
92 Feature::UNSPECIFIED_PLATFORM
).result());
95 Feature::NOT_FOUND_IN_WHITELIST
,
96 feature
.IsAvailableToManifest(kIdBaz
,
97 Manifest::TYPE_UNKNOWN
,
98 Manifest::INVALID_LOCATION
,
100 Feature::UNSPECIFIED_PLATFORM
).result());
102 Feature::NOT_FOUND_IN_WHITELIST
,
103 feature
.IsAvailableToManifest(std::string(),
104 Manifest::TYPE_UNKNOWN
,
105 Manifest::INVALID_LOCATION
,
107 Feature::UNSPECIFIED_PLATFORM
).result());
109 feature
.extension_types()->insert(Manifest::TYPE_LEGACY_PACKAGED_APP
);
111 Feature::NOT_FOUND_IN_WHITELIST
,
112 feature
.IsAvailableToManifest(kIdBaz
,
113 Manifest::TYPE_LEGACY_PACKAGED_APP
,
114 Manifest::INVALID_LOCATION
,
116 Feature::UNSPECIFIED_PLATFORM
).result());
119 TEST(SimpleFeatureTest
, HashedIdWhitelist
) {
120 // echo -n "fooabbbbccccddddeeeeffffgggghhhh" |
121 // sha1sum | tr '[:lower:]' '[:upper:]'
122 const std::string
kIdFoo("fooabbbbccccddddeeeeffffgggghhhh");
123 const std::string
kIdFooHashed("55BC7228A0D502A2A48C9BB16B07062A01E62897");
124 SimpleFeature feature
;
126 feature
.whitelist()->insert(kIdFooHashed
);
129 Feature::IS_AVAILABLE
,
130 feature
.IsAvailableToManifest(kIdFoo
,
131 Manifest::TYPE_UNKNOWN
,
132 Manifest::INVALID_LOCATION
,
134 Feature::UNSPECIFIED_PLATFORM
).result());
136 Feature::IS_AVAILABLE
,
137 feature
.IsAvailableToManifest(kIdFooHashed
,
138 Manifest::TYPE_UNKNOWN
,
139 Manifest::INVALID_LOCATION
,
141 Feature::UNSPECIFIED_PLATFORM
).result());
143 Feature::NOT_FOUND_IN_WHITELIST
,
144 feature
.IsAvailableToManifest("slightlytoooolongforanextensionid",
145 Manifest::TYPE_UNKNOWN
,
146 Manifest::INVALID_LOCATION
,
148 Feature::UNSPECIFIED_PLATFORM
).result());
150 Feature::NOT_FOUND_IN_WHITELIST
,
151 feature
.IsAvailableToManifest("tooshortforanextensionid",
152 Manifest::TYPE_UNKNOWN
,
153 Manifest::INVALID_LOCATION
,
155 Feature::UNSPECIFIED_PLATFORM
).result());
158 TEST(SimpleFeatureTest
, Blacklist
) {
159 const std::string
kIdFoo("fooabbbbccccddddeeeeffffgggghhhh");
160 const std::string
kIdBar("barabbbbccccddddeeeeffffgggghhhh");
161 const std::string
kIdBaz("bazabbbbccccddddeeeeffffgggghhhh");
162 SimpleFeature feature
;
163 feature
.blacklist()->insert(kIdFoo
);
164 feature
.blacklist()->insert(kIdBar
);
167 Feature::FOUND_IN_BLACKLIST
,
168 feature
.IsAvailableToManifest(kIdFoo
,
169 Manifest::TYPE_UNKNOWN
,
170 Manifest::INVALID_LOCATION
,
172 Feature::UNSPECIFIED_PLATFORM
).result());
174 Feature::FOUND_IN_BLACKLIST
,
175 feature
.IsAvailableToManifest(kIdBar
,
176 Manifest::TYPE_UNKNOWN
,
177 Manifest::INVALID_LOCATION
,
179 Feature::UNSPECIFIED_PLATFORM
).result());
182 Feature::IS_AVAILABLE
,
183 feature
.IsAvailableToManifest(kIdBaz
,
184 Manifest::TYPE_UNKNOWN
,
185 Manifest::INVALID_LOCATION
,
187 Feature::UNSPECIFIED_PLATFORM
).result());
189 Feature::IS_AVAILABLE
,
190 feature
.IsAvailableToManifest(std::string(),
191 Manifest::TYPE_UNKNOWN
,
192 Manifest::INVALID_LOCATION
,
194 Feature::UNSPECIFIED_PLATFORM
).result());
197 TEST(SimpleFeatureTest
, HashedIdBlacklist
) {
198 // echo -n "fooabbbbccccddddeeeeffffgggghhhh" |
199 // sha1sum | tr '[:lower:]' '[:upper:]'
200 const std::string
kIdFoo("fooabbbbccccddddeeeeffffgggghhhh");
201 const std::string
kIdFooHashed("55BC7228A0D502A2A48C9BB16B07062A01E62897");
202 SimpleFeature feature
;
204 feature
.blacklist()->insert(kIdFooHashed
);
207 Feature::FOUND_IN_BLACKLIST
,
208 feature
.IsAvailableToManifest(kIdFoo
,
209 Manifest::TYPE_UNKNOWN
,
210 Manifest::INVALID_LOCATION
,
212 Feature::UNSPECIFIED_PLATFORM
).result());
214 Feature::FOUND_IN_BLACKLIST
,
215 feature
.IsAvailableToManifest(kIdFooHashed
,
216 Manifest::TYPE_UNKNOWN
,
217 Manifest::INVALID_LOCATION
,
219 Feature::UNSPECIFIED_PLATFORM
).result());
221 Feature::IS_AVAILABLE
,
222 feature
.IsAvailableToManifest("slightlytoooolongforanextensionid",
223 Manifest::TYPE_UNKNOWN
,
224 Manifest::INVALID_LOCATION
,
226 Feature::UNSPECIFIED_PLATFORM
).result());
228 Feature::IS_AVAILABLE
,
229 feature
.IsAvailableToManifest("tooshortforanextensionid",
230 Manifest::TYPE_UNKNOWN
,
231 Manifest::INVALID_LOCATION
,
233 Feature::UNSPECIFIED_PLATFORM
).result());
236 TEST(SimpleFeatureTest
, PackageType
) {
237 SimpleFeature feature
;
238 feature
.extension_types()->insert(Manifest::TYPE_EXTENSION
);
239 feature
.extension_types()->insert(Manifest::TYPE_LEGACY_PACKAGED_APP
);
242 Feature::IS_AVAILABLE
,
243 feature
.IsAvailableToManifest(std::string(),
244 Manifest::TYPE_EXTENSION
,
245 Manifest::INVALID_LOCATION
,
247 Feature::UNSPECIFIED_PLATFORM
).result());
249 Feature::IS_AVAILABLE
,
250 feature
.IsAvailableToManifest(std::string(),
251 Manifest::TYPE_LEGACY_PACKAGED_APP
,
252 Manifest::INVALID_LOCATION
,
254 Feature::UNSPECIFIED_PLATFORM
).result());
257 Feature::INVALID_TYPE
,
258 feature
.IsAvailableToManifest(std::string(),
259 Manifest::TYPE_UNKNOWN
,
260 Manifest::INVALID_LOCATION
,
262 Feature::UNSPECIFIED_PLATFORM
).result());
264 Feature::INVALID_TYPE
,
265 feature
.IsAvailableToManifest(std::string(),
266 Manifest::TYPE_THEME
,
267 Manifest::INVALID_LOCATION
,
269 Feature::UNSPECIFIED_PLATFORM
).result());
272 TEST(SimpleFeatureTest
, Context
) {
273 SimpleFeature feature
;
274 feature
.set_name("somefeature");
275 feature
.contexts()->insert(Feature::BLESSED_EXTENSION_CONTEXT
);
276 feature
.extension_types()->insert(Manifest::TYPE_LEGACY_PACKAGED_APP
);
277 feature
.platforms()->insert(Feature::CHROMEOS_PLATFORM
);
278 feature
.set_min_manifest_version(21);
279 feature
.set_max_manifest_version(25);
281 base::DictionaryValue manifest
;
282 manifest
.SetString("name", "test");
283 manifest
.SetString("version", "1");
284 manifest
.SetInteger("manifest_version", 21);
285 manifest
.SetString("app.launch.local_path", "foo.html");
288 scoped_refptr
<const Extension
> extension(Extension::Create(
289 base::FilePath(), Manifest::INTERNAL
, manifest
, Extension::NO_FLAGS
,
291 EXPECT_EQ("", error
);
292 ASSERT_TRUE(extension
.get());
294 feature
.whitelist()->insert("monkey");
295 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST
, feature
.IsAvailableToContext(
296 extension
.get(), Feature::BLESSED_EXTENSION_CONTEXT
,
297 Feature::CHROMEOS_PLATFORM
).result());
298 feature
.whitelist()->clear();
300 feature
.extension_types()->clear();
301 feature
.extension_types()->insert(Manifest::TYPE_THEME
);
303 Feature::Availability availability
= feature
.IsAvailableToContext(
304 extension
.get(), Feature::BLESSED_EXTENSION_CONTEXT
,
305 Feature::CHROMEOS_PLATFORM
);
306 EXPECT_EQ(Feature::INVALID_TYPE
, availability
.result());
307 EXPECT_EQ("'somefeature' is only allowed for themes, "
308 "but this is a legacy packaged app.",
309 availability
.message());
312 feature
.extension_types()->clear();
313 feature
.extension_types()->insert(Manifest::TYPE_LEGACY_PACKAGED_APP
);
314 feature
.contexts()->clear();
315 feature
.contexts()->insert(Feature::UNBLESSED_EXTENSION_CONTEXT
);
316 feature
.contexts()->insert(Feature::CONTENT_SCRIPT_CONTEXT
);
318 Feature::Availability availability
= feature
.IsAvailableToContext(
319 extension
.get(), Feature::BLESSED_EXTENSION_CONTEXT
,
320 Feature::CHROMEOS_PLATFORM
);
321 EXPECT_EQ(Feature::INVALID_CONTEXT
, availability
.result());
322 EXPECT_EQ("'somefeature' is only allowed to run in extension iframes and "
323 "content scripts, but this is a privileged page",
324 availability
.message());
327 feature
.contexts()->insert(Feature::WEB_PAGE_CONTEXT
);
329 Feature::Availability availability
= feature
.IsAvailableToContext(
330 extension
.get(), Feature::BLESSED_EXTENSION_CONTEXT
,
331 Feature::CHROMEOS_PLATFORM
);
332 EXPECT_EQ(Feature::INVALID_CONTEXT
, availability
.result());
333 EXPECT_EQ("'somefeature' is only allowed to run in extension iframes, "
334 "content scripts, and web pages, but this is a privileged page",
335 availability
.message());
338 feature
.contexts()->clear();
339 feature
.contexts()->insert(Feature::BLESSED_EXTENSION_CONTEXT
);
340 feature
.set_location(SimpleFeature::COMPONENT_LOCATION
);
341 EXPECT_EQ(Feature::INVALID_LOCATION
, feature
.IsAvailableToContext(
342 extension
.get(), Feature::BLESSED_EXTENSION_CONTEXT
,
343 Feature::CHROMEOS_PLATFORM
).result());
344 feature
.set_location(SimpleFeature::UNSPECIFIED_LOCATION
);
346 EXPECT_EQ(Feature::INVALID_PLATFORM
, feature
.IsAvailableToContext(
347 extension
.get(), Feature::BLESSED_EXTENSION_CONTEXT
,
348 Feature::UNSPECIFIED_PLATFORM
).result());
350 feature
.set_min_manifest_version(22);
351 EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION
, feature
.IsAvailableToContext(
352 extension
.get(), Feature::BLESSED_EXTENSION_CONTEXT
,
353 Feature::CHROMEOS_PLATFORM
).result());
354 feature
.set_min_manifest_version(21);
356 feature
.set_max_manifest_version(18);
357 EXPECT_EQ(Feature::INVALID_MAX_MANIFEST_VERSION
, feature
.IsAvailableToContext(
358 extension
.get(), Feature::BLESSED_EXTENSION_CONTEXT
,
359 Feature::CHROMEOS_PLATFORM
).result());
360 feature
.set_max_manifest_version(25);
363 TEST(SimpleFeatureTest
, Location
) {
364 // Component extensions can access any location.
365 EXPECT_TRUE(LocationIsAvailable(SimpleFeature::COMPONENT_LOCATION
,
366 Manifest::COMPONENT
));
368 LocationIsAvailable(SimpleFeature::POLICY_LOCATION
, Manifest::COMPONENT
));
369 EXPECT_TRUE(LocationIsAvailable(SimpleFeature::UNSPECIFIED_LOCATION
,
370 Manifest::COMPONENT
));
372 // Only component extensions can access the "component" location.
373 EXPECT_FALSE(LocationIsAvailable(SimpleFeature::COMPONENT_LOCATION
,
374 Manifest::INVALID_LOCATION
));
375 EXPECT_FALSE(LocationIsAvailable(SimpleFeature::COMPONENT_LOCATION
,
376 Manifest::UNPACKED
));
377 EXPECT_FALSE(LocationIsAvailable(SimpleFeature::COMPONENT_LOCATION
,
378 Manifest::EXTERNAL_PREF_DOWNLOAD
));
379 EXPECT_FALSE(LocationIsAvailable(SimpleFeature::COMPONENT_LOCATION
,
380 Manifest::EXTERNAL_POLICY
));
381 EXPECT_FALSE(LocationIsAvailable(SimpleFeature::COMPONENT_LOCATION
,
382 Manifest::EXTERNAL_POLICY_DOWNLOAD
));
384 // Policy extensions can access the "policy" location.
385 EXPECT_TRUE(LocationIsAvailable(SimpleFeature::POLICY_LOCATION
,
386 Manifest::EXTERNAL_POLICY
));
387 EXPECT_TRUE(LocationIsAvailable(SimpleFeature::POLICY_LOCATION
,
388 Manifest::EXTERNAL_POLICY_DOWNLOAD
));
390 // Non-policy (except component) extensions cannot access policy.
391 EXPECT_FALSE(LocationIsAvailable(SimpleFeature::POLICY_LOCATION
,
392 Manifest::INVALID_LOCATION
));
394 LocationIsAvailable(SimpleFeature::POLICY_LOCATION
, Manifest::UNPACKED
));
395 EXPECT_FALSE(LocationIsAvailable(SimpleFeature::POLICY_LOCATION
,
396 Manifest::EXTERNAL_PREF_DOWNLOAD
));
399 TEST(SimpleFeatureTest
, Platform
) {
400 SimpleFeature feature
;
401 feature
.platforms()->insert(Feature::CHROMEOS_PLATFORM
);
402 EXPECT_EQ(Feature::IS_AVAILABLE
,
403 feature
.IsAvailableToManifest(std::string(),
404 Manifest::TYPE_UNKNOWN
,
405 Manifest::INVALID_LOCATION
,
407 Feature::CHROMEOS_PLATFORM
).result());
409 Feature::INVALID_PLATFORM
,
410 feature
.IsAvailableToManifest(std::string(),
411 Manifest::TYPE_UNKNOWN
,
412 Manifest::INVALID_LOCATION
,
414 Feature::UNSPECIFIED_PLATFORM
).result());
417 TEST(SimpleFeatureTest
, ManifestVersion
) {
418 SimpleFeature feature
;
419 feature
.set_min_manifest_version(5);
422 Feature::INVALID_MIN_MANIFEST_VERSION
,
423 feature
.IsAvailableToManifest(std::string(),
424 Manifest::TYPE_UNKNOWN
,
425 Manifest::INVALID_LOCATION
,
427 Feature::UNSPECIFIED_PLATFORM
).result());
429 Feature::INVALID_MIN_MANIFEST_VERSION
,
430 feature
.IsAvailableToManifest(std::string(),
431 Manifest::TYPE_UNKNOWN
,
432 Manifest::INVALID_LOCATION
,
434 Feature::UNSPECIFIED_PLATFORM
).result());
437 Feature::IS_AVAILABLE
,
438 feature
.IsAvailableToManifest(std::string(),
439 Manifest::TYPE_UNKNOWN
,
440 Manifest::INVALID_LOCATION
,
442 Feature::UNSPECIFIED_PLATFORM
).result());
444 Feature::IS_AVAILABLE
,
445 feature
.IsAvailableToManifest(std::string(),
446 Manifest::TYPE_UNKNOWN
,
447 Manifest::INVALID_LOCATION
,
449 Feature::UNSPECIFIED_PLATFORM
).result());
451 feature
.set_max_manifest_version(8);
454 Feature::INVALID_MAX_MANIFEST_VERSION
,
455 feature
.IsAvailableToManifest(std::string(),
456 Manifest::TYPE_UNKNOWN
,
457 Manifest::INVALID_LOCATION
,
459 Feature::UNSPECIFIED_PLATFORM
).result());
461 Feature::IS_AVAILABLE
,
462 feature
.IsAvailableToManifest(std::string(),
463 Manifest::TYPE_UNKNOWN
,
464 Manifest::INVALID_LOCATION
,
466 Feature::UNSPECIFIED_PLATFORM
).result());
468 Feature::IS_AVAILABLE
,
469 feature
.IsAvailableToManifest(std::string(),
470 Manifest::TYPE_UNKNOWN
,
471 Manifest::INVALID_LOCATION
,
473 Feature::UNSPECIFIED_PLATFORM
).result());
476 TEST(SimpleFeatureTest
, ParseNull
) {
477 scoped_ptr
<base::DictionaryValue
> value(new base::DictionaryValue());
478 scoped_ptr
<SimpleFeature
> feature(new SimpleFeature());
479 feature
->Parse(value
.get());
480 EXPECT_TRUE(feature
->whitelist()->empty());
481 EXPECT_TRUE(feature
->extension_types()->empty());
482 EXPECT_TRUE(feature
->contexts()->empty());
483 EXPECT_EQ(SimpleFeature::UNSPECIFIED_LOCATION
, feature
->location());
484 EXPECT_TRUE(feature
->platforms()->empty());
485 EXPECT_EQ(0, feature
->min_manifest_version());
486 EXPECT_EQ(0, feature
->max_manifest_version());
489 TEST(SimpleFeatureTest
, ParseWhitelist
) {
490 scoped_ptr
<base::DictionaryValue
> value(new base::DictionaryValue());
491 base::ListValue
* whitelist
= new base::ListValue();
492 whitelist
->Append(new base::StringValue("foo"));
493 whitelist
->Append(new base::StringValue("bar"));
494 value
->Set("whitelist", whitelist
);
495 scoped_ptr
<SimpleFeature
> feature(new SimpleFeature());
496 feature
->Parse(value
.get());
497 EXPECT_EQ(2u, feature
->whitelist()->size());
498 EXPECT_TRUE(feature
->whitelist()->count("foo"));
499 EXPECT_TRUE(feature
->whitelist()->count("bar"));
502 TEST(SimpleFeatureTest
, ParsePackageTypes
) {
503 scoped_ptr
<base::DictionaryValue
> value(new base::DictionaryValue());
504 base::ListValue
* extension_types
= new base::ListValue();
505 extension_types
->Append(new base::StringValue("extension"));
506 extension_types
->Append(new base::StringValue("theme"));
507 extension_types
->Append(new base::StringValue("legacy_packaged_app"));
508 extension_types
->Append(new base::StringValue("hosted_app"));
509 extension_types
->Append(new base::StringValue("platform_app"));
510 extension_types
->Append(new base::StringValue("shared_module"));
511 value
->Set("extension_types", extension_types
);
512 scoped_ptr
<SimpleFeature
> feature(new SimpleFeature());
513 feature
->Parse(value
.get());
514 EXPECT_EQ(6u, feature
->extension_types()->size());
515 EXPECT_TRUE(feature
->extension_types()->count(Manifest::TYPE_EXTENSION
));
516 EXPECT_TRUE(feature
->extension_types()->count(Manifest::TYPE_THEME
));
517 EXPECT_TRUE(feature
->extension_types()->count(
518 Manifest::TYPE_LEGACY_PACKAGED_APP
));
519 EXPECT_TRUE(feature
->extension_types()->count(Manifest::TYPE_HOSTED_APP
));
520 EXPECT_TRUE(feature
->extension_types()->count(Manifest::TYPE_PLATFORM_APP
));
521 EXPECT_TRUE(feature
->extension_types()->count(Manifest::TYPE_SHARED_MODULE
));
523 value
->SetString("extension_types", "all");
524 scoped_ptr
<SimpleFeature
> feature2(new SimpleFeature());
525 feature2
->Parse(value
.get());
526 EXPECT_EQ(*(feature
->extension_types()), *(feature2
->extension_types()));
529 TEST(SimpleFeatureTest
, ParseContexts
) {
530 scoped_ptr
<base::DictionaryValue
> value(new base::DictionaryValue());
531 base::ListValue
* contexts
= new base::ListValue();
532 contexts
->Append(new base::StringValue("blessed_extension"));
533 contexts
->Append(new base::StringValue("unblessed_extension"));
534 contexts
->Append(new base::StringValue("content_script"));
535 contexts
->Append(new base::StringValue("web_page"));
536 contexts
->Append(new base::StringValue("blessed_web_page"));
537 contexts
->Append(new base::StringValue("webui"));
538 value
->Set("contexts", contexts
);
539 scoped_ptr
<SimpleFeature
> feature(new SimpleFeature());
540 feature
->Parse(value
.get());
541 EXPECT_EQ(6u, feature
->contexts()->size());
542 EXPECT_TRUE(feature
->contexts()->count(Feature::BLESSED_EXTENSION_CONTEXT
));
543 EXPECT_TRUE(feature
->contexts()->count(Feature::UNBLESSED_EXTENSION_CONTEXT
));
544 EXPECT_TRUE(feature
->contexts()->count(Feature::CONTENT_SCRIPT_CONTEXT
));
545 EXPECT_TRUE(feature
->contexts()->count(Feature::WEB_PAGE_CONTEXT
));
546 EXPECT_TRUE(feature
->contexts()->count(Feature::BLESSED_WEB_PAGE_CONTEXT
));
548 value
->SetString("contexts", "all");
549 scoped_ptr
<SimpleFeature
> feature2(new SimpleFeature());
550 feature2
->Parse(value
.get());
551 EXPECT_EQ(*(feature
->contexts()), *(feature2
->contexts()));
554 TEST(SimpleFeatureTest
, ParseLocation
) {
555 scoped_ptr
<base::DictionaryValue
> value(new base::DictionaryValue());
556 value
->SetString("location", "component");
557 scoped_ptr
<SimpleFeature
> feature(new SimpleFeature());
558 feature
->Parse(value
.get());
559 EXPECT_EQ(SimpleFeature::COMPONENT_LOCATION
, feature
->location());
562 TEST(SimpleFeatureTest
, ParsePlatforms
) {
563 scoped_ptr
<base::DictionaryValue
> value(new base::DictionaryValue());
564 scoped_ptr
<SimpleFeature
> feature(new SimpleFeature());
565 base::ListValue
* platforms
= new base::ListValue();
566 value
->Set("platforms", platforms
);
567 feature
->Parse(value
.get());
568 EXPECT_TRUE(feature
->platforms()->empty());
570 platforms
->AppendString("chromeos");
571 feature
->Parse(value
.get());
572 EXPECT_FALSE(feature
->platforms()->empty());
573 EXPECT_EQ(Feature::CHROMEOS_PLATFORM
, *feature
->platforms()->begin());
576 platforms
->AppendString("win");
577 feature
->Parse(value
.get());
578 EXPECT_FALSE(feature
->platforms()->empty());
579 EXPECT_EQ(Feature::WIN_PLATFORM
, *feature
->platforms()->begin());
582 platforms
->AppendString("win");
583 platforms
->AppendString("chromeos");
584 feature
->Parse(value
.get());
585 std::set
<Feature::Platform
> expected_platforms
;
586 expected_platforms
.insert(Feature::CHROMEOS_PLATFORM
);
587 expected_platforms
.insert(Feature::WIN_PLATFORM
);
589 EXPECT_FALSE(feature
->platforms()->empty());
590 EXPECT_EQ(expected_platforms
, *feature
->platforms());
593 TEST(SimpleFeatureTest
, ParseManifestVersion
) {
594 scoped_ptr
<base::DictionaryValue
> value(new base::DictionaryValue());
595 value
->SetInteger("min_manifest_version", 1);
596 value
->SetInteger("max_manifest_version", 5);
597 scoped_ptr
<SimpleFeature
> feature(new SimpleFeature());
598 feature
->Parse(value
.get());
599 EXPECT_EQ(1, feature
->min_manifest_version());
600 EXPECT_EQ(5, feature
->max_manifest_version());
603 TEST(SimpleFeatureTest
, Inheritance
) {
604 SimpleFeature feature
;
605 feature
.whitelist()->insert("foo");
606 feature
.extension_types()->insert(Manifest::TYPE_THEME
);
607 feature
.contexts()->insert(Feature::BLESSED_EXTENSION_CONTEXT
);
608 feature
.set_location(SimpleFeature::COMPONENT_LOCATION
);
609 feature
.platforms()->insert(Feature::CHROMEOS_PLATFORM
);
610 feature
.set_min_manifest_version(1);
611 feature
.set_max_manifest_version(2);
613 // Test additive parsing. Parsing an empty dictionary should result in no
614 // changes to a SimpleFeature.
615 base::DictionaryValue definition
;
616 feature
.Parse(&definition
);
617 EXPECT_EQ(1u, feature
.whitelist()->size());
618 EXPECT_EQ(1u, feature
.extension_types()->size());
619 EXPECT_EQ(1u, feature
.contexts()->size());
620 EXPECT_EQ(1u, feature
.whitelist()->count("foo"));
621 EXPECT_EQ(SimpleFeature::COMPONENT_LOCATION
, feature
.location());
622 EXPECT_EQ(1u, feature
.platforms()->size());
623 EXPECT_EQ(1u, feature
.platforms()->count(Feature::CHROMEOS_PLATFORM
));
624 EXPECT_EQ(1, feature
.min_manifest_version());
625 EXPECT_EQ(2, feature
.max_manifest_version());
627 base::ListValue
* whitelist
= new base::ListValue();
628 base::ListValue
* extension_types
= new base::ListValue();
629 base::ListValue
* contexts
= new base::ListValue();
630 whitelist
->Append(new base::StringValue("bar"));
631 extension_types
->Append(new base::StringValue("extension"));
632 contexts
->Append(new base::StringValue("unblessed_extension"));
633 definition
.Set("whitelist", whitelist
);
634 definition
.Set("extension_types", extension_types
);
635 definition
.Set("contexts", contexts
);
636 // Can't test location or platform because we only have one value so far.
637 definition
.Set("min_manifest_version", new base::FundamentalValue(2));
638 definition
.Set("max_manifest_version", new base::FundamentalValue(3));
640 feature
.Parse(&definition
);
641 EXPECT_EQ(1u, feature
.whitelist()->size());
642 EXPECT_EQ(1u, feature
.extension_types()->size());
643 EXPECT_EQ(1u, feature
.contexts()->size());
644 EXPECT_EQ(1u, feature
.whitelist()->count("bar"));
645 EXPECT_EQ(1u, feature
.extension_types()->count(Manifest::TYPE_EXTENSION
));
647 feature
.contexts()->count(Feature::UNBLESSED_EXTENSION_CONTEXT
));
648 EXPECT_EQ(2, feature
.min_manifest_version());
649 EXPECT_EQ(3, feature
.max_manifest_version());
652 } // namespace extensions