[email protected] | 21c6c43 | 2014-03-05 18:47:31 | [diff] [blame] | 1 | // Copyright 2014 The Chromium Authors. All rights reserved. |
[email protected] | ae33d32 | 2012-03-19 22:24:35 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. | ||||
4 | |||||
[email protected] | 21c6c43 | 2014-03-05 18:47:31 | [diff] [blame] | 5 | #ifndef EXTENSIONS_BROWSER_EXTENSION_FUNCTION_REGISTRY_H_ |
6 | #define EXTENSIONS_BROWSER_EXTENSION_FUNCTION_REGISTRY_H_ | ||||
[email protected] | ae33d32 | 2012-03-19 22:24:35 | [diff] [blame] | 7 | |
8 | #include <map> | ||||
9 | #include <string> | ||||
10 | #include <vector> | ||||
11 | |||||
[email protected] | 1ee7f89 | 2014-03-04 06:04:25 | [diff] [blame] | 12 | #include "extensions/browser/extension_function_histogram_value.h" |
[email protected] | 07ad962 | 2013-01-18 23:00:33 | [diff] [blame] | 13 | |
[email protected] | ae33d32 | 2012-03-19 22:24:35 | [diff] [blame] | 14 | class ExtensionFunction; |
15 | |||||
16 | // A factory function for creating new ExtensionFunction instances. | ||||
17 | typedef ExtensionFunction* (*ExtensionFunctionFactory)(); | ||||
18 | |||||
19 | // Template for defining ExtensionFunctionFactory. | ||||
[email protected] | 21c6c43 | 2014-03-05 18:47:31 | [diff] [blame] | 20 | template <class T> |
[email protected] | ae33d32 | 2012-03-19 22:24:35 | [diff] [blame] | 21 | ExtensionFunction* 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 | |||||
[email protected] | ae33d32 | 2012-03-19 22:24:35 | [diff] [blame] | 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 | |||||
[email protected] | 21c6c43 | 2014-03-05 18:47:31 | [diff] [blame] | 44 | template <class T> |
[email protected] | ae33d32 | 2012-03-19 22:24:35 | [diff] [blame] | 45 | void RegisterFunction() { |
[email protected] | 07ad962 | 2013-01-18 23:00:33 | [diff] [blame] | 46 | ExtensionFunctionFactory factory = &NewExtensionFunction<T>; |
47 | factories_[T::function_name()] = | ||||
48 | FactoryEntry(factory, T::histogram_value()); | ||||
[email protected] | ae33d32 | 2012-03-19 22:24:35 | [diff] [blame] | 49 | } |
50 | |||||
[email protected] | 07ad962 | 2013-01-18 23:00:33 | [diff] [blame] | 51 | struct FactoryEntry { |
52 | public: | ||||
53 | explicit FactoryEntry(); | ||||
[email protected] | 21c6c43 | 2014-03-05 18:47:31 | [diff] [blame] | 54 | explicit FactoryEntry( |
55 | ExtensionFunctionFactory factory, | ||||
56 | extensions::functions::HistogramValue histogram_value); | ||||
[email protected] | 07ad962 | 2013-01-18 23:00:33 | [diff] [blame] | 57 | |
58 | ExtensionFunctionFactory factory_; | ||||
59 | extensions::functions::HistogramValue histogram_value_; | ||||
60 | }; | ||||
61 | |||||
62 | typedef std::map<std::string, FactoryEntry> FactoryMap; | ||||
[email protected] | ae33d32 | 2012-03-19 22:24:35 | [diff] [blame] | 63 | FactoryMap factories_; |
64 | }; | ||||
65 | |||||
[email protected] | 21c6c43 | 2014-03-05 18:47:31 | [diff] [blame] | 66 | #endif // EXTENSIONS_BROWSER_EXTENSION_FUNCTION_REGISTRY_H_ |