Index: chrome/common/extensions/simple_feature_provider.cc |
diff --git a/chrome/common/extensions/simple_feature_provider.cc b/chrome/common/extensions/simple_feature_provider.cc |
index 71be30ca90a70d8e587e76455576de800585aa3f..e5acf3652a73dcf5cbb5dc11f27a3a505ef8ec0e 100644 |
--- a/chrome/common/extensions/simple_feature_provider.cc |
+++ b/chrome/common/extensions/simple_feature_provider.cc |
@@ -6,27 +6,42 @@ |
#include "base/json/json_reader.h" |
#include "base/lazy_instance.h" |
+#include "chrome/common/extensions/manifest_feature.h" |
+#include "chrome/common/extensions/permission_feature.h" |
#include "grit/common_resources.h" |
#include "ui/base/resource/resource_bundle.h" |
+namespace extensions { |
+ |
namespace { |
const bool kAllowTrailingComma = false; |
+template<class FeatureClass> |
+Feature* CreateFeature() { |
+ return new FeatureClass(); |
+} |
+ |
struct Static { |
Static() |
: manifest_features( |
- LoadProvider("manifest", IDR_EXTENSION_MANIFEST_FEATURES)), |
+ LoadProvider("manifest", |
+ &CreateFeature<ManifestFeature>, |
+ IDR_EXTENSION_MANIFEST_FEATURES)), |
permission_features( |
- LoadProvider("permissions", IDR_EXTENSION_PERMISSION_FEATURES)) { |
+ LoadProvider("permissions", |
+ &CreateFeature<PermissionFeature>, |
+ IDR_EXTENSION_PERMISSION_FEATURES)) { |
} |
- scoped_ptr<extensions::SimpleFeatureProvider> manifest_features; |
- scoped_ptr<extensions::SimpleFeatureProvider> permission_features; |
+ scoped_ptr<SimpleFeatureProvider> manifest_features; |
+ scoped_ptr<SimpleFeatureProvider> permission_features; |
private: |
- scoped_ptr<extensions::SimpleFeatureProvider> LoadProvider( |
- const std::string& debug_string, int resource_id) { |
+ scoped_ptr<SimpleFeatureProvider> LoadProvider( |
+ const std::string& debug_string, |
+ SimpleFeatureProvider::FeatureFactory factory, |
+ int resource_id) { |
std::string manifest_features = |
ResourceBundle::GetSharedInstance().GetRawDataResource( |
resource_id).as_string(); |
@@ -39,8 +54,8 @@ struct Static { |
CHECK(value->IsType(Value::TYPE_DICTIONARY)) << debug_string; |
scoped_ptr<DictionaryValue> dictionary_value( |
static_cast<DictionaryValue*>(value)); |
- return scoped_ptr<extensions::SimpleFeatureProvider>( |
- new extensions::SimpleFeatureProvider(dictionary_value.Pass())); |
+ return scoped_ptr<SimpleFeatureProvider>( |
+ new SimpleFeatureProvider(dictionary_value.Pass(), factory)); |
} |
}; |
@@ -48,11 +63,11 @@ base::LazyInstance<Static> g_static = LAZY_INSTANCE_INITIALIZER; |
} // namespace |
-namespace extensions { |
- |
-SimpleFeatureProvider::SimpleFeatureProvider( |
- scoped_ptr<DictionaryValue> root) |
- : root_(root.release()) { |
+SimpleFeatureProvider::SimpleFeatureProvider(scoped_ptr<DictionaryValue> root, |
+ FeatureFactory factory) |
+ : root_(root.release()), |
+ factory_(factory ? factory : |
+ static_cast<FeatureFactory>(&CreateFeature<Feature>)) { |
} |
SimpleFeatureProvider::~SimpleFeatureProvider() { |
@@ -77,21 +92,18 @@ std::set<std::string> SimpleFeatureProvider::GetAllFeatureNames() const { |
return result; |
} |
-scoped_ptr<Feature> SimpleFeatureProvider::GetFeature( |
- const std::string& name) const { |
- scoped_ptr<Feature> feature; |
- |
+scoped_ptr<Feature> SimpleFeatureProvider::GetFeature(const std::string& name) { |
DictionaryValue* description = NULL; |
- if (root_->GetDictionary(name, &description)) |
- feature = Feature::Parse(description); |
- |
- if (!feature.get()) { |
- // Have to use DLOG here because this happens in a lot of unit tests that |
- // use ancient compiled crx files with unknown keys. |
- DLOG(ERROR) << name; |
+ if (!root_->GetDictionary(name, &description)) { |
+ LOG(ERROR) << name << ": Definition not found."; |
return scoped_ptr<Feature>(); |
} |
+ scoped_ptr<Feature> feature(new Feature()); |
+ feature.reset((*factory_)()); |
+ feature->set_name(name); |
+ feature->Parse(description); |
+ |
if (feature->extension_types()->empty()) { |
LOG(ERROR) << name << ": Simple features must specify atleast one value " |
<< "for extension_types."; |