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 14 class ExtensionFunction; 15 16 // A factory function for creating new ExtensionFunction instances. 17 typedef ExtensionFunction* (*ExtensionFunctionFactory)(); 18 19 // Template for defining ExtensionFunctionFactory. 20 template <class T> NewExtensionFunction()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. 27 class 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> RegisterFunction()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