// Copyright 2014 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_DOM_HTML_ELEMENT_FACTORY_H_
#define COBALT_DOM_HTML_ELEMENT_FACTORY_H_

#include <string>

#include "base/callback.h"
#include "base/hash_tables.h"
#include "base/memory/ref_counted.h"
#include "cobalt/base/token.h"

namespace cobalt {
namespace dom {

class Document;
class HTMLElement;

// This factory is responsible for creating HTML elements according to tag name.
class HTMLElementFactory {
 public:
  HTMLElementFactory();
  ~HTMLElementFactory();

  scoped_refptr<HTMLElement> CreateHTMLElement(Document* document,
                                               base::Token tag_name);

 private:
  typedef base::Callback<scoped_refptr<HTMLElement>(Document* document)>
      CreateHTMLElementTCallback;
  typedef base::hash_map<base::Token, CreateHTMLElementTCallback>
      TagNameToCreateHTMLElementTCallbackMap;

  // Helper function templates for adding entries to the map below.
  template <typename T>
  void RegisterHTMLElementWithSingleTagName();
  template <typename T>
  void RegisterHTMLElementWithMultipleTagName();

  TagNameToCreateHTMLElementTCallbackMap
      tag_name_to_create_html_element_t_callback_map_;

  DISALLOW_COPY_AND_ASSIGN(HTMLElementFactory);
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_HTML_ELEMENT_FACTORY_H_
