// Copyright 2015 The Cobalt Authors. 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_PARSER_LIBXML_HTML_PARSER_WRAPPER_H_
#define COBALT_DOM_PARSER_LIBXML_HTML_PARSER_WRAPPER_H_

#include "cobalt/dom_parser/libxml_parser_wrapper.h"

#include <libxml/HTMLparser.h>
#include <string>

#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "cobalt/base/source_location.h"
#include "cobalt/dom/document.h"
#include "cobalt/dom/node.h"
#include "cobalt/loader/decoder.h"

namespace cobalt {
namespace dom_parser {

class LibxmlHTMLParserWrapper : LibxmlParserWrapper {
 public:
  LibxmlHTMLParserWrapper(
      const scoped_refptr<dom::Document>& document,
      const scoped_refptr<dom::Node>& parent_node,
      const scoped_refptr<dom::Node>& reference_node,
      const int dom_max_element_depth,
      const base::SourceLocation& input_location,
      const loader::Decoder::OnCompleteFunction& load_complete_callback,
      const bool should_run_scripts)
      : LibxmlParserWrapper(document, parent_node, reference_node,
                            dom_max_element_depth, input_location,
                            load_complete_callback),
        html_parser_context_(NULL),
        should_run_scripts_(should_run_scripts) {
    DCHECK(!document->IsXMLDocument());
  }
  ~LibxmlHTMLParserWrapper() override;

  // From LibxmlParserWrapper.
  void OnStartElement(const std::string& name,
                      const ParserAttributeVector& attributes) override;
  void OnEndElement(const std::string& name) override;
  void DecodeChunk(const char* data, size_t size) override;
  void Finish() override;

 private:
  base::SourceLocation GetSourceLocation() override;

  htmlParserCtxtPtr html_parser_context_;

  const bool should_run_scripts_;

  DISALLOW_COPY_AND_ASSIGN(LibxmlHTMLParserWrapper);
};

}  // namespace dom_parser
}  // namespace cobalt

#endif  // COBALT_DOM_PARSER_LIBXML_HTML_PARSER_WRAPPER_H_
