1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef EXTENSIONS_BROWSER_EXTENSION_FUNCTION_REGISTRY_H_
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define EXTENSIONS_BROWSER_EXTENSION_FUNCTION_REGISTRY_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/extension_function_histogram_value.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionFunction;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A factory function for creating new ExtensionFunction instances.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef ExtensionFunction* (*ExtensionFunctionFactory)();
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Template for defining ExtensionFunctionFactory.
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <class T>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionFunction* NewExtensionFunction() {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new T();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Contains a list of all known extension functions and allows clients to
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// create instances of them.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionFunctionRegistry {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ExtensionFunctionRegistry* GetInstance();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ExtensionFunctionRegistry();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionFunctionRegistry();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds all function names to 'names'.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetAllNames(std::vector<std::string>* names);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows overriding of specific functions (e.g. for testing).  Functions
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // must be previously registered.  Returns true if successful.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool OverrideFunction(const std::string& name,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ExtensionFunctionFactory factory);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Factory method for the ExtensionFunction registered as 'name'.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionFunction* NewFunction(const std::string& name);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <class T>
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RegisterFunction() {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExtensionFunctionFactory factory = &NewExtensionFunction<T>;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    factories_[T::function_name()] =
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FactoryEntry(factory, T::histogram_value());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct FactoryEntry {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    explicit FactoryEntry();
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit FactoryEntry(
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ExtensionFunctionFactory factory,
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        extensions::functions::HistogramValue histogram_value);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExtensionFunctionFactory factory_;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::functions::HistogramValue histogram_value_;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<std::string, FactoryEntry> FactoryMap;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FactoryMap factories_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // EXTENSIONS_BROWSER_EXTENSION_FUNCTION_REGISTRY_H_
67