// 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.

#include "cobalt/web/dom_exception.h"

namespace cobalt {
namespace web {
namespace {

// https://heycam.github.io/webidl/#dfn-error-names-table
const char* kCodeToErrorName[] = {
    "",
    "IndexSizeError",
    "DOMStringSizeError",
    "HierarchyRequestError",
    "WrongDocumentError",
    "InvalidCharacterError",
    "NoDataAllowedError",
    "NoModificationAllowedError",
    "NotFoundError",
    "NotSupportedError",
    "InUseAttributeError",
    "InvalidStateError",
    "SyntaxError",
    "InvalidModificationError",
    "NamespaceError",
    "InvalidAccessError",
    "ValidationError",
    "TypeMismatchError",
    "SecurityError",
    "NetworkError",
    "AbortError",
    "URLMismatchError",
    "QuotaExceededError",
    "TimeoutError",
    "InvalidNodeTypeError",
    "DataCloneError",
};

const char* GetErrorName(DOMException::ExceptionCode code) {
  // Use the table for errors that have a corresponding code.
  static_assert(
      arraysize(kCodeToErrorName) == DOMException::kHighestErrCodeValue + 1,
      "Mismatch number of entries in error table");
  if (code <= DOMException::kHighestErrCodeValue) {
    return kCodeToErrorName[code];
  }

  // Error names are enumerated here:
  //   http://heycam.github.io/webidl/#idl-DOMException-error-names
  switch (code) {
    case DOMException::kReadOnlyErr:
      return "ReadOnlyError";
    case DOMException::kInvalidPointerIdErr:
      return "InvalidPointerId";
    case DOMException::kNotAllowedErr:
      return "NotAllowedError";
    default:
      NOTREACHED();
      break;
  }

  return "";
}

DOMException::ExceptionCode GetErrorCode(const std::string& name) {
  for (size_t i = 0; i < arraysize(kCodeToErrorName); ++i) {
    if (name == kCodeToErrorName[i]) {
      return static_cast<DOMException::ExceptionCode>(i);
    }
  }
  return DOMException::kNone;
}

// The code attribute's getter must return the legacy code indicated in the
// error names table for this DOMException object's name, or 0 if no such entry
// exists in the table.
//   https://heycam.github.io/webidl/#dom-domexception-code
DOMException::ExceptionCode GetLegacyCodeValue(
    DOMException::ExceptionCode value) {
  return value > DOMException::kHighestErrCodeValue ? DOMException::kNone
                                                    : value;
}
}  // namespace

DOMException::DOMException(ExceptionCode code)
    : code_(GetLegacyCodeValue(code)), name_(GetErrorName(code)) {}

DOMException::DOMException(ExceptionCode code, const std::string& message)
    : code_(GetLegacyCodeValue(code)),
      name_(GetErrorName(code)),
      message_(message) {}

DOMException::DOMException(const std::string& message, const std::string& name)
    : code_(GetErrorCode(name)), name_(name), message_(message) {}

// static
void DOMException::Raise(ExceptionCode code,
                         script::ExceptionState* exception_state) {
  DCHECK(exception_state);
  if (exception_state) {
    exception_state->SetException(base::WrapRefCounted(new DOMException(code)));
  }
}

// static
void DOMException::Raise(ExceptionCode code, const std::string& message,
                         script::ExceptionState* exception_state) {
  DCHECK(exception_state);
  if (exception_state) {
    exception_state->SetException(
        base::WrapRefCounted(new DOMException(code, message)));
  }
}

}  // namespace web
}  // namespace cobalt
