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

          Line data    Source code
       1             : /* THIS FILE IS AUTOGENERATED FROM DataChannel.webidl BY Codegen.py - DO NOT EDIT */
       2             : 
       3             : #include "DataChannelBinding.h"
       4             : #include "EventHandlerBinding.h"
       5             : #include "EventTargetBinding.h"
       6             : #include "WrapperFactory.h"
       7             : #include "jsapi.h"
       8             : #include "jsfriendapi.h"
       9             : #include "mozilla/OwningNonNull.h"
      10             : #include "mozilla/dom/BindingUtils.h"
      11             : #include "mozilla/dom/Blob.h"
      12             : #include "mozilla/dom/DOMJSClass.h"
      13             : #include "mozilla/dom/NonRefcountedDOMObject.h"
      14             : #include "mozilla/dom/Nullable.h"
      15             : #include "mozilla/dom/PrimitiveConversions.h"
      16             : #include "mozilla/dom/TypedArray.h"
      17             : #include "mozilla/dom/XrayExpandoClass.h"
      18             : #include "nsDOMDataChannel.h"
      19             : 
      20             : namespace mozilla {
      21             : namespace dom {
      22             : 
      23             : namespace RTCDataChannelStateValues {
      24             : extern const EnumEntry strings[5] = {
      25             :   {"connecting", 10},
      26             :   {"open", 4},
      27             :   {"closing", 7},
      28             :   {"closed", 6},
      29             :   { nullptr, 0 }
      30             : };
      31             : } // namespace RTCDataChannelStateValues
      32             : 
      33             : bool
      34           0 : ToJSValue(JSContext* aCx, RTCDataChannelState aArgument, JS::MutableHandle<JS::Value> aValue)
      35             : {
      36           0 :   MOZ_ASSERT(uint32_t(aArgument) < ArrayLength(RTCDataChannelStateValues::strings));
      37             :   JSString* resultStr =
      38           0 :     JS_NewStringCopyN(aCx, RTCDataChannelStateValues::strings[uint32_t(aArgument)].value,
      39           0 :                       RTCDataChannelStateValues::strings[uint32_t(aArgument)].length);
      40           0 :   if (!resultStr) {
      41           0 :     return false;
      42             :   }
      43           0 :   aValue.setString(resultStr);
      44           0 :   return true;
      45             : }
      46             : 
      47             : 
      48             : namespace RTCDataChannelTypeValues {
      49             : extern const EnumEntry strings[3] = {
      50             :   {"arraybuffer", 11},
      51             :   {"blob", 4},
      52             :   { nullptr, 0 }
      53             : };
      54             : } // namespace RTCDataChannelTypeValues
      55             : 
      56             : bool
      57           0 : ToJSValue(JSContext* aCx, RTCDataChannelType aArgument, JS::MutableHandle<JS::Value> aValue)
      58             : {
      59           0 :   MOZ_ASSERT(uint32_t(aArgument) < ArrayLength(RTCDataChannelTypeValues::strings));
      60             :   JSString* resultStr =
      61           0 :     JS_NewStringCopyN(aCx, RTCDataChannelTypeValues::strings[uint32_t(aArgument)].value,
      62           0 :                       RTCDataChannelTypeValues::strings[uint32_t(aArgument)].length);
      63           0 :   if (!resultStr) {
      64           0 :     return false;
      65             :   }
      66           0 :   aValue.setString(resultStr);
      67           0 :   return true;
      68             : }
      69             : 
      70             : 
      71             : namespace DataChannelBinding {
      72             : 
      73             : static_assert(IsRefcounted<NativeType>::value == IsRefcounted<EventTargetBinding::NativeType>::value,
      74             :               "Can't inherit from an interface with a different ownership model.");
      75             : 
      76             : static bool
      77           0 : get_label(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
      78             : {
      79           0 :   DOMString result;
      80           0 :   self->GetLabel(result);
      81           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
      82           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
      83           0 :     return false;
      84             :   }
      85           0 :   return true;
      86             : }
      87             : 
      88             : static const JSJitInfo label_getterinfo = {
      89             :   { (JSJitGetterOp)get_label },
      90             :   { prototypes::id::DataChannel },
      91             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
      92             :   JSJitInfo::Getter,
      93             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
      94             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
      95             :   false,  /* isInfallible. False in setters. */
      96             :   false,  /* isMovable.  Not relevant for setters. */
      97             :   false, /* isEliminatable.  Not relevant for setters. */
      98             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
      99             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     100             :   false,  /* isTypedMethod.  Only relevant for methods. */
     101             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     102             : };
     103             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     104             : static_assert(0 < 1, "There is no slot for us");
     105             : 
     106             : static bool
     107           0 : get_reliable(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
     108             : {
     109           0 :   bool result(self->Reliable());
     110           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     111           0 :   args.rval().setBoolean(result);
     112           0 :   return true;
     113             : }
     114             : 
     115             : static const JSJitInfo reliable_getterinfo = {
     116             :   { (JSJitGetterOp)get_reliable },
     117             :   { prototypes::id::DataChannel },
     118             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     119             :   JSJitInfo::Getter,
     120             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     121             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
     122             :   true,  /* isInfallible. False in setters. */
     123             :   false,  /* isMovable.  Not relevant for setters. */
     124             :   false, /* isEliminatable.  Not relevant for setters. */
     125             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     126             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     127             :   false,  /* isTypedMethod.  Only relevant for methods. */
     128             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     129             : };
     130             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     131             : static_assert(0 < 1, "There is no slot for us");
     132             : 
     133             : static bool
     134           0 : get_readyState(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
     135             : {
     136           0 :   RTCDataChannelState result(self->ReadyState());
     137           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     138           0 :   if (!ToJSValue(cx, result, args.rval())) {
     139           0 :     return false;
     140             :   }
     141           0 :   return true;
     142             : }
     143             : 
     144             : static const JSJitInfo readyState_getterinfo = {
     145             :   { (JSJitGetterOp)get_readyState },
     146             :   { prototypes::id::DataChannel },
     147             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     148             :   JSJitInfo::Getter,
     149             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     150             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
     151             :   false,  /* isInfallible. False in setters. */
     152             :   false,  /* isMovable.  Not relevant for setters. */
     153             :   false, /* isEliminatable.  Not relevant for setters. */
     154             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     155             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     156             :   false,  /* isTypedMethod.  Only relevant for methods. */
     157             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     158             : };
     159             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     160             : static_assert(0 < 1, "There is no slot for us");
     161             : 
     162             : static bool
     163           0 : get_bufferedAmount(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
     164             : {
     165           0 :   uint32_t result(self->BufferedAmount());
     166           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     167           0 :   args.rval().setNumber(result);
     168           0 :   return true;
     169             : }
     170             : 
     171             : static const JSJitInfo bufferedAmount_getterinfo = {
     172             :   { (JSJitGetterOp)get_bufferedAmount },
     173             :   { prototypes::id::DataChannel },
     174             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     175             :   JSJitInfo::Getter,
     176             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     177             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
     178             :   true,  /* isInfallible. False in setters. */
     179             :   false,  /* isMovable.  Not relevant for setters. */
     180             :   false, /* isEliminatable.  Not relevant for setters. */
     181             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     182             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     183             :   false,  /* isTypedMethod.  Only relevant for methods. */
     184             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     185             : };
     186             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     187             : static_assert(0 < 1, "There is no slot for us");
     188             : 
     189             : static bool
     190           0 : get_bufferedAmountLowThreshold(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
     191             : {
     192           0 :   uint32_t result(self->BufferedAmountLowThreshold());
     193           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     194           0 :   args.rval().setNumber(result);
     195           0 :   return true;
     196             : }
     197             : 
     198             : static bool
     199           0 : set_bufferedAmountLowThreshold(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitSetterCallArgs args)
     200             : {
     201             :   uint32_t arg0;
     202           0 :   if (!ValueToPrimitive<uint32_t, eDefault>(cx, args[0], &arg0)) {
     203           0 :     return false;
     204             :   }
     205           0 :   self->SetBufferedAmountLowThreshold(arg0);
     206           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     207             : 
     208           0 :   return true;
     209             : }
     210             : 
     211             : static const JSJitInfo bufferedAmountLowThreshold_getterinfo = {
     212             :   { (JSJitGetterOp)get_bufferedAmountLowThreshold },
     213             :   { prototypes::id::DataChannel },
     214             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     215             :   JSJitInfo::Getter,
     216             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     217             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
     218             :   true,  /* isInfallible. False in setters. */
     219             :   false,  /* isMovable.  Not relevant for setters. */
     220             :   false, /* isEliminatable.  Not relevant for setters. */
     221             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     222             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     223             :   false,  /* isTypedMethod.  Only relevant for methods. */
     224             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     225             : };
     226             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     227             : static_assert(0 < 1, "There is no slot for us");
     228             : static const JSJitInfo bufferedAmountLowThreshold_setterinfo = {
     229             :   { (JSJitGetterOp)set_bufferedAmountLowThreshold },
     230             :   { prototypes::id::DataChannel },
     231             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     232             :   JSJitInfo::Setter,
     233             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     234             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     235             :   false,  /* isInfallible. False in setters. */
     236             :   false,  /* isMovable.  Not relevant for setters. */
     237             :   false, /* isEliminatable.  Not relevant for setters. */
     238             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     239             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     240             :   false,  /* isTypedMethod.  Only relevant for methods. */
     241             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     242             : };
     243             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     244             : static_assert(0 < 1, "There is no slot for us");
     245             : 
     246             : static bool
     247           0 : get_onopen(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
     248             : {
     249           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnopen());
     250           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     251           0 :   if (result) {
     252           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
     253           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
     254           0 :       return false;
     255             :     }
     256           0 :     return true;
     257             :   } else {
     258           0 :     args.rval().setNull();
     259           0 :     return true;
     260             :   }
     261             : }
     262             : 
     263             : static bool
     264           0 : set_onopen(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitSetterCallArgs args)
     265             : {
     266           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
     267           0 :   if (args[0].isObject()) {
     268             :     { // scope for tempRoot
     269           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
     270           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
     271             :     }
     272             :   } else {
     273           0 :     arg0 = nullptr;
     274             :   }
     275           0 :   self->SetOnopen(Constify(arg0));
     276           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     277             : 
     278           0 :   return true;
     279             : }
     280             : 
     281             : static const JSJitInfo onopen_getterinfo = {
     282             :   { (JSJitGetterOp)get_onopen },
     283             :   { prototypes::id::DataChannel },
     284             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     285             :   JSJitInfo::Getter,
     286             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     287             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     288             :   false,  /* isInfallible. False in setters. */
     289             :   false,  /* isMovable.  Not relevant for setters. */
     290             :   false, /* isEliminatable.  Not relevant for setters. */
     291             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     292             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     293             :   false,  /* isTypedMethod.  Only relevant for methods. */
     294             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     295             : };
     296             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     297             : static_assert(0 < 1, "There is no slot for us");
     298             : static const JSJitInfo onopen_setterinfo = {
     299             :   { (JSJitGetterOp)set_onopen },
     300             :   { prototypes::id::DataChannel },
     301             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     302             :   JSJitInfo::Setter,
     303             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     304             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     305             :   false,  /* isInfallible. False in setters. */
     306             :   false,  /* isMovable.  Not relevant for setters. */
     307             :   false, /* isEliminatable.  Not relevant for setters. */
     308             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     309             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     310             :   false,  /* isTypedMethod.  Only relevant for methods. */
     311             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     312             : };
     313             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     314             : static_assert(0 < 1, "There is no slot for us");
     315             : 
     316             : static bool
     317           0 : get_onerror(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
     318             : {
     319           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnerror());
     320           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     321           0 :   if (result) {
     322           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
     323           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
     324           0 :       return false;
     325             :     }
     326           0 :     return true;
     327             :   } else {
     328           0 :     args.rval().setNull();
     329           0 :     return true;
     330             :   }
     331             : }
     332             : 
     333             : static bool
     334           0 : set_onerror(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitSetterCallArgs args)
     335             : {
     336           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
     337           0 :   if (args[0].isObject()) {
     338             :     { // scope for tempRoot
     339           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
     340           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
     341             :     }
     342             :   } else {
     343           0 :     arg0 = nullptr;
     344             :   }
     345           0 :   self->SetOnerror(Constify(arg0));
     346           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     347             : 
     348           0 :   return true;
     349             : }
     350             : 
     351             : static const JSJitInfo onerror_getterinfo = {
     352             :   { (JSJitGetterOp)get_onerror },
     353             :   { prototypes::id::DataChannel },
     354             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     355             :   JSJitInfo::Getter,
     356             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     357             :   JSVAL_TYPE_UNKNOWN,  /* 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             : static const JSJitInfo onerror_setterinfo = {
     369             :   { (JSJitGetterOp)set_onerror },
     370             :   { prototypes::id::DataChannel },
     371             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     372             :   JSJitInfo::Setter,
     373             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     374             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     375             :   false,  /* isInfallible. False in setters. */
     376             :   false,  /* isMovable.  Not relevant for setters. */
     377             :   false, /* isEliminatable.  Not relevant for setters. */
     378             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     379             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     380             :   false,  /* isTypedMethod.  Only relevant for methods. */
     381             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     382             : };
     383             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     384             : static_assert(0 < 1, "There is no slot for us");
     385             : 
     386             : static bool
     387           0 : get_onclose(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
     388             : {
     389           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnclose());
     390           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     391           0 :   if (result) {
     392           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
     393           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
     394           0 :       return false;
     395             :     }
     396           0 :     return true;
     397             :   } else {
     398           0 :     args.rval().setNull();
     399           0 :     return true;
     400             :   }
     401             : }
     402             : 
     403             : static bool
     404           0 : set_onclose(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitSetterCallArgs args)
     405             : {
     406           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
     407           0 :   if (args[0].isObject()) {
     408             :     { // scope for tempRoot
     409           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
     410           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
     411             :     }
     412             :   } else {
     413           0 :     arg0 = nullptr;
     414             :   }
     415           0 :   self->SetOnclose(Constify(arg0));
     416           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     417             : 
     418           0 :   return true;
     419             : }
     420             : 
     421             : static const JSJitInfo onclose_getterinfo = {
     422             :   { (JSJitGetterOp)get_onclose },
     423             :   { prototypes::id::DataChannel },
     424             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     425             :   JSJitInfo::Getter,
     426             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     427             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     428             :   false,  /* isInfallible. False in setters. */
     429             :   false,  /* isMovable.  Not relevant for setters. */
     430             :   false, /* isEliminatable.  Not relevant for setters. */
     431             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     432             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     433             :   false,  /* isTypedMethod.  Only relevant for methods. */
     434             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     435             : };
     436             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     437             : static_assert(0 < 1, "There is no slot for us");
     438             : static const JSJitInfo onclose_setterinfo = {
     439             :   { (JSJitGetterOp)set_onclose },
     440             :   { prototypes::id::DataChannel },
     441             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     442             :   JSJitInfo::Setter,
     443             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     444             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     445             :   false,  /* isInfallible. False in setters. */
     446             :   false,  /* isMovable.  Not relevant for setters. */
     447             :   false, /* isEliminatable.  Not relevant for setters. */
     448             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     449             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     450             :   false,  /* isTypedMethod.  Only relevant for methods. */
     451             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     452             : };
     453             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     454             : static_assert(0 < 1, "There is no slot for us");
     455             : 
     456             : static bool
     457           0 : close(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, const JSJitMethodCallArgs& args)
     458             : {
     459           0 :   self->Close();
     460           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     461           0 :   args.rval().setUndefined();
     462           0 :   return true;
     463             : }
     464             : 
     465             : static const JSJitInfo close_methodinfo = {
     466             :   { (JSJitGetterOp)close },
     467             :   { prototypes::id::DataChannel },
     468             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     469             :   JSJitInfo::Method,
     470             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     471             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     472             :   true,  /* isInfallible. False in setters. */
     473             :   false,  /* isMovable.  Not relevant for setters. */
     474             :   false, /* isEliminatable.  Not relevant for setters. */
     475             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     476             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     477             :   false,  /* isTypedMethod.  Only relevant for methods. */
     478             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     479             : };
     480             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     481             : static_assert(0 < 1, "There is no slot for us");
     482             : 
     483             : static bool
     484           0 : get_onmessage(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
     485             : {
     486           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnmessage());
     487           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     488           0 :   if (result) {
     489           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
     490           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
     491           0 :       return false;
     492             :     }
     493           0 :     return true;
     494             :   } else {
     495           0 :     args.rval().setNull();
     496           0 :     return true;
     497             :   }
     498             : }
     499             : 
     500             : static bool
     501           0 : set_onmessage(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitSetterCallArgs args)
     502             : {
     503           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
     504           0 :   if (args[0].isObject()) {
     505             :     { // scope for tempRoot
     506           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
     507           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
     508             :     }
     509             :   } else {
     510           0 :     arg0 = nullptr;
     511             :   }
     512           0 :   self->SetOnmessage(Constify(arg0));
     513           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     514             : 
     515           0 :   return true;
     516             : }
     517             : 
     518             : static const JSJitInfo onmessage_getterinfo = {
     519             :   { (JSJitGetterOp)get_onmessage },
     520             :   { prototypes::id::DataChannel },
     521             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     522             :   JSJitInfo::Getter,
     523             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     524             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     525             :   false,  /* isInfallible. False in setters. */
     526             :   false,  /* isMovable.  Not relevant for setters. */
     527             :   false, /* isEliminatable.  Not relevant for setters. */
     528             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     529             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     530             :   false,  /* isTypedMethod.  Only relevant for methods. */
     531             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     532             : };
     533             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     534             : static_assert(0 < 1, "There is no slot for us");
     535             : static const JSJitInfo onmessage_setterinfo = {
     536             :   { (JSJitGetterOp)set_onmessage },
     537             :   { prototypes::id::DataChannel },
     538             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     539             :   JSJitInfo::Setter,
     540             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     541             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     542             :   false,  /* isInfallible. False in setters. */
     543             :   false,  /* isMovable.  Not relevant for setters. */
     544             :   false, /* isEliminatable.  Not relevant for setters. */
     545             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     546             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     547             :   false,  /* isTypedMethod.  Only relevant for methods. */
     548             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     549             : };
     550             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     551             : static_assert(0 < 1, "There is no slot for us");
     552             : 
     553             : static bool
     554           0 : get_onbufferedamountlow(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
     555             : {
     556           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnbufferedamountlow());
     557           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     558           0 :   if (result) {
     559           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
     560           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
     561           0 :       return false;
     562             :     }
     563           0 :     return true;
     564             :   } else {
     565           0 :     args.rval().setNull();
     566           0 :     return true;
     567             :   }
     568             : }
     569             : 
     570             : static bool
     571           0 : set_onbufferedamountlow(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitSetterCallArgs args)
     572             : {
     573           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
     574           0 :   if (args[0].isObject()) {
     575             :     { // scope for tempRoot
     576           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
     577           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
     578             :     }
     579             :   } else {
     580           0 :     arg0 = nullptr;
     581             :   }
     582           0 :   self->SetOnbufferedamountlow(Constify(arg0));
     583           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     584             : 
     585           0 :   return true;
     586             : }
     587             : 
     588             : static const JSJitInfo onbufferedamountlow_getterinfo = {
     589             :   { (JSJitGetterOp)get_onbufferedamountlow },
     590             :   { prototypes::id::DataChannel },
     591             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     592             :   JSJitInfo::Getter,
     593             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     594             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     595             :   false,  /* isInfallible. False in setters. */
     596             :   false,  /* isMovable.  Not relevant for setters. */
     597             :   false, /* isEliminatable.  Not relevant for setters. */
     598             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     599             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     600             :   false,  /* isTypedMethod.  Only relevant for methods. */
     601             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     602             : };
     603             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     604             : static_assert(0 < 1, "There is no slot for us");
     605             : static const JSJitInfo onbufferedamountlow_setterinfo = {
     606             :   { (JSJitGetterOp)set_onbufferedamountlow },
     607             :   { prototypes::id::DataChannel },
     608             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     609             :   JSJitInfo::Setter,
     610             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     611             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     612             :   false,  /* isInfallible. False in setters. */
     613             :   false,  /* isMovable.  Not relevant for setters. */
     614             :   false, /* isEliminatable.  Not relevant for setters. */
     615             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     616             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     617             :   false,  /* isTypedMethod.  Only relevant for methods. */
     618             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     619             : };
     620             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     621             : static_assert(0 < 1, "There is no slot for us");
     622             : 
     623             : static bool
     624           0 : get_binaryType(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
     625             : {
     626           0 :   RTCDataChannelType result(self->BinaryType());
     627           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     628           0 :   if (!ToJSValue(cx, result, args.rval())) {
     629           0 :     return false;
     630             :   }
     631           0 :   return true;
     632             : }
     633             : 
     634             : static bool
     635           0 : set_binaryType(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitSetterCallArgs args)
     636             : {
     637             :   RTCDataChannelType arg0;
     638             :   {
     639             :     int index;
     640           0 :     if (!FindEnumStringIndex<false>(cx, args[0], RTCDataChannelTypeValues::strings, "RTCDataChannelType", "Value being assigned to DataChannel.binaryType", &index)) {
     641           0 :       return false;
     642             :     }
     643           0 :     if (index < 0) {
     644           0 :       return true;
     645             :     }
     646           0 :     arg0 = static_cast<RTCDataChannelType>(index);
     647             :   }
     648           0 :   self->SetBinaryType(arg0);
     649           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     650             : 
     651           0 :   return true;
     652             : }
     653             : 
     654             : static const JSJitInfo binaryType_getterinfo = {
     655             :   { (JSJitGetterOp)get_binaryType },
     656             :   { prototypes::id::DataChannel },
     657             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     658             :   JSJitInfo::Getter,
     659             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     660             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
     661             :   false,  /* isInfallible. False in setters. */
     662             :   false,  /* isMovable.  Not relevant for setters. */
     663             :   false, /* isEliminatable.  Not relevant for setters. */
     664             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     665             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     666             :   false,  /* isTypedMethod.  Only relevant for methods. */
     667             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     668             : };
     669             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     670             : static_assert(0 < 1, "There is no slot for us");
     671             : static const JSJitInfo binaryType_setterinfo = {
     672             :   { (JSJitGetterOp)set_binaryType },
     673             :   { prototypes::id::DataChannel },
     674             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     675             :   JSJitInfo::Setter,
     676             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     677             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     678             :   false,  /* isInfallible. False in setters. */
     679             :   false,  /* isMovable.  Not relevant for setters. */
     680             :   false, /* isEliminatable.  Not relevant for setters. */
     681             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     682             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     683             :   false,  /* isTypedMethod.  Only relevant for methods. */
     684             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     685             : };
     686             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     687             : static_assert(0 < 1, "There is no slot for us");
     688             : 
     689             : static bool
     690           0 : send(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, const JSJitMethodCallArgs& args)
     691             : {
     692           0 :   unsigned argcount = std::min(args.length(), 1u);
     693           0 :   switch (argcount) {
     694             :     case 1: {
     695           0 :       if (args[0].isObject()) {
     696             :         do {
     697           0 :           NonNull<mozilla::dom::Blob> arg0;
     698             :           {
     699           0 :             nsresult rv = UnwrapObject<prototypes::id::Blob, mozilla::dom::Blob>(args[0], arg0);
     700           0 :             if (NS_FAILED(rv)) {
     701           0 :               break;
     702             :             }
     703             :           }
     704           0 :           binding_detail::FastErrorResult rv;
     705           0 :           self->Send(NonNullHelper(arg0), rv);
     706           0 :           if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     707           0 :             return false;
     708             :           }
     709           0 :           MOZ_ASSERT(!JS_IsExceptionPending(cx));
     710           0 :           args.rval().setUndefined();
     711           0 :           return true;
     712             :         } while (0);
     713             :         do {
     714           0 :           RootedTypedArray<ArrayBuffer> arg0(cx);
     715           0 :           if (!arg0.Init(&args[0].toObject())) {
     716           0 :             break;
     717             :           }
     718           0 :           binding_detail::FastErrorResult rv;
     719           0 :           self->Send(Constify(arg0), rv);
     720           0 :           if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     721           0 :             return false;
     722             :           }
     723           0 :           MOZ_ASSERT(!JS_IsExceptionPending(cx));
     724           0 :           args.rval().setUndefined();
     725           0 :           return true;
     726             :         } while (0);
     727             :         do {
     728           0 :           RootedTypedArray<ArrayBufferView> arg0(cx);
     729           0 :           if (!arg0.Init(&args[0].toObject())) {
     730           0 :             break;
     731             :           }
     732           0 :           binding_detail::FastErrorResult rv;
     733           0 :           self->Send(Constify(arg0), rv);
     734           0 :           if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     735           0 :             return false;
     736             :           }
     737           0 :           MOZ_ASSERT(!JS_IsExceptionPending(cx));
     738           0 :           args.rval().setUndefined();
     739           0 :           return true;
     740             :         } while (0);
     741             :       }
     742           0 :       binding_detail::FakeString arg0;
     743           0 :       if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
     744           0 :         return false;
     745             :       }
     746           0 :       binding_detail::FastErrorResult rv;
     747           0 :       self->Send(NonNullHelper(Constify(arg0)), rv);
     748           0 :       if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     749           0 :         return false;
     750             :       }
     751           0 :       MOZ_ASSERT(!JS_IsExceptionPending(cx));
     752           0 :       args.rval().setUndefined();
     753           0 :       return true;
     754             :       break;
     755             :     }
     756             :     default: {
     757           0 :       return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "DataChannel.send");
     758             :       break;
     759             :     }
     760             :   }
     761             :   MOZ_CRASH("We have an always-returning default case");
     762             :   return false;
     763             : }
     764             : 
     765             : static const JSJitInfo send_methodinfo = {
     766             :   { (JSJitGetterOp)send },
     767             :   { prototypes::id::DataChannel },
     768             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     769             :   JSJitInfo::Method,
     770             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     771             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     772             :   false,  /* isInfallible. False in setters. */
     773             :   false,  /* isMovable.  Not relevant for setters. */
     774             :   false, /* isEliminatable.  Not relevant for setters. */
     775             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     776             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     777             :   false,  /* isTypedMethod.  Only relevant for methods. */
     778             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     779             : };
     780             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     781             : static_assert(0 < 1, "There is no slot for us");
     782             : 
     783             : static bool
     784           0 : get_protocol(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
     785             : {
     786           0 :   DOMString result;
     787           0 :   self->GetProtocol(result);
     788           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     789           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
     790           0 :     return false;
     791             :   }
     792           0 :   return true;
     793             : }
     794             : 
     795             : static const JSJitInfo protocol_getterinfo = {
     796             :   { (JSJitGetterOp)get_protocol },
     797             :   { prototypes::id::DataChannel },
     798             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     799             :   JSJitInfo::Getter,
     800             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     801             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
     802             :   false,  /* isInfallible. False in setters. */
     803             :   false,  /* isMovable.  Not relevant for setters. */
     804             :   false, /* isEliminatable.  Not relevant for setters. */
     805             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     806             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     807             :   false,  /* isTypedMethod.  Only relevant for methods. */
     808             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     809             : };
     810             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     811             : static_assert(0 < 1, "There is no slot for us");
     812             : 
     813             : static bool
     814           0 : get_ordered(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
     815             : {
     816           0 :   bool result(self->Ordered());
     817           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     818           0 :   args.rval().setBoolean(result);
     819           0 :   return true;
     820             : }
     821             : 
     822             : static const JSJitInfo ordered_getterinfo = {
     823             :   { (JSJitGetterOp)get_ordered },
     824             :   { prototypes::id::DataChannel },
     825             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     826             :   JSJitInfo::Getter,
     827             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     828             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
     829             :   true,  /* isInfallible. False in setters. */
     830             :   false,  /* isMovable.  Not relevant for setters. */
     831             :   false, /* isEliminatable.  Not relevant for setters. */
     832             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     833             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     834             :   false,  /* isTypedMethod.  Only relevant for methods. */
     835             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     836             : };
     837             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     838             : static_assert(0 < 1, "There is no slot for us");
     839             : 
     840             : static bool
     841           0 : get_id(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
     842             : {
     843           0 :   uint16_t result(self->Id());
     844           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     845           0 :   args.rval().setInt32(int32_t(result));
     846           0 :   return true;
     847             : }
     848             : 
     849             : static const JSJitInfo id_getterinfo = {
     850             :   { (JSJitGetterOp)get_id },
     851             :   { prototypes::id::DataChannel },
     852             :   { PrototypeTraits<prototypes::id::DataChannel>::Depth },
     853             :   JSJitInfo::Getter,
     854             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     855             :   JSVAL_TYPE_INT32,  /* returnType.  Not relevant for setters. */
     856             :   true,  /* isInfallible. False in setters. */
     857             :   false,  /* isMovable.  Not relevant for setters. */
     858             :   false, /* isEliminatable.  Not relevant for setters. */
     859             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     860             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     861             :   false,  /* isTypedMethod.  Only relevant for methods. */
     862             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     863             : };
     864             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     865             : static_assert(0 < 1, "There is no slot for us");
     866             : 
     867             : static bool
     868           0 : _addProperty(JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JS::Handle<JS::Value> val)
     869             : {
     870           0 :   nsDOMDataChannel* self = UnwrapPossiblyNotInitializedDOMObject<nsDOMDataChannel>(obj);
     871             :   // We don't want to preserve if we don't have a wrapper, and we
     872             :   // obviously can't preserve if we're not initialized.
     873           0 :   if (self && self->GetWrapperPreserveColor()) {
     874           0 :     PreserveWrapper(self);
     875             :   }
     876           0 :   return true;
     877             : }
     878             : 
     879             : static void
     880           0 : _finalize(js::FreeOp* fop, JSObject* obj)
     881             : {
     882           0 :   nsDOMDataChannel* self = UnwrapPossiblyNotInitializedDOMObject<nsDOMDataChannel>(obj);
     883           0 :   if (self) {
     884           0 :     ClearWrapper(self, self, obj);
     885           0 :     AddForDeferredFinalization<nsDOMDataChannel>(self);
     886             :   }
     887           0 : }
     888             : 
     889             : static void
     890           0 : _objectMoved(JSObject* obj, const JSObject* old)
     891             : {
     892           0 :   nsDOMDataChannel* self = UnwrapPossiblyNotInitializedDOMObject<nsDOMDataChannel>(obj);
     893           0 :   if (self) {
     894           0 :     UpdateWrapper(self, self, obj, old);
     895             :   }
     896           0 : }
     897             : 
     898             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
     899             : #if defined(__clang__)
     900             : #pragma clang diagnostic push
     901             : #pragma clang diagnostic ignored "-Wmissing-braces"
     902             : #endif
     903             : static const JSFunctionSpec sMethods_specs[] = {
     904             :   JS_FNSPEC("close", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&close_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
     905             :   JS_FNSPEC("send", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&send_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
     906             :   JS_FS_END
     907             : };
     908             : #if defined(__clang__)
     909             : #pragma clang diagnostic pop
     910             : #endif
     911             : 
     912             : 
     913             : // Can't be const because the pref-enabled boolean needs to be writable
     914             : static Prefable<const JSFunctionSpec> sMethods[] = {
     915             :   { nullptr, &sMethods_specs[0] },
     916             :   { nullptr, nullptr }
     917             : };
     918             : 
     919             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
     920             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
     921             : static_assert(2 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
     922             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
     923             : 
     924             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
     925             : #if defined(__clang__)
     926             : #pragma clang diagnostic push
     927             : #pragma clang diagnostic ignored "-Wmissing-braces"
     928             : #endif
     929             : static const JSPropertySpec sAttributes_specs[] = {
     930             :   { "label", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &label_getterinfo, nullptr, nullptr },
     931             :   { "reliable", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &reliable_getterinfo, nullptr, nullptr },
     932             :   { "readyState", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &readyState_getterinfo, nullptr, nullptr },
     933             :   { "bufferedAmount", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &bufferedAmount_getterinfo, nullptr, nullptr },
     934             :   { "bufferedAmountLowThreshold", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &bufferedAmountLowThreshold_getterinfo, GenericBindingSetter, &bufferedAmountLowThreshold_setterinfo },
     935             :   { "onopen", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onopen_getterinfo, GenericBindingSetter, &onopen_setterinfo },
     936             :   { "onerror", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onerror_getterinfo, GenericBindingSetter, &onerror_setterinfo },
     937             :   { "onclose", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onclose_getterinfo, GenericBindingSetter, &onclose_setterinfo },
     938             :   { "onmessage", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onmessage_getterinfo, GenericBindingSetter, &onmessage_setterinfo },
     939             :   { "onbufferedamountlow", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onbufferedamountlow_getterinfo, GenericBindingSetter, &onbufferedamountlow_setterinfo },
     940             :   { "binaryType", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &binaryType_getterinfo, GenericBindingSetter, &binaryType_setterinfo },
     941             :   { "protocol", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &protocol_getterinfo, nullptr, nullptr },
     942             :   { "ordered", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &ordered_getterinfo, nullptr, nullptr },
     943             :   { "id", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &id_getterinfo, nullptr, nullptr },
     944             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
     945             : };
     946             : #if defined(__clang__)
     947             : #pragma clang diagnostic pop
     948             : #endif
     949             : 
     950             : 
     951             : // Can't be const because the pref-enabled boolean needs to be writable
     952             : static Prefable<const JSPropertySpec> sAttributes[] = {
     953             :   { nullptr, &sAttributes_specs[0] },
     954             :   { nullptr, nullptr }
     955             : };
     956             : 
     957             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
     958             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
     959             : static_assert(14 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
     960             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
     961             : 
     962             : 
     963             : static uint16_t sNativeProperties_sortedPropertyIndices[16];
     964             : static PropertyInfo sNativeProperties_propertyInfos[16];
     965             : 
     966             : static const NativePropertiesN<2> sNativeProperties = {
     967             :   false, 0,
     968             :   false, 0,
     969             :   true,  0 /* sMethods */,
     970             :   true,  1 /* sAttributes */,
     971             :   false, 0,
     972             :   false, 0,
     973             :   false, 0,
     974             :   -1,
     975             :   16,
     976             :   sNativeProperties_sortedPropertyIndices,
     977             :   {
     978             :     { sMethods, &sNativeProperties_propertyInfos[0] },
     979             :     { sAttributes, &sNativeProperties_propertyInfos[2] }
     980             :   }
     981             : };
     982             : static_assert(16 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
     983             :     "We have a property info count that is oversized");
     984             : 
     985             : static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
     986             :   {
     987             :     "Function",
     988             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
     989             :     &sBoringInterfaceObjectClassClassOps,
     990             :     JS_NULL_CLASS_SPEC,
     991             :     JS_NULL_CLASS_EXT,
     992             :     &sInterfaceObjectClassObjectOps
     993             :   },
     994             :   eInterface,
     995             :   true,
     996             :   prototypes::id::DataChannel,
     997             :   PrototypeTraits<prototypes::id::DataChannel>::Depth,
     998             :   sNativePropertyHooks,
     999             :   "function DataChannel() {\n    [native code]\n}",
    1000             :   EventTargetBinding::GetConstructorObject
    1001             : };
    1002             : 
    1003             : static const DOMIfaceAndProtoJSClass sPrototypeClass = {
    1004             :   {
    1005             :     "DataChannelPrototype",
    1006             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
    1007             :     JS_NULL_CLASS_OPS,
    1008             :     JS_NULL_CLASS_SPEC,
    1009             :     JS_NULL_CLASS_EXT,
    1010             :     JS_NULL_OBJECT_OPS
    1011             :   },
    1012             :   eInterfacePrototype,
    1013             :   false,
    1014             :   prototypes::id::DataChannel,
    1015             :   PrototypeTraits<prototypes::id::DataChannel>::Depth,
    1016             :   sNativePropertyHooks,
    1017             :   "[object DataChannelPrototype]",
    1018             :   EventTargetBinding::GetProtoObject
    1019             : };
    1020             : 
    1021             : JSObject*
    1022           0 : DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
    1023             : {
    1024           0 :   return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
    1025             : }
    1026             : 
    1027             : static const js::ClassOps sClassOps = {
    1028             :   _addProperty, /* addProperty */
    1029             :   nullptr,               /* delProperty */
    1030             :   nullptr,               /* getProperty */
    1031             :   nullptr,               /* setProperty */
    1032             :   nullptr,               /* enumerate */
    1033             :   nullptr, /* newEnumerate */
    1034             :   nullptr, /* resolve */
    1035             :   nullptr, /* mayResolve */
    1036             :   _finalize, /* finalize */
    1037             :   nullptr, /* call */
    1038             :   nullptr,               /* hasInstance */
    1039             :   nullptr,               /* construct */
    1040             :   nullptr, /* trace */
    1041             : };
    1042             : 
    1043             : static const js::ClassExtension sClassExtension = {
    1044             :   nullptr, /* weakmapKeyDelegateOp */
    1045             :   _objectMoved /* objectMovedOp */
    1046             : };
    1047             : 
    1048             : static const DOMJSClass sClass = {
    1049             :   { "DataChannel",
    1050             :     JSCLASS_IS_DOMJSCLASS | JSCLASS_FOREGROUND_FINALIZE | JSCLASS_HAS_RESERVED_SLOTS(1),
    1051             :     &sClassOps,
    1052             :     JS_NULL_CLASS_SPEC,
    1053             :     &sClassExtension,
    1054             :     JS_NULL_OBJECT_OPS
    1055             :   },
    1056             :   { prototypes::id::EventTarget, prototypes::id::DataChannel, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count },
    1057             :   IsBaseOf<nsISupports, nsDOMDataChannel >::value,
    1058             :   sNativePropertyHooks,
    1059             :   FindAssociatedGlobalForNative<nsDOMDataChannel>::Get,
    1060             :   GetProtoObjectHandle,
    1061             :   GetCCParticipant<nsDOMDataChannel>::Get()
    1062             : };
    1063             : static_assert(1 == DOM_INSTANCE_RESERVED_SLOTS,
    1064             :               "Must have the right minimal number of reserved slots.");
    1065             : static_assert(1 >= 1,
    1066             :               "Must have enough reserved slots.");
    1067             : 
    1068             : const JSClass*
    1069           0 : GetJSClass()
    1070             : {
    1071           0 :   return sClass.ToJSClass();
    1072             : }
    1073             : 
    1074             : bool
    1075           0 : Wrap(JSContext* aCx, nsDOMDataChannel* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector)
    1076             : {
    1077             :   MOZ_ASSERT(static_cast<nsDOMDataChannel*>(aObject) ==
    1078             :              reinterpret_cast<nsDOMDataChannel*>(aObject),
    1079             :              "Multiple inheritance for nsDOMDataChannel is broken.");
    1080             :   MOZ_ASSERT(static_cast<mozilla::dom::EventTarget*>(aObject) ==
    1081             :              reinterpret_cast<mozilla::dom::EventTarget*>(aObject),
    1082             :              "Multiple inheritance for mozilla::dom::EventTarget is broken.");
    1083           0 :   MOZ_ASSERT(ToSupportsIsCorrect(aObject));
    1084           0 :   MOZ_ASSERT_IF(aGivenProto, js::IsObjectInContextCompartment(aGivenProto, aCx));
    1085           0 :   MOZ_ASSERT(!aCache->GetWrapper(),
    1086             :              "You should probably not be using Wrap() directly; use "
    1087             :              "GetOrCreateDOMReflector instead");
    1088             : 
    1089           0 :   MOZ_ASSERT(ToSupportsIsOnPrimaryInheritanceChain(aObject, aCache),
    1090             :              "nsISupports must be on our primary inheritance chain");
    1091             : 
    1092           0 :   JS::Rooted<JSObject*> global(aCx, FindAssociatedGlobal(aCx, aObject->GetParentObject()));
    1093           0 :   if (!global) {
    1094           0 :     return false;
    1095             :   }
    1096           0 :   MOZ_ASSERT(JS_IsGlobalObject(global));
    1097           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(global));
    1098             : 
    1099             :   // That might have ended up wrapping us already, due to the wonders
    1100             :   // of XBL.  Check for that, and bail out as needed.
    1101           0 :   aReflector.set(aCache->GetWrapper());
    1102           0 :   if (aReflector) {
    1103             : #ifdef DEBUG
    1104           0 :     binding_detail::AssertReflectorHasGivenProto(aCx, aReflector, aGivenProto);
    1105             : #endif // DEBUG
    1106           0 :     return true;
    1107             :   }
    1108             : 
    1109           0 :   JSAutoCompartment ac(aCx, global);
    1110           0 :   JS::Handle<JSObject*> canonicalProto = GetProtoObjectHandle(aCx);
    1111           0 :   if (!canonicalProto) {
    1112           0 :     return false;
    1113             :   }
    1114           0 :   JS::Rooted<JSObject*> proto(aCx);
    1115           0 :   if (aGivenProto) {
    1116           0 :     proto = aGivenProto;
    1117             :     // Unfortunately, while aGivenProto was in the compartment of aCx
    1118             :     // coming in, we changed compartments to that of "parent" so may need
    1119             :     // to wrap the proto here.
    1120           0 :     if (js::GetContextCompartment(aCx) != js::GetObjectCompartment(proto)) {
    1121           0 :       if (!JS_WrapObject(aCx, &proto)) {
    1122           0 :         return false;
    1123             :       }
    1124             :     }
    1125             :   } else {
    1126           0 :     proto = canonicalProto;
    1127             :   }
    1128             : 
    1129           0 :   BindingJSObjectCreator<nsDOMDataChannel> creator(aCx);
    1130           0 :   creator.CreateObject(aCx, sClass.ToJSClass(), proto, aObject, aReflector);
    1131           0 :   if (!aReflector) {
    1132           0 :     return false;
    1133             :   }
    1134             : 
    1135           0 :   aCache->SetWrapper(aReflector);
    1136           0 :   creator.InitializationSucceeded();
    1137             : 
    1138           0 :   MOZ_ASSERT(aCache->GetWrapperPreserveColor() &&
    1139             :              aCache->GetWrapperPreserveColor() == aReflector);
    1140             :   // If proto != canonicalProto, we have to preserve our wrapper;
    1141             :   // otherwise we won't be able to properly recreate it later, since
    1142             :   // we won't know what proto to use.  Note that we don't check
    1143             :   // aGivenProto here, since it's entirely possible (and even
    1144             :   // somewhat common) to have a non-null aGivenProto which is the
    1145             :   // same as canonicalProto.
    1146           0 :   if (proto != canonicalProto) {
    1147           0 :     PreserveWrapper(aObject);
    1148             :   }
    1149             : 
    1150           0 :   return true;
    1151             : }
    1152             : 
    1153             : const NativePropertyHooks sNativePropertyHooks[] = { {
    1154             :   nullptr,
    1155             :   nullptr,
    1156             :   nullptr,
    1157             :   { sNativeProperties.Upcast(), nullptr },
    1158             :   prototypes::id::DataChannel,
    1159             :   constructors::id::DataChannel,
    1160             :   EventTargetBinding::sNativePropertyHooks,
    1161             :   &DefaultXrayExpandoObjectClass
    1162             : } };
    1163             : 
    1164             : void
    1165           0 : CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
    1166             : {
    1167           0 :   JS::Handle<JSObject*> parentProto(EventTargetBinding::GetProtoObjectHandle(aCx));
    1168           0 :   if (!parentProto) {
    1169           0 :     return;
    1170             :   }
    1171             : 
    1172           0 :   JS::Handle<JSObject*> constructorProto(EventTargetBinding::GetConstructorObjectHandle(aCx));
    1173           0 :   if (!constructorProto) {
    1174           0 :     return;
    1175             :   }
    1176             : 
    1177             :   static bool sIdsInited = false;
    1178           0 :   if (!sIdsInited && NS_IsMainThread()) {
    1179           0 :     if (!InitIds(aCx, sNativeProperties.Upcast())) {
    1180           0 :       return;
    1181             :     }
    1182           0 :     sIdsInited = true;
    1183             :   }
    1184             : 
    1185           0 :   JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::DataChannel);
    1186           0 :   JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::DataChannel);
    1187           0 :   dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
    1188             :                               &sPrototypeClass.mBase, protoCache,
    1189             :                               constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
    1190             :                               interfaceCache,
    1191             :                               sNativeProperties.Upcast(),
    1192             :                               nullptr,
    1193             :                               "DataChannel", aDefineOnGlobal,
    1194             :                               nullptr,
    1195           0 :                               false);
    1196             : }
    1197             : 
    1198             : JS::Handle<JSObject*>
    1199           0 : GetProtoObjectHandle(JSContext* aCx)
    1200             : {
    1201             :   /* Get the interface prototype object for this class.  This will create the
    1202             :      object as needed. */
    1203           0 :   bool aDefineOnGlobal = true;
    1204             : 
    1205             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    1206           0 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    1207           0 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    1208           0 :     return nullptr;
    1209             :   }
    1210             : 
    1211             :   /* Check to see whether the interface objects are already installed */
    1212           0 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    1213           0 :   if (!protoAndIfaceCache.HasEntryInSlot(prototypes::id::DataChannel)) {
    1214           0 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    1215           0 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    1216             :   }
    1217             : 
    1218             :   /*
    1219             :    * The object might _still_ be null, but that's OK.
    1220             :    *
    1221             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    1222             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    1223             :    * changed after they have been set.
    1224             :    *
    1225             :    * Calling address() avoids the read read barrier that does gray
    1226             :    * unmarking, but it's not possible for the object to be gray here.
    1227             :    */
    1228             : 
    1229           0 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(prototypes::id::DataChannel);
    1230           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    1231           0 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    1232             : }
    1233             : 
    1234             : JS::Handle<JSObject*>
    1235           0 : GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
    1236             : {
    1237             :   /* Get the interface object for this class.  This will create the object as
    1238             :      needed. */
    1239             : 
    1240             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    1241           0 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    1242           0 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    1243           0 :     return nullptr;
    1244             :   }
    1245             : 
    1246             :   /* Check to see whether the interface objects are already installed */
    1247           0 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    1248           0 :   if (!protoAndIfaceCache.HasEntryInSlot(constructors::id::DataChannel)) {
    1249           0 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    1250           0 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    1251             :   }
    1252             : 
    1253             :   /*
    1254             :    * The object might _still_ be null, but that's OK.
    1255             :    *
    1256             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    1257             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    1258             :    * changed after they have been set.
    1259             :    *
    1260             :    * Calling address() avoids the read read barrier that does gray
    1261             :    * unmarking, but it's not possible for the object to be gray here.
    1262             :    */
    1263             : 
    1264           0 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::DataChannel);
    1265           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    1266           0 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    1267             : }
    1268             : 
    1269             : JSObject*
    1270           0 : GetConstructorObject(JSContext* aCx)
    1271             : {
    1272           0 :   return GetConstructorObjectHandle(aCx);
    1273             : }
    1274             : 
    1275             : } // namespace DataChannelBinding
    1276             : 
    1277             : 
    1278             : 
    1279             : } // namespace dom
    1280             : } // namespace mozilla

Generated by: LCOV version 1.13