// 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_HTML_DECODER_H_
#define COBALT_DOM_PARSER_HTML_DECODER_H_

#include <memory>
#include <string>

#include "base/callback.h"
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "base/threading/thread_checker.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;

// This decoder class is responsible for decoding a piece of HTML source code
// and creating corresponding DOM nodes and inserting them at the given
// position.
class HTMLDecoder : public loader::Decoder {
 public:
  // New nodes will be inserted under parent_node, before reference_node.
  // If parent_node and document are the same, the HTML input to be decoded is a
  // whole document, which means implied <html>, <body> tags generated by the
  // libxml parser will be appended to the document. Otherwise the implied tags
  // will be ignored.
  HTMLDecoder(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,
              const csp::CSPHeaderPolicy require_csp);

  ~HTMLDecoder();

  // From Decoder.
  loader::LoadResponseType OnResponseStarted(
      loader::Fetcher* fetcher,
      const scoped_refptr<net::HttpResponseHeaders>& headers) override;
  void DecodeChunk(const char* data, size_t size) override;
  void Finish() override;
  bool Suspend() override { return false; }

  void Resume(render_tree::ResourceProvider* resource_provider) override {
    NOTIMPLEMENTED();
  };

 private:
  // This subclass is responsible for providing the handlers for the interface
  // of libxml2's SAX parser.
  std::unique_ptr<LibxmlHTMLParserWrapper> libxml_html_parser_wrapper_;
  scoped_refptr<dom::Document> document_;
  THREAD_CHECKER(thread_checker_);

  // If Cobalt user forbids rendering Cobalt without csp headers.
  const csp::CSPHeaderPolicy require_csp_;

  const loader::Decoder::OnCompleteFunction load_complete_callback_;

  DISALLOW_COPY_AND_ASSIGN(HTMLDecoder);
};

}  // namespace dom_parser
}  // namespace cobalt

#endif  // COBALT_DOM_PARSER_HTML_DECODER_H_
