| Index: chrome/common/extensions/features/base_feature_provider.cc | 
| diff --git a/chrome/common/extensions/features/base_feature_provider.cc b/chrome/common/extensions/features/base_feature_provider.cc | 
| index 44cc4544a9388b45f275856a9c533fba8820bc06..3e2c5e5c7a51b5c3419e6aeb26fbd268ea5d633a 100644 | 
| --- a/chrome/common/extensions/features/base_feature_provider.cc | 
| +++ b/chrome/common/extensions/features/base_feature_provider.cc | 
| @@ -6,6 +6,7 @@ | 
|  | 
| #include "base/json/json_reader.h" | 
| #include "base/lazy_instance.h" | 
| +#include "chrome/common/extensions/features/api_feature.h" | 
| #include "chrome/common/extensions/features/complex_feature.h" | 
| #include "chrome/common/extensions/features/manifest_feature.h" | 
| #include "chrome/common/extensions/features/permission_feature.h" | 
| @@ -23,7 +24,11 @@ SimpleFeature* CreateFeature() { | 
|  | 
| struct Static { | 
| Static() | 
| -      : manifest_features( | 
| +      : api_features( | 
| +            LoadProvider("api", | 
| +                         &CreateFeature<APIFeature>, | 
| +                         IDR_EXTENSION_API_FEATURES)), | 
| +        manifest_features( | 
| LoadProvider("manifest", | 
| &CreateFeature<ManifestFeature>, | 
| IDR_EXTENSION_MANIFEST_FEATURES)), | 
| @@ -33,6 +38,7 @@ struct Static { | 
| IDR_EXTENSION_PERMISSION_FEATURES)) { | 
| } | 
|  | 
| +  scoped_ptr<BaseFeatureProvider> api_features; | 
| scoped_ptr<BaseFeatureProvider> manifest_features; | 
| scoped_ptr<BaseFeatureProvider> permission_features; | 
|  | 
| @@ -67,20 +73,10 @@ bool ParseFeature(const DictionaryValue* value, | 
| const std::string& name, | 
| SimpleFeature* feature) { | 
| feature->set_name(name); | 
| -  feature->Parse(value); | 
| - | 
| -  if (feature->extension_types()->empty()) { | 
| -    LOG(ERROR) << name << ": Simple features must specify at least one " | 
| -               << "value for extension_types."; | 
| -    return false; | 
| -  } | 
| - | 
| -  if (!feature->GetContexts()->empty()) { | 
| -    LOG(ERROR) << name << ": Simple features do not support contexts."; | 
| -    return false; | 
| -  } | 
| - | 
| -  return true; | 
| +  std::string error = feature->Parse(value); | 
| +  if (!error.empty()) | 
| +    LOG(ERROR) << error; | 
| +  return error.empty(); | 
| } | 
|  | 
| base::LazyInstance<Static> g_static = LAZY_INSTANCE_INITIALIZER; | 
| @@ -141,6 +137,11 @@ BaseFeatureProvider::~BaseFeatureProvider() { | 
| } | 
|  | 
| // static | 
| +BaseFeatureProvider* BaseFeatureProvider::GetApiFeatures() { | 
| +  return g_static.Get().api_features.get(); | 
| +} | 
| + | 
| +// static | 
| BaseFeatureProvider* BaseFeatureProvider::GetManifestFeatures() { | 
| return g_static.Get().manifest_features.get(); | 
| } | 
|  |