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