Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Unified Diff: extensions/common/features/simple_feature.h

Issue 1010973013: Refactor Uses of std::set to std::vector in SimpleFeature (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove Unsigned From Checks with STLCount Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_;

Powered by Google App Engine
This is Rietveld 408576698