// Copyright 2014 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_ATTR_H_
#define COBALT_DOM_ATTR_H_

#include <string>

#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "cobalt/script/wrappable.h"

namespace cobalt {
namespace dom {

class Element;
class NamedNodeMap;

// This type represents a DOM element's attribute as an object.
//    https://www.w3.org/TR/2014/WD-dom-20140710/#interface-attr
//
// Starting from DOM4, Attr no longer inherits from Node.
//
// This class is designed to proxy the actual attribute value which is stored
// in the Element and be created only on demand.
class Attr : public script::Wrappable, public base::SupportsWeakPtr<Attr> {
 public:
  // If container is NULL, the Attr will be created in a detached state.
  Attr(const std::string& name, const std::string& value,
       const scoped_refptr<const NamedNodeMap>& container);

  // Web API: Attr
  const std::string& name() const { return name_; }
  const std::string& node_name() const {
    // TODO: Report deprecated attribute.
    return name_;
  }

  const std::string& value() const { return value_; }
  void set_value(const std::string& value);

  const std::string& node_value() const;

  DEFINE_WRAPPABLE_TYPE(Attr);
  void TraceMembers(script::Tracer* tracer) override;

 private:
  ~Attr();

  // Used by NamedNodeMap to set the value of Attr without triggering an
  // update in the proxied Element.
  void SetValueInternal(const std::string& value) { value_ = value; }

  // Used by NamedNodeMap to attach the Attr to itself.
  scoped_refptr<const NamedNodeMap> container() const;
  void set_container(const scoped_refptr<const NamedNodeMap>& value);

  // Name of the attribute.
  const std::string name_;
  // Value of the attribute.
  std::string value_;
  // Pointer to the NamedNodeMap that contains this Attr.
  scoped_refptr<const NamedNodeMap> container_;

  friend class NamedNodeMap;
  DISALLOW_COPY_AND_ASSIGN(Attr);
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_ATTR_H_
