1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "extensions/common/features/feature_provider.h"
6
7#include <map>
8
9#include "base/basictypes.h"
10#include "base/lazy_instance.h"
11#include "base/memory/linked_ptr.h"
12#include "extensions/common/extensions_client.h"
13
14namespace extensions {
15
16namespace {
17
18class Static {
19 public:
20  FeatureProvider* GetFeatures(const std::string& name) const {
21    FeatureProviderMap::const_iterator it = feature_providers_.find(name);
22    CHECK(it != feature_providers_.end());
23    return it->second.get();
24  }
25
26 private:
27  friend struct base::DefaultLazyInstanceTraits<Static>;
28
29  Static() {
30    ExtensionsClient* client = ExtensionsClient::Get();
31    feature_providers_["api"] =
32        make_linked_ptr(client->CreateFeatureProvider("api").release());
33    feature_providers_["manifest"] =
34        make_linked_ptr(client->CreateFeatureProvider("manifest").release());
35    feature_providers_["permission"] =
36        make_linked_ptr(client->CreateFeatureProvider("permission").release());
37  }
38
39  typedef std::map<std::string, linked_ptr<FeatureProvider> >
40      FeatureProviderMap;
41
42  FeatureProviderMap feature_providers_;
43};
44
45base::LazyInstance<Static> g_static = LAZY_INSTANCE_INITIALIZER;
46
47}  // namespace
48
49// static
50const FeatureProvider* FeatureProvider::GetByName(const std::string& name) {
51  return g_static.Get().GetFeatures(name);
52}
53
54// static
55const FeatureProvider* FeatureProvider::GetAPIFeatures() {
56  return GetByName("api");
57}
58
59// static
60const FeatureProvider* FeatureProvider::GetManifestFeatures() {
61  return GetByName("manifest");
62}
63
64// static
65const FeatureProvider* FeatureProvider::GetPermissionFeatures() {
66  return GetByName("permission");
67}
68
69}  // namespace extensions
70