1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// found in the LICENSE file.
4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "extensions/common/features/feature_provider.h"
6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <map>
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/basictypes.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/lazy_instance.h"
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/memory/linked_ptr.h"
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "extensions/common/extensions_client.h"
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace extensions {
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace {
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass Static {
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  FeatureProvider* GetFeatures(const std::string& name) const {
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    FeatureProviderMap::const_iterator it = feature_providers_.find(name);
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    CHECK(it != feature_providers_.end());
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return it->second.get();
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  friend struct base::DefaultLazyInstanceTraits<Static>;
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  Static() {
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ExtensionsClient* client = ExtensionsClient::Get();
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    feature_providers_["api"] =
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        make_linked_ptr(client->CreateFeatureProvider("api").release());
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    feature_providers_["manifest"] =
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        make_linked_ptr(client->CreateFeatureProvider("manifest").release());
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    feature_providers_["permission"] =
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        make_linked_ptr(client->CreateFeatureProvider("permission").release());
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  typedef std::map<std::string, linked_ptr<FeatureProvider> >
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      FeatureProviderMap;
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  FeatureProviderMap feature_providers_;
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubase::LazyInstance<Static> g_static = LAZY_INSTANCE_INITIALIZER;
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// static
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const FeatureProvider* FeatureProvider::GetByName(const std::string& name) {
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return g_static.Get().GetFeatures(name);
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// static
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const FeatureProvider* FeatureProvider::GetAPIFeatures() {
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return GetByName("api");
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// static
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const FeatureProvider* FeatureProvider::GetManifestFeatures() {
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return GetByName("manifest");
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// static
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const FeatureProvider* FeatureProvider::GetPermissionFeatures() {
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return GetByName("permission");
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace extensions
70