/* THIS FILE IS AUTOGENERATED FROM HTMLMediaElement.webidl BY Codegen.py - DO NOT EDIT */

#include "DOMMediaStream.h"
#include "EventHandlerBinding.h"
#include "HTMLElementBinding.h"
#include "HTMLMediaElementBinding.h"
#include "WrapperFactory.h"
#include "mozilla/FloatingPoint.h"
#include "mozilla/OwningNonNull.h"
#include "mozilla/Preferences.h"
#include "mozilla/dom/AudioTrackList.h"
#include "mozilla/dom/BindingUtils.h"
#include "mozilla/dom/DOMJSClass.h"
#include "mozilla/dom/HTMLMediaElement.h"
#include "mozilla/dom/MediaError.h"
#include "mozilla/dom/MediaKeys.h"
#include "mozilla/dom/MediaSource.h"
#include "mozilla/dom/NonRefcountedDOMObject.h"
#include "mozilla/dom/Nullable.h"
#include "mozilla/dom/PrimitiveConversions.h"
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/TextTrack.h"
#include "mozilla/dom/TextTrackList.h"
#include "mozilla/dom/TimeRanges.h"
#include "mozilla/dom/VideoTrackList.h"
#include "mozilla/dom/XrayExpandoClass.h"
#include "nsContentUtils.h"

namespace mozilla {
namespace dom {

namespace HTMLMediaElementBinding {

static_assert(IsRefcounted<NativeType>::value == IsRefcounted<HTMLElementBinding::NativeType>::value,
              "Can't inherit from an interface with a different ownership model.");

static bool
get_error(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  auto result(StrongOrRawPtr<mozilla::dom::MediaError>(self->GetError()));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!result) {
    args.rval().setNull();
    return true;
  }
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static const JSJitInfo error_getterinfo = {
  { (JSJitGetterOp)get_error },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_src(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  DOMString result;
  self->GetSrc(result);
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    return false;
  }
  return true;
}

static bool
set_src(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  binding_detail::FakeString arg0;
  if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
    return false;
  }
  binding_detail::FastErrorResult rv;
  self->SetSrc(NonNullHelper(Constify(arg0)), rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo src_getterinfo = {
  { (JSJitGetterOp)get_src },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo src_setterinfo = {
  { (JSJitGetterOp)set_src },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_currentSrc(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  DOMString result;
  self->GetCurrentSrc(result);
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    return false;
  }
  return true;
}

static const JSJitInfo currentSrc_getterinfo = {
  { (JSJitGetterOp)get_currentSrc },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_crossOrigin(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  DOMString result;
  self->GetCrossOrigin(result);
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!xpc::StringToJsval(cx, result, args.rval())) {
    return false;
  }
  return true;
}

static bool
set_crossOrigin(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  binding_detail::FakeString arg0;
  if (!ConvertJSValueToString(cx, args[0], eNull, eNull, arg0)) {
    return false;
  }
  binding_detail::FastErrorResult rv;
  self->SetCrossOrigin(NonNullHelper(Constify(arg0)), rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo crossOrigin_getterinfo = {
  { (JSJitGetterOp)get_crossOrigin },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo crossOrigin_setterinfo = {
  { (JSJitGetterOp)set_crossOrigin },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_networkState(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  uint16_t result(self->NetworkState());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setInt32(int32_t(result));
  return true;
}

static const JSJitInfo networkState_getterinfo = {
  { (JSJitGetterOp)get_networkState },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_INT32,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_preload(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  DOMString result;
  self->GetPreload(result);
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    return false;
  }
  return true;
}

static bool
set_preload(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  binding_detail::FakeString arg0;
  if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
    return false;
  }
  binding_detail::FastErrorResult rv;
  self->SetPreload(NonNullHelper(Constify(arg0)), rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo preload_getterinfo = {
  { (JSJitGetterOp)get_preload },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo preload_setterinfo = {
  { (JSJitGetterOp)set_preload },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_buffered(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  auto result(StrongOrRawPtr<mozilla::dom::TimeRanges>(self->Buffered()));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  static_assert(!IsPointer<decltype(result)>::value,
                "NewObject implies that we need to keep the object alive with a strong reference.");
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static const JSJitInfo buffered_getterinfo = {
  { (JSJitGetterOp)get_buffered },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
load(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  self->Load();
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setUndefined();
  return true;
}

static const JSJitInfo load_methodinfo = {
  { (JSJitGetterOp)load },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Method,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
canPlayType(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  if (MOZ_UNLIKELY(args.length() < 1)) {
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "HTMLMediaElement.canPlayType");
  }
  binding_detail::FakeString arg0;
  if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
    return false;
  }
  DOMString result;
  self->CanPlayType(NonNullHelper(Constify(arg0)), result);
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    return false;
  }
  return true;
}

static const JSJitInfo canPlayType_methodinfo = {
  { (JSJitGetterOp)canPlayType },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Method,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_readyState(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  uint16_t result(self->ReadyState());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setInt32(int32_t(result));
  return true;
}

static const JSJitInfo readyState_getterinfo = {
  { (JSJitGetterOp)get_readyState },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_INT32,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_seeking(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->Seeking());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static const JSJitInfo seeking_getterinfo = {
  { (JSJitGetterOp)get_seeking },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_currentTime(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  double result(self->CurrentTime());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().set(JS_NumberValue(double(result)));
  return true;
}

static bool
set_currentTime(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  double arg0;
  if (!ValueToPrimitive<double, eDefault>(cx, args[0], &arg0)) {
    return false;
  } else if (!mozilla::IsFinite(arg0)) {
    ThrowErrorMessage(cx, MSG_NOT_FINITE, "Value being assigned to HTMLMediaElement.currentTime");
    return false;
  }
  binding_detail::FastErrorResult rv;
  self->SetCurrentTime(arg0, rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo currentTime_getterinfo = {
  { (JSJitGetterOp)get_currentTime },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo currentTime_setterinfo = {
  { (JSJitGetterOp)set_currentTime },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
fastSeek(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  if (MOZ_UNLIKELY(args.length() < 1)) {
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "HTMLMediaElement.fastSeek");
  }
  double arg0;
  if (!ValueToPrimitive<double, eDefault>(cx, args[0], &arg0)) {
    return false;
  } else if (!mozilla::IsFinite(arg0)) {
    ThrowErrorMessage(cx, MSG_NOT_FINITE, "Argument 1 of HTMLMediaElement.fastSeek");
    return false;
  }
  binding_detail::FastErrorResult rv;
  self->FastSeek(arg0, rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setUndefined();
  return true;
}

static const JSJitInfo fastSeek_methodinfo = {
  { (JSJitGetterOp)fastSeek },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Method,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_duration(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  double result(self->Duration());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().set(JS_NumberValue(double(result)));
  return true;
}

static const JSJitInfo duration_getterinfo = {
  { (JSJitGetterOp)get_duration },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_isEncrypted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->IsEncrypted());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static const JSJitInfo isEncrypted_getterinfo = {
  { (JSJitGetterOp)get_isEncrypted },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_paused(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->Paused());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static const JSJitInfo paused_getterinfo = {
  { (JSJitGetterOp)get_paused },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_defaultPlaybackRate(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  double result(self->DefaultPlaybackRate());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().set(JS_NumberValue(double(result)));
  return true;
}

static bool
set_defaultPlaybackRate(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  double arg0;
  if (!ValueToPrimitive<double, eDefault>(cx, args[0], &arg0)) {
    return false;
  } else if (!mozilla::IsFinite(arg0)) {
    ThrowErrorMessage(cx, MSG_NOT_FINITE, "Value being assigned to HTMLMediaElement.defaultPlaybackRate");
    return false;
  }
  binding_detail::FastErrorResult rv;
  self->SetDefaultPlaybackRate(arg0, rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo defaultPlaybackRate_getterinfo = {
  { (JSJitGetterOp)get_defaultPlaybackRate },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo defaultPlaybackRate_setterinfo = {
  { (JSJitGetterOp)set_defaultPlaybackRate },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_playbackRate(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  double result(self->PlaybackRate());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().set(JS_NumberValue(double(result)));
  return true;
}

static bool
set_playbackRate(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  double arg0;
  if (!ValueToPrimitive<double, eDefault>(cx, args[0], &arg0)) {
    return false;
  } else if (!mozilla::IsFinite(arg0)) {
    ThrowErrorMessage(cx, MSG_NOT_FINITE, "Value being assigned to HTMLMediaElement.playbackRate");
    return false;
  }
  binding_detail::FastErrorResult rv;
  self->SetPlaybackRate(arg0, rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo playbackRate_getterinfo = {
  { (JSJitGetterOp)get_playbackRate },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo playbackRate_setterinfo = {
  { (JSJitGetterOp)set_playbackRate },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_played(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  auto result(StrongOrRawPtr<mozilla::dom::TimeRanges>(self->Played()));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  static_assert(!IsPointer<decltype(result)>::value,
                "NewObject implies that we need to keep the object alive with a strong reference.");
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static const JSJitInfo played_getterinfo = {
  { (JSJitGetterOp)get_played },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_seekable(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  auto result(StrongOrRawPtr<mozilla::dom::TimeRanges>(self->Seekable()));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  static_assert(!IsPointer<decltype(result)>::value,
                "NewObject implies that we need to keep the object alive with a strong reference.");
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static const JSJitInfo seekable_getterinfo = {
  { (JSJitGetterOp)get_seekable },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_ended(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->Ended());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static const JSJitInfo ended_getterinfo = {
  { (JSJitGetterOp)get_ended },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_autoplay(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->Autoplay());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static bool
set_autoplay(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  bool arg0;
  if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    return false;
  }
  binding_detail::FastErrorResult rv;
  self->SetAutoplay(arg0, rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo autoplay_getterinfo = {
  { (JSJitGetterOp)get_autoplay },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo autoplay_setterinfo = {
  { (JSJitGetterOp)set_autoplay },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_loop(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->Loop());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static bool
set_loop(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  bool arg0;
  if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    return false;
  }
  binding_detail::FastErrorResult rv;
  self->SetLoop(arg0, rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo loop_getterinfo = {
  { (JSJitGetterOp)get_loop },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo loop_setterinfo = {
  { (JSJitGetterOp)set_loop },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
play(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  binding_detail::FastErrorResult rv;
  self->Play(rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setUndefined();
  return true;
}

static const JSJitInfo play_methodinfo = {
  { (JSJitGetterOp)play },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Method,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
pause(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  binding_detail::FastErrorResult rv;
  self->Pause(rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setUndefined();
  return true;
}

static const JSJitInfo pause_methodinfo = {
  { (JSJitGetterOp)pause },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Method,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_controls(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->Controls());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static bool
set_controls(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  bool arg0;
  if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    return false;
  }
  binding_detail::FastErrorResult rv;
  self->SetControls(arg0, rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo controls_getterinfo = {
  { (JSJitGetterOp)get_controls },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo controls_setterinfo = {
  { (JSJitGetterOp)set_controls },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_volume(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  double result(self->Volume());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().set(JS_NumberValue(double(result)));
  return true;
}

static bool
set_volume(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  double arg0;
  if (!ValueToPrimitive<double, eDefault>(cx, args[0], &arg0)) {
    return false;
  } else if (!mozilla::IsFinite(arg0)) {
    ThrowErrorMessage(cx, MSG_NOT_FINITE, "Value being assigned to HTMLMediaElement.volume");
    return false;
  }
  binding_detail::FastErrorResult rv;
  self->SetVolume(arg0, rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo volume_getterinfo = {
  { (JSJitGetterOp)get_volume },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo volume_setterinfo = {
  { (JSJitGetterOp)set_volume },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_muted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->Muted());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static bool
set_muted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  bool arg0;
  if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    return false;
  }
  self->SetMuted(arg0);
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo muted_getterinfo = {
  { (JSJitGetterOp)get_muted },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo muted_setterinfo = {
  { (JSJitGetterOp)set_muted },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_defaultMuted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->DefaultMuted());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static bool
set_defaultMuted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  bool arg0;
  if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    return false;
  }
  binding_detail::FastErrorResult rv;
  self->SetDefaultMuted(arg0, rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo defaultMuted_getterinfo = {
  { (JSJitGetterOp)get_defaultMuted },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo defaultMuted_setterinfo = {
  { (JSJitGetterOp)set_defaultMuted },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_audioTracks(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  auto result(StrongOrRawPtr<mozilla::dom::AudioTrackList>(self->AudioTracks()));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static const JSJitInfo audioTracks_getterinfo = {
  { (JSJitGetterOp)get_audioTracks },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_videoTracks(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  auto result(StrongOrRawPtr<mozilla::dom::VideoTrackList>(self->VideoTracks()));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static const JSJitInfo videoTracks_getterinfo = {
  { (JSJitGetterOp)get_videoTracks },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_textTracks(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  auto result(StrongOrRawPtr<mozilla::dom::TextTrackList>(self->GetTextTracks()));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!result) {
    args.rval().setNull();
    return true;
  }
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static const JSJitInfo textTracks_getterinfo = {
  { (JSJitGetterOp)get_textTracks },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
addTextTrack(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  if (MOZ_UNLIKELY(args.length() < 1)) {
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "HTMLMediaElement.addTextTrack");
  }
  TextTrackKind arg0;
  {
    int index;
    if (!FindEnumStringIndex<true>(cx, args[0], TextTrackKindValues::strings, "TextTrackKind", "Argument 1 of HTMLMediaElement.addTextTrack", &index)) {
      return false;
    }
    MOZ_ASSERT(index >= 0);
    arg0 = static_cast<TextTrackKind>(index);
  }
  binding_detail::FakeString arg1;
  if (args.hasDefined(1)) {
    if (!ConvertJSValueToString(cx, args[1], eStringify, eStringify, arg1)) {
      return false;
    }
  } else {
    static const char16_t data[] = { 0 };
    arg1.Rebind(data, ArrayLength(data) - 1);
  }
  binding_detail::FakeString arg2;
  if (args.hasDefined(2)) {
    if (!ConvertJSValueToString(cx, args[2], eStringify, eStringify, arg2)) {
      return false;
    }
  } else {
    static const char16_t data[] = { 0 };
    arg2.Rebind(data, ArrayLength(data) - 1);
  }
  auto result(StrongOrRawPtr<mozilla::dom::TextTrack>(self->AddTextTrack(arg0, NonNullHelper(Constify(arg1)), NonNullHelper(Constify(arg2)))));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static const JSJitInfo addTextTrack_methodinfo = {
  { (JSJitGetterOp)addTextTrack },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Method,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_mozMediaSourceObject(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  auto result(StrongOrRawPtr<mozilla::dom::MediaSource>(self->GetMozMediaSourceObject()));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!result) {
    args.rval().setNull();
    return true;
  }
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static const JSJitInfo mozMediaSourceObject_getterinfo = {
  { (JSJitGetterOp)get_mozMediaSourceObject },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_mozDebugReaderData(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  DOMString result;
  self->GetMozDebugReaderData(result);
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    return false;
  }
  return true;
}

static const JSJitInfo mozDebugReaderData_getterinfo = {
  { (JSJitGetterOp)get_mozDebugReaderData },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
mozDumpDebugInfo(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  self->MozDumpDebugInfo();
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setUndefined();
  return true;
}

static const JSJitInfo mozDumpDebugInfo_methodinfo = {
  { (JSJitGetterOp)mozDumpDebugInfo },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Method,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_srcObject(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  auto result(StrongOrRawPtr<mozilla::DOMMediaStream>(self->GetSrcObject()));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!result) {
    args.rval().setNull();
    return true;
  }
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static bool
set_srcObject(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  mozilla::DOMMediaStream* arg0;
  if (args[0].isObject()) {
    {
      nsresult rv = UnwrapObject<prototypes::id::MediaStream, mozilla::DOMMediaStream>(args[0], arg0);
      if (NS_FAILED(rv)) {
        ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Value being assigned to HTMLMediaElement.srcObject", "MediaStream");
        return false;
      }
    }
  } else if (args[0].isNullOrUndefined()) {
    arg0 = nullptr;
  } else {
    ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Value being assigned to HTMLMediaElement.srcObject");
    return false;
  }
  self->SetSrcObject(Constify(arg0));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo srcObject_getterinfo = {
  { (JSJitGetterOp)get_srcObject },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo srcObject_setterinfo = {
  { (JSJitGetterOp)set_srcObject },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_mozSrcObject(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  auto result(StrongOrRawPtr<mozilla::DOMMediaStream>(self->GetMozSrcObject()));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!result) {
    args.rval().setNull();
    return true;
  }
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static bool
set_mozSrcObject(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  mozilla::DOMMediaStream* arg0;
  if (args[0].isObject()) {
    {
      nsresult rv = UnwrapObject<prototypes::id::MediaStream, mozilla::DOMMediaStream>(args[0], arg0);
      if (NS_FAILED(rv)) {
        ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Value being assigned to HTMLMediaElement.mozSrcObject", "MediaStream");
        return false;
      }
    }
  } else if (args[0].isNullOrUndefined()) {
    arg0 = nullptr;
  } else {
    ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Value being assigned to HTMLMediaElement.mozSrcObject");
    return false;
  }
  self->SetMozSrcObject(Constify(arg0));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo mozSrcObject_getterinfo = {
  { (JSJitGetterOp)get_mozSrcObject },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo mozSrcObject_setterinfo = {
  { (JSJitGetterOp)set_mozSrcObject },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_mozPreservesPitch(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->MozPreservesPitch());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static bool
set_mozPreservesPitch(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  bool arg0;
  if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    return false;
  }
  self->SetMozPreservesPitch(arg0);
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo mozPreservesPitch_getterinfo = {
  { (JSJitGetterOp)get_mozPreservesPitch },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo mozPreservesPitch_setterinfo = {
  { (JSJitGetterOp)set_mozPreservesPitch },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_mozAutoplayEnabled(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->MozAutoplayEnabled());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static const JSJitInfo mozAutoplayEnabled_getterinfo = {
  { (JSJitGetterOp)get_mozAutoplayEnabled },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_mozAllowCasting(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->MozAllowCasting());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static bool
set_mozAllowCasting(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  bool arg0;
  if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    return false;
  }
  self->SetMozAllowCasting(arg0);
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo mozAllowCasting_getterinfo = {
  { (JSJitGetterOp)get_mozAllowCasting },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo mozAllowCasting_setterinfo = {
  { (JSJitGetterOp)set_mozAllowCasting },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_mozIsCasting(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->MozIsCasting());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static bool
set_mozIsCasting(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  bool arg0;
  if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    return false;
  }
  self->SetMozIsCasting(arg0);
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo mozIsCasting_getterinfo = {
  { (JSJitGetterOp)get_mozIsCasting },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo mozIsCasting_setterinfo = {
  { (JSJitGetterOp)set_mozIsCasting },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
mozCaptureStream(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  if (!mozilla::dom::EnforceNotInPrerendering(cx, obj)) {
      // Return false from the JSNative in order to trigger
      // an uncatchable exception.
      MOZ_ASSERT(!JS_IsExceptionPending(cx));
      return false;
  }
  binding_detail::FastErrorResult rv;
  auto result(StrongOrRawPtr<mozilla::DOMMediaStream>(self->MozCaptureStream(rv)));
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static const JSJitInfo mozCaptureStream_methodinfo = {
  { (JSJitGetterOp)mozCaptureStream },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Method,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
mozCaptureStreamUntilEnded(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  if (!mozilla::dom::EnforceNotInPrerendering(cx, obj)) {
      // Return false from the JSNative in order to trigger
      // an uncatchable exception.
      MOZ_ASSERT(!JS_IsExceptionPending(cx));
      return false;
  }
  binding_detail::FastErrorResult rv;
  auto result(StrongOrRawPtr<mozilla::DOMMediaStream>(self->MozCaptureStreamUntilEnded(rv)));
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static const JSJitInfo mozCaptureStreamUntilEnded_methodinfo = {
  { (JSJitGetterOp)mozCaptureStreamUntilEnded },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Method,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_mozAudioCaptured(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->MozAudioCaptured());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static const JSJitInfo mozAudioCaptured_getterinfo = {
  { (JSJitGetterOp)get_mozAudioCaptured },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
mozGetMetadata(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  binding_detail::FastErrorResult rv;
  JS::Rooted<JSObject*> result(cx);
  self->MozGetMetadata(cx, &result, rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (result) {
                JS::ExposeObjectToActiveJS(result);
              }
              args.rval().setObjectOrNull(result);
  if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
    return false;
  }
  return true;
}

static const JSJitInfo mozGetMetadata_methodinfo = {
  { (JSJitGetterOp)mozGetMetadata },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Method,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_mozFragmentEnd(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  double result(self->MozFragmentEnd());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().set(JS_NumberValue(double(result)));
  return true;
}

static const JSJitInfo mozFragmentEnd_getterinfo = {
  { (JSJitGetterOp)get_mozFragmentEnd },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_mozAudioChannelType(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  AudioChannel result(self->MozAudioChannelType());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!ToJSValue(cx, result, args.rval())) {
    return false;
  }
  return true;
}

static bool
set_mozAudioChannelType(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  AudioChannel arg0;
  {
    int index;
    if (!FindEnumStringIndex<false>(cx, args[0], AudioChannelValues::strings, "AudioChannel", "Value being assigned to HTMLMediaElement.mozAudioChannelType", &index)) {
      return false;
    }
    if (index < 0) {
      return true;
    }
    arg0 = static_cast<AudioChannel>(index);
  }
  binding_detail::FastErrorResult rv;
  self->SetMozAudioChannelType(arg0, rv);
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo mozAudioChannelType_getterinfo = {
  { (JSJitGetterOp)get_mozAudioChannelType },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo mozAudioChannelType_setterinfo = {
  { (JSJitGetterOp)set_mozAudioChannelType },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_onmozinterruptbegin(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  RefPtr<EventHandlerNonNull> result(self->GetOnmozinterruptbegin());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (result) {
    args.rval().setObject(*GetCallbackFromCallbackObject(result));
    if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
      return false;
    }
    return true;
  } else {
    args.rval().setNull();
    return true;
  }
}

static bool
set_onmozinterruptbegin(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
  if (args[0].isObject()) {
      { // Scope for tempRoot
        JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
        arg0 = new binding_detail::FastEventHandlerNonNull(cx, tempRoot, mozilla::dom::GetIncumbentGlobal());
      }
  } else {
    arg0 = nullptr;
  }
  self->SetOnmozinterruptbegin(Constify(arg0));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo onmozinterruptbegin_getterinfo = {
  { (JSJitGetterOp)get_onmozinterruptbegin },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo onmozinterruptbegin_setterinfo = {
  { (JSJitGetterOp)set_onmozinterruptbegin },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_onmozinterruptend(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  RefPtr<EventHandlerNonNull> result(self->GetOnmozinterruptend());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (result) {
    args.rval().setObject(*GetCallbackFromCallbackObject(result));
    if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
      return false;
    }
    return true;
  } else {
    args.rval().setNull();
    return true;
  }
}

static bool
set_onmozinterruptend(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
  if (args[0].isObject()) {
      { // Scope for tempRoot
        JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
        arg0 = new binding_detail::FastEventHandlerNonNull(cx, tempRoot, mozilla::dom::GetIncumbentGlobal());
      }
  } else {
    arg0 = nullptr;
  }
  self->SetOnmozinterruptend(Constify(arg0));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo onmozinterruptend_getterinfo = {
  { (JSJitGetterOp)get_onmozinterruptend },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo onmozinterruptend_setterinfo = {
  { (JSJitGetterOp)set_onmozinterruptend },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_mediaKeys(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  auto result(StrongOrRawPtr<mozilla::dom::MediaKeys>(self->GetMediaKeys()));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!result) {
    args.rval().setNull();
    return true;
  }
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static const JSJitInfo mediaKeys_getterinfo = {
  { (JSJitGetterOp)get_mediaKeys },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
setMediaKeys(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  if (MOZ_UNLIKELY(args.length() < 1)) {
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "HTMLMediaElement.setMediaKeys");
  }
  mozilla::dom::MediaKeys* arg0;
  if (args[0].isObject()) {
    {
      nsresult rv = UnwrapObject<prototypes::id::MediaKeys, mozilla::dom::MediaKeys>(args[0], arg0);
      if (NS_FAILED(rv)) {
        ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of HTMLMediaElement.setMediaKeys", "MediaKeys");
        return false;
      }
    }
  } else if (args[0].isNullOrUndefined()) {
    arg0 = nullptr;
  } else {
    ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of HTMLMediaElement.setMediaKeys");
    return false;
  }
  binding_detail::FastErrorResult rv;
  auto result(StrongOrRawPtr<mozilla::dom::Promise>(self->SetMediaKeys(Constify(arg0), rv)));
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  static_assert(!IsPointer<decltype(result)>::value,
                "NewObject implies that we need to keep the object alive with a strong reference.");
  if (!WrapNewBindingNonWrapperCachedObject(cx, obj, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static bool
setMediaKeys_promiseWrapper(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  // Make sure to save the callee before someone maybe messes
  // with rval().
  JS::Rooted<JSObject*> callee(cx, &args.callee());
  bool ok = setMediaKeys(cx, obj, self, args);
  if (ok) {
    return true;
  }
  return ConvertExceptionToPromise(cx, xpc::XrayAwareCalleeGlobal(callee),
                                   args.rval());
}

static const JSJitInfo setMediaKeys_methodinfo = {
  { (JSJitGetterOp)setMediaKeys_promiseWrapper },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Method,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_onencrypted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  RefPtr<EventHandlerNonNull> result(self->GetOnencrypted());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (result) {
    args.rval().setObject(*GetCallbackFromCallbackObject(result));
    if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
      return false;
    }
    return true;
  } else {
    args.rval().setNull();
    return true;
  }
}

static bool
set_onencrypted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
  if (args[0].isObject()) {
      { // Scope for tempRoot
        JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
        arg0 = new binding_detail::FastEventHandlerNonNull(cx, tempRoot, mozilla::dom::GetIncumbentGlobal());
      }
  } else {
    arg0 = nullptr;
  }
  self->SetOnencrypted(Constify(arg0));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo onencrypted_getterinfo = {
  { (JSJitGetterOp)get_onencrypted },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo onencrypted_setterinfo = {
  { (JSJitGetterOp)set_onencrypted },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_onwaitingforkey(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  RefPtr<EventHandlerNonNull> result(self->GetOnwaitingforkey());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (result) {
    args.rval().setObject(*GetCallbackFromCallbackObject(result));
    if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
      return false;
    }
    return true;
  } else {
    args.rval().setNull();
    return true;
  }
}

static bool
set_onwaitingforkey(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
{
  RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
  if (args[0].isObject()) {
      { // Scope for tempRoot
        JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
        arg0 = new binding_detail::FastEventHandlerNonNull(cx, tempRoot, mozilla::dom::GetIncumbentGlobal());
      }
  } else {
    arg0 = nullptr;
  }
  self->SetOnwaitingforkey(Constify(arg0));
  MOZ_ASSERT(!JS_IsExceptionPending(cx));

  return true;
}

static const JSJitInfo onwaitingforkey_getterinfo = {
  { (JSJitGetterOp)get_onwaitingforkey },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");
static const JSJitInfo onwaitingforkey_setterinfo = {
  { (JSJitGetterOp)set_onwaitingforkey },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Setter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_computedVolume(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  double result(self->ComputedVolume());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().set(JS_NumberValue(double(result)));
  return true;
}

static const JSJitInfo computedVolume_getterinfo = {
  { (JSJitGetterOp)get_computedVolume },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_computedMuted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  bool result(self->ComputedMuted());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setBoolean(result);
  return true;
}

static const JSJitInfo computedMuted_getterinfo = {
  { (JSJitGetterOp)get_computedMuted },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
get_computedSuspended(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
{
  uint32_t result(self->ComputedSuspended());
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setNumber(result);
  return true;
}

static const JSJitInfo computedSuspended_getterinfo = {
  { (JSJitGetterOp)get_computedSuspended },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Getter,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
  true,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
seekToNextFrame(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  binding_detail::FastErrorResult rv;
  auto result(StrongOrRawPtr<mozilla::dom::Promise>(self->SeekToNextFrame(rv)));
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    return false;
  }
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  if (!WrapNewBindingNonWrapperCachedObject(cx, obj, result, args.rval())) {
    MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    return false;
  }
  return true;
}

static bool
seekToNextFrame_promiseWrapper(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  // Make sure to save the callee before someone maybe messes
  // with rval().
  JS::Rooted<JSObject*> callee(cx, &args.callee());
  bool ok = seekToNextFrame(cx, obj, self, args);
  if (ok) {
    return true;
  }
  return ConvertExceptionToPromise(cx, xpc::XrayAwareCalleeGlobal(callee),
                                   args.rval());
}

static const JSJitInfo seekToNextFrame_methodinfo = {
  { (JSJitGetterOp)seekToNextFrame_promiseWrapper },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Method,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static bool
setVisible(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
{
  if (MOZ_UNLIKELY(args.length() < 1)) {
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "HTMLMediaElement.setVisible");
  }
  bool arg0;
  if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    return false;
  }
  self->SetVisible(arg0);
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
  args.rval().setUndefined();
  return true;
}

static const JSJitInfo setVisible_methodinfo = {
  { (JSJitGetterOp)setVisible },
  { prototypes::id::HTMLMediaElement },
  { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
  JSJitInfo::Method,
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
  false,  /* isInfallible. False in setters. */
  false,  /* isMovable.  Not relevant for setters. */
  false, /* isEliminatable.  Not relevant for setters. */
  false, /* isAlwaysInSlot.  Only relevant for getters. */
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
  false,  /* isTypedMethod.  Only relevant for methods. */
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
};
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
static_assert(0 < 1, "There is no slot for us");

static const JSFunctionSpec sMethods_specs[] = {
  JS_FNSPEC("load", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&load_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
  JS_FNSPEC("canPlayType", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&canPlayType_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
  JS_FNSPEC("fastSeek", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&fastSeek_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
  JS_FNSPEC("play", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&play_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
  JS_FNSPEC("pause", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&pause_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
  JS_FNSPEC("addTextTrack", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&addTextTrack_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
  JS_FS_END,
  JS_FNSPEC("mozDumpDebugInfo", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&mozDumpDebugInfo_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
  JS_FS_END,
  JS_FNSPEC("mozCaptureStream", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&mozCaptureStream_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
  JS_FNSPEC("mozCaptureStreamUntilEnded", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&mozCaptureStreamUntilEnded_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
  JS_FNSPEC("mozGetMetadata", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&mozGetMetadata_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
  JS_FS_END,
  JS_FNSPEC("setMediaKeys", GenericPromiseReturningBindingMethod, reinterpret_cast<const JSJitInfo*>(&setMediaKeys_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
  JS_FS_END,
  JS_FNSPEC("seekToNextFrame", GenericPromiseReturningBindingMethod, reinterpret_cast<const JSJitInfo*>(&seekToNextFrame_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
  JS_FS_END,
  JS_FNSPEC("setVisible", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&setVisible_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
  JS_FS_END
};

static PrefableDisablers sMethods_disablers7 = {
  true, false, 0, nullptr
};

static PrefableDisablers sMethods_disablers13 = {
  true, false, 0, nullptr
};

static PrefableDisablers sMethods_disablers15 = {
  true, false, 0, nullptr
};

static PrefableDisablers sMethods_disablers17 = {
  true, false, 0, nullptr
};

// Can't be const because the pref-enabled boolean needs to be writable
static Prefable<const JSFunctionSpec> sMethods[] = {
  { nullptr, &sMethods_specs[0] },
  { &sMethods_disablers7, &sMethods_specs[7] },
  { nullptr, &sMethods_specs[9] },
  { &sMethods_disablers13, &sMethods_specs[13] },
  { &sMethods_disablers15, &sMethods_specs[15] },
  { &sMethods_disablers17, &sMethods_specs[17] },
  { nullptr, nullptr }
};

static jsid sMethods_ids[19];

static const JSPropertySpec sAttributes_specs[] = {
  { "error", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &error_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "src", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &src_getterinfo } }, { { GenericBindingSetter, &src_setterinfo } } } } },
  { "currentSrc", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &currentSrc_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "crossOrigin", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &crossOrigin_getterinfo } }, { { GenericBindingSetter, &crossOrigin_setterinfo } } } } },
  { "networkState", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &networkState_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "preload", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &preload_getterinfo } }, { { GenericBindingSetter, &preload_setterinfo } } } } },
  { "buffered", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &buffered_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "readyState", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &readyState_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "seeking", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &seeking_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "currentTime", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &currentTime_getterinfo } }, { { GenericBindingSetter, &currentTime_setterinfo } } } } },
  { "duration", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &duration_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "paused", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &paused_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "defaultPlaybackRate", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &defaultPlaybackRate_getterinfo } }, { { GenericBindingSetter, &defaultPlaybackRate_setterinfo } } } } },
  { "playbackRate", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &playbackRate_getterinfo } }, { { GenericBindingSetter, &playbackRate_setterinfo } } } } },
  { "played", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &played_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "seekable", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &seekable_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "ended", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &ended_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "autoplay", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &autoplay_getterinfo } }, { { GenericBindingSetter, &autoplay_setterinfo } } } } },
  { "loop", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &loop_getterinfo } }, { { GenericBindingSetter, &loop_setterinfo } } } } },
  { "controls", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &controls_getterinfo } }, { { GenericBindingSetter, &controls_setterinfo } } } } },
  { "volume", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &volume_getterinfo } }, { { GenericBindingSetter, &volume_setterinfo } } } } },
  { "muted", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &muted_getterinfo } }, { { GenericBindingSetter, &muted_setterinfo } } } } },
  { "defaultMuted", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &defaultMuted_getterinfo } }, { { GenericBindingSetter, &defaultMuted_setterinfo } } } } },
  JS_PS_END,
  { "audioTracks", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &audioTracks_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "videoTracks", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &videoTracks_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  JS_PS_END,
  { "textTracks", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &textTracks_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "srcObject", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &srcObject_getterinfo } }, { { GenericBindingSetter, &srcObject_setterinfo } } } } },
  { "mozSrcObject", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &mozSrcObject_getterinfo } }, { { GenericBindingSetter, &mozSrcObject_setterinfo } } } } },
  { "mozPreservesPitch", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &mozPreservesPitch_getterinfo } }, { { GenericBindingSetter, &mozPreservesPitch_setterinfo } } } } },
  { "mozAutoplayEnabled", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &mozAutoplayEnabled_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  JS_PS_END,
  { "mozAllowCasting", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &mozAllowCasting_getterinfo } }, { { GenericBindingSetter, &mozAllowCasting_setterinfo } } } } },
  { "mozIsCasting", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &mozIsCasting_getterinfo } }, { { GenericBindingSetter, &mozIsCasting_setterinfo } } } } },
  JS_PS_END,
  { "mozAudioCaptured", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &mozAudioCaptured_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "mozFragmentEnd", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &mozFragmentEnd_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  JS_PS_END,
  { "mozAudioChannelType", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &mozAudioChannelType_getterinfo } }, { { GenericBindingSetter, &mozAudioChannelType_setterinfo } } } } },
  { "onmozinterruptbegin", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &onmozinterruptbegin_getterinfo } }, { { GenericBindingSetter, &onmozinterruptbegin_setterinfo } } } } },
  { "onmozinterruptend", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &onmozinterruptend_getterinfo } }, { { GenericBindingSetter, &onmozinterruptend_setterinfo } } } } },
  JS_PS_END,
  { "mediaKeys", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &mediaKeys_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "onencrypted", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &onencrypted_getterinfo } }, { { GenericBindingSetter, &onencrypted_setterinfo } } } } },
  { "onwaitingforkey", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &onwaitingforkey_getterinfo } }, { { GenericBindingSetter, &onwaitingforkey_setterinfo } } } } },
  JS_PS_END,
  { "computedVolume", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &computedVolume_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "computedMuted", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &computedMuted_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "computedSuspended", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &computedSuspended_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  JS_PS_END
};

static PrefableDisablers sAttributes_disablers24 = {
  true, false, 0, nullptr
};

static PrefableDisablers sAttributes_disablers33 = {
  true, false, 0, &IsChromeOrXBL
};

static PrefableDisablers sAttributes_disablers39 = {
  true, false, 0, nullptr
};

static PrefableDisablers sAttributes_disablers43 = {
  true, false, 0, nullptr
};

static PrefableDisablers sAttributes_disablers47 = {
  true, false, 0, nullptr
};

// Can't be const because the pref-enabled boolean needs to be writable
static Prefable<const JSPropertySpec> sAttributes[] = {
  { nullptr, &sAttributes_specs[0] },
  { &sAttributes_disablers24, &sAttributes_specs[24] },
  { nullptr, &sAttributes_specs[27] },
  { &sAttributes_disablers33, &sAttributes_specs[33] },
  { nullptr, &sAttributes_specs[36] },
  { &sAttributes_disablers39, &sAttributes_specs[39] },
  { &sAttributes_disablers43, &sAttributes_specs[43] },
  { &sAttributes_disablers47, &sAttributes_specs[47] },
  { nullptr, nullptr }
};

static jsid sAttributes_ids[51];

static const JSPropertySpec sChromeAttributes_specs[] = {
  { "isEncrypted", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &isEncrypted_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "mozMediaSourceObject", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &mozMediaSourceObject_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  { "mozDebugReaderData", JSPROP_SHARED | JSPROP_ENUMERATE, { { { { GenericBindingGetter, &mozDebugReaderData_getterinfo } }, JSNATIVE_WRAPPER(nullptr) } } },
  JS_PS_END
};


// Can't be const because the pref-enabled boolean needs to be writable
static Prefable<const JSPropertySpec> sChromeAttributes[] = {
  { nullptr, &sChromeAttributes_specs[0] },
  { nullptr, nullptr }
};

static jsid sChromeAttributes_ids[4];

static const ConstantSpec sConstants_specs[] = {
  { "NETWORK_EMPTY", JS::Int32Value(0) },
  { "NETWORK_IDLE", JS::Int32Value(1) },
  { "NETWORK_LOADING", JS::Int32Value(2) },
  { "NETWORK_NO_SOURCE", JS::Int32Value(3) },
  { "HAVE_NOTHING", JS::Int32Value(0) },
  { "HAVE_METADATA", JS::Int32Value(1) },
  { "HAVE_CURRENT_DATA", JS::Int32Value(2) },
  { "HAVE_FUTURE_DATA", JS::Int32Value(3) },
  { "HAVE_ENOUGH_DATA", JS::Int32Value(4) },
  { 0, JS::UndefinedValue() }
};


// Can't be const because the pref-enabled boolean needs to be writable
static Prefable<const ConstantSpec> sConstants[] = {
  { nullptr, &sConstants_specs[0] },
  { nullptr, nullptr }
};

static jsid sConstants_ids[10];


static const NativePropertiesN<3> sNativeProperties = {
  -1,
  false, 0,
  false, 0,
  true,  0 /* sMethods */,
  true,  1 /* sAttributes */,
  false, 0,
  false, 0,
  true,  2 /* sConstants */,
  {
    { sMethods, sMethods_ids, sMethods_specs },
    { sAttributes, sAttributes_ids, sAttributes_specs },
    { sConstants, sConstants_ids, sConstants_specs }
  }
};

static const NativePropertiesN<1> sChromeOnlyNativeProperties = {
  -1,
  false, 0,
  false, 0,
  false, 0,
  true,  0 /* sChromeAttributes */,
  false, 0,
  false, 0,
  false, 0,
  {
    { sChromeAttributes, sChromeAttributes_ids, sChromeAttributes_specs }
  }
};

static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
  {
    "Function",
    JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
    &sBoringInterfaceObjectClassClassOps,
    JS_NULL_CLASS_SPEC,
    JS_NULL_CLASS_EXT,
    &sInterfaceObjectClassObjectOps
  },
  eInterface,
  true,
  prototypes::id::HTMLMediaElement,
  PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth,
  sNativePropertyHooks,
  "function HTMLMediaElement() {\n    [native code]\n}",
  HTMLElementBinding::GetConstructorObject
};

static const DOMIfaceAndProtoJSClass sPrototypeClass = {
  {
    "HTMLMediaElementPrototype",
    JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
    JS_NULL_CLASS_OPS,
    JS_NULL_CLASS_SPEC,
    JS_NULL_CLASS_EXT,
    JS_NULL_OBJECT_OPS
  },
  eInterfacePrototype,
  false,
  prototypes::id::HTMLMediaElement,
  PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth,
  sNativePropertyHooks,
  "[object HTMLMediaElementPrototype]",
  HTMLElementBinding::GetProtoObject
};

JSObject*
DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
{
  return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
}

const NativePropertyHooks sNativePropertyHooks[] = { {
  nullptr,
  nullptr,
  nullptr,
  { sNativeProperties.Upcast(), sChromeOnlyNativeProperties.Upcast() },
  prototypes::id::HTMLMediaElement,
  constructors::id::HTMLMediaElement,
  HTMLElementBinding::sNativePropertyHooks,
  &DefaultXrayExpandoObjectClass
} };

void
CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
{
  JS::Handle<JSObject*> parentProto(HTMLElementBinding::GetProtoObjectHandle(aCx));
  if (!parentProto) {
    return;
  }

  JS::Handle<JSObject*> constructorProto(HTMLElementBinding::GetConstructorObjectHandle(aCx));
  if (!constructorProto) {
    return;
  }

  static bool sIdsInited = false;
  if (!sIdsInited && NS_IsMainThread()) {
    if (!InitIds(aCx, sMethods, sMethods_ids)) {
      return;
    }
    if (!InitIds(aCx, sChromeAttributes, sChromeAttributes_ids)) {
      return;
    }
    if (!InitIds(aCx, sAttributes, sAttributes_ids)) {
      return;
    }
    if (!InitIds(aCx, sConstants, sConstants_ids)) {
      return;
    }
    sIdsInited = true;
  }

  static bool sPrefCachesInited = false;
  if (!sPrefCachesInited && NS_IsMainThread()) {
    sPrefCachesInited = true;
    Preferences::AddBoolVarCache(&sMethods[1].disablers->enabled, "media.test.dumpDebugInfo");
    Preferences::AddBoolVarCache(&sMethods[3].disablers->enabled, "media.eme.apiVisible");
    Preferences::AddBoolVarCache(&sMethods[4].disablers->enabled, "media.seekToNextFrame.enabled");
    Preferences::AddBoolVarCache(&sMethods[5].disablers->enabled, "media.test.setVisible");
    Preferences::AddBoolVarCache(&sAttributes[1].disablers->enabled, "media.track.enabled");
    Preferences::AddBoolVarCache(&sAttributes[5].disablers->enabled, "media.useAudioChannelAPI");
    Preferences::AddBoolVarCache(&sAttributes[6].disablers->enabled, "media.eme.apiVisible");
    Preferences::AddBoolVarCache(&sAttributes[7].disablers->enabled, "media.useAudioChannelService.testing");
  }

  JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::HTMLMediaElement);
  JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::HTMLMediaElement);
  dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
                              &sPrototypeClass.mBase, protoCache,
                              constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
                              interfaceCache,
                              sNativeProperties.Upcast(),
                              nsContentUtils::ThreadsafeIsCallerChrome() ? sChromeOnlyNativeProperties.Upcast() : nullptr,
                              "HTMLMediaElement", aDefineOnGlobal,
                              nullptr,
                              false);
}

JS::Handle<JSObject*>
GetProtoObjectHandle(JSContext* aCx)
{
  /* Get the interface prototype object for this class.  This will create the
     object as needed. */
  bool aDefineOnGlobal = true;

  /* Make sure our global is sane.  Hopefully we can remove this sometime */
  JSObject* global = JS::CurrentGlobalOrNull(aCx);
  if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    return nullptr;
  }

  /* Check to see whether the interface objects are already installed */
  ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
  if (!protoAndIfaceCache.EntrySlotIfExists(prototypes::id::HTMLMediaElement)) {
    JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
  }

  /*
   * The object might _still_ be null, but that's OK.
   *
   * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
   * traced by TraceProtoAndIfaceCache() and its contents are never
   * changed after they have been set.
   *
   * Calling address() avoids the read read barrier that does gray
   * unmarking, but it's not possible for the object to be gray here.
   */

  const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(prototypes::id::HTMLMediaElement);
  MOZ_ASSERT_IF(entrySlot, !JS::ObjectIsMarkedGray(entrySlot));
  return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
}

JSObject*
GetProtoObject(JSContext* aCx)
{
  return GetProtoObjectHandle(aCx);
}

JS::Handle<JSObject*>
GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
{
  /* Get the interface object for this class.  This will create the object as
     needed. */

  /* Make sure our global is sane.  Hopefully we can remove this sometime */
  JSObject* global = JS::CurrentGlobalOrNull(aCx);
  if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    return nullptr;
  }

  /* Check to see whether the interface objects are already installed */
  ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
  if (!protoAndIfaceCache.EntrySlotIfExists(constructors::id::HTMLMediaElement)) {
    JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
  }

  /*
   * The object might _still_ be null, but that's OK.
   *
   * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
   * traced by TraceProtoAndIfaceCache() and its contents are never
   * changed after they have been set.
   *
   * Calling address() avoids the read read barrier that does gray
   * unmarking, but it's not possible for the object to be gray here.
   */

  const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::HTMLMediaElement);
  MOZ_ASSERT_IF(entrySlot, !JS::ObjectIsMarkedGray(entrySlot));
  return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
}

JSObject*
GetConstructorObject(JSContext* aCx)
{
  return GetConstructorObjectHandle(aCx);
}

} // namespace HTMLMediaElementBinding



} // namespace dom
} // namespace mozilla
