| OLD | NEW | 
|    1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |    1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include "chrome/common/extensions/features/base_feature_provider.h" |    5 #include "chrome/common/extensions/features/base_feature_provider.h" | 
|    6  |    6  | 
|    7 #include "base/json/json_reader.h" |    7 #include "base/json/json_reader.h" | 
|    8 #include "base/lazy_instance.h" |    8 #include "base/lazy_instance.h" | 
 |    9 #include "chrome/common/extensions/features/api_feature.h" | 
|    9 #include "chrome/common/extensions/features/complex_feature.h" |   10 #include "chrome/common/extensions/features/complex_feature.h" | 
|   10 #include "chrome/common/extensions/features/manifest_feature.h" |   11 #include "chrome/common/extensions/features/manifest_feature.h" | 
|   11 #include "chrome/common/extensions/features/permission_feature.h" |   12 #include "chrome/common/extensions/features/permission_feature.h" | 
|   12 #include "grit/common_resources.h" |   13 #include "grit/common_resources.h" | 
|   13 #include "ui/base/resource/resource_bundle.h" |   14 #include "ui/base/resource/resource_bundle.h" | 
|   14  |   15  | 
|   15 namespace extensions { |   16 namespace extensions { | 
|   16  |   17  | 
|   17 namespace { |   18 namespace { | 
|   18  |   19  | 
|   19 template<class FeatureClass> |   20 template<class FeatureClass> | 
|   20 SimpleFeature* CreateFeature() { |   21 SimpleFeature* CreateFeature() { | 
|   21   return new FeatureClass(); |   22   return new FeatureClass(); | 
|   22 } |   23 } | 
|   23  |   24  | 
|   24 struct Static { |   25 struct Static { | 
|   25   Static() |   26   Static() | 
|   26       : manifest_features( |   27       : api_features( | 
 |   28             LoadProvider("api", | 
 |   29                          &CreateFeature<APIFeature>, | 
 |   30                          IDR_EXTENSION_API_FEATURES)), | 
 |   31         manifest_features( | 
|   27             LoadProvider("manifest", |   32             LoadProvider("manifest", | 
|   28                          &CreateFeature<ManifestFeature>, |   33                          &CreateFeature<ManifestFeature>, | 
|   29                          IDR_EXTENSION_MANIFEST_FEATURES)), |   34                          IDR_EXTENSION_MANIFEST_FEATURES)), | 
|   30         permission_features( |   35         permission_features( | 
|   31             LoadProvider("permissions", |   36             LoadProvider("permissions", | 
|   32                          &CreateFeature<PermissionFeature>, |   37                          &CreateFeature<PermissionFeature>, | 
|   33                          IDR_EXTENSION_PERMISSION_FEATURES)) { |   38                          IDR_EXTENSION_PERMISSION_FEATURES)) { | 
|   34   } |   39   } | 
|   35  |   40  | 
 |   41   scoped_ptr<BaseFeatureProvider> api_features; | 
|   36   scoped_ptr<BaseFeatureProvider> manifest_features; |   42   scoped_ptr<BaseFeatureProvider> manifest_features; | 
|   37   scoped_ptr<BaseFeatureProvider> permission_features; |   43   scoped_ptr<BaseFeatureProvider> permission_features; | 
|   38  |   44  | 
|   39  private: |   45  private: | 
|   40   scoped_ptr<BaseFeatureProvider> LoadProvider( |   46   scoped_ptr<BaseFeatureProvider> LoadProvider( | 
|   41       const std::string& debug_string, |   47       const std::string& debug_string, | 
|   42       BaseFeatureProvider::FeatureFactory factory, |   48       BaseFeatureProvider::FeatureFactory factory, | 
|   43       int resource_id) { |   49       int resource_id) { | 
|   44     const std::string& features_file = |   50     const std::string& features_file = | 
|   45         ResourceBundle::GetSharedInstance().GetRawDataResource( |   51         ResourceBundle::GetSharedInstance().GetRawDataResource( | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
|   60       value_as_dict.reset(new DictionaryValue()); |   66       value_as_dict.reset(new DictionaryValue()); | 
|   61     } |   67     } | 
|   62     return make_scoped_ptr(new BaseFeatureProvider(*value_as_dict, factory)); |   68     return make_scoped_ptr(new BaseFeatureProvider(*value_as_dict, factory)); | 
|   63   } |   69   } | 
|   64 }; |   70 }; | 
|   65  |   71  | 
|   66 bool ParseFeature(const DictionaryValue* value, |   72 bool ParseFeature(const DictionaryValue* value, | 
|   67                   const std::string& name, |   73                   const std::string& name, | 
|   68                   SimpleFeature* feature) { |   74                   SimpleFeature* feature) { | 
|   69   feature->set_name(name); |   75   feature->set_name(name); | 
|   70   feature->Parse(value); |   76   std::string error = feature->Parse(value); | 
|   71  |   77   if (!error.empty()) | 
|   72   if (feature->extension_types()->empty()) { |   78     LOG(ERROR) << error; | 
|   73     LOG(ERROR) << name << ": Simple features must specify at least one " |   79   return error.empty(); | 
|   74                << "value for extension_types."; |  | 
|   75     return false; |  | 
|   76   } |  | 
|   77  |  | 
|   78   if (!feature->GetContexts()->empty()) { |  | 
|   79     LOG(ERROR) << name << ": Simple features do not support contexts."; |  | 
|   80     return false; |  | 
|   81   } |  | 
|   82  |  | 
|   83   return true; |  | 
|   84 } |   80 } | 
|   85  |   81  | 
|   86 base::LazyInstance<Static> g_static = LAZY_INSTANCE_INITIALIZER; |   82 base::LazyInstance<Static> g_static = LAZY_INSTANCE_INITIALIZER; | 
|   87  |   83  | 
|   88 }  // namespace |   84 }  // namespace | 
|   89  |   85  | 
|   90 BaseFeatureProvider::BaseFeatureProvider(const DictionaryValue& root, |   86 BaseFeatureProvider::BaseFeatureProvider(const DictionaryValue& root, | 
|   91                                          FeatureFactory factory) |   87                                          FeatureFactory factory) | 
|   92     : factory_(factory ? factory : |   88     : factory_(factory ? factory : | 
|   93                static_cast<FeatureFactory>(&CreateFeature<SimpleFeature>)) { |   89                static_cast<FeatureFactory>(&CreateFeature<SimpleFeature>)) { | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  134       LOG(ERROR) << iter.key() << ": Feature description must be dictionary or" |  130       LOG(ERROR) << iter.key() << ": Feature description must be dictionary or" | 
|  135                  << " list of dictionaries."; |  131                  << " list of dictionaries."; | 
|  136     } |  132     } | 
|  137   } |  133   } | 
|  138 } |  134 } | 
|  139  |  135  | 
|  140 BaseFeatureProvider::~BaseFeatureProvider() { |  136 BaseFeatureProvider::~BaseFeatureProvider() { | 
|  141 } |  137 } | 
|  142  |  138  | 
|  143 // static |  139 // static | 
 |  140 BaseFeatureProvider* BaseFeatureProvider::GetApiFeatures() { | 
 |  141   return g_static.Get().api_features.get(); | 
 |  142 } | 
 |  143  | 
 |  144 // static | 
|  144 BaseFeatureProvider* BaseFeatureProvider::GetManifestFeatures() { |  145 BaseFeatureProvider* BaseFeatureProvider::GetManifestFeatures() { | 
|  145   return g_static.Get().manifest_features.get(); |  146   return g_static.Get().manifest_features.get(); | 
|  146 } |  147 } | 
|  147  |  148  | 
|  148 // static |  149 // static | 
|  149 BaseFeatureProvider* BaseFeatureProvider::GetPermissionFeatures() { |  150 BaseFeatureProvider* BaseFeatureProvider::GetPermissionFeatures() { | 
|  150   return g_static.Get().permission_features.get(); |  151   return g_static.Get().permission_features.get(); | 
|  151 } |  152 } | 
|  152  |  153  | 
|  153 std::set<std::string> BaseFeatureProvider::GetAllFeatureNames() const { |  154 std::set<std::string> BaseFeatureProvider::GetAllFeatureNames() const { | 
|  154   std::set<std::string> result; |  155   std::set<std::string> result; | 
|  155   for (FeatureMap::const_iterator iter = features_.begin(); |  156   for (FeatureMap::const_iterator iter = features_.begin(); | 
|  156        iter != features_.end(); ++iter) { |  157        iter != features_.end(); ++iter) { | 
|  157     result.insert(iter->first); |  158     result.insert(iter->first); | 
|  158   } |  159   } | 
|  159   return result; |  160   return result; | 
|  160 } |  161 } | 
|  161  |  162  | 
|  162 Feature* BaseFeatureProvider::GetFeature(const std::string& name) { |  163 Feature* BaseFeatureProvider::GetFeature(const std::string& name) { | 
|  163   FeatureMap::iterator iter = features_.find(name); |  164   FeatureMap::iterator iter = features_.find(name); | 
|  164   if (iter != features_.end()) |  165   if (iter != features_.end()) | 
|  165     return iter->second.get(); |  166     return iter->second.get(); | 
|  166   else |  167   else | 
|  167     return NULL; |  168     return NULL; | 
|  168 } |  169 } | 
|  169  |  170  | 
|  170 }  // namespace |  171 }  // namespace | 
| OLD | NEW |