/*
 * Copyright 2015 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_CDATA_SECTION_H_
#define COBALT_DOM_CDATA_SECTION_H_

#include <string>

#include "base/string_piece.h"
#include "cobalt/dom/text.h"
#include "cobalt/script/environment_settings.h"

namespace cobalt {
namespace dom {

class Document;

// CDATA sections are used to escape blocks of text containing characters that
// would otherwise be regarded as markup.
//   https://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-667469212
class CDATASection : public Text {
 public:
  CDATASection(script::EnvironmentSettings* env_settings,
               const base::StringPiece& cdata_section);
  CDATASection(Document* document, const base::StringPiece& cdata_section);

  // Web API: Node
  //
  base::Token node_name() const OVERRIDE;
  NodeType node_type() const OVERRIDE { return Node::kCdataSectionNode; }

  // Custom, not in any spec: Node.
  //
  scoped_refptr<CDATASection> AsCDATASection() OVERRIDE { return this; }

  void Accept(NodeVisitor* visitor) OVERRIDE;
  void Accept(ConstNodeVisitor* visitor) const OVERRIDE;

  scoped_refptr<Node> Duplicate() const OVERRIDE;

  DEFINE_WRAPPABLE_TYPE(CDATASection);

 private:
  ~CDATASection() OVERRIDE {}
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_CDATA_SECTION_H_
