LCOV - code coverage report
Current view: top level - obj-x86_64-pc-linux-gnu/dom/bindings - HTMLMediaElementBinding.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 0 740 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 88 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* THIS FILE IS AUTOGENERATED FROM HTMLMediaElement.webidl BY Codegen.py - DO NOT EDIT */
       2             : 
       3             : #include "DOMMediaStream.h"
       4             : #include "EventHandlerBinding.h"
       5             : #include "HTMLElementBinding.h"
       6             : #include "HTMLMediaElementBinding.h"
       7             : #include "WrapperFactory.h"
       8             : #include "mozilla/FloatingPoint.h"
       9             : #include "mozilla/OwningNonNull.h"
      10             : #include "mozilla/Preferences.h"
      11             : #include "mozilla/dom/AudioTrackList.h"
      12             : #include "mozilla/dom/BindingUtils.h"
      13             : #include "mozilla/dom/CustomElementRegistry.h"
      14             : #include "mozilla/dom/DOMJSClass.h"
      15             : #include "mozilla/dom/HTMLMediaElement.h"
      16             : #include "mozilla/dom/MediaError.h"
      17             : #include "mozilla/dom/MediaKeys.h"
      18             : #include "mozilla/dom/MediaSource.h"
      19             : #include "mozilla/dom/NonRefcountedDOMObject.h"
      20             : #include "mozilla/dom/Nullable.h"
      21             : #include "mozilla/dom/PrimitiveConversions.h"
      22             : #include "mozilla/dom/Promise.h"
      23             : #include "mozilla/dom/TextTrack.h"
      24             : #include "mozilla/dom/TextTrackList.h"
      25             : #include "mozilla/dom/TimeRanges.h"
      26             : #include "mozilla/dom/ToJSValue.h"
      27             : #include "mozilla/dom/VideoTrackList.h"
      28             : #include "mozilla/dom/XrayExpandoClass.h"
      29             : #include "nsContentUtils.h"
      30             : 
      31             : namespace mozilla {
      32             : namespace dom {
      33             : 
      34             : namespace HTMLMediaElementBinding {
      35             : 
      36             : static_assert(IsRefcounted<NativeType>::value == IsRefcounted<HTMLElementBinding::NativeType>::value,
      37             :               "Can't inherit from an interface with a different ownership model.");
      38             : 
      39             : static bool
      40           0 : get_error(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
      41             : {
      42           0 :   auto result(StrongOrRawPtr<mozilla::dom::MediaError>(self->GetError()));
      43           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
      44           0 :   if (!result) {
      45           0 :     args.rval().setNull();
      46           0 :     return true;
      47             :   }
      48           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
      49           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
      50           0 :     return false;
      51             :   }
      52           0 :   return true;
      53             : }
      54             : 
      55             : static const JSJitInfo error_getterinfo = {
      56             :   { (JSJitGetterOp)get_error },
      57             :   { prototypes::id::HTMLMediaElement },
      58             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
      59             :   JSJitInfo::Getter,
      60             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
      61             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
      62             :   false,  /* isInfallible. False in setters. */
      63             :   false,  /* isMovable.  Not relevant for setters. */
      64             :   false, /* isEliminatable.  Not relevant for setters. */
      65             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
      66             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
      67             :   false,  /* isTypedMethod.  Only relevant for methods. */
      68             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
      69             : };
      70             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
      71             : static_assert(0 < 1, "There is no slot for us");
      72             : 
      73             : static bool
      74           0 : get_src(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
      75             : {
      76           0 :   DOMString result;
      77           0 :   self->GetSrc(result);
      78           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
      79           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
      80           0 :     return false;
      81             :   }
      82           0 :   return true;
      83             : }
      84             : 
      85             : static bool
      86           0 : set_src(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
      87             : {
      88           0 :   binding_detail::FakeString arg0;
      89           0 :   if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
      90           0 :     return false;
      91             :   }
      92           0 :   CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
      93           0 :   Maybe<AutoCEReaction> ceReaction;
      94           0 :   if (reactionsStack) {
      95           0 :     ceReaction.emplace(reactionsStack);
      96             :   }
      97           0 :   binding_detail::FastErrorResult rv;
      98           0 :   self->SetSrc(NonNullHelper(Constify(arg0)), rv);
      99           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     100           0 :     return false;
     101             :   }
     102           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     103             : 
     104           0 :   return true;
     105             : }
     106             : 
     107             : static const JSJitInfo src_getterinfo = {
     108             :   { (JSJitGetterOp)get_src },
     109             :   { prototypes::id::HTMLMediaElement },
     110             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     111             :   JSJitInfo::Getter,
     112             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     113             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
     114             :   false,  /* isInfallible. False in setters. */
     115             :   false,  /* isMovable.  Not relevant for setters. */
     116             :   false, /* isEliminatable.  Not relevant for setters. */
     117             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     118             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     119             :   false,  /* isTypedMethod.  Only relevant for methods. */
     120             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     121             : };
     122             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     123             : static_assert(0 < 1, "There is no slot for us");
     124             : static const JSJitInfo src_setterinfo = {
     125             :   { (JSJitGetterOp)set_src },
     126             :   { prototypes::id::HTMLMediaElement },
     127             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     128             :   JSJitInfo::Setter,
     129             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     130             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     131             :   false,  /* isInfallible. False in setters. */
     132             :   false,  /* isMovable.  Not relevant for setters. */
     133             :   false, /* isEliminatable.  Not relevant for setters. */
     134             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     135             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     136             :   false,  /* isTypedMethod.  Only relevant for methods. */
     137             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     138             : };
     139             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     140             : static_assert(0 < 1, "There is no slot for us");
     141             : 
     142             : static bool
     143           0 : get_currentSrc(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     144             : {
     145           0 :   DOMString result;
     146           0 :   self->GetCurrentSrc(result);
     147           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     148           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
     149           0 :     return false;
     150             :   }
     151           0 :   return true;
     152             : }
     153             : 
     154             : static const JSJitInfo currentSrc_getterinfo = {
     155             :   { (JSJitGetterOp)get_currentSrc },
     156             :   { prototypes::id::HTMLMediaElement },
     157             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     158             :   JSJitInfo::Getter,
     159             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     160             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
     161             :   false,  /* isInfallible. False in setters. */
     162             :   false,  /* isMovable.  Not relevant for setters. */
     163             :   false, /* isEliminatable.  Not relevant for setters. */
     164             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     165             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     166             :   false,  /* isTypedMethod.  Only relevant for methods. */
     167             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     168             : };
     169             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     170             : static_assert(0 < 1, "There is no slot for us");
     171             : 
     172             : static bool
     173           0 : get_crossOrigin(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     174             : {
     175           0 :   DOMString result;
     176           0 :   self->GetCrossOrigin(result);
     177           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     178           0 :   if (!xpc::StringToJsval(cx, result, args.rval())) {
     179           0 :     return false;
     180             :   }
     181           0 :   return true;
     182             : }
     183             : 
     184             : static bool
     185           0 : set_crossOrigin(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
     186             : {
     187           0 :   binding_detail::FakeString arg0;
     188           0 :   if (!ConvertJSValueToString(cx, args[0], eNull, eNull, arg0)) {
     189           0 :     return false;
     190             :   }
     191           0 :   CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
     192           0 :   Maybe<AutoCEReaction> ceReaction;
     193           0 :   if (reactionsStack) {
     194           0 :     ceReaction.emplace(reactionsStack);
     195             :   }
     196           0 :   binding_detail::FastErrorResult rv;
     197           0 :   self->SetCrossOrigin(NonNullHelper(Constify(arg0)), rv);
     198           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     199           0 :     return false;
     200             :   }
     201           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     202             : 
     203           0 :   return true;
     204             : }
     205             : 
     206             : static const JSJitInfo crossOrigin_getterinfo = {
     207             :   { (JSJitGetterOp)get_crossOrigin },
     208             :   { prototypes::id::HTMLMediaElement },
     209             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     210             :   JSJitInfo::Getter,
     211             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     212             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     213             :   false,  /* isInfallible. False in setters. */
     214             :   false,  /* isMovable.  Not relevant for setters. */
     215             :   false, /* isEliminatable.  Not relevant for setters. */
     216             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     217             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     218             :   false,  /* isTypedMethod.  Only relevant for methods. */
     219             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     220             : };
     221             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     222             : static_assert(0 < 1, "There is no slot for us");
     223             : static const JSJitInfo crossOrigin_setterinfo = {
     224             :   { (JSJitGetterOp)set_crossOrigin },
     225             :   { prototypes::id::HTMLMediaElement },
     226             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     227             :   JSJitInfo::Setter,
     228             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     229             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     230             :   false,  /* isInfallible. False in setters. */
     231             :   false,  /* isMovable.  Not relevant for setters. */
     232             :   false, /* isEliminatable.  Not relevant for setters. */
     233             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     234             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     235             :   false,  /* isTypedMethod.  Only relevant for methods. */
     236             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     237             : };
     238             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     239             : static_assert(0 < 1, "There is no slot for us");
     240             : 
     241             : static bool
     242           0 : get_networkState(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     243             : {
     244           0 :   uint16_t result(self->NetworkState());
     245           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     246           0 :   args.rval().setInt32(int32_t(result));
     247           0 :   return true;
     248             : }
     249             : 
     250             : static const JSJitInfo networkState_getterinfo = {
     251             :   { (JSJitGetterOp)get_networkState },
     252             :   { prototypes::id::HTMLMediaElement },
     253             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     254             :   JSJitInfo::Getter,
     255             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     256             :   JSVAL_TYPE_INT32,  /* returnType.  Not relevant for setters. */
     257             :   true,  /* isInfallible. False in setters. */
     258             :   false,  /* isMovable.  Not relevant for setters. */
     259             :   false, /* isEliminatable.  Not relevant for setters. */
     260             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     261             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     262             :   false,  /* isTypedMethod.  Only relevant for methods. */
     263             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     264             : };
     265             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     266             : static_assert(0 < 1, "There is no slot for us");
     267             : 
     268             : static bool
     269           0 : get_preload(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     270             : {
     271           0 :   DOMString result;
     272           0 :   self->GetPreload(result);
     273           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     274           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
     275           0 :     return false;
     276             :   }
     277           0 :   return true;
     278             : }
     279             : 
     280             : static bool
     281           0 : set_preload(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
     282             : {
     283           0 :   binding_detail::FakeString arg0;
     284           0 :   if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
     285           0 :     return false;
     286             :   }
     287           0 :   CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
     288           0 :   Maybe<AutoCEReaction> ceReaction;
     289           0 :   if (reactionsStack) {
     290           0 :     ceReaction.emplace(reactionsStack);
     291             :   }
     292           0 :   binding_detail::FastErrorResult rv;
     293           0 :   self->SetPreload(NonNullHelper(Constify(arg0)), rv);
     294           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     295           0 :     return false;
     296             :   }
     297           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     298             : 
     299           0 :   return true;
     300             : }
     301             : 
     302             : static const JSJitInfo preload_getterinfo = {
     303             :   { (JSJitGetterOp)get_preload },
     304             :   { prototypes::id::HTMLMediaElement },
     305             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     306             :   JSJitInfo::Getter,
     307             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     308             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
     309             :   false,  /* isInfallible. False in setters. */
     310             :   false,  /* isMovable.  Not relevant for setters. */
     311             :   false, /* isEliminatable.  Not relevant for setters. */
     312             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     313             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     314             :   false,  /* isTypedMethod.  Only relevant for methods. */
     315             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     316             : };
     317             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     318             : static_assert(0 < 1, "There is no slot for us");
     319             : static const JSJitInfo preload_setterinfo = {
     320             :   { (JSJitGetterOp)set_preload },
     321             :   { prototypes::id::HTMLMediaElement },
     322             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     323             :   JSJitInfo::Setter,
     324             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     325             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     326             :   false,  /* isInfallible. False in setters. */
     327             :   false,  /* isMovable.  Not relevant for setters. */
     328             :   false, /* isEliminatable.  Not relevant for setters. */
     329             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     330             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     331             :   false,  /* isTypedMethod.  Only relevant for methods. */
     332             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     333             : };
     334             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     335             : static_assert(0 < 1, "There is no slot for us");
     336             : 
     337             : static bool
     338           0 : get_buffered(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     339             : {
     340           0 :   auto result(StrongOrRawPtr<mozilla::dom::TimeRanges>(self->Buffered()));
     341           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     342             :   static_assert(!IsPointer<decltype(result)>::value,
     343             :                 "NewObject implies that we need to keep the object alive with a strong reference.");
     344           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
     345           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
     346           0 :     return false;
     347             :   }
     348           0 :   return true;
     349             : }
     350             : 
     351             : static const JSJitInfo buffered_getterinfo = {
     352             :   { (JSJitGetterOp)get_buffered },
     353             :   { prototypes::id::HTMLMediaElement },
     354             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     355             :   JSJitInfo::Getter,
     356             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     357             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
     358             :   false,  /* isInfallible. False in setters. */
     359             :   false,  /* isMovable.  Not relevant for setters. */
     360             :   false, /* isEliminatable.  Not relevant for setters. */
     361             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     362             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     363             :   false,  /* isTypedMethod.  Only relevant for methods. */
     364             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     365             : };
     366             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     367             : static_assert(0 < 1, "There is no slot for us");
     368             : 
     369             : static bool
     370           0 : load(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
     371             : {
     372           0 :   self->Load();
     373           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     374           0 :   args.rval().setUndefined();
     375           0 :   return true;
     376             : }
     377             : 
     378             : static const JSJitInfo load_methodinfo = {
     379             :   { (JSJitGetterOp)load },
     380             :   { prototypes::id::HTMLMediaElement },
     381             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     382             :   JSJitInfo::Method,
     383             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     384             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     385             :   true,  /* isInfallible. False in setters. */
     386             :   false,  /* isMovable.  Not relevant for setters. */
     387             :   false, /* isEliminatable.  Not relevant for setters. */
     388             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     389             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     390             :   false,  /* isTypedMethod.  Only relevant for methods. */
     391             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     392             : };
     393             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     394             : static_assert(0 < 1, "There is no slot for us");
     395             : 
     396             : static bool
     397           0 : canPlayType(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
     398             : {
     399           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
     400           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "HTMLMediaElement.canPlayType");
     401             :   }
     402           0 :   binding_detail::FakeString arg0;
     403           0 :   if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
     404           0 :     return false;
     405             :   }
     406           0 :   DOMString result;
     407           0 :   self->CanPlayType(NonNullHelper(Constify(arg0)), result);
     408           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     409           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
     410           0 :     return false;
     411             :   }
     412           0 :   return true;
     413             : }
     414             : 
     415             : static const JSJitInfo canPlayType_methodinfo = {
     416             :   { (JSJitGetterOp)canPlayType },
     417             :   { prototypes::id::HTMLMediaElement },
     418             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     419             :   JSJitInfo::Method,
     420             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     421             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
     422             :   false,  /* isInfallible. False in setters. */
     423             :   false,  /* isMovable.  Not relevant for setters. */
     424             :   false, /* isEliminatable.  Not relevant for setters. */
     425             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     426             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     427             :   false,  /* isTypedMethod.  Only relevant for methods. */
     428             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     429             : };
     430             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     431             : static_assert(0 < 1, "There is no slot for us");
     432             : 
     433             : static bool
     434           0 : get_readyState(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     435             : {
     436           0 :   uint16_t result(self->ReadyState());
     437           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     438           0 :   args.rval().setInt32(int32_t(result));
     439           0 :   return true;
     440             : }
     441             : 
     442             : static const JSJitInfo readyState_getterinfo = {
     443             :   { (JSJitGetterOp)get_readyState },
     444             :   { prototypes::id::HTMLMediaElement },
     445             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     446             :   JSJitInfo::Getter,
     447             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     448             :   JSVAL_TYPE_INT32,  /* returnType.  Not relevant for setters. */
     449             :   true,  /* isInfallible. False in setters. */
     450             :   false,  /* isMovable.  Not relevant for setters. */
     451             :   false, /* isEliminatable.  Not relevant for setters. */
     452             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     453             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     454             :   false,  /* isTypedMethod.  Only relevant for methods. */
     455             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     456             : };
     457             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     458             : static_assert(0 < 1, "There is no slot for us");
     459             : 
     460             : static bool
     461           0 : get_seeking(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     462             : {
     463           0 :   bool result(self->Seeking());
     464           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     465           0 :   args.rval().setBoolean(result);
     466           0 :   return true;
     467             : }
     468             : 
     469             : static const JSJitInfo seeking_getterinfo = {
     470             :   { (JSJitGetterOp)get_seeking },
     471             :   { prototypes::id::HTMLMediaElement },
     472             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     473             :   JSJitInfo::Getter,
     474             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     475             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
     476             :   true,  /* isInfallible. False in setters. */
     477             :   false,  /* isMovable.  Not relevant for setters. */
     478             :   false, /* isEliminatable.  Not relevant for setters. */
     479             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     480             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     481             :   false,  /* isTypedMethod.  Only relevant for methods. */
     482             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     483             : };
     484             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     485             : static_assert(0 < 1, "There is no slot for us");
     486             : 
     487             : static bool
     488           0 : get_currentTime(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     489             : {
     490           0 :   double result(self->CurrentTime());
     491           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     492           0 :   args.rval().set(JS_NumberValue(double(result)));
     493           0 :   return true;
     494             : }
     495             : 
     496             : static bool
     497           0 : set_currentTime(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
     498             : {
     499             :   double arg0;
     500           0 :   if (!ValueToPrimitive<double, eDefault>(cx, args[0], &arg0)) {
     501           0 :     return false;
     502           0 :   } else if (!mozilla::IsFinite(arg0)) {
     503           0 :     ThrowErrorMessage(cx, MSG_NOT_FINITE, "Value being assigned to HTMLMediaElement.currentTime");
     504           0 :     return false;
     505             :   }
     506           0 :   binding_detail::FastErrorResult rv;
     507           0 :   self->SetCurrentTime(arg0, rv);
     508           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     509           0 :     return false;
     510             :   }
     511           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     512             : 
     513           0 :   return true;
     514             : }
     515             : 
     516             : static const JSJitInfo currentTime_getterinfo = {
     517             :   { (JSJitGetterOp)get_currentTime },
     518             :   { prototypes::id::HTMLMediaElement },
     519             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     520             :   JSJitInfo::Getter,
     521             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     522             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
     523             :   true,  /* isInfallible. False in setters. */
     524             :   false,  /* isMovable.  Not relevant for setters. */
     525             :   false, /* isEliminatable.  Not relevant for setters. */
     526             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     527             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     528             :   false,  /* isTypedMethod.  Only relevant for methods. */
     529             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     530             : };
     531             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     532             : static_assert(0 < 1, "There is no slot for us");
     533             : static const JSJitInfo currentTime_setterinfo = {
     534             :   { (JSJitGetterOp)set_currentTime },
     535             :   { prototypes::id::HTMLMediaElement },
     536             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     537             :   JSJitInfo::Setter,
     538             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     539             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     540             :   false,  /* isInfallible. False in setters. */
     541             :   false,  /* isMovable.  Not relevant for setters. */
     542             :   false, /* isEliminatable.  Not relevant for setters. */
     543             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     544             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     545             :   false,  /* isTypedMethod.  Only relevant for methods. */
     546             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     547             : };
     548             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     549             : static_assert(0 < 1, "There is no slot for us");
     550             : 
     551             : static bool
     552           0 : fastSeek(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
     553             : {
     554           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
     555           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "HTMLMediaElement.fastSeek");
     556             :   }
     557             :   double arg0;
     558           0 :   if (!ValueToPrimitive<double, eDefault>(cx, args[0], &arg0)) {
     559           0 :     return false;
     560           0 :   } else if (!mozilla::IsFinite(arg0)) {
     561           0 :     ThrowErrorMessage(cx, MSG_NOT_FINITE, "Argument 1 of HTMLMediaElement.fastSeek");
     562           0 :     return false;
     563             :   }
     564           0 :   binding_detail::FastErrorResult rv;
     565           0 :   self->FastSeek(arg0, rv);
     566           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     567           0 :     return false;
     568             :   }
     569           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     570           0 :   args.rval().setUndefined();
     571           0 :   return true;
     572             : }
     573             : 
     574             : static const JSJitInfo fastSeek_methodinfo = {
     575             :   { (JSJitGetterOp)fastSeek },
     576             :   { prototypes::id::HTMLMediaElement },
     577             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     578             :   JSJitInfo::Method,
     579             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     580             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     581             :   false,  /* isInfallible. False in setters. */
     582             :   false,  /* isMovable.  Not relevant for setters. */
     583             :   false, /* isEliminatable.  Not relevant for setters. */
     584             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     585             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     586             :   false,  /* isTypedMethod.  Only relevant for methods. */
     587             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     588             : };
     589             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     590             : static_assert(0 < 1, "There is no slot for us");
     591             : 
     592             : static bool
     593           0 : get_duration(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     594             : {
     595           0 :   double result(self->Duration());
     596           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     597           0 :   args.rval().set(JS_NumberValue(double(result)));
     598           0 :   return true;
     599             : }
     600             : 
     601             : static const JSJitInfo duration_getterinfo = {
     602             :   { (JSJitGetterOp)get_duration },
     603             :   { prototypes::id::HTMLMediaElement },
     604             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     605             :   JSJitInfo::Getter,
     606             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     607             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
     608             :   true,  /* isInfallible. False in setters. */
     609             :   false,  /* isMovable.  Not relevant for setters. */
     610             :   false, /* isEliminatable.  Not relevant for setters. */
     611             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     612             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     613             :   false,  /* isTypedMethod.  Only relevant for methods. */
     614             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     615             : };
     616             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     617             : static_assert(0 < 1, "There is no slot for us");
     618             : 
     619             : static bool
     620           0 : get_isEncrypted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     621             : {
     622           0 :   bool result(self->IsEncrypted());
     623           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     624           0 :   args.rval().setBoolean(result);
     625           0 :   return true;
     626             : }
     627             : 
     628             : static const JSJitInfo isEncrypted_getterinfo = {
     629             :   { (JSJitGetterOp)get_isEncrypted },
     630             :   { prototypes::id::HTMLMediaElement },
     631             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     632             :   JSJitInfo::Getter,
     633             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     634             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
     635             :   true,  /* isInfallible. False in setters. */
     636             :   false,  /* isMovable.  Not relevant for setters. */
     637             :   false, /* isEliminatable.  Not relevant for setters. */
     638             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     639             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     640             :   false,  /* isTypedMethod.  Only relevant for methods. */
     641             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     642             : };
     643             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     644             : static_assert(0 < 1, "There is no slot for us");
     645             : 
     646             : static bool
     647           0 : get_paused(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     648             : {
     649           0 :   bool result(self->Paused());
     650           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     651           0 :   args.rval().setBoolean(result);
     652           0 :   return true;
     653             : }
     654             : 
     655             : static const JSJitInfo paused_getterinfo = {
     656             :   { (JSJitGetterOp)get_paused },
     657             :   { prototypes::id::HTMLMediaElement },
     658             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     659             :   JSJitInfo::Getter,
     660             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     661             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
     662             :   true,  /* isInfallible. False in setters. */
     663             :   false,  /* isMovable.  Not relevant for setters. */
     664             :   false, /* isEliminatable.  Not relevant for setters. */
     665             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     666             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     667             :   false,  /* isTypedMethod.  Only relevant for methods. */
     668             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     669             : };
     670             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     671             : static_assert(0 < 1, "There is no slot for us");
     672             : 
     673             : static bool
     674           0 : get_defaultPlaybackRate(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     675             : {
     676           0 :   double result(self->DefaultPlaybackRate());
     677           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     678           0 :   args.rval().set(JS_NumberValue(double(result)));
     679           0 :   return true;
     680             : }
     681             : 
     682             : static bool
     683           0 : set_defaultPlaybackRate(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
     684             : {
     685             :   double arg0;
     686           0 :   if (!ValueToPrimitive<double, eDefault>(cx, args[0], &arg0)) {
     687           0 :     return false;
     688           0 :   } else if (!mozilla::IsFinite(arg0)) {
     689           0 :     ThrowErrorMessage(cx, MSG_NOT_FINITE, "Value being assigned to HTMLMediaElement.defaultPlaybackRate");
     690           0 :     return false;
     691             :   }
     692           0 :   binding_detail::FastErrorResult rv;
     693           0 :   self->SetDefaultPlaybackRate(arg0, rv);
     694           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     695           0 :     return false;
     696             :   }
     697           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     698             : 
     699           0 :   return true;
     700             : }
     701             : 
     702             : static const JSJitInfo defaultPlaybackRate_getterinfo = {
     703             :   { (JSJitGetterOp)get_defaultPlaybackRate },
     704             :   { prototypes::id::HTMLMediaElement },
     705             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     706             :   JSJitInfo::Getter,
     707             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     708             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
     709             :   true,  /* isInfallible. False in setters. */
     710             :   false,  /* isMovable.  Not relevant for setters. */
     711             :   false, /* isEliminatable.  Not relevant for setters. */
     712             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     713             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     714             :   false,  /* isTypedMethod.  Only relevant for methods. */
     715             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     716             : };
     717             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     718             : static_assert(0 < 1, "There is no slot for us");
     719             : static const JSJitInfo defaultPlaybackRate_setterinfo = {
     720             :   { (JSJitGetterOp)set_defaultPlaybackRate },
     721             :   { prototypes::id::HTMLMediaElement },
     722             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     723             :   JSJitInfo::Setter,
     724             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     725             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     726             :   false,  /* isInfallible. False in setters. */
     727             :   false,  /* isMovable.  Not relevant for setters. */
     728             :   false, /* isEliminatable.  Not relevant for setters. */
     729             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     730             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     731             :   false,  /* isTypedMethod.  Only relevant for methods. */
     732             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     733             : };
     734             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     735             : static_assert(0 < 1, "There is no slot for us");
     736             : 
     737             : static bool
     738           0 : get_playbackRate(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     739             : {
     740           0 :   double result(self->PlaybackRate());
     741           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     742           0 :   args.rval().set(JS_NumberValue(double(result)));
     743           0 :   return true;
     744             : }
     745             : 
     746             : static bool
     747           0 : set_playbackRate(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
     748             : {
     749             :   double arg0;
     750           0 :   if (!ValueToPrimitive<double, eDefault>(cx, args[0], &arg0)) {
     751           0 :     return false;
     752           0 :   } else if (!mozilla::IsFinite(arg0)) {
     753           0 :     ThrowErrorMessage(cx, MSG_NOT_FINITE, "Value being assigned to HTMLMediaElement.playbackRate");
     754           0 :     return false;
     755             :   }
     756           0 :   binding_detail::FastErrorResult rv;
     757           0 :   self->SetPlaybackRate(arg0, rv);
     758           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     759           0 :     return false;
     760             :   }
     761           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     762             : 
     763           0 :   return true;
     764             : }
     765             : 
     766             : static const JSJitInfo playbackRate_getterinfo = {
     767             :   { (JSJitGetterOp)get_playbackRate },
     768             :   { prototypes::id::HTMLMediaElement },
     769             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     770             :   JSJitInfo::Getter,
     771             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     772             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
     773             :   true,  /* isInfallible. False in setters. */
     774             :   false,  /* isMovable.  Not relevant for setters. */
     775             :   false, /* isEliminatable.  Not relevant for setters. */
     776             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     777             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     778             :   false,  /* isTypedMethod.  Only relevant for methods. */
     779             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     780             : };
     781             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     782             : static_assert(0 < 1, "There is no slot for us");
     783             : static const JSJitInfo playbackRate_setterinfo = {
     784             :   { (JSJitGetterOp)set_playbackRate },
     785             :   { prototypes::id::HTMLMediaElement },
     786             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     787             :   JSJitInfo::Setter,
     788             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     789             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     790             :   false,  /* isInfallible. False in setters. */
     791             :   false,  /* isMovable.  Not relevant for setters. */
     792             :   false, /* isEliminatable.  Not relevant for setters. */
     793             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     794             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     795             :   false,  /* isTypedMethod.  Only relevant for methods. */
     796             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     797             : };
     798             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     799             : static_assert(0 < 1, "There is no slot for us");
     800             : 
     801             : static bool
     802           0 : get_played(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     803             : {
     804           0 :   auto result(StrongOrRawPtr<mozilla::dom::TimeRanges>(self->Played()));
     805           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     806             :   static_assert(!IsPointer<decltype(result)>::value,
     807             :                 "NewObject implies that we need to keep the object alive with a strong reference.");
     808           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
     809           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
     810           0 :     return false;
     811             :   }
     812           0 :   return true;
     813             : }
     814             : 
     815             : static const JSJitInfo played_getterinfo = {
     816             :   { (JSJitGetterOp)get_played },
     817             :   { prototypes::id::HTMLMediaElement },
     818             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     819             :   JSJitInfo::Getter,
     820             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     821             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
     822             :   false,  /* isInfallible. False in setters. */
     823             :   false,  /* isMovable.  Not relevant for setters. */
     824             :   false, /* isEliminatable.  Not relevant for setters. */
     825             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     826             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     827             :   false,  /* isTypedMethod.  Only relevant for methods. */
     828             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     829             : };
     830             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     831             : static_assert(0 < 1, "There is no slot for us");
     832             : 
     833             : static bool
     834           0 : get_seekable(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     835             : {
     836           0 :   auto result(StrongOrRawPtr<mozilla::dom::TimeRanges>(self->Seekable()));
     837           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     838             :   static_assert(!IsPointer<decltype(result)>::value,
     839             :                 "NewObject implies that we need to keep the object alive with a strong reference.");
     840           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
     841           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
     842           0 :     return false;
     843             :   }
     844           0 :   return true;
     845             : }
     846             : 
     847             : static const JSJitInfo seekable_getterinfo = {
     848             :   { (JSJitGetterOp)get_seekable },
     849             :   { prototypes::id::HTMLMediaElement },
     850             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     851             :   JSJitInfo::Getter,
     852             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     853             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
     854             :   false,  /* isInfallible. False in setters. */
     855             :   false,  /* isMovable.  Not relevant for setters. */
     856             :   false, /* isEliminatable.  Not relevant for setters. */
     857             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     858             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     859             :   false,  /* isTypedMethod.  Only relevant for methods. */
     860             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     861             : };
     862             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     863             : static_assert(0 < 1, "There is no slot for us");
     864             : 
     865             : static bool
     866           0 : get_ended(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     867             : {
     868           0 :   bool result(self->Ended());
     869           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     870           0 :   args.rval().setBoolean(result);
     871           0 :   return true;
     872             : }
     873             : 
     874             : static const JSJitInfo ended_getterinfo = {
     875             :   { (JSJitGetterOp)get_ended },
     876             :   { prototypes::id::HTMLMediaElement },
     877             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     878             :   JSJitInfo::Getter,
     879             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     880             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
     881             :   true,  /* isInfallible. False in setters. */
     882             :   false,  /* isMovable.  Not relevant for setters. */
     883             :   false, /* isEliminatable.  Not relevant for setters. */
     884             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     885             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     886             :   false,  /* isTypedMethod.  Only relevant for methods. */
     887             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     888             : };
     889             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     890             : static_assert(0 < 1, "There is no slot for us");
     891             : 
     892             : static bool
     893           0 : get_autoplay(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     894             : {
     895           0 :   bool result(self->Autoplay());
     896           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     897           0 :   args.rval().setBoolean(result);
     898           0 :   return true;
     899             : }
     900             : 
     901             : static bool
     902           0 : set_autoplay(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
     903             : {
     904             :   bool arg0;
     905           0 :   if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
     906           0 :     return false;
     907             :   }
     908           0 :   CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
     909           0 :   Maybe<AutoCEReaction> ceReaction;
     910           0 :   if (reactionsStack) {
     911           0 :     ceReaction.emplace(reactionsStack);
     912             :   }
     913           0 :   binding_detail::FastErrorResult rv;
     914           0 :   self->SetAutoplay(arg0, rv);
     915           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     916           0 :     return false;
     917             :   }
     918           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     919             : 
     920           0 :   return true;
     921             : }
     922             : 
     923             : static const JSJitInfo autoplay_getterinfo = {
     924             :   { (JSJitGetterOp)get_autoplay },
     925             :   { prototypes::id::HTMLMediaElement },
     926             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     927             :   JSJitInfo::Getter,
     928             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     929             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
     930             :   true,  /* isInfallible. False in setters. */
     931             :   false,  /* isMovable.  Not relevant for setters. */
     932             :   false, /* isEliminatable.  Not relevant for setters. */
     933             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     934             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     935             :   false,  /* isTypedMethod.  Only relevant for methods. */
     936             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     937             : };
     938             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     939             : static_assert(0 < 1, "There is no slot for us");
     940             : static const JSJitInfo autoplay_setterinfo = {
     941             :   { (JSJitGetterOp)set_autoplay },
     942             :   { prototypes::id::HTMLMediaElement },
     943             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     944             :   JSJitInfo::Setter,
     945             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     946             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     947             :   false,  /* isInfallible. False in setters. */
     948             :   false,  /* isMovable.  Not relevant for setters. */
     949             :   false, /* isEliminatable.  Not relevant for setters. */
     950             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     951             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     952             :   false,  /* isTypedMethod.  Only relevant for methods. */
     953             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     954             : };
     955             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     956             : static_assert(0 < 1, "There is no slot for us");
     957             : 
     958             : static bool
     959           0 : get_loop(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
     960             : {
     961           0 :   bool result(self->Loop());
     962           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     963           0 :   args.rval().setBoolean(result);
     964           0 :   return true;
     965             : }
     966             : 
     967             : static bool
     968           0 : set_loop(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
     969             : {
     970             :   bool arg0;
     971           0 :   if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
     972           0 :     return false;
     973             :   }
     974           0 :   CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
     975           0 :   Maybe<AutoCEReaction> ceReaction;
     976           0 :   if (reactionsStack) {
     977           0 :     ceReaction.emplace(reactionsStack);
     978             :   }
     979           0 :   binding_detail::FastErrorResult rv;
     980           0 :   self->SetLoop(arg0, rv);
     981           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     982           0 :     return false;
     983             :   }
     984           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     985             : 
     986           0 :   return true;
     987             : }
     988             : 
     989             : static const JSJitInfo loop_getterinfo = {
     990             :   { (JSJitGetterOp)get_loop },
     991             :   { prototypes::id::HTMLMediaElement },
     992             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
     993             :   JSJitInfo::Getter,
     994             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     995             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
     996             :   true,  /* isInfallible. False in setters. */
     997             :   false,  /* isMovable.  Not relevant for setters. */
     998             :   false, /* isEliminatable.  Not relevant for setters. */
     999             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1000             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1001             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1002             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1003             : };
    1004             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1005             : static_assert(0 < 1, "There is no slot for us");
    1006             : static const JSJitInfo loop_setterinfo = {
    1007             :   { (JSJitGetterOp)set_loop },
    1008             :   { prototypes::id::HTMLMediaElement },
    1009             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1010             :   JSJitInfo::Setter,
    1011             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1012             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1013             :   false,  /* isInfallible. False in setters. */
    1014             :   false,  /* isMovable.  Not relevant for setters. */
    1015             :   false, /* isEliminatable.  Not relevant for setters. */
    1016             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1017             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1018             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1019             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1020             : };
    1021             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1022             : static_assert(0 < 1, "There is no slot for us");
    1023             : 
    1024             : static bool
    1025           0 : play(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    1026             : {
    1027           0 :   binding_detail::FastErrorResult rv;
    1028           0 :   auto result(StrongOrRawPtr<Promise>(self->Play(rv)));
    1029           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1030           0 :     return false;
    1031             :   }
    1032           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1033           0 :   if (!ToJSValue(cx, result, args.rval())) {
    1034           0 :     return false;
    1035             :   }
    1036           0 :   return true;
    1037             : }
    1038             : 
    1039             : static bool
    1040           0 : play_promiseWrapper(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    1041             : {
    1042             :   // Make sure to save the callee before someone maybe messes
    1043             :   // with rval().
    1044           0 :   JS::Rooted<JSObject*> callee(cx, &args.callee());
    1045           0 :   bool ok = play(cx, obj, self, args);
    1046           0 :   if (ok) {
    1047           0 :     return true;
    1048             :   }
    1049           0 :   return ConvertExceptionToPromise(cx, xpc::XrayAwareCalleeGlobal(callee),
    1050           0 :                                    args.rval());
    1051             : }
    1052             : 
    1053             : static const JSJitInfo play_methodinfo = {
    1054             :   { (JSJitGetterOp)play_promiseWrapper },
    1055             :   { prototypes::id::HTMLMediaElement },
    1056             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1057             :   JSJitInfo::Method,
    1058             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1059             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
    1060             :   false,  /* isInfallible. False in setters. */
    1061             :   false,  /* isMovable.  Not relevant for setters. */
    1062             :   false, /* isEliminatable.  Not relevant for setters. */
    1063             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1064             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1065             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1066             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1067             : };
    1068             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1069             : static_assert(0 < 1, "There is no slot for us");
    1070             : 
    1071             : static bool
    1072           0 : pause(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    1073             : {
    1074           0 :   binding_detail::FastErrorResult rv;
    1075           0 :   self->Pause(rv);
    1076           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1077           0 :     return false;
    1078             :   }
    1079           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1080           0 :   args.rval().setUndefined();
    1081           0 :   return true;
    1082             : }
    1083             : 
    1084             : static const JSJitInfo pause_methodinfo = {
    1085             :   { (JSJitGetterOp)pause },
    1086             :   { prototypes::id::HTMLMediaElement },
    1087             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1088             :   JSJitInfo::Method,
    1089             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1090             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1091             :   false,  /* isInfallible. False in setters. */
    1092             :   false,  /* isMovable.  Not relevant for setters. */
    1093             :   false, /* isEliminatable.  Not relevant for setters. */
    1094             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1095             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1096             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1097             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1098             : };
    1099             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1100             : static_assert(0 < 1, "There is no slot for us");
    1101             : 
    1102             : static bool
    1103           0 : get_controls(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1104             : {
    1105           0 :   bool result(self->Controls());
    1106           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1107           0 :   args.rval().setBoolean(result);
    1108           0 :   return true;
    1109             : }
    1110             : 
    1111             : static bool
    1112           0 : set_controls(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
    1113             : {
    1114             :   bool arg0;
    1115           0 :   if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    1116           0 :     return false;
    1117             :   }
    1118           0 :   CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
    1119           0 :   Maybe<AutoCEReaction> ceReaction;
    1120           0 :   if (reactionsStack) {
    1121           0 :     ceReaction.emplace(reactionsStack);
    1122             :   }
    1123           0 :   binding_detail::FastErrorResult rv;
    1124           0 :   self->SetControls(arg0, rv);
    1125           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1126           0 :     return false;
    1127             :   }
    1128           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1129             : 
    1130           0 :   return true;
    1131             : }
    1132             : 
    1133             : static const JSJitInfo controls_getterinfo = {
    1134             :   { (JSJitGetterOp)get_controls },
    1135             :   { prototypes::id::HTMLMediaElement },
    1136             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1137             :   JSJitInfo::Getter,
    1138             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1139             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    1140             :   true,  /* isInfallible. False in setters. */
    1141             :   false,  /* isMovable.  Not relevant for setters. */
    1142             :   false, /* isEliminatable.  Not relevant for setters. */
    1143             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1144             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1145             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1146             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1147             : };
    1148             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1149             : static_assert(0 < 1, "There is no slot for us");
    1150             : static const JSJitInfo controls_setterinfo = {
    1151             :   { (JSJitGetterOp)set_controls },
    1152             :   { prototypes::id::HTMLMediaElement },
    1153             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1154             :   JSJitInfo::Setter,
    1155             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1156             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1157             :   false,  /* isInfallible. False in setters. */
    1158             :   false,  /* isMovable.  Not relevant for setters. */
    1159             :   false, /* isEliminatable.  Not relevant for setters. */
    1160             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1161             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1162             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1163             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1164             : };
    1165             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1166             : static_assert(0 < 1, "There is no slot for us");
    1167             : 
    1168             : static bool
    1169           0 : get_volume(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1170             : {
    1171           0 :   double result(self->Volume());
    1172           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1173           0 :   args.rval().set(JS_NumberValue(double(result)));
    1174           0 :   return true;
    1175             : }
    1176             : 
    1177             : static bool
    1178           0 : set_volume(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
    1179             : {
    1180             :   double arg0;
    1181           0 :   if (!ValueToPrimitive<double, eDefault>(cx, args[0], &arg0)) {
    1182           0 :     return false;
    1183           0 :   } else if (!mozilla::IsFinite(arg0)) {
    1184           0 :     ThrowErrorMessage(cx, MSG_NOT_FINITE, "Value being assigned to HTMLMediaElement.volume");
    1185           0 :     return false;
    1186             :   }
    1187           0 :   binding_detail::FastErrorResult rv;
    1188           0 :   self->SetVolume(arg0, rv);
    1189           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1190           0 :     return false;
    1191             :   }
    1192           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1193             : 
    1194           0 :   return true;
    1195             : }
    1196             : 
    1197             : static const JSJitInfo volume_getterinfo = {
    1198             :   { (JSJitGetterOp)get_volume },
    1199             :   { prototypes::id::HTMLMediaElement },
    1200             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1201             :   JSJitInfo::Getter,
    1202             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1203             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
    1204             :   true,  /* isInfallible. False in setters. */
    1205             :   false,  /* isMovable.  Not relevant for setters. */
    1206             :   false, /* isEliminatable.  Not relevant for setters. */
    1207             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1208             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1209             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1210             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1211             : };
    1212             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1213             : static_assert(0 < 1, "There is no slot for us");
    1214             : static const JSJitInfo volume_setterinfo = {
    1215             :   { (JSJitGetterOp)set_volume },
    1216             :   { prototypes::id::HTMLMediaElement },
    1217             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1218             :   JSJitInfo::Setter,
    1219             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1220             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1221             :   false,  /* isInfallible. False in setters. */
    1222             :   false,  /* isMovable.  Not relevant for setters. */
    1223             :   false, /* isEliminatable.  Not relevant for setters. */
    1224             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1225             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1226             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1227             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1228             : };
    1229             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1230             : static_assert(0 < 1, "There is no slot for us");
    1231             : 
    1232             : static bool
    1233           0 : get_muted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1234             : {
    1235           0 :   bool result(self->Muted());
    1236           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1237           0 :   args.rval().setBoolean(result);
    1238           0 :   return true;
    1239             : }
    1240             : 
    1241             : static bool
    1242           0 : set_muted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
    1243             : {
    1244             :   bool arg0;
    1245           0 :   if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    1246           0 :     return false;
    1247             :   }
    1248           0 :   self->SetMuted(arg0);
    1249           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1250             : 
    1251           0 :   return true;
    1252             : }
    1253             : 
    1254             : static const JSJitInfo muted_getterinfo = {
    1255             :   { (JSJitGetterOp)get_muted },
    1256             :   { prototypes::id::HTMLMediaElement },
    1257             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1258             :   JSJitInfo::Getter,
    1259             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1260             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    1261             :   true,  /* isInfallible. False in setters. */
    1262             :   false,  /* isMovable.  Not relevant for setters. */
    1263             :   false, /* isEliminatable.  Not relevant for setters. */
    1264             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1265             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1266             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1267             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1268             : };
    1269             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1270             : static_assert(0 < 1, "There is no slot for us");
    1271             : static const JSJitInfo muted_setterinfo = {
    1272             :   { (JSJitGetterOp)set_muted },
    1273             :   { prototypes::id::HTMLMediaElement },
    1274             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1275             :   JSJitInfo::Setter,
    1276             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1277             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1278             :   false,  /* isInfallible. False in setters. */
    1279             :   false,  /* isMovable.  Not relevant for setters. */
    1280             :   false, /* isEliminatable.  Not relevant for setters. */
    1281             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1282             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1283             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1284             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1285             : };
    1286             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1287             : static_assert(0 < 1, "There is no slot for us");
    1288             : 
    1289             : static bool
    1290           0 : get_defaultMuted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1291             : {
    1292           0 :   bool result(self->DefaultMuted());
    1293           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1294           0 :   args.rval().setBoolean(result);
    1295           0 :   return true;
    1296             : }
    1297             : 
    1298             : static bool
    1299           0 : set_defaultMuted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
    1300             : {
    1301             :   bool arg0;
    1302           0 :   if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    1303           0 :     return false;
    1304             :   }
    1305           0 :   CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
    1306           0 :   Maybe<AutoCEReaction> ceReaction;
    1307           0 :   if (reactionsStack) {
    1308           0 :     ceReaction.emplace(reactionsStack);
    1309             :   }
    1310           0 :   binding_detail::FastErrorResult rv;
    1311           0 :   self->SetDefaultMuted(arg0, rv);
    1312           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1313           0 :     return false;
    1314             :   }
    1315           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1316             : 
    1317           0 :   return true;
    1318             : }
    1319             : 
    1320             : static const JSJitInfo defaultMuted_getterinfo = {
    1321             :   { (JSJitGetterOp)get_defaultMuted },
    1322             :   { prototypes::id::HTMLMediaElement },
    1323             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1324             :   JSJitInfo::Getter,
    1325             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1326             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    1327             :   true,  /* isInfallible. False in setters. */
    1328             :   false,  /* isMovable.  Not relevant for setters. */
    1329             :   false, /* isEliminatable.  Not relevant for setters. */
    1330             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1331             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1332             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1333             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1334             : };
    1335             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1336             : static_assert(0 < 1, "There is no slot for us");
    1337             : static const JSJitInfo defaultMuted_setterinfo = {
    1338             :   { (JSJitGetterOp)set_defaultMuted },
    1339             :   { prototypes::id::HTMLMediaElement },
    1340             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1341             :   JSJitInfo::Setter,
    1342             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1343             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1344             :   false,  /* isInfallible. False in setters. */
    1345             :   false,  /* isMovable.  Not relevant for setters. */
    1346             :   false, /* isEliminatable.  Not relevant for setters. */
    1347             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1348             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1349             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1350             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1351             : };
    1352             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1353             : static_assert(0 < 1, "There is no slot for us");
    1354             : 
    1355             : static bool
    1356           0 : get_audioTracks(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1357             : {
    1358           0 :   auto result(StrongOrRawPtr<mozilla::dom::AudioTrackList>(self->AudioTracks()));
    1359           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1360           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    1361           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1362           0 :     return false;
    1363             :   }
    1364           0 :   return true;
    1365             : }
    1366             : 
    1367             : static const JSJitInfo audioTracks_getterinfo = {
    1368             :   { (JSJitGetterOp)get_audioTracks },
    1369             :   { prototypes::id::HTMLMediaElement },
    1370             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1371             :   JSJitInfo::Getter,
    1372             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1373             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
    1374             :   false,  /* isInfallible. False in setters. */
    1375             :   false,  /* isMovable.  Not relevant for setters. */
    1376             :   false, /* isEliminatable.  Not relevant for setters. */
    1377             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1378             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1379             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1380             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1381             : };
    1382             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1383             : static_assert(0 < 1, "There is no slot for us");
    1384             : 
    1385             : static bool
    1386           0 : get_videoTracks(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1387             : {
    1388           0 :   auto result(StrongOrRawPtr<mozilla::dom::VideoTrackList>(self->VideoTracks()));
    1389           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1390           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    1391           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1392           0 :     return false;
    1393             :   }
    1394           0 :   return true;
    1395             : }
    1396             : 
    1397             : static const JSJitInfo videoTracks_getterinfo = {
    1398             :   { (JSJitGetterOp)get_videoTracks },
    1399             :   { prototypes::id::HTMLMediaElement },
    1400             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1401             :   JSJitInfo::Getter,
    1402             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1403             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
    1404             :   false,  /* isInfallible. False in setters. */
    1405             :   false,  /* isMovable.  Not relevant for setters. */
    1406             :   false, /* isEliminatable.  Not relevant for setters. */
    1407             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1408             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1409             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1410             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1411             : };
    1412             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1413             : static_assert(0 < 1, "There is no slot for us");
    1414             : 
    1415             : static bool
    1416           0 : get_textTracks(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1417             : {
    1418           0 :   auto result(StrongOrRawPtr<mozilla::dom::TextTrackList>(self->GetTextTracks()));
    1419           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1420           0 :   if (!result) {
    1421           0 :     args.rval().setNull();
    1422           0 :     return true;
    1423             :   }
    1424           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    1425           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1426           0 :     return false;
    1427             :   }
    1428           0 :   return true;
    1429             : }
    1430             : 
    1431             : static const JSJitInfo textTracks_getterinfo = {
    1432             :   { (JSJitGetterOp)get_textTracks },
    1433             :   { prototypes::id::HTMLMediaElement },
    1434             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1435             :   JSJitInfo::Getter,
    1436             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1437             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
    1438             :   false,  /* isInfallible. False in setters. */
    1439             :   false,  /* isMovable.  Not relevant for setters. */
    1440             :   false, /* isEliminatable.  Not relevant for setters. */
    1441             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1442             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1443             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1444             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1445             : };
    1446             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1447             : static_assert(0 < 1, "There is no slot for us");
    1448             : 
    1449             : static bool
    1450           0 : addTextTrack(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    1451             : {
    1452           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    1453           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "HTMLMediaElement.addTextTrack");
    1454             :   }
    1455             :   TextTrackKind arg0;
    1456             :   {
    1457             :     int index;
    1458           0 :     if (!FindEnumStringIndex<true>(cx, args[0], TextTrackKindValues::strings, "TextTrackKind", "Argument 1 of HTMLMediaElement.addTextTrack", &index)) {
    1459           0 :       return false;
    1460             :     }
    1461           0 :     MOZ_ASSERT(index >= 0);
    1462           0 :     arg0 = static_cast<TextTrackKind>(index);
    1463             :   }
    1464           0 :   binding_detail::FakeString arg1;
    1465           0 :   if (args.hasDefined(1)) {
    1466           0 :     if (!ConvertJSValueToString(cx, args[1], eStringify, eStringify, arg1)) {
    1467           0 :       return false;
    1468             :     }
    1469             :   } else {
    1470             :     static const char16_t data[] = { 0 };
    1471           0 :     arg1.Rebind(data, ArrayLength(data) - 1);
    1472             :   }
    1473           0 :   binding_detail::FakeString arg2;
    1474           0 :   if (args.hasDefined(2)) {
    1475           0 :     if (!ConvertJSValueToString(cx, args[2], eStringify, eStringify, arg2)) {
    1476           0 :       return false;
    1477             :     }
    1478             :   } else {
    1479             :     static const char16_t data[] = { 0 };
    1480           0 :     arg2.Rebind(data, ArrayLength(data) - 1);
    1481             :   }
    1482           0 :   auto result(StrongOrRawPtr<mozilla::dom::TextTrack>(self->AddTextTrack(arg0, NonNullHelper(Constify(arg1)), NonNullHelper(Constify(arg2)))));
    1483           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1484           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    1485           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1486           0 :     return false;
    1487             :   }
    1488           0 :   return true;
    1489             : }
    1490             : 
    1491             : static const JSJitInfo addTextTrack_methodinfo = {
    1492             :   { (JSJitGetterOp)addTextTrack },
    1493             :   { prototypes::id::HTMLMediaElement },
    1494             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1495             :   JSJitInfo::Method,
    1496             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1497             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
    1498             :   false,  /* isInfallible. False in setters. */
    1499             :   false,  /* isMovable.  Not relevant for setters. */
    1500             :   false, /* isEliminatable.  Not relevant for setters. */
    1501             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1502             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1503             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1504             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1505             : };
    1506             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1507             : static_assert(0 < 1, "There is no slot for us");
    1508             : 
    1509             : static bool
    1510           0 : get_mozMediaSourceObject(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1511             : {
    1512           0 :   auto result(StrongOrRawPtr<mozilla::dom::MediaSource>(self->GetMozMediaSourceObject()));
    1513           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1514           0 :   if (!result) {
    1515           0 :     args.rval().setNull();
    1516           0 :     return true;
    1517             :   }
    1518           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    1519           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1520           0 :     return false;
    1521             :   }
    1522           0 :   return true;
    1523             : }
    1524             : 
    1525             : static const JSJitInfo mozMediaSourceObject_getterinfo = {
    1526             :   { (JSJitGetterOp)get_mozMediaSourceObject },
    1527             :   { prototypes::id::HTMLMediaElement },
    1528             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1529             :   JSJitInfo::Getter,
    1530             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1531             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
    1532             :   false,  /* isInfallible. False in setters. */
    1533             :   false,  /* isMovable.  Not relevant for setters. */
    1534             :   false, /* isEliminatable.  Not relevant for setters. */
    1535             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1536             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1537             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1538             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1539             : };
    1540             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1541             : static_assert(0 < 1, "There is no slot for us");
    1542             : 
    1543             : static bool
    1544           0 : get_mozDebugReaderData(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1545             : {
    1546           0 :   DOMString result;
    1547           0 :   self->GetMozDebugReaderData(result);
    1548           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1549           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    1550           0 :     return false;
    1551             :   }
    1552           0 :   return true;
    1553             : }
    1554             : 
    1555             : static const JSJitInfo mozDebugReaderData_getterinfo = {
    1556             :   { (JSJitGetterOp)get_mozDebugReaderData },
    1557             :   { prototypes::id::HTMLMediaElement },
    1558             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1559             :   JSJitInfo::Getter,
    1560             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1561             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
    1562             :   false,  /* isInfallible. False in setters. */
    1563             :   false,  /* isMovable.  Not relevant for setters. */
    1564             :   false, /* isEliminatable.  Not relevant for setters. */
    1565             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1566             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1567             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1568             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1569             : };
    1570             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1571             : static_assert(0 < 1, "There is no slot for us");
    1572             : 
    1573             : static bool
    1574           0 : mozRequestDebugInfo(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    1575             : {
    1576           0 :   binding_detail::FastErrorResult rv;
    1577           0 :   auto result(StrongOrRawPtr<Promise>(self->MozRequestDebugInfo(rv)));
    1578           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1579           0 :     return false;
    1580             :   }
    1581           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1582             :   static_assert(!IsPointer<decltype(result)>::value,
    1583             :                 "NewObject implies that we need to keep the object alive with a strong reference.");
    1584           0 :   if (!ToJSValue(cx, result, args.rval())) {
    1585           0 :     return false;
    1586             :   }
    1587           0 :   return true;
    1588             : }
    1589             : 
    1590             : static bool
    1591           0 : mozRequestDebugInfo_promiseWrapper(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    1592             : {
    1593             :   // Make sure to save the callee before someone maybe messes
    1594             :   // with rval().
    1595           0 :   JS::Rooted<JSObject*> callee(cx, &args.callee());
    1596           0 :   bool ok = mozRequestDebugInfo(cx, obj, self, args);
    1597           0 :   if (ok) {
    1598           0 :     return true;
    1599             :   }
    1600           0 :   return ConvertExceptionToPromise(cx, xpc::XrayAwareCalleeGlobal(callee),
    1601           0 :                                    args.rval());
    1602             : }
    1603             : 
    1604             : static const JSJitInfo mozRequestDebugInfo_methodinfo = {
    1605             :   { (JSJitGetterOp)mozRequestDebugInfo_promiseWrapper },
    1606             :   { prototypes::id::HTMLMediaElement },
    1607             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1608             :   JSJitInfo::Method,
    1609             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1610             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
    1611             :   false,  /* isInfallible. False in setters. */
    1612             :   false,  /* isMovable.  Not relevant for setters. */
    1613             :   false, /* isEliminatable.  Not relevant for setters. */
    1614             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1615             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1616             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1617             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1618             : };
    1619             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1620             : static_assert(0 < 1, "There is no slot for us");
    1621             : 
    1622             : static bool
    1623           0 : mozDumpDebugInfo(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    1624             : {
    1625           0 :   self->MozDumpDebugInfo();
    1626           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1627           0 :   args.rval().setUndefined();
    1628           0 :   return true;
    1629             : }
    1630             : 
    1631             : static const JSJitInfo mozDumpDebugInfo_methodinfo = {
    1632             :   { (JSJitGetterOp)mozDumpDebugInfo },
    1633             :   { prototypes::id::HTMLMediaElement },
    1634             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1635             :   JSJitInfo::Method,
    1636             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1637             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1638             :   true,  /* isInfallible. False in setters. */
    1639             :   false,  /* isMovable.  Not relevant for setters. */
    1640             :   false, /* isEliminatable.  Not relevant for setters. */
    1641             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1642             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1643             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1644             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1645             : };
    1646             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1647             : static_assert(0 < 1, "There is no slot for us");
    1648             : 
    1649             : static bool
    1650           0 : get_srcObject(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1651             : {
    1652           0 :   auto result(StrongOrRawPtr<mozilla::DOMMediaStream>(self->GetSrcObject()));
    1653           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1654           0 :   if (!result) {
    1655           0 :     args.rval().setNull();
    1656           0 :     return true;
    1657             :   }
    1658           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    1659           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1660           0 :     return false;
    1661             :   }
    1662           0 :   return true;
    1663             : }
    1664             : 
    1665             : static bool
    1666           0 : set_srcObject(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
    1667             : {
    1668             :   mozilla::DOMMediaStream* arg0;
    1669           0 :   if (args[0].isObject()) {
    1670             :     {
    1671           0 :       nsresult rv = UnwrapObject<prototypes::id::MediaStream, mozilla::DOMMediaStream>(args[0], arg0);
    1672           0 :       if (NS_FAILED(rv)) {
    1673           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Value being assigned to HTMLMediaElement.srcObject", "MediaStream");
    1674           0 :         return false;
    1675             :       }
    1676             :     }
    1677           0 :   } else if (args[0].isNullOrUndefined()) {
    1678           0 :     arg0 = nullptr;
    1679             :   } else {
    1680           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Value being assigned to HTMLMediaElement.srcObject");
    1681           0 :     return false;
    1682             :   }
    1683           0 :   self->SetSrcObject(Constify(arg0));
    1684           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1685             : 
    1686           0 :   return true;
    1687             : }
    1688             : 
    1689             : static const JSJitInfo srcObject_getterinfo = {
    1690             :   { (JSJitGetterOp)get_srcObject },
    1691             :   { prototypes::id::HTMLMediaElement },
    1692             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1693             :   JSJitInfo::Getter,
    1694             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1695             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
    1696             :   false,  /* isInfallible. False in setters. */
    1697             :   false,  /* isMovable.  Not relevant for setters. */
    1698             :   false, /* isEliminatable.  Not relevant for setters. */
    1699             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1700             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1701             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1702             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1703             : };
    1704             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1705             : static_assert(0 < 1, "There is no slot for us");
    1706             : static const JSJitInfo srcObject_setterinfo = {
    1707             :   { (JSJitGetterOp)set_srcObject },
    1708             :   { prototypes::id::HTMLMediaElement },
    1709             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1710             :   JSJitInfo::Setter,
    1711             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1712             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1713             :   false,  /* isInfallible. False in setters. */
    1714             :   false,  /* isMovable.  Not relevant for setters. */
    1715             :   false, /* isEliminatable.  Not relevant for setters. */
    1716             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1717             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1718             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1719             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1720             : };
    1721             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1722             : static_assert(0 < 1, "There is no slot for us");
    1723             : 
    1724             : static bool
    1725           0 : get_mozSrcObject(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1726             : {
    1727           0 :   auto result(StrongOrRawPtr<mozilla::DOMMediaStream>(self->GetMozSrcObject()));
    1728           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1729           0 :   if (!result) {
    1730           0 :     args.rval().setNull();
    1731           0 :     return true;
    1732             :   }
    1733           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    1734           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1735           0 :     return false;
    1736             :   }
    1737           0 :   return true;
    1738             : }
    1739             : 
    1740             : static bool
    1741           0 : set_mozSrcObject(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
    1742             : {
    1743             :   mozilla::DOMMediaStream* arg0;
    1744           0 :   if (args[0].isObject()) {
    1745             :     {
    1746           0 :       nsresult rv = UnwrapObject<prototypes::id::MediaStream, mozilla::DOMMediaStream>(args[0], arg0);
    1747           0 :       if (NS_FAILED(rv)) {
    1748           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Value being assigned to HTMLMediaElement.mozSrcObject", "MediaStream");
    1749           0 :         return false;
    1750             :       }
    1751             :     }
    1752           0 :   } else if (args[0].isNullOrUndefined()) {
    1753           0 :     arg0 = nullptr;
    1754             :   } else {
    1755           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Value being assigned to HTMLMediaElement.mozSrcObject");
    1756           0 :     return false;
    1757             :   }
    1758           0 :   self->SetMozSrcObject(Constify(arg0));
    1759           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1760             : 
    1761           0 :   return true;
    1762             : }
    1763             : 
    1764             : static const JSJitInfo mozSrcObject_getterinfo = {
    1765             :   { (JSJitGetterOp)get_mozSrcObject },
    1766             :   { prototypes::id::HTMLMediaElement },
    1767             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1768             :   JSJitInfo::Getter,
    1769             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1770             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
    1771             :   false,  /* isInfallible. False in setters. */
    1772             :   false,  /* isMovable.  Not relevant for setters. */
    1773             :   false, /* isEliminatable.  Not relevant for setters. */
    1774             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1775             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1776             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1777             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1778             : };
    1779             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1780             : static_assert(0 < 1, "There is no slot for us");
    1781             : static const JSJitInfo mozSrcObject_setterinfo = {
    1782             :   { (JSJitGetterOp)set_mozSrcObject },
    1783             :   { prototypes::id::HTMLMediaElement },
    1784             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1785             :   JSJitInfo::Setter,
    1786             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1787             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1788             :   false,  /* isInfallible. False in setters. */
    1789             :   false,  /* isMovable.  Not relevant for setters. */
    1790             :   false, /* isEliminatable.  Not relevant for setters. */
    1791             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1792             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1793             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1794             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1795             : };
    1796             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1797             : static_assert(0 < 1, "There is no slot for us");
    1798             : 
    1799             : static bool
    1800           0 : get_mozPreservesPitch(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1801             : {
    1802           0 :   bool result(self->MozPreservesPitch());
    1803           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1804           0 :   args.rval().setBoolean(result);
    1805           0 :   return true;
    1806             : }
    1807             : 
    1808             : static bool
    1809           0 : set_mozPreservesPitch(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
    1810             : {
    1811             :   bool arg0;
    1812           0 :   if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    1813           0 :     return false;
    1814             :   }
    1815           0 :   self->SetMozPreservesPitch(arg0);
    1816           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1817             : 
    1818           0 :   return true;
    1819             : }
    1820             : 
    1821             : static const JSJitInfo mozPreservesPitch_getterinfo = {
    1822             :   { (JSJitGetterOp)get_mozPreservesPitch },
    1823             :   { prototypes::id::HTMLMediaElement },
    1824             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1825             :   JSJitInfo::Getter,
    1826             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1827             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    1828             :   true,  /* isInfallible. False in setters. */
    1829             :   false,  /* isMovable.  Not relevant for setters. */
    1830             :   false, /* isEliminatable.  Not relevant for setters. */
    1831             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1832             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1833             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1834             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1835             : };
    1836             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1837             : static_assert(0 < 1, "There is no slot for us");
    1838             : static const JSJitInfo mozPreservesPitch_setterinfo = {
    1839             :   { (JSJitGetterOp)set_mozPreservesPitch },
    1840             :   { prototypes::id::HTMLMediaElement },
    1841             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1842             :   JSJitInfo::Setter,
    1843             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1844             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1845             :   false,  /* isInfallible. False in setters. */
    1846             :   false,  /* isMovable.  Not relevant for setters. */
    1847             :   false, /* isEliminatable.  Not relevant for setters. */
    1848             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1849             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1850             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1851             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1852             : };
    1853             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1854             : static_assert(0 < 1, "There is no slot for us");
    1855             : 
    1856             : static bool
    1857           0 : get_mozAutoplayEnabled(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1858             : {
    1859           0 :   bool result(self->MozAutoplayEnabled());
    1860           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1861           0 :   args.rval().setBoolean(result);
    1862           0 :   return true;
    1863             : }
    1864             : 
    1865             : static const JSJitInfo mozAutoplayEnabled_getterinfo = {
    1866             :   { (JSJitGetterOp)get_mozAutoplayEnabled },
    1867             :   { prototypes::id::HTMLMediaElement },
    1868             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1869             :   JSJitInfo::Getter,
    1870             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1871             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    1872             :   true,  /* isInfallible. False in setters. */
    1873             :   false,  /* isMovable.  Not relevant for setters. */
    1874             :   false, /* isEliminatable.  Not relevant for setters. */
    1875             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1876             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1877             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1878             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1879             : };
    1880             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1881             : static_assert(0 < 1, "There is no slot for us");
    1882             : 
    1883             : static bool
    1884           0 : get_mozAllowCasting(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1885             : {
    1886           0 :   bool result(self->MozAllowCasting());
    1887           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1888           0 :   args.rval().setBoolean(result);
    1889           0 :   return true;
    1890             : }
    1891             : 
    1892             : static bool
    1893           0 : set_mozAllowCasting(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
    1894             : {
    1895             :   bool arg0;
    1896           0 :   if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    1897           0 :     return false;
    1898             :   }
    1899           0 :   self->SetMozAllowCasting(arg0);
    1900           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1901             : 
    1902           0 :   return true;
    1903             : }
    1904             : 
    1905             : static const JSJitInfo mozAllowCasting_getterinfo = {
    1906             :   { (JSJitGetterOp)get_mozAllowCasting },
    1907             :   { prototypes::id::HTMLMediaElement },
    1908             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1909             :   JSJitInfo::Getter,
    1910             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1911             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    1912             :   true,  /* isInfallible. False in setters. */
    1913             :   false,  /* isMovable.  Not relevant for setters. */
    1914             :   false, /* isEliminatable.  Not relevant for setters. */
    1915             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1916             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1917             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1918             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1919             : };
    1920             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1921             : static_assert(0 < 1, "There is no slot for us");
    1922             : static const JSJitInfo mozAllowCasting_setterinfo = {
    1923             :   { (JSJitGetterOp)set_mozAllowCasting },
    1924             :   { prototypes::id::HTMLMediaElement },
    1925             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1926             :   JSJitInfo::Setter,
    1927             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1928             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1929             :   false,  /* isInfallible. False in setters. */
    1930             :   false,  /* isMovable.  Not relevant for setters. */
    1931             :   false, /* isEliminatable.  Not relevant for setters. */
    1932             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1933             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1934             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1935             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1936             : };
    1937             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1938             : static_assert(0 < 1, "There is no slot for us");
    1939             : 
    1940             : static bool
    1941           0 : get_mozIsCasting(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    1942             : {
    1943           0 :   bool result(self->MozIsCasting());
    1944           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1945           0 :   args.rval().setBoolean(result);
    1946           0 :   return true;
    1947             : }
    1948             : 
    1949             : static bool
    1950           0 : set_mozIsCasting(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
    1951             : {
    1952             :   bool arg0;
    1953           0 :   if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    1954           0 :     return false;
    1955             :   }
    1956           0 :   self->SetMozIsCasting(arg0);
    1957           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1958             : 
    1959           0 :   return true;
    1960             : }
    1961             : 
    1962             : static const JSJitInfo mozIsCasting_getterinfo = {
    1963             :   { (JSJitGetterOp)get_mozIsCasting },
    1964             :   { prototypes::id::HTMLMediaElement },
    1965             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1966             :   JSJitInfo::Getter,
    1967             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1968             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    1969             :   true,  /* isInfallible. False in setters. */
    1970             :   false,  /* isMovable.  Not relevant for setters. */
    1971             :   false, /* isEliminatable.  Not relevant for setters. */
    1972             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1973             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1974             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1975             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1976             : };
    1977             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1978             : static_assert(0 < 1, "There is no slot for us");
    1979             : static const JSJitInfo mozIsCasting_setterinfo = {
    1980             :   { (JSJitGetterOp)set_mozIsCasting },
    1981             :   { prototypes::id::HTMLMediaElement },
    1982             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    1983             :   JSJitInfo::Setter,
    1984             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1985             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1986             :   false,  /* isInfallible. False in setters. */
    1987             :   false,  /* isMovable.  Not relevant for setters. */
    1988             :   false, /* isEliminatable.  Not relevant for setters. */
    1989             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1990             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1991             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1992             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1993             : };
    1994             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1995             : static_assert(0 < 1, "There is no slot for us");
    1996             : 
    1997             : static bool
    1998           0 : mozCaptureStream(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    1999             : {
    2000           0 :   if (!mozilla::dom::EnforceNotInPrerendering(cx, obj)) {
    2001             :       // Return false from the JSNative in order to trigger
    2002             :       // an uncatchable exception.
    2003           0 :       MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2004           0 :       return false;
    2005             :   }
    2006           0 :   binding_detail::FastErrorResult rv;
    2007           0 :   auto result(StrongOrRawPtr<mozilla::DOMMediaStream>(self->MozCaptureStream(rv)));
    2008           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2009           0 :     return false;
    2010             :   }
    2011           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2012           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    2013           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    2014           0 :     return false;
    2015             :   }
    2016           0 :   return true;
    2017             : }
    2018             : 
    2019             : static const JSJitInfo mozCaptureStream_methodinfo = {
    2020             :   { (JSJitGetterOp)mozCaptureStream },
    2021             :   { prototypes::id::HTMLMediaElement },
    2022             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2023             :   JSJitInfo::Method,
    2024             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2025             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
    2026             :   false,  /* isInfallible. False in setters. */
    2027             :   false,  /* isMovable.  Not relevant for setters. */
    2028             :   false, /* isEliminatable.  Not relevant for setters. */
    2029             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2030             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2031             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2032             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2033             : };
    2034             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2035             : static_assert(0 < 1, "There is no slot for us");
    2036             : 
    2037             : static bool
    2038           0 : mozCaptureStreamUntilEnded(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    2039             : {
    2040           0 :   if (!mozilla::dom::EnforceNotInPrerendering(cx, obj)) {
    2041             :       // Return false from the JSNative in order to trigger
    2042             :       // an uncatchable exception.
    2043           0 :       MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2044           0 :       return false;
    2045             :   }
    2046           0 :   binding_detail::FastErrorResult rv;
    2047           0 :   auto result(StrongOrRawPtr<mozilla::DOMMediaStream>(self->MozCaptureStreamUntilEnded(rv)));
    2048           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2049           0 :     return false;
    2050             :   }
    2051           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2052           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    2053           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    2054           0 :     return false;
    2055             :   }
    2056           0 :   return true;
    2057             : }
    2058             : 
    2059             : static const JSJitInfo mozCaptureStreamUntilEnded_methodinfo = {
    2060             :   { (JSJitGetterOp)mozCaptureStreamUntilEnded },
    2061             :   { prototypes::id::HTMLMediaElement },
    2062             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2063             :   JSJitInfo::Method,
    2064             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2065             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
    2066             :   false,  /* isInfallible. False in setters. */
    2067             :   false,  /* isMovable.  Not relevant for setters. */
    2068             :   false, /* isEliminatable.  Not relevant for setters. */
    2069             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2070             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2071             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2072             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2073             : };
    2074             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2075             : static_assert(0 < 1, "There is no slot for us");
    2076             : 
    2077             : static bool
    2078           0 : get_mozAudioCaptured(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    2079             : {
    2080           0 :   bool result(self->MozAudioCaptured());
    2081           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2082           0 :   args.rval().setBoolean(result);
    2083           0 :   return true;
    2084             : }
    2085             : 
    2086             : static const JSJitInfo mozAudioCaptured_getterinfo = {
    2087             :   { (JSJitGetterOp)get_mozAudioCaptured },
    2088             :   { prototypes::id::HTMLMediaElement },
    2089             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2090             :   JSJitInfo::Getter,
    2091             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2092             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    2093             :   true,  /* isInfallible. False in setters. */
    2094             :   false,  /* isMovable.  Not relevant for setters. */
    2095             :   false, /* isEliminatable.  Not relevant for setters. */
    2096             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2097             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2098             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2099             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2100             : };
    2101             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2102             : static_assert(0 < 1, "There is no slot for us");
    2103             : 
    2104             : static bool
    2105           0 : mozGetMetadata(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    2106             : {
    2107           0 :   binding_detail::FastErrorResult rv;
    2108           0 :   JS::Rooted<JSObject*> result(cx);
    2109           0 :   self->MozGetMetadata(cx, &result, rv);
    2110           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2111           0 :     return false;
    2112             :   }
    2113           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2114           0 :   if (result) {
    2115           0 :                 JS::ExposeObjectToActiveJS(result);
    2116             :               }
    2117           0 :               args.rval().setObjectOrNull(result);
    2118           0 :   if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
    2119           0 :     return false;
    2120             :   }
    2121           0 :   return true;
    2122             : }
    2123             : 
    2124             : static const JSJitInfo mozGetMetadata_methodinfo = {
    2125             :   { (JSJitGetterOp)mozGetMetadata },
    2126             :   { prototypes::id::HTMLMediaElement },
    2127             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2128             :   JSJitInfo::Method,
    2129             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2130             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
    2131             :   false,  /* isInfallible. False in setters. */
    2132             :   false,  /* isMovable.  Not relevant for setters. */
    2133             :   false, /* isEliminatable.  Not relevant for setters. */
    2134             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2135             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2136             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2137             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2138             : };
    2139             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2140             : static_assert(0 < 1, "There is no slot for us");
    2141             : 
    2142             : static bool
    2143           0 : get_mozFragmentEnd(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    2144             : {
    2145           0 :   double result(self->MozFragmentEnd());
    2146           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2147           0 :   args.rval().set(JS_NumberValue(double(result)));
    2148           0 :   return true;
    2149             : }
    2150             : 
    2151             : static const JSJitInfo mozFragmentEnd_getterinfo = {
    2152             :   { (JSJitGetterOp)get_mozFragmentEnd },
    2153             :   { prototypes::id::HTMLMediaElement },
    2154             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2155             :   JSJitInfo::Getter,
    2156             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2157             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
    2158             :   true,  /* isInfallible. False in setters. */
    2159             :   false,  /* isMovable.  Not relevant for setters. */
    2160             :   false, /* isEliminatable.  Not relevant for setters. */
    2161             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2162             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2163             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2164             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2165             : };
    2166             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2167             : static_assert(0 < 1, "There is no slot for us");
    2168             : 
    2169             : static bool
    2170           0 : reportCanPlayTelemetry(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    2171             : {
    2172           0 :   self->ReportCanPlayTelemetry();
    2173           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2174           0 :   args.rval().setUndefined();
    2175           0 :   return true;
    2176             : }
    2177             : 
    2178             : static const JSJitInfo reportCanPlayTelemetry_methodinfo = {
    2179             :   { (JSJitGetterOp)reportCanPlayTelemetry },
    2180             :   { prototypes::id::HTMLMediaElement },
    2181             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2182             :   JSJitInfo::Method,
    2183             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2184             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2185             :   true,  /* isInfallible. False in setters. */
    2186             :   false,  /* isMovable.  Not relevant for setters. */
    2187             :   false, /* isEliminatable.  Not relevant for setters. */
    2188             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2189             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2190             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2191             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2192             : };
    2193             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2194             : static_assert(0 < 1, "There is no slot for us");
    2195             : 
    2196             : static bool
    2197           0 : get_mediaKeys(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    2198             : {
    2199           0 :   auto result(StrongOrRawPtr<mozilla::dom::MediaKeys>(self->GetMediaKeys()));
    2200           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2201           0 :   if (!result) {
    2202           0 :     args.rval().setNull();
    2203           0 :     return true;
    2204             :   }
    2205           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    2206           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    2207           0 :     return false;
    2208             :   }
    2209           0 :   return true;
    2210             : }
    2211             : 
    2212             : static const JSJitInfo mediaKeys_getterinfo = {
    2213             :   { (JSJitGetterOp)get_mediaKeys },
    2214             :   { prototypes::id::HTMLMediaElement },
    2215             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2216             :   JSJitInfo::Getter,
    2217             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2218             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
    2219             :   false,  /* isInfallible. False in setters. */
    2220             :   false,  /* isMovable.  Not relevant for setters. */
    2221             :   false, /* isEliminatable.  Not relevant for setters. */
    2222             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2223             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2224             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2225             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2226             : };
    2227             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2228             : static_assert(0 < 1, "There is no slot for us");
    2229             : 
    2230             : static bool
    2231           0 : setMediaKeys(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    2232             : {
    2233           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    2234           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "HTMLMediaElement.setMediaKeys");
    2235             :   }
    2236             :   mozilla::dom::MediaKeys* arg0;
    2237           0 :   if (args[0].isObject()) {
    2238             :     {
    2239           0 :       nsresult rv = UnwrapObject<prototypes::id::MediaKeys, mozilla::dom::MediaKeys>(args[0], arg0);
    2240           0 :       if (NS_FAILED(rv)) {
    2241           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of HTMLMediaElement.setMediaKeys", "MediaKeys");
    2242           0 :         return false;
    2243             :       }
    2244             :     }
    2245           0 :   } else if (args[0].isNullOrUndefined()) {
    2246           0 :     arg0 = nullptr;
    2247             :   } else {
    2248           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of HTMLMediaElement.setMediaKeys");
    2249           0 :     return false;
    2250             :   }
    2251           0 :   binding_detail::FastErrorResult rv;
    2252           0 :   auto result(StrongOrRawPtr<Promise>(self->SetMediaKeys(Constify(arg0), rv)));
    2253           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2254           0 :     return false;
    2255             :   }
    2256           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2257             :   static_assert(!IsPointer<decltype(result)>::value,
    2258             :                 "NewObject implies that we need to keep the object alive with a strong reference.");
    2259           0 :   if (!ToJSValue(cx, result, args.rval())) {
    2260           0 :     return false;
    2261             :   }
    2262           0 :   return true;
    2263             : }
    2264             : 
    2265             : static bool
    2266           0 : setMediaKeys_promiseWrapper(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    2267             : {
    2268             :   // Make sure to save the callee before someone maybe messes
    2269             :   // with rval().
    2270           0 :   JS::Rooted<JSObject*> callee(cx, &args.callee());
    2271           0 :   bool ok = setMediaKeys(cx, obj, self, args);
    2272           0 :   if (ok) {
    2273           0 :     return true;
    2274             :   }
    2275           0 :   return ConvertExceptionToPromise(cx, xpc::XrayAwareCalleeGlobal(callee),
    2276           0 :                                    args.rval());
    2277             : }
    2278             : 
    2279             : static const JSJitInfo setMediaKeys_methodinfo = {
    2280             :   { (JSJitGetterOp)setMediaKeys_promiseWrapper },
    2281             :   { prototypes::id::HTMLMediaElement },
    2282             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2283             :   JSJitInfo::Method,
    2284             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2285             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
    2286             :   false,  /* isInfallible. False in setters. */
    2287             :   false,  /* isMovable.  Not relevant for setters. */
    2288             :   false, /* isEliminatable.  Not relevant for setters. */
    2289             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2290             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2291             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2292             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2293             : };
    2294             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2295             : static_assert(0 < 1, "There is no slot for us");
    2296             : 
    2297             : static bool
    2298           0 : get_onencrypted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    2299             : {
    2300           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnencrypted());
    2301           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2302           0 :   if (result) {
    2303           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
    2304           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
    2305           0 :       return false;
    2306             :     }
    2307           0 :     return true;
    2308             :   } else {
    2309           0 :     args.rval().setNull();
    2310           0 :     return true;
    2311             :   }
    2312             : }
    2313             : 
    2314             : static bool
    2315           0 : set_onencrypted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
    2316             : {
    2317           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
    2318           0 :   if (args[0].isObject()) {
    2319             :     { // scope for tempRoot
    2320           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
    2321           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
    2322             :     }
    2323             :   } else {
    2324           0 :     arg0 = nullptr;
    2325             :   }
    2326           0 :   self->SetOnencrypted(Constify(arg0));
    2327           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2328             : 
    2329           0 :   return true;
    2330             : }
    2331             : 
    2332             : static const JSJitInfo onencrypted_getterinfo = {
    2333             :   { (JSJitGetterOp)get_onencrypted },
    2334             :   { prototypes::id::HTMLMediaElement },
    2335             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2336             :   JSJitInfo::Getter,
    2337             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2338             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
    2339             :   false,  /* isInfallible. False in setters. */
    2340             :   false,  /* isMovable.  Not relevant for setters. */
    2341             :   false, /* isEliminatable.  Not relevant for setters. */
    2342             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2343             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2344             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2345             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2346             : };
    2347             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2348             : static_assert(0 < 1, "There is no slot for us");
    2349             : static const JSJitInfo onencrypted_setterinfo = {
    2350             :   { (JSJitGetterOp)set_onencrypted },
    2351             :   { prototypes::id::HTMLMediaElement },
    2352             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2353             :   JSJitInfo::Setter,
    2354             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2355             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2356             :   false,  /* isInfallible. False in setters. */
    2357             :   false,  /* isMovable.  Not relevant for setters. */
    2358             :   false, /* isEliminatable.  Not relevant for setters. */
    2359             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2360             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2361             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2362             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2363             : };
    2364             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2365             : static_assert(0 < 1, "There is no slot for us");
    2366             : 
    2367             : static bool
    2368           0 : get_onwaitingforkey(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    2369             : {
    2370           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnwaitingforkey());
    2371           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2372           0 :   if (result) {
    2373           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
    2374           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
    2375           0 :       return false;
    2376             :     }
    2377           0 :     return true;
    2378             :   } else {
    2379           0 :     args.rval().setNull();
    2380           0 :     return true;
    2381             :   }
    2382             : }
    2383             : 
    2384             : static bool
    2385           0 : set_onwaitingforkey(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitSetterCallArgs args)
    2386             : {
    2387           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
    2388           0 :   if (args[0].isObject()) {
    2389             :     { // scope for tempRoot
    2390           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
    2391           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
    2392             :     }
    2393             :   } else {
    2394           0 :     arg0 = nullptr;
    2395             :   }
    2396           0 :   self->SetOnwaitingforkey(Constify(arg0));
    2397           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2398             : 
    2399           0 :   return true;
    2400             : }
    2401             : 
    2402             : static const JSJitInfo onwaitingforkey_getterinfo = {
    2403             :   { (JSJitGetterOp)get_onwaitingforkey },
    2404             :   { prototypes::id::HTMLMediaElement },
    2405             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2406             :   JSJitInfo::Getter,
    2407             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2408             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
    2409             :   false,  /* isInfallible. False in setters. */
    2410             :   false,  /* isMovable.  Not relevant for setters. */
    2411             :   false, /* isEliminatable.  Not relevant for setters. */
    2412             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2413             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2414             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2415             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2416             : };
    2417             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2418             : static_assert(0 < 1, "There is no slot for us");
    2419             : static const JSJitInfo onwaitingforkey_setterinfo = {
    2420             :   { (JSJitGetterOp)set_onwaitingforkey },
    2421             :   { prototypes::id::HTMLMediaElement },
    2422             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2423             :   JSJitInfo::Setter,
    2424             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2425             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2426             :   false,  /* isInfallible. False in setters. */
    2427             :   false,  /* isMovable.  Not relevant for setters. */
    2428             :   false, /* isEliminatable.  Not relevant for setters. */
    2429             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2430             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2431             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2432             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2433             : };
    2434             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2435             : static_assert(0 < 1, "There is no slot for us");
    2436             : 
    2437             : static bool
    2438           0 : get_computedVolume(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    2439             : {
    2440           0 :   double result(self->ComputedVolume());
    2441           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2442           0 :   args.rval().set(JS_NumberValue(double(result)));
    2443           0 :   return true;
    2444             : }
    2445             : 
    2446             : static const JSJitInfo computedVolume_getterinfo = {
    2447             :   { (JSJitGetterOp)get_computedVolume },
    2448             :   { prototypes::id::HTMLMediaElement },
    2449             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2450             :   JSJitInfo::Getter,
    2451             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2452             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
    2453             :   true,  /* isInfallible. False in setters. */
    2454             :   false,  /* isMovable.  Not relevant for setters. */
    2455             :   false, /* isEliminatable.  Not relevant for setters. */
    2456             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2457             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2458             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2459             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2460             : };
    2461             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2462             : static_assert(0 < 1, "There is no slot for us");
    2463             : 
    2464             : static bool
    2465           0 : get_computedMuted(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    2466             : {
    2467           0 :   bool result(self->ComputedMuted());
    2468           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2469           0 :   args.rval().setBoolean(result);
    2470           0 :   return true;
    2471             : }
    2472             : 
    2473             : static const JSJitInfo computedMuted_getterinfo = {
    2474             :   { (JSJitGetterOp)get_computedMuted },
    2475             :   { prototypes::id::HTMLMediaElement },
    2476             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2477             :   JSJitInfo::Getter,
    2478             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2479             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    2480             :   true,  /* isInfallible. False in setters. */
    2481             :   false,  /* isMovable.  Not relevant for setters. */
    2482             :   false, /* isEliminatable.  Not relevant for setters. */
    2483             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2484             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2485             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2486             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2487             : };
    2488             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2489             : static_assert(0 < 1, "There is no slot for us");
    2490             : 
    2491             : static bool
    2492           0 : get_computedSuspended(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, JSJitGetterCallArgs args)
    2493             : {
    2494           0 :   uint32_t result(self->ComputedSuspended());
    2495           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2496           0 :   args.rval().setNumber(result);
    2497           0 :   return true;
    2498             : }
    2499             : 
    2500             : static const JSJitInfo computedSuspended_getterinfo = {
    2501             :   { (JSJitGetterOp)get_computedSuspended },
    2502             :   { prototypes::id::HTMLMediaElement },
    2503             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2504             :   JSJitInfo::Getter,
    2505             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2506             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
    2507             :   true,  /* isInfallible. False in setters. */
    2508             :   false,  /* isMovable.  Not relevant for setters. */
    2509             :   false, /* isEliminatable.  Not relevant for setters. */
    2510             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2511             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2512             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2513             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2514             : };
    2515             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2516             : static_assert(0 < 1, "There is no slot for us");
    2517             : 
    2518             : static bool
    2519           0 : seekToNextFrame(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    2520             : {
    2521           0 :   binding_detail::FastErrorResult rv;
    2522           0 :   auto result(StrongOrRawPtr<Promise>(self->SeekToNextFrame(rv)));
    2523           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2524           0 :     return false;
    2525             :   }
    2526           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2527           0 :   if (!ToJSValue(cx, result, args.rval())) {
    2528           0 :     return false;
    2529             :   }
    2530           0 :   return true;
    2531             : }
    2532             : 
    2533             : static bool
    2534           0 : seekToNextFrame_promiseWrapper(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    2535             : {
    2536             :   // Make sure to save the callee before someone maybe messes
    2537             :   // with rval().
    2538           0 :   JS::Rooted<JSObject*> callee(cx, &args.callee());
    2539           0 :   bool ok = seekToNextFrame(cx, obj, self, args);
    2540           0 :   if (ok) {
    2541           0 :     return true;
    2542             :   }
    2543           0 :   return ConvertExceptionToPromise(cx, xpc::XrayAwareCalleeGlobal(callee),
    2544           0 :                                    args.rval());
    2545             : }
    2546             : 
    2547             : static const JSJitInfo seekToNextFrame_methodinfo = {
    2548             :   { (JSJitGetterOp)seekToNextFrame_promiseWrapper },
    2549             :   { prototypes::id::HTMLMediaElement },
    2550             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2551             :   JSJitInfo::Method,
    2552             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2553             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
    2554             :   false,  /* isInfallible. False in setters. */
    2555             :   false,  /* isMovable.  Not relevant for setters. */
    2556             :   false, /* isEliminatable.  Not relevant for setters. */
    2557             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2558             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2559             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2560             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2561             : };
    2562             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2563             : static_assert(0 < 1, "There is no slot for us");
    2564             : 
    2565             : static bool
    2566           0 : setVisible(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    2567             : {
    2568           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    2569           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "HTMLMediaElement.setVisible");
    2570             :   }
    2571             :   bool arg0;
    2572           0 :   if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    2573           0 :     return false;
    2574             :   }
    2575           0 :   self->SetVisible(arg0);
    2576           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2577           0 :   args.rval().setUndefined();
    2578           0 :   return true;
    2579             : }
    2580             : 
    2581             : static const JSJitInfo setVisible_methodinfo = {
    2582             :   { (JSJitGetterOp)setVisible },
    2583             :   { prototypes::id::HTMLMediaElement },
    2584             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2585             :   JSJitInfo::Method,
    2586             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2587             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2588             :   false,  /* isInfallible. False in setters. */
    2589             :   false,  /* isMovable.  Not relevant for setters. */
    2590             :   false, /* isEliminatable.  Not relevant for setters. */
    2591             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2592             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2593             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2594             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2595             : };
    2596             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2597             : static_assert(0 < 1, "There is no slot for us");
    2598             : 
    2599             : static bool
    2600           0 : hasSuspendTaint(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::HTMLMediaElement* self, const JSJitMethodCallArgs& args)
    2601             : {
    2602           0 :   bool result(self->HasSuspendTaint());
    2603           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2604           0 :   args.rval().setBoolean(result);
    2605           0 :   return true;
    2606             : }
    2607             : 
    2608             : static const JSJitInfo hasSuspendTaint_methodinfo = {
    2609             :   { (JSJitGetterOp)hasSuspendTaint },
    2610             :   { prototypes::id::HTMLMediaElement },
    2611             :   { PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth },
    2612             :   JSJitInfo::Method,
    2613             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2614             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    2615             :   true,  /* isInfallible. False in setters. */
    2616             :   false,  /* isMovable.  Not relevant for setters. */
    2617             :   false, /* isEliminatable.  Not relevant for setters. */
    2618             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2619             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2620             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2621             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2622             : };
    2623             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2624             : static_assert(0 < 1, "There is no slot for us");
    2625             : 
    2626             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
    2627             : #if defined(__clang__)
    2628             : #pragma clang diagnostic push
    2629             : #pragma clang diagnostic ignored "-Wmissing-braces"
    2630             : #endif
    2631             : static const JSFunctionSpec sMethods_specs[] = {
    2632             :   JS_FNSPEC("load", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&load_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2633             :   JS_FNSPEC("canPlayType", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&canPlayType_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2634             :   JS_FNSPEC("fastSeek", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&fastSeek_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2635             :   JS_FNSPEC("play", GenericPromiseReturningBindingMethod, reinterpret_cast<const JSJitInfo*>(&play_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2636             :   JS_FNSPEC("pause", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&pause_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2637             :   JS_FNSPEC("addTextTrack", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&addTextTrack_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2638             :   JS_FS_END,
    2639             :   JS_FNSPEC("mozRequestDebugInfo", GenericPromiseReturningBindingMethod, reinterpret_cast<const JSJitInfo*>(&mozRequestDebugInfo_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2640             :   JS_FS_END,
    2641             :   JS_FNSPEC("mozDumpDebugInfo", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&mozDumpDebugInfo_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2642             :   JS_FS_END,
    2643             :   JS_FNSPEC("mozCaptureStream", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&mozCaptureStream_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2644             :   JS_FNSPEC("mozCaptureStreamUntilEnded", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&mozCaptureStreamUntilEnded_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2645             :   JS_FNSPEC("mozGetMetadata", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&mozGetMetadata_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2646             :   JS_FNSPEC("setMediaKeys", GenericPromiseReturningBindingMethod, reinterpret_cast<const JSJitInfo*>(&setMediaKeys_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2647             :   JS_FS_END,
    2648             :   JS_FNSPEC("seekToNextFrame", GenericPromiseReturningBindingMethod, reinterpret_cast<const JSJitInfo*>(&seekToNextFrame_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2649             :   JS_FS_END,
    2650             :   JS_FNSPEC("setVisible", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&setVisible_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2651             :   JS_FNSPEC("hasSuspendTaint", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&hasSuspendTaint_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2652             :   JS_FS_END
    2653             : };
    2654             : #if defined(__clang__)
    2655             : #pragma clang diagnostic pop
    2656             : #endif
    2657             : 
    2658             : static PrefableDisablers sMethods_disablers7 = {
    2659             :   true, false, 0, &HasDebuggerPrivilege
    2660             : };
    2661             : 
    2662             : static PrefableDisablers sMethods_disablers9 = {
    2663             :   true, false, 0, nullptr
    2664             : };
    2665             : 
    2666             : static PrefableDisablers sMethods_disablers16 = {
    2667             :   true, false, 0, nullptr
    2668             : };
    2669             : 
    2670             : static PrefableDisablers sMethods_disablers18 = {
    2671             :   true, false, 0, nullptr
    2672             : };
    2673             : 
    2674             : // Can't be const because the pref-enabled boolean needs to be writable
    2675             : static Prefable<const JSFunctionSpec> sMethods[] = {
    2676             :   { nullptr, &sMethods_specs[0] },
    2677             :   { &sMethods_disablers7, &sMethods_specs[7] },
    2678             :   { &sMethods_disablers9, &sMethods_specs[9] },
    2679             :   { nullptr, &sMethods_specs[11] },
    2680             :   { &sMethods_disablers16, &sMethods_specs[16] },
    2681             :   { &sMethods_disablers18, &sMethods_specs[18] },
    2682             :   { nullptr, nullptr }
    2683             : };
    2684             : 
    2685             : static_assert(6 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
    2686             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
    2687             : static_assert(6 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
    2688             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
    2689             : 
    2690             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
    2691             : #if defined(__clang__)
    2692             : #pragma clang diagnostic push
    2693             : #pragma clang diagnostic ignored "-Wmissing-braces"
    2694             : #endif
    2695             : static const JSFunctionSpec sChromeMethods_specs[] = {
    2696             :   JS_FNSPEC("reportCanPlayTelemetry", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&reportCanPlayTelemetry_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2697             :   JS_FS_END
    2698             : };
    2699             : #if defined(__clang__)
    2700             : #pragma clang diagnostic pop
    2701             : #endif
    2702             : 
    2703             : 
    2704             : // Can't be const because the pref-enabled boolean needs to be writable
    2705             : static Prefable<const JSFunctionSpec> sChromeMethods[] = {
    2706             :   { nullptr, &sChromeMethods_specs[0] },
    2707             :   { nullptr, nullptr }
    2708             : };
    2709             : 
    2710             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
    2711             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
    2712             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
    2713             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
    2714             : 
    2715             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
    2716             : #if defined(__clang__)
    2717             : #pragma clang diagnostic push
    2718             : #pragma clang diagnostic ignored "-Wmissing-braces"
    2719             : #endif
    2720             : static const JSPropertySpec sAttributes_specs[] = {
    2721             :   { "error", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &error_getterinfo, nullptr, nullptr },
    2722             :   { "src", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &src_getterinfo, GenericBindingSetter, &src_setterinfo },
    2723             :   { "currentSrc", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &currentSrc_getterinfo, nullptr, nullptr },
    2724             :   { "crossOrigin", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &crossOrigin_getterinfo, GenericBindingSetter, &crossOrigin_setterinfo },
    2725             :   { "networkState", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &networkState_getterinfo, nullptr, nullptr },
    2726             :   { "preload", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &preload_getterinfo, GenericBindingSetter, &preload_setterinfo },
    2727             :   { "buffered", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &buffered_getterinfo, nullptr, nullptr },
    2728             :   { "readyState", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &readyState_getterinfo, nullptr, nullptr },
    2729             :   { "seeking", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &seeking_getterinfo, nullptr, nullptr },
    2730             :   { "currentTime", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &currentTime_getterinfo, GenericBindingSetter, &currentTime_setterinfo },
    2731             :   { "duration", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &duration_getterinfo, nullptr, nullptr },
    2732             :   { "paused", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &paused_getterinfo, nullptr, nullptr },
    2733             :   { "defaultPlaybackRate", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &defaultPlaybackRate_getterinfo, GenericBindingSetter, &defaultPlaybackRate_setterinfo },
    2734             :   { "playbackRate", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &playbackRate_getterinfo, GenericBindingSetter, &playbackRate_setterinfo },
    2735             :   { "played", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &played_getterinfo, nullptr, nullptr },
    2736             :   { "seekable", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &seekable_getterinfo, nullptr, nullptr },
    2737             :   { "ended", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &ended_getterinfo, nullptr, nullptr },
    2738             :   { "autoplay", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &autoplay_getterinfo, GenericBindingSetter, &autoplay_setterinfo },
    2739             :   { "loop", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &loop_getterinfo, GenericBindingSetter, &loop_setterinfo },
    2740             :   { "controls", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &controls_getterinfo, GenericBindingSetter, &controls_setterinfo },
    2741             :   { "volume", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &volume_getterinfo, GenericBindingSetter, &volume_setterinfo },
    2742             :   { "muted", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &muted_getterinfo, GenericBindingSetter, &muted_setterinfo },
    2743             :   { "defaultMuted", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &defaultMuted_getterinfo, GenericBindingSetter, &defaultMuted_setterinfo },
    2744             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr },
    2745             :   { "audioTracks", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &audioTracks_getterinfo, nullptr, nullptr },
    2746             :   { "videoTracks", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &videoTracks_getterinfo, nullptr, nullptr },
    2747             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr },
    2748             :   { "textTracks", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &textTracks_getterinfo, nullptr, nullptr },
    2749             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr },
    2750             :   { "mozMediaSourceObject", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mozMediaSourceObject_getterinfo, nullptr, nullptr },
    2751             :   { "mozDebugReaderData", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mozDebugReaderData_getterinfo, nullptr, nullptr },
    2752             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr },
    2753             :   { "srcObject", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &srcObject_getterinfo, GenericBindingSetter, &srcObject_setterinfo },
    2754             :   { "mozSrcObject", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mozSrcObject_getterinfo, GenericBindingSetter, &mozSrcObject_setterinfo },
    2755             :   { "mozPreservesPitch", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mozPreservesPitch_getterinfo, GenericBindingSetter, &mozPreservesPitch_setterinfo },
    2756             :   { "mozAutoplayEnabled", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mozAutoplayEnabled_getterinfo, nullptr, nullptr },
    2757             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr },
    2758             :   { "mozAllowCasting", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mozAllowCasting_getterinfo, GenericBindingSetter, &mozAllowCasting_setterinfo },
    2759             :   { "mozIsCasting", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mozIsCasting_getterinfo, GenericBindingSetter, &mozIsCasting_setterinfo },
    2760             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr },
    2761             :   { "mozAudioCaptured", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mozAudioCaptured_getterinfo, nullptr, nullptr },
    2762             :   { "mozFragmentEnd", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mozFragmentEnd_getterinfo, nullptr, nullptr },
    2763             :   { "mediaKeys", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mediaKeys_getterinfo, nullptr, nullptr },
    2764             :   { "onencrypted", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onencrypted_getterinfo, GenericBindingSetter, &onencrypted_setterinfo },
    2765             :   { "onwaitingforkey", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onwaitingforkey_getterinfo, GenericBindingSetter, &onwaitingforkey_setterinfo },
    2766             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr },
    2767             :   { "computedVolume", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &computedVolume_getterinfo, nullptr, nullptr },
    2768             :   { "computedMuted", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &computedMuted_getterinfo, nullptr, nullptr },
    2769             :   { "computedSuspended", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &computedSuspended_getterinfo, nullptr, nullptr },
    2770             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
    2771             : };
    2772             : #if defined(__clang__)
    2773             : #pragma clang diagnostic pop
    2774             : #endif
    2775             : 
    2776             : static PrefableDisablers sAttributes_disablers24 = {
    2777             :   true, false, 0, nullptr
    2778             : };
    2779             : 
    2780             : static PrefableDisablers sAttributes_disablers29 = {
    2781             :   true, false, 0, &HasDebuggerPrivilege
    2782             : };
    2783             : 
    2784             : static PrefableDisablers sAttributes_disablers37 = {
    2785             :   true, false, 0, &IsChromeOrXBL
    2786             : };
    2787             : 
    2788             : static PrefableDisablers sAttributes_disablers46 = {
    2789             :   true, false, 0, nullptr
    2790             : };
    2791             : 
    2792             : // Can't be const because the pref-enabled boolean needs to be writable
    2793             : static Prefable<const JSPropertySpec> sAttributes[] = {
    2794             :   { nullptr, &sAttributes_specs[0] },
    2795             :   { &sAttributes_disablers24, &sAttributes_specs[24] },
    2796             :   { nullptr, &sAttributes_specs[27] },
    2797             :   { &sAttributes_disablers29, &sAttributes_specs[29] },
    2798             :   { nullptr, &sAttributes_specs[32] },
    2799             :   { &sAttributes_disablers37, &sAttributes_specs[37] },
    2800             :   { nullptr, &sAttributes_specs[40] },
    2801             :   { &sAttributes_disablers46, &sAttributes_specs[46] },
    2802             :   { nullptr, nullptr }
    2803             : };
    2804             : 
    2805             : static_assert(8 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
    2806             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
    2807             : static_assert(23 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
    2808             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
    2809             : 
    2810             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
    2811             : #if defined(__clang__)
    2812             : #pragma clang diagnostic push
    2813             : #pragma clang diagnostic ignored "-Wmissing-braces"
    2814             : #endif
    2815             : static const JSPropertySpec sChromeAttributes_specs[] = {
    2816             :   { "isEncrypted", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &isEncrypted_getterinfo, nullptr, nullptr },
    2817             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
    2818             : };
    2819             : #if defined(__clang__)
    2820             : #pragma clang diagnostic pop
    2821             : #endif
    2822             : 
    2823             : 
    2824             : // Can't be const because the pref-enabled boolean needs to be writable
    2825             : static Prefable<const JSPropertySpec> sChromeAttributes[] = {
    2826             :   { nullptr, &sChromeAttributes_specs[0] },
    2827             :   { nullptr, nullptr }
    2828             : };
    2829             : 
    2830             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
    2831             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
    2832             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
    2833             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
    2834             : 
    2835             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
    2836             : #if defined(__clang__)
    2837             : #pragma clang diagnostic push
    2838             : #pragma clang diagnostic ignored "-Wmissing-braces"
    2839             : #endif
    2840             : static const ConstantSpec sConstants_specs[] = {
    2841             :   { "NETWORK_EMPTY", JS::Int32Value(0) },
    2842             :   { "NETWORK_IDLE", JS::Int32Value(1) },
    2843             :   { "NETWORK_LOADING", JS::Int32Value(2) },
    2844             :   { "NETWORK_NO_SOURCE", JS::Int32Value(3) },
    2845             :   { "HAVE_NOTHING", JS::Int32Value(0) },
    2846             :   { "HAVE_METADATA", JS::Int32Value(1) },
    2847             :   { "HAVE_CURRENT_DATA", JS::Int32Value(2) },
    2848             :   { "HAVE_FUTURE_DATA", JS::Int32Value(3) },
    2849             :   { "HAVE_ENOUGH_DATA", JS::Int32Value(4) },
    2850             :   { 0, JS::UndefinedValue() }
    2851             : };
    2852             : #if defined(__clang__)
    2853             : #pragma clang diagnostic pop
    2854             : #endif
    2855             : 
    2856             : 
    2857             : // Can't be const because the pref-enabled boolean needs to be writable
    2858             : static Prefable<const ConstantSpec> sConstants[] = {
    2859             :   { nullptr, &sConstants_specs[0] },
    2860             :   { nullptr, nullptr }
    2861             : };
    2862             : 
    2863             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
    2864             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
    2865             : static_assert(9 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
    2866             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
    2867             : 
    2868             : 
    2869             : static uint16_t sNativeProperties_sortedPropertyIndices[66];
    2870             : static PropertyInfo sNativeProperties_propertyInfos[66];
    2871             : 
    2872             : static const NativePropertiesN<3> sNativeProperties = {
    2873             :   false, 0,
    2874             :   false, 0,
    2875             :   true,  0 /* sMethods */,
    2876             :   true,  1 /* sAttributes */,
    2877             :   false, 0,
    2878             :   false, 0,
    2879             :   true,  2 /* sConstants */,
    2880             :   -1,
    2881             :   66,
    2882             :   sNativeProperties_sortedPropertyIndices,
    2883             :   {
    2884             :     { sMethods, &sNativeProperties_propertyInfos[0] },
    2885             :     { sAttributes, &sNativeProperties_propertyInfos[15] },
    2886             :     { sConstants, &sNativeProperties_propertyInfos[57] }
    2887             :   }
    2888             : };
    2889             : static_assert(66 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
    2890             :     "We have a property info count that is oversized");
    2891             : 
    2892             : static uint16_t sChromeOnlyNativeProperties_sortedPropertyIndices[2];
    2893             : static PropertyInfo sChromeOnlyNativeProperties_propertyInfos[2];
    2894             : 
    2895             : static const NativePropertiesN<2> sChromeOnlyNativeProperties = {
    2896             :   false, 0,
    2897             :   false, 0,
    2898             :   true,  0 /* sChromeMethods */,
    2899             :   true,  1 /* sChromeAttributes */,
    2900             :   false, 0,
    2901             :   false, 0,
    2902             :   false, 0,
    2903             :   -1,
    2904             :   2,
    2905             :   sChromeOnlyNativeProperties_sortedPropertyIndices,
    2906             :   {
    2907             :     { sChromeMethods, &sChromeOnlyNativeProperties_propertyInfos[0] },
    2908             :     { sChromeAttributes, &sChromeOnlyNativeProperties_propertyInfos[1] }
    2909             :   }
    2910             : };
    2911             : static_assert(2 < 1ull << CHAR_BIT * sizeof(sChromeOnlyNativeProperties.propertyInfoCount),
    2912             :     "We have a property info count that is oversized");
    2913             : 
    2914             : static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
    2915             :   {
    2916             :     "Function",
    2917             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
    2918             :     &sBoringInterfaceObjectClassClassOps,
    2919             :     JS_NULL_CLASS_SPEC,
    2920             :     JS_NULL_CLASS_EXT,
    2921             :     &sInterfaceObjectClassObjectOps
    2922             :   },
    2923             :   eInterface,
    2924             :   true,
    2925             :   prototypes::id::HTMLMediaElement,
    2926             :   PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth,
    2927             :   sNativePropertyHooks,
    2928             :   "function HTMLMediaElement() {\n    [native code]\n}",
    2929             :   HTMLElementBinding::GetConstructorObject
    2930             : };
    2931             : 
    2932             : static const DOMIfaceAndProtoJSClass sPrototypeClass = {
    2933             :   {
    2934             :     "HTMLMediaElementPrototype",
    2935             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
    2936             :     JS_NULL_CLASS_OPS,
    2937             :     JS_NULL_CLASS_SPEC,
    2938             :     JS_NULL_CLASS_EXT,
    2939             :     JS_NULL_OBJECT_OPS
    2940             :   },
    2941             :   eInterfacePrototype,
    2942             :   false,
    2943             :   prototypes::id::HTMLMediaElement,
    2944             :   PrototypeTraits<prototypes::id::HTMLMediaElement>::Depth,
    2945             :   sNativePropertyHooks,
    2946             :   "[object HTMLMediaElementPrototype]",
    2947             :   HTMLElementBinding::GetProtoObject
    2948             : };
    2949             : 
    2950             : JSObject*
    2951           0 : DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
    2952             : {
    2953           0 :   return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
    2954             : }
    2955             : 
    2956             : const NativePropertyHooks sNativePropertyHooks[] = { {
    2957             :   nullptr,
    2958             :   nullptr,
    2959             :   nullptr,
    2960             :   { sNativeProperties.Upcast(), sChromeOnlyNativeProperties.Upcast() },
    2961             :   prototypes::id::HTMLMediaElement,
    2962             :   constructors::id::HTMLMediaElement,
    2963             :   HTMLElementBinding::sNativePropertyHooks,
    2964             :   &DefaultXrayExpandoObjectClass
    2965             : } };
    2966             : 
    2967             : void
    2968           0 : CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
    2969             : {
    2970           0 :   JS::Handle<JSObject*> parentProto(HTMLElementBinding::GetProtoObjectHandle(aCx));
    2971           0 :   if (!parentProto) {
    2972           0 :     return;
    2973             :   }
    2974             : 
    2975           0 :   JS::Handle<JSObject*> constructorProto(HTMLElementBinding::GetConstructorObjectHandle(aCx));
    2976           0 :   if (!constructorProto) {
    2977           0 :     return;
    2978             :   }
    2979             : 
    2980             :   static bool sIdsInited = false;
    2981           0 :   if (!sIdsInited && NS_IsMainThread()) {
    2982           0 :     if (!InitIds(aCx, sNativeProperties.Upcast())) {
    2983           0 :       return;
    2984             :     }
    2985           0 :     if (!InitIds(aCx, sChromeOnlyNativeProperties.Upcast())) {
    2986           0 :       return;
    2987             :     }
    2988           0 :     sIdsInited = true;
    2989             :   }
    2990             : 
    2991             :   static bool sPrefCachesInited = false;
    2992           0 :   if (!sPrefCachesInited && NS_IsMainThread()) {
    2993           0 :     sPrefCachesInited = true;
    2994           0 :     Preferences::AddBoolVarCache(&sMethods[2].disablers->enabled, "media.test.dumpDebugInfo");
    2995           0 :     Preferences::AddBoolVarCache(&sMethods[4].disablers->enabled, "media.seekToNextFrame.enabled");
    2996           0 :     Preferences::AddBoolVarCache(&sMethods[5].disablers->enabled, "media.test.video-suspend");
    2997           0 :     Preferences::AddBoolVarCache(&sAttributes[1].disablers->enabled, "media.track.enabled");
    2998           0 :     Preferences::AddBoolVarCache(&sAttributes[7].disablers->enabled, "media.useAudioChannelService.testing");
    2999             :   }
    3000             : 
    3001           0 :   JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::HTMLMediaElement);
    3002           0 :   JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::HTMLMediaElement);
    3003           0 :   dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
    3004             :                               &sPrototypeClass.mBase, protoCache,
    3005             :                               constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
    3006             :                               interfaceCache,
    3007             :                               sNativeProperties.Upcast(),
    3008           0 :                               nsContentUtils::ThreadsafeIsSystemCaller(aCx) ? sChromeOnlyNativeProperties.Upcast() : nullptr,
    3009             :                               "HTMLMediaElement", aDefineOnGlobal,
    3010             :                               nullptr,
    3011           0 :                               false);
    3012             : }
    3013             : 
    3014             : JS::Handle<JSObject*>
    3015           0 : GetProtoObjectHandle(JSContext* aCx)
    3016             : {
    3017             :   /* Get the interface prototype object for this class.  This will create the
    3018             :      object as needed. */
    3019           0 :   bool aDefineOnGlobal = true;
    3020             : 
    3021             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    3022           0 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    3023           0 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    3024           0 :     return nullptr;
    3025             :   }
    3026             : 
    3027             :   /* Check to see whether the interface objects are already installed */
    3028           0 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    3029           0 :   if (!protoAndIfaceCache.HasEntryInSlot(prototypes::id::HTMLMediaElement)) {
    3030           0 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    3031           0 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    3032             :   }
    3033             : 
    3034             :   /*
    3035             :    * The object might _still_ be null, but that's OK.
    3036             :    *
    3037             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    3038             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    3039             :    * changed after they have been set.
    3040             :    *
    3041             :    * Calling address() avoids the read read barrier that does gray
    3042             :    * unmarking, but it's not possible for the object to be gray here.
    3043             :    */
    3044             : 
    3045           0 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(prototypes::id::HTMLMediaElement);
    3046           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    3047           0 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    3048             : }
    3049             : 
    3050             : JSObject*
    3051           0 : GetProtoObject(JSContext* aCx)
    3052             : {
    3053           0 :   return GetProtoObjectHandle(aCx);
    3054             : }
    3055             : 
    3056             : JS::Handle<JSObject*>
    3057           0 : GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
    3058             : {
    3059             :   /* Get the interface object for this class.  This will create the object as
    3060             :      needed. */
    3061             : 
    3062             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    3063           0 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    3064           0 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    3065           0 :     return nullptr;
    3066             :   }
    3067             : 
    3068             :   /* Check to see whether the interface objects are already installed */
    3069           0 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    3070           0 :   if (!protoAndIfaceCache.HasEntryInSlot(constructors::id::HTMLMediaElement)) {
    3071           0 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    3072           0 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    3073             :   }
    3074             : 
    3075             :   /*
    3076             :    * The object might _still_ be null, but that's OK.
    3077             :    *
    3078             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    3079             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    3080             :    * changed after they have been set.
    3081             :    *
    3082             :    * Calling address() avoids the read read barrier that does gray
    3083             :    * unmarking, but it's not possible for the object to be gray here.
    3084             :    */
    3085             : 
    3086           0 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::HTMLMediaElement);
    3087           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    3088           0 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    3089             : }
    3090             : 
    3091             : JSObject*
    3092           0 : GetConstructorObject(JSContext* aCx)
    3093             : {
    3094           0 :   return GetConstructorObjectHandle(aCx);
    3095             : }
    3096             : 
    3097             : } // namespace HTMLMediaElementBinding
    3098             : 
    3099             : 
    3100             : 
    3101             : } // namespace dom
    3102             : } // namespace mozilla

Generated by: LCOV version 1.13