// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef EXTENSIONS_BROWSER_EXTENSION_FUNCTION_REGISTRY_H_ #define EXTENSIONS_BROWSER_EXTENSION_FUNCTION_REGISTRY_H_ #include #include #include #include "extensions/browser/extension_function_histogram_value.h" class ExtensionFunction; // A factory function for creating new ExtensionFunction instances. typedef ExtensionFunction* (*ExtensionFunctionFactory)(); // Template for defining ExtensionFunctionFactory. template ExtensionFunction* NewExtensionFunction() { return new T(); } // Contains a list of all known extension functions and allows clients to // create instances of them. class ExtensionFunctionRegistry { public: static ExtensionFunctionRegistry* GetInstance(); explicit ExtensionFunctionRegistry(); virtual ~ExtensionFunctionRegistry(); // Adds all function names to 'names'. void GetAllNames(std::vector* names); // Allows overriding of specific functions (e.g. for testing). Functions // must be previously registered. Returns true if successful. bool OverrideFunction(const std::string& name, ExtensionFunctionFactory factory); // Factory method for the ExtensionFunction registered as 'name'. ExtensionFunction* NewFunction(const std::string& name); template void RegisterFunction() { ExtensionFunctionFactory factory = &NewExtensionFunction; factories_[T::function_name()] = FactoryEntry(factory, T::histogram_value()); } struct FactoryEntry { public: explicit FactoryEntry(); explicit FactoryEntry( ExtensionFunctionFactory factory, extensions::functions::HistogramValue histogram_value); ExtensionFunctionFactory factory_; extensions::functions::HistogramValue histogram_value_; }; typedef std::map FactoryMap; FactoryMap factories_; }; #endif // EXTENSIONS_BROWSER_EXTENSION_FUNCTION_REGISTRY_H_