// 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