// 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/xhr/xml_http_request_event_target.h"

#include "cobalt/base/tokens.h"

namespace cobalt {
namespace xhr {

XMLHttpRequestEventTarget::XMLHttpRequestEventTarget() {}
XMLHttpRequestEventTarget::~XMLHttpRequestEventTarget() {}

const dom::EventTarget::EventListenerScriptValue*
XMLHttpRequestEventTarget::onabort() const {
  return onabort_listener_ ? &onabort_listener_.value().referenced_value()
                           : NULL;
}
const dom::EventTarget::EventListenerScriptValue*
XMLHttpRequestEventTarget::onerror() const {
  return onerror_listener_ ? &onerror_listener_.value().referenced_value()
                           : NULL;
}
const dom::EventTarget::EventListenerScriptValue*
XMLHttpRequestEventTarget::onload() const {
  return onload_listener_ ? &onload_listener_.value().referenced_value() : NULL;
}
const dom::EventTarget::EventListenerScriptValue*
XMLHttpRequestEventTarget::onloadend() const {
  return onloadend_listener_ ? &onloadend_listener_.value().referenced_value()
                             : NULL;
}
const dom::EventTarget::EventListenerScriptValue*
XMLHttpRequestEventTarget::onloadstart() const {
  return onloadstart_listener_
             ? &onloadstart_listener_.value().referenced_value()
             : NULL;
}
const dom::EventTarget::EventListenerScriptValue*
XMLHttpRequestEventTarget::onprogress() const {
  return onprogress_listener_ ? &onprogress_listener_.value().referenced_value()
                              : NULL;
}
const dom::EventTarget::EventListenerScriptValue*
XMLHttpRequestEventTarget::ontimeout() const {
  return ontimeout_listener_ ? &ontimeout_listener_.value().referenced_value()
                             : NULL;
}

void XMLHttpRequestEventTarget::set_onabort(
    const EventListenerScriptValue& listener) {
  if (listener.IsNull()) {
    onabort_listener_ = base::nullopt;
  } else {
    onabort_listener_.emplace(this, listener);
  }
  SetAttributeEventListener(base::Tokens::abort(), listener);
}
void XMLHttpRequestEventTarget::set_onerror(
    const EventListenerScriptValue& listener) {
  if (listener.IsNull()) {
    onerror_listener_ = base::nullopt;
  } else {
    onerror_listener_.emplace(this, listener);
  }
  SetAttributeEventListener(base::Tokens::error(), listener);
}
void XMLHttpRequestEventTarget::set_onload(
    const EventListenerScriptValue& listener) {
  if (listener.IsNull()) {
    onload_listener_ = base::nullopt;
  } else {
    onload_listener_.emplace(this, listener);
  }
  SetAttributeEventListener(base::Tokens::load(), listener);
}
void XMLHttpRequestEventTarget::set_onloadend(
    const EventListenerScriptValue& listener) {
  if (listener.IsNull()) {
    onloadend_listener_ = base::nullopt;
  } else {
    onloadend_listener_.emplace(this, listener);
  }
  SetAttributeEventListener(base::Tokens::loadend(), listener);
}
void XMLHttpRequestEventTarget::set_onloadstart(
    const EventListenerScriptValue& listener) {
  if (listener.IsNull()) {
    onloadstart_listener_ = base::nullopt;
  } else {
    onloadstart_listener_.emplace(this, listener);
  }
  SetAttributeEventListener(base::Tokens::loadstart(), listener);
}
void XMLHttpRequestEventTarget::set_onprogress(
    const EventListenerScriptValue& listener) {
  if (listener.IsNull()) {
    onprogress_listener_ = base::nullopt;
  } else {
    onprogress_listener_.emplace(this, listener);
  }
  SetAttributeEventListener(base::Tokens::progress(), listener);
}
void XMLHttpRequestEventTarget::set_ontimeout(
    const EventListenerScriptValue& listener) {
  if (listener.IsNull()) {
    ontimeout_listener_ = base::nullopt;
  } else {
    ontimeout_listener_.emplace(this, listener);
  }
  SetAttributeEventListener(base::Tokens::timeout(), listener);
}

void XMLHttpRequestEventTarget::TraceMembers(script::Tracer* tracer) {
  dom::EventTarget::TraceMembers(tracer);
}

}  // namespace xhr
}  // namespace cobalt
