Index: extensions/common/features/simple_feature.h |
diff --git a/extensions/common/features/simple_feature.h b/extensions/common/features/simple_feature.h |
index a5bc27080d0b88a1b64d061c4c1838692ae3e29e..9d8c539414bb42f775911dbd76fa7c1cbaed192f 100644 |
--- a/extensions/common/features/simple_feature.h |
+++ b/extensions/common/features/simple_feature.h |
@@ -11,6 +11,7 @@ |
#include "base/callback_forward.h" |
#include "base/gtest_prod_util.h" |
+#include "base/lazy_instance.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/memory/scoped_vector.h" |
#include "base/values.h" |
@@ -21,53 +22,16 @@ |
namespace extensions { |
+class BaseFeatureProviderTest; |
+class ExtensionAPITest; |
+class ManifestUnitTest; |
+class SimpleFeatureTest; |
+ |
class SimpleFeature : public Feature { |
public: |
SimpleFeature(); |
~SimpleFeature() override; |
- // Similar to Manifest::Location, these are the classes of locations |
- // supported in feature files. |
- // |
- // This is only public for testing. Production code should never access it, |
- // nor should it really have any reason to access the SimpleFeature class |
- // directly, it should be dealing with the Feature interface. |
- enum Location { |
- UNSPECIFIED_LOCATION, |
- COMPONENT_LOCATION, |
- EXTERNAL_COMPONENT_LOCATION, |
- POLICY_LOCATION, |
- }; |
- |
- // Accessors defined for testing. See comment above about not directly using |
- // SimpleFeature in production code. |
- std::set<std::string>* blacklist() { return &blacklist_; } |
- const std::set<std::string>* blacklist() const { return &blacklist_; } |
- std::set<std::string>* whitelist() { return &whitelist_; } |
- const std::set<std::string>* whitelist() const { return &whitelist_; } |
- std::set<Manifest::Type>* extension_types() { return &extension_types_; } |
- const std::set<Manifest::Type>* extension_types() const { |
- return &extension_types_; |
- } |
- std::set<Context>* contexts() { return &contexts_; } |
- const std::set<Context>* contexts() const { return &contexts_; } |
- Location location() const { return location_; } |
- void set_location(Location location) { location_ = location; } |
- int min_manifest_version() const { return min_manifest_version_; } |
- void set_min_manifest_version(int min_manifest_version) { |
- min_manifest_version_ = min_manifest_version; |
- } |
- int max_manifest_version() const { return max_manifest_version_; } |
- void set_max_manifest_version(int max_manifest_version) { |
- max_manifest_version_ = max_manifest_version; |
- } |
- const std::string& command_line_switch() const { |
- return command_line_switch_; |
- } |
- void set_command_line_switch(const std::string& command_line_switch) { |
- command_line_switch_ = command_line_switch; |
- } |
- |
// Dependency resolution is a property of Features that is preferrably |
// handled internally to avoid temptation, but FeatureFilters may need |
// to know if there are any at all. |
@@ -80,9 +44,7 @@ class SimpleFeature : public Feature { |
// Unspecified values in the JSON are not modified in the object. This allows |
// us to implement inheritance by parsing one value after another. Returns |
// the error found, or an empty string on success. |
- virtual std::string Parse(const base::DictionaryValue* value); |
- |
- std::set<Platform>* platforms() { return &platforms_; } |
+ virtual std::string Parse(const base::DictionaryValue* dictionary); |
Availability IsAvailableToContext(const Extension* extension, |
Context context) const { |
@@ -120,10 +82,51 @@ class SimpleFeature : public Feature { |
bool IsIdInBlacklist(const std::string& extension_id) const override; |
bool IsIdInWhitelist(const std::string& extension_id) const override; |
- static bool IsIdInList(const std::string& extension_id, |
- const std::set<std::string>& list); |
+ |
+ static bool IsIdInArray(const std::string& extension_id, |
+ const char* const array[], |
+ size_t array_length); |
protected: |
+ // Similar to Manifest::Location, these are the classes of locations |
+ // supported in feature files. Production code should never directly access |
+ // these. |
+ enum Location { |
+ UNSPECIFIED_LOCATION, |
+ COMPONENT_LOCATION, |
+ EXTERNAL_COMPONENT_LOCATION, |
+ POLICY_LOCATION, |
+ }; |
+ |
+ // Accessors defined for testing. |
+ std::vector<std::string>* blacklist() { return &blacklist_; } |
+ const std::vector<std::string>* blacklist() const { return &blacklist_; } |
+ std::vector<std::string>* whitelist() { return &whitelist_; } |
+ const std::vector<std::string>* whitelist() const { return &whitelist_; } |
+ std::vector<Manifest::Type>* extension_types() { return &extension_types_; } |
+ const std::vector<Manifest::Type>* extension_types() const { |
+ return &extension_types_; |
+ } |
+ std::vector<Context>* contexts() { return &contexts_; } |
+ const std::vector<Context>* contexts() const { return &contexts_; } |
+ std::vector<Platform>* platforms() { return &platforms_; } |
+ Location location() const { return location_; } |
+ void set_location(Location location) { location_ = location; } |
+ int min_manifest_version() const { return min_manifest_version_; } |
+ void set_min_manifest_version(int min_manifest_version) { |
+ min_manifest_version_ = min_manifest_version; |
+ } |
+ int max_manifest_version() const { return max_manifest_version_; } |
+ void set_max_manifest_version(int max_manifest_version) { |
+ max_manifest_version_ = max_manifest_version; |
+ } |
+ const std::string& command_line_switch() const { |
+ return command_line_switch_; |
+ } |
+ void set_command_line_switch(const std::string& command_line_switch) { |
+ command_line_switch_ = command_line_switch; |
+ } |
+ |
// Handy utilities which construct the correct availability message. |
Availability CreateAvailability(AvailabilityResult result) const; |
Availability CreateAvailability(AvailabilityResult result, |
@@ -134,23 +137,55 @@ class SimpleFeature : public Feature { |
Context context) const; |
private: |
+ friend class SimpleFeatureTest; |
+ FRIEND_TEST_ALL_PREFIXES(BaseFeatureProviderTest, ManifestFeatureTypes); |
+ FRIEND_TEST_ALL_PREFIXES(BaseFeatureProviderTest, PermissionFeatureTypes); |
+ FRIEND_TEST_ALL_PREFIXES(ExtensionAPITest, DefaultConfigurationFeatures); |
+ FRIEND_TEST_ALL_PREFIXES(ManifestUnitTest, Extension); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, Blacklist); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, CommandLineSwitch); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, Context); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, HashedIdBlacklist); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, HashedIdWhitelist); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, Inheritance); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, Location); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, ManifestVersion); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, PackageType); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, ParseContexts); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, ParseLocation); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, ParseManifestVersion); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, ParseNull); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, ParsePackageTypes); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, ParsePlatforms); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, ParseWhitelist); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, Platform); |
+ FRIEND_TEST_ALL_PREFIXES(SimpleFeatureTest, Whitelist); |
+ |
+ // Holds String to Enum value mappings. |
+ struct Mappings; |
+ |
+ static bool IsIdInList(const std::string& extension_id, |
+ const std::vector<std::string>& list); |
+ |
bool MatchesManifestLocation(Manifest::Location manifest_location) const; |
Availability CheckDependencies( |
const base::Callback<Availability(const Feature*)>& checker) const; |
+ static bool IsValidExtensionId(const std::string& extension_id); |
+ |
// For clarity and consistency, we handle the default value of each of these |
// members the same way: it matches everything. It is up to the higher level |
// code that reads Features out of static data to validate that data and set |
// sensible defaults. |
- std::set<std::string> blacklist_; |
- std::set<std::string> whitelist_; |
- std::set<std::string> dependencies_; |
- std::set<Manifest::Type> extension_types_; |
- std::set<Context> contexts_; |
+ std::vector<std::string> blacklist_; |
+ std::vector<std::string> whitelist_; |
+ std::vector<std::string> dependencies_; |
+ std::vector<Manifest::Type> extension_types_; |
+ std::vector<Context> contexts_; |
+ std::vector<Platform> platforms_; |
URLPatternSet matches_; |
Location location_; |
- std::set<Platform> platforms_; |
int min_manifest_version_; |
int max_manifest_version_; |
bool component_extensions_auto_granted_; |