/*
 * 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_DOM_EXCEPTION_H_
#define COBALT_DOM_DOM_EXCEPTION_H_

#include <string>

#include "cobalt/script/exception_state.h"
#include "cobalt/script/script_exception.h"

namespace cobalt {
namespace dom {

class DOMException : public script::ScriptException {
 public:
  // List of exceptions and codes found here:
  //   http://heycam.github.io/webidl/#idl-DOMException-error-names
  // Add more codes as Cobalt needs them.
  enum ExceptionCode {
    // If the error name does not have a corresponding code, set the code to 0.
    kNone = 0,
    kIndexSizeErr = 1,
    kNoModificationAllowedError = 7,
    kNotFoundErr = 8,
    kNotSupportedErr = 9,
    kInvalidStateErr = 11,
    kSyntaxErr = 12,
    kInvalidAccessErr = 15,
    // Note that TypeMismatchErr is replaced by TypeError but we keep using it
    // to be in sync with Chrome.
    kTypeMismatchErr = 17,
    kSecurityErr = 18,
    kQuotaExceededErr = 22,
    kReadOnlyErr
  };

  explicit DOMException(ExceptionCode code);
  DOMException(ExceptionCode code, const std::string& message);

  uint16 code() const { return static_cast<uint16>(code_); }
  std::string name() const OVERRIDE { return name_; }
  std::string message() const OVERRIDE { return message_; }

  // Helper function to raise a DOMException in the ExceptionState passed in.
  static void Raise(ExceptionCode code,
                    script::ExceptionState* exception_state);

  DEFINE_WRAPPABLE_TYPE(DOMException);

 private:
  ExceptionCode code_;
  std::string name_;
  std::string message_;
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_DOM_EXCEPTION_H_
