1// Copyright 2014 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#ifndef EXTENSIONS_BROWSER_EXTENSION_FUNCTION_REGISTRY_H_ 6#define EXTENSIONS_BROWSER_EXTENSION_FUNCTION_REGISTRY_H_ 7 8#include <map> 9#include <string> 10#include <vector> 11 12#include "extensions/browser/extension_function_histogram_value.h" 13 14class ExtensionFunction; 15 16// A factory function for creating new ExtensionFunction instances. 17typedef ExtensionFunction* (*ExtensionFunctionFactory)(); 18 19// Template for defining ExtensionFunctionFactory. 20template <class T> 21ExtensionFunction* NewExtensionFunction() { 22 return new T(); 23} 24 25// Contains a list of all known extension functions and allows clients to 26// create instances of them. 27class ExtensionFunctionRegistry { 28 public: 29 static ExtensionFunctionRegistry* GetInstance(); 30 explicit ExtensionFunctionRegistry(); 31 virtual ~ExtensionFunctionRegistry(); 32 33 // Adds all function names to 'names'. 34 void GetAllNames(std::vector<std::string>* names); 35 36 // Allows overriding of specific functions (e.g. for testing). Functions 37 // must be previously registered. Returns true if successful. 38 bool OverrideFunction(const std::string& name, 39 ExtensionFunctionFactory factory); 40 41 // Factory method for the ExtensionFunction registered as 'name'. 42 ExtensionFunction* NewFunction(const std::string& name); 43 44 template <class T> 45 void RegisterFunction() { 46 ExtensionFunctionFactory factory = &NewExtensionFunction<T>; 47 factories_[T::function_name()] = 48 FactoryEntry(factory, T::histogram_value()); 49 } 50 51 struct FactoryEntry { 52 public: 53 explicit FactoryEntry(); 54 explicit FactoryEntry( 55 ExtensionFunctionFactory factory, 56 extensions::functions::HistogramValue histogram_value); 57 58 ExtensionFunctionFactory factory_; 59 extensions::functions::HistogramValue histogram_value_; 60 }; 61 62 typedef std::map<std::string, FactoryEntry> FactoryMap; 63 FactoryMap factories_; 64}; 65 66#endif // EXTENSIONS_BROWSER_EXTENSION_FUNCTION_REGISTRY_H_ 67