| 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();
 | 
|  }
 | 
| 
 |