| // Copyright 2013 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 "extensions/common/features/feature_provider.h" |
| |
| #include <map> |
| |
| #include "base/basictypes.h" |
| #include "base/lazy_instance.h" |
| #include "base/memory/linked_ptr.h" |
| #include "extensions/common/extensions_client.h" |
| |
| namespace extensions { |
| |
| namespace { |
| |
| class Static { |
| public: |
| FeatureProvider* GetFeatures(const std::string& name) const { |
| FeatureProviderMap::const_iterator it = feature_providers_.find(name); |
| CHECK(it != feature_providers_.end()); |
| return it->second.get(); |
| } |
| |
| private: |
| friend struct base::DefaultLazyInstanceTraits<Static>; |
| |
| Static() { |
| ExtensionsClient* client = ExtensionsClient::Get(); |
| feature_providers_["api"] = |
| make_linked_ptr(client->CreateFeatureProvider("api").release()); |
| feature_providers_["manifest"] = |
| make_linked_ptr(client->CreateFeatureProvider("manifest").release()); |
| feature_providers_["permission"] = |
| make_linked_ptr(client->CreateFeatureProvider("permission").release()); |
| } |
| |
| typedef std::map<std::string, linked_ptr<FeatureProvider> > |
| FeatureProviderMap; |
| |
| FeatureProviderMap feature_providers_; |
| }; |
| |
| base::LazyInstance<Static> g_static = LAZY_INSTANCE_INITIALIZER; |
| |
| } // namespace |
| |
| // static |
| const FeatureProvider* FeatureProvider::GetByName(const std::string& name) { |
| return g_static.Get().GetFeatures(name); |
| } |
| |
| // static |
| const FeatureProvider* FeatureProvider::GetAPIFeatures() { |
| return GetByName("api"); |
| } |
| |
| // static |
| const FeatureProvider* FeatureProvider::GetManifestFeatures() { |
| return GetByName("manifest"); |
| } |
| |
| // static |
| const FeatureProvider* FeatureProvider::GetPermissionFeatures() { |
| return GetByName("permission"); |
| } |
| |
| } // namespace extensions |