| Index: chrome/common/extensions/api/extension_api_feature.cc | 
| diff --git a/chrome/common/extensions/api/extension_api_feature.cc b/chrome/common/extensions/api/extension_api_feature.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..b290771cb854b2b2b3b53bac9d2eade235d4076b | 
| --- /dev/null | 
| +++ b/chrome/common/extensions/api/extension_api_feature.cc | 
| @@ -0,0 +1,71 @@ | 
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include "chrome/common/extensions/api/extension_api_feature.h" | 
| + | 
| +#include "base/values.h" | 
| + | 
| +namespace extensions { | 
| + | 
| +namespace { | 
| + | 
| +const char* kChildKinds[] = { | 
| +  "functions", | 
| +  "events" | 
| +}; | 
| + | 
| +}  // namespace | 
| + | 
| +ExtensionAPIFeature::ExtensionAPIFeature() { | 
| +} | 
| + | 
| +ExtensionAPIFeature::~ExtensionAPIFeature() { | 
| +} | 
| + | 
| +std::set<std::string>* ExtensionAPIFeature::dependencies() { | 
| +  return &dependencies_; | 
| +} | 
| + | 
| +void ExtensionAPIFeature::Parse(const DictionaryValue* schema) { | 
| +  Feature::Parse(schema); | 
| + | 
| +  ParseSet(schema, "dependencies", &dependencies_); | 
| + | 
| +  for (size_t i = 0; i < arraysize(kChildKinds); ++i) { | 
| +    ListValue* child_list = NULL; | 
| +    schema->GetList(kChildKinds[i], &child_list); | 
| +    if (!child_list) | 
| +      continue; | 
| + | 
| +    for (size_t j = 0; j < child_list->GetSize(); ++j) { | 
| +      DictionaryValue* child = NULL; | 
| +      CHECK(child_list->GetDictionary(j, &child)); | 
| + | 
| +      scoped_ptr<ExtensionAPIFeature> child_feature(new ExtensionAPIFeature()); | 
| +      child_feature->Parse(child); | 
| +      if (child_feature->IsEmpty()) | 
| +        continue;  // no need to store no-op features | 
| + | 
| +      std::string child_name; | 
| +      CHECK(child->GetString("name", &child_name)); | 
| +      child_feature->set_name(name() + "." + child_name); | 
| +      CHECK(child_features_.insert( | 
| +            std::make_pair(child_name, | 
| +                           make_linked_ptr(child_feature.release()))).second); | 
| +    } | 
| +  } | 
| +} | 
| + | 
| +Feature* ExtensionAPIFeature::GetChild(const std::string& child_name) const { | 
| +  ChildFeatureMap::const_iterator iter = child_features_.find(child_name); | 
| +  if (iter != child_features_.end()) { | 
| +    ExtensionAPIFeature* result = iter->second.get(); | 
| +    result->dependencies()->insert(std::string("api:") + name()); | 
| +    return result; | 
| +  } else { | 
| +    return NULL; | 
| +  } | 
| +} | 
| + | 
| +}  // namespace extensions | 
|  |