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

          Line data    Source code
       1             : /* THIS FILE IS AUTOGENERATED FROM SpeechSynthesisUtterance.webidl BY Codegen.py - DO NOT EDIT */
       2             : 
       3             : #include "EventHandlerBinding.h"
       4             : #include "EventTargetBinding.h"
       5             : #include "SpeechSynthesisUtteranceBinding.h"
       6             : #include "WrapperFactory.h"
       7             : #include "mozilla/FloatingPoint.h"
       8             : #include "mozilla/OwningNonNull.h"
       9             : #include "mozilla/Preferences.h"
      10             : #include "mozilla/dom/BindingUtils.h"
      11             : #include "mozilla/dom/DOMJSClass.h"
      12             : #include "mozilla/dom/NonRefcountedDOMObject.h"
      13             : #include "mozilla/dom/Nullable.h"
      14             : #include "mozilla/dom/PrimitiveConversions.h"
      15             : #include "mozilla/dom/SpeechSynthesisUtterance.h"
      16             : #include "mozilla/dom/SpeechSynthesisVoice.h"
      17             : #include "mozilla/dom/XrayExpandoClass.h"
      18             : #include "nsContentUtils.h"
      19             : 
      20             : namespace mozilla {
      21             : namespace dom {
      22             : 
      23             : namespace SpeechSynthesisUtteranceBinding {
      24             : 
      25             : static_assert(IsRefcounted<NativeType>::value == IsRefcounted<EventTargetBinding::NativeType>::value,
      26             :               "Can't inherit from an interface with a different ownership model.");
      27             : 
      28             : static bool
      29           0 : get_text(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
      30             : {
      31           0 :   DOMString result;
      32           0 :   self->GetText(result);
      33           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
      34           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
      35           0 :     return false;
      36             :   }
      37           0 :   return true;
      38             : }
      39             : 
      40             : static bool
      41           0 : set_text(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
      42             : {
      43           0 :   binding_detail::FakeString arg0;
      44           0 :   if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
      45           0 :     return false;
      46             :   }
      47           0 :   self->SetText(NonNullHelper(Constify(arg0)));
      48           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
      49             : 
      50           0 :   return true;
      51             : }
      52             : 
      53             : static const JSJitInfo text_getterinfo = {
      54             :   { (JSJitGetterOp)get_text },
      55             :   { prototypes::id::SpeechSynthesisUtterance },
      56             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
      57             :   JSJitInfo::Getter,
      58             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
      59             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
      60             :   false,  /* isInfallible. False in setters. */
      61             :   false,  /* isMovable.  Not relevant for setters. */
      62             :   false, /* isEliminatable.  Not relevant for setters. */
      63             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
      64             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
      65             :   false,  /* isTypedMethod.  Only relevant for methods. */
      66             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
      67             : };
      68             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
      69             : static_assert(0 < 1, "There is no slot for us");
      70             : static const JSJitInfo text_setterinfo = {
      71             :   { (JSJitGetterOp)set_text },
      72             :   { prototypes::id::SpeechSynthesisUtterance },
      73             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
      74             :   JSJitInfo::Setter,
      75             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
      76             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
      77             :   false,  /* isInfallible. False in setters. */
      78             :   false,  /* isMovable.  Not relevant for setters. */
      79             :   false, /* isEliminatable.  Not relevant for setters. */
      80             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
      81             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
      82             :   false,  /* isTypedMethod.  Only relevant for methods. */
      83             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
      84             : };
      85             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
      86             : static_assert(0 < 1, "There is no slot for us");
      87             : 
      88             : static bool
      89           0 : get_lang(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
      90             : {
      91           0 :   DOMString result;
      92           0 :   self->GetLang(result);
      93           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
      94           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
      95           0 :     return false;
      96             :   }
      97           0 :   return true;
      98             : }
      99             : 
     100             : static bool
     101           0 : set_lang(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
     102             : {
     103           0 :   binding_detail::FakeString arg0;
     104           0 :   if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
     105           0 :     return false;
     106             :   }
     107           0 :   self->SetLang(NonNullHelper(Constify(arg0)));
     108           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     109             : 
     110           0 :   return true;
     111             : }
     112             : 
     113             : static const JSJitInfo lang_getterinfo = {
     114             :   { (JSJitGetterOp)get_lang },
     115             :   { prototypes::id::SpeechSynthesisUtterance },
     116             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     117             :   JSJitInfo::Getter,
     118             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     119             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
     120             :   false,  /* isInfallible. False in setters. */
     121             :   false,  /* isMovable.  Not relevant for setters. */
     122             :   false, /* isEliminatable.  Not relevant for setters. */
     123             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     124             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     125             :   false,  /* isTypedMethod.  Only relevant for methods. */
     126             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     127             : };
     128             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     129             : static_assert(0 < 1, "There is no slot for us");
     130             : static const JSJitInfo lang_setterinfo = {
     131             :   { (JSJitGetterOp)set_lang },
     132             :   { prototypes::id::SpeechSynthesisUtterance },
     133             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     134             :   JSJitInfo::Setter,
     135             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     136             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     137             :   false,  /* isInfallible. False in setters. */
     138             :   false,  /* isMovable.  Not relevant for setters. */
     139             :   false, /* isEliminatable.  Not relevant for setters. */
     140             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     141             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     142             :   false,  /* isTypedMethod.  Only relevant for methods. */
     143             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     144             : };
     145             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     146             : static_assert(0 < 1, "There is no slot for us");
     147             : 
     148             : static bool
     149           0 : get_voice(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
     150             : {
     151           0 :   auto result(StrongOrRawPtr<mozilla::dom::SpeechSynthesisVoice>(self->GetVoice()));
     152           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     153           0 :   if (!result) {
     154           0 :     args.rval().setNull();
     155           0 :     return true;
     156             :   }
     157           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
     158           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
     159           0 :     return false;
     160             :   }
     161           0 :   return true;
     162             : }
     163             : 
     164             : static bool
     165           0 : set_voice(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
     166             : {
     167             :   mozilla::dom::SpeechSynthesisVoice* arg0;
     168           0 :   if (args[0].isObject()) {
     169             :     {
     170           0 :       nsresult rv = UnwrapObject<prototypes::id::SpeechSynthesisVoice, mozilla::dom::SpeechSynthesisVoice>(args[0], arg0);
     171           0 :       if (NS_FAILED(rv)) {
     172           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Value being assigned to SpeechSynthesisUtterance.voice", "SpeechSynthesisVoice");
     173           0 :         return false;
     174             :       }
     175             :     }
     176           0 :   } else if (args[0].isNullOrUndefined()) {
     177           0 :     arg0 = nullptr;
     178             :   } else {
     179           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Value being assigned to SpeechSynthesisUtterance.voice");
     180           0 :     return false;
     181             :   }
     182           0 :   self->SetVoice(Constify(arg0));
     183           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     184             : 
     185           0 :   return true;
     186             : }
     187             : 
     188             : static const JSJitInfo voice_getterinfo = {
     189             :   { (JSJitGetterOp)get_voice },
     190             :   { prototypes::id::SpeechSynthesisUtterance },
     191             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     192             :   JSJitInfo::Getter,
     193             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     194             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     195             :   false,  /* isInfallible. False in setters. */
     196             :   false,  /* isMovable.  Not relevant for setters. */
     197             :   false, /* isEliminatable.  Not relevant for setters. */
     198             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     199             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     200             :   false,  /* isTypedMethod.  Only relevant for methods. */
     201             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     202             : };
     203             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     204             : static_assert(0 < 1, "There is no slot for us");
     205             : static const JSJitInfo voice_setterinfo = {
     206             :   { (JSJitGetterOp)set_voice },
     207             :   { prototypes::id::SpeechSynthesisUtterance },
     208             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     209             :   JSJitInfo::Setter,
     210             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     211             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     212             :   false,  /* isInfallible. False in setters. */
     213             :   false,  /* isMovable.  Not relevant for setters. */
     214             :   false, /* isEliminatable.  Not relevant for setters. */
     215             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     216             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     217             :   false,  /* isTypedMethod.  Only relevant for methods. */
     218             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     219             : };
     220             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     221             : static_assert(0 < 1, "There is no slot for us");
     222             : 
     223             : static bool
     224           0 : get_volume(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
     225             : {
     226           0 :   float result(self->Volume());
     227           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     228           0 :   args.rval().set(JS_NumberValue(double(result)));
     229           0 :   return true;
     230             : }
     231             : 
     232             : static bool
     233           0 : set_volume(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
     234             : {
     235             :   float arg0;
     236           0 :   if (!ValueToPrimitive<float, eDefault>(cx, args[0], &arg0)) {
     237           0 :     return false;
     238           0 :   } else if (!mozilla::IsFinite(arg0)) {
     239           0 :     ThrowErrorMessage(cx, MSG_NOT_FINITE, "Value being assigned to SpeechSynthesisUtterance.volume");
     240           0 :     return false;
     241             :   }
     242           0 :   self->SetVolume(arg0);
     243           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     244             : 
     245           0 :   return true;
     246             : }
     247             : 
     248             : static const JSJitInfo volume_getterinfo = {
     249             :   { (JSJitGetterOp)get_volume },
     250             :   { prototypes::id::SpeechSynthesisUtterance },
     251             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     252             :   JSJitInfo::Getter,
     253             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     254             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
     255             :   true,  /* isInfallible. False in setters. */
     256             :   false,  /* isMovable.  Not relevant for setters. */
     257             :   false, /* isEliminatable.  Not relevant for setters. */
     258             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     259             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     260             :   false,  /* isTypedMethod.  Only relevant for methods. */
     261             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     262             : };
     263             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     264             : static_assert(0 < 1, "There is no slot for us");
     265             : static const JSJitInfo volume_setterinfo = {
     266             :   { (JSJitGetterOp)set_volume },
     267             :   { prototypes::id::SpeechSynthesisUtterance },
     268             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     269             :   JSJitInfo::Setter,
     270             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     271             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     272             :   false,  /* isInfallible. False in setters. */
     273             :   false,  /* isMovable.  Not relevant for setters. */
     274             :   false, /* isEliminatable.  Not relevant for setters. */
     275             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     276             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     277             :   false,  /* isTypedMethod.  Only relevant for methods. */
     278             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     279             : };
     280             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     281             : static_assert(0 < 1, "There is no slot for us");
     282             : 
     283             : static bool
     284           0 : get_rate(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
     285             : {
     286           0 :   float result(self->Rate());
     287           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     288           0 :   args.rval().set(JS_NumberValue(double(result)));
     289           0 :   return true;
     290             : }
     291             : 
     292             : static bool
     293           0 : set_rate(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
     294             : {
     295             :   float arg0;
     296           0 :   if (!ValueToPrimitive<float, eDefault>(cx, args[0], &arg0)) {
     297           0 :     return false;
     298           0 :   } else if (!mozilla::IsFinite(arg0)) {
     299           0 :     ThrowErrorMessage(cx, MSG_NOT_FINITE, "Value being assigned to SpeechSynthesisUtterance.rate");
     300           0 :     return false;
     301             :   }
     302           0 :   self->SetRate(arg0);
     303           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     304             : 
     305           0 :   return true;
     306             : }
     307             : 
     308             : static const JSJitInfo rate_getterinfo = {
     309             :   { (JSJitGetterOp)get_rate },
     310             :   { prototypes::id::SpeechSynthesisUtterance },
     311             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     312             :   JSJitInfo::Getter,
     313             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     314             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
     315             :   true,  /* isInfallible. False in setters. */
     316             :   false,  /* isMovable.  Not relevant for setters. */
     317             :   false, /* isEliminatable.  Not relevant for setters. */
     318             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     319             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     320             :   false,  /* isTypedMethod.  Only relevant for methods. */
     321             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     322             : };
     323             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     324             : static_assert(0 < 1, "There is no slot for us");
     325             : static const JSJitInfo rate_setterinfo = {
     326             :   { (JSJitGetterOp)set_rate },
     327             :   { prototypes::id::SpeechSynthesisUtterance },
     328             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     329             :   JSJitInfo::Setter,
     330             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     331             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     332             :   false,  /* isInfallible. False in setters. */
     333             :   false,  /* isMovable.  Not relevant for setters. */
     334             :   false, /* isEliminatable.  Not relevant for setters. */
     335             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     336             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     337             :   false,  /* isTypedMethod.  Only relevant for methods. */
     338             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     339             : };
     340             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     341             : static_assert(0 < 1, "There is no slot for us");
     342             : 
     343             : static bool
     344           0 : get_pitch(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
     345             : {
     346           0 :   float result(self->Pitch());
     347           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     348           0 :   args.rval().set(JS_NumberValue(double(result)));
     349           0 :   return true;
     350             : }
     351             : 
     352             : static bool
     353           0 : set_pitch(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
     354             : {
     355             :   float arg0;
     356           0 :   if (!ValueToPrimitive<float, eDefault>(cx, args[0], &arg0)) {
     357           0 :     return false;
     358           0 :   } else if (!mozilla::IsFinite(arg0)) {
     359           0 :     ThrowErrorMessage(cx, MSG_NOT_FINITE, "Value being assigned to SpeechSynthesisUtterance.pitch");
     360           0 :     return false;
     361             :   }
     362           0 :   self->SetPitch(arg0);
     363           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     364             : 
     365           0 :   return true;
     366             : }
     367             : 
     368             : static const JSJitInfo pitch_getterinfo = {
     369             :   { (JSJitGetterOp)get_pitch },
     370             :   { prototypes::id::SpeechSynthesisUtterance },
     371             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     372             :   JSJitInfo::Getter,
     373             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     374             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
     375             :   true,  /* 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             : static const JSJitInfo pitch_setterinfo = {
     386             :   { (JSJitGetterOp)set_pitch },
     387             :   { prototypes::id::SpeechSynthesisUtterance },
     388             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     389             :   JSJitInfo::Setter,
     390             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     391             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     392             :   false,  /* isInfallible. False in setters. */
     393             :   false,  /* isMovable.  Not relevant for setters. */
     394             :   false, /* isEliminatable.  Not relevant for setters. */
     395             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     396             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     397             :   false,  /* isTypedMethod.  Only relevant for methods. */
     398             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     399             : };
     400             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     401             : static_assert(0 < 1, "There is no slot for us");
     402             : 
     403             : static bool
     404           0 : get_onstart(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
     405             : {
     406           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnstart());
     407           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     408           0 :   if (result) {
     409           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
     410           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
     411           0 :       return false;
     412             :     }
     413           0 :     return true;
     414             :   } else {
     415           0 :     args.rval().setNull();
     416           0 :     return true;
     417             :   }
     418             : }
     419             : 
     420             : static bool
     421           0 : set_onstart(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
     422             : {
     423           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
     424           0 :   if (args[0].isObject()) {
     425             :     { // scope for tempRoot
     426           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
     427           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
     428             :     }
     429             :   } else {
     430           0 :     arg0 = nullptr;
     431             :   }
     432           0 :   self->SetOnstart(Constify(arg0));
     433           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     434             : 
     435           0 :   return true;
     436             : }
     437             : 
     438             : static const JSJitInfo onstart_getterinfo = {
     439             :   { (JSJitGetterOp)get_onstart },
     440             :   { prototypes::id::SpeechSynthesisUtterance },
     441             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     442             :   JSJitInfo::Getter,
     443             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     444             :   JSVAL_TYPE_UNKNOWN,  /* 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             : static const JSJitInfo onstart_setterinfo = {
     456             :   { (JSJitGetterOp)set_onstart },
     457             :   { prototypes::id::SpeechSynthesisUtterance },
     458             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     459             :   JSJitInfo::Setter,
     460             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     461             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     462             :   false,  /* isInfallible. False in setters. */
     463             :   false,  /* isMovable.  Not relevant for setters. */
     464             :   false, /* isEliminatable.  Not relevant for setters. */
     465             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     466             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     467             :   false,  /* isTypedMethod.  Only relevant for methods. */
     468             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     469             : };
     470             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     471             : static_assert(0 < 1, "There is no slot for us");
     472             : 
     473             : static bool
     474           0 : get_onend(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
     475             : {
     476           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnend());
     477           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     478           0 :   if (result) {
     479           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
     480           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
     481           0 :       return false;
     482             :     }
     483           0 :     return true;
     484             :   } else {
     485           0 :     args.rval().setNull();
     486           0 :     return true;
     487             :   }
     488             : }
     489             : 
     490             : static bool
     491           0 : set_onend(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
     492             : {
     493           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
     494           0 :   if (args[0].isObject()) {
     495             :     { // scope for tempRoot
     496           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
     497           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
     498             :     }
     499             :   } else {
     500           0 :     arg0 = nullptr;
     501             :   }
     502           0 :   self->SetOnend(Constify(arg0));
     503           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     504             : 
     505           0 :   return true;
     506             : }
     507             : 
     508             : static const JSJitInfo onend_getterinfo = {
     509             :   { (JSJitGetterOp)get_onend },
     510             :   { prototypes::id::SpeechSynthesisUtterance },
     511             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     512             :   JSJitInfo::Getter,
     513             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     514             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     515             :   false,  /* isInfallible. False in setters. */
     516             :   false,  /* isMovable.  Not relevant for setters. */
     517             :   false, /* isEliminatable.  Not relevant for setters. */
     518             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     519             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     520             :   false,  /* isTypedMethod.  Only relevant for methods. */
     521             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     522             : };
     523             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     524             : static_assert(0 < 1, "There is no slot for us");
     525             : static const JSJitInfo onend_setterinfo = {
     526             :   { (JSJitGetterOp)set_onend },
     527             :   { prototypes::id::SpeechSynthesisUtterance },
     528             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     529             :   JSJitInfo::Setter,
     530             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     531             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     532             :   false,  /* isInfallible. False in setters. */
     533             :   false,  /* isMovable.  Not relevant for setters. */
     534             :   false, /* isEliminatable.  Not relevant for setters. */
     535             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     536             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     537             :   false,  /* isTypedMethod.  Only relevant for methods. */
     538             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     539             : };
     540             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     541             : static_assert(0 < 1, "There is no slot for us");
     542             : 
     543             : static bool
     544           0 : get_onerror(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
     545             : {
     546           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnerror());
     547           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     548           0 :   if (result) {
     549           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
     550           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
     551           0 :       return false;
     552             :     }
     553           0 :     return true;
     554             :   } else {
     555           0 :     args.rval().setNull();
     556           0 :     return true;
     557             :   }
     558             : }
     559             : 
     560             : static bool
     561           0 : set_onerror(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
     562             : {
     563           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
     564           0 :   if (args[0].isObject()) {
     565             :     { // scope for tempRoot
     566           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
     567           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
     568             :     }
     569             :   } else {
     570           0 :     arg0 = nullptr;
     571             :   }
     572           0 :   self->SetOnerror(Constify(arg0));
     573           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     574             : 
     575           0 :   return true;
     576             : }
     577             : 
     578             : static const JSJitInfo onerror_getterinfo = {
     579             :   { (JSJitGetterOp)get_onerror },
     580             :   { prototypes::id::SpeechSynthesisUtterance },
     581             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     582             :   JSJitInfo::Getter,
     583             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     584             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     585             :   false,  /* isInfallible. False in setters. */
     586             :   false,  /* isMovable.  Not relevant for setters. */
     587             :   false, /* isEliminatable.  Not relevant for setters. */
     588             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     589             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     590             :   false,  /* isTypedMethod.  Only relevant for methods. */
     591             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     592             : };
     593             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     594             : static_assert(0 < 1, "There is no slot for us");
     595             : static const JSJitInfo onerror_setterinfo = {
     596             :   { (JSJitGetterOp)set_onerror },
     597             :   { prototypes::id::SpeechSynthesisUtterance },
     598             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     599             :   JSJitInfo::Setter,
     600             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     601             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     602             :   false,  /* isInfallible. False in setters. */
     603             :   false,  /* isMovable.  Not relevant for setters. */
     604             :   false, /* isEliminatable.  Not relevant for setters. */
     605             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     606             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     607             :   false,  /* isTypedMethod.  Only relevant for methods. */
     608             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     609             : };
     610             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     611             : static_assert(0 < 1, "There is no slot for us");
     612             : 
     613             : static bool
     614           0 : get_onpause(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
     615             : {
     616           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnpause());
     617           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     618           0 :   if (result) {
     619           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
     620           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
     621           0 :       return false;
     622             :     }
     623           0 :     return true;
     624             :   } else {
     625           0 :     args.rval().setNull();
     626           0 :     return true;
     627             :   }
     628             : }
     629             : 
     630             : static bool
     631           0 : set_onpause(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
     632             : {
     633           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
     634           0 :   if (args[0].isObject()) {
     635             :     { // scope for tempRoot
     636           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
     637           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
     638             :     }
     639             :   } else {
     640           0 :     arg0 = nullptr;
     641             :   }
     642           0 :   self->SetOnpause(Constify(arg0));
     643           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     644             : 
     645           0 :   return true;
     646             : }
     647             : 
     648             : static const JSJitInfo onpause_getterinfo = {
     649             :   { (JSJitGetterOp)get_onpause },
     650             :   { prototypes::id::SpeechSynthesisUtterance },
     651             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     652             :   JSJitInfo::Getter,
     653             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     654             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     655             :   false,  /* isInfallible. False in setters. */
     656             :   false,  /* isMovable.  Not relevant for setters. */
     657             :   false, /* isEliminatable.  Not relevant for setters. */
     658             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     659             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     660             :   false,  /* isTypedMethod.  Only relevant for methods. */
     661             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     662             : };
     663             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     664             : static_assert(0 < 1, "There is no slot for us");
     665             : static const JSJitInfo onpause_setterinfo = {
     666             :   { (JSJitGetterOp)set_onpause },
     667             :   { prototypes::id::SpeechSynthesisUtterance },
     668             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     669             :   JSJitInfo::Setter,
     670             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     671             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     672             :   false,  /* isInfallible. False in setters. */
     673             :   false,  /* isMovable.  Not relevant for setters. */
     674             :   false, /* isEliminatable.  Not relevant for setters. */
     675             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     676             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     677             :   false,  /* isTypedMethod.  Only relevant for methods. */
     678             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     679             : };
     680             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     681             : static_assert(0 < 1, "There is no slot for us");
     682             : 
     683             : static bool
     684           0 : get_onresume(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
     685             : {
     686           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnresume());
     687           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     688           0 :   if (result) {
     689           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
     690           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
     691           0 :       return false;
     692             :     }
     693           0 :     return true;
     694             :   } else {
     695           0 :     args.rval().setNull();
     696           0 :     return true;
     697             :   }
     698             : }
     699             : 
     700             : static bool
     701           0 : set_onresume(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
     702             : {
     703           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
     704           0 :   if (args[0].isObject()) {
     705             :     { // scope for tempRoot
     706           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
     707           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
     708             :     }
     709             :   } else {
     710           0 :     arg0 = nullptr;
     711             :   }
     712           0 :   self->SetOnresume(Constify(arg0));
     713           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     714             : 
     715           0 :   return true;
     716             : }
     717             : 
     718             : static const JSJitInfo onresume_getterinfo = {
     719             :   { (JSJitGetterOp)get_onresume },
     720             :   { prototypes::id::SpeechSynthesisUtterance },
     721             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     722             :   JSJitInfo::Getter,
     723             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     724             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     725             :   false,  /* isInfallible. False in setters. */
     726             :   false,  /* isMovable.  Not relevant for setters. */
     727             :   false, /* isEliminatable.  Not relevant for setters. */
     728             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     729             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     730             :   false,  /* isTypedMethod.  Only relevant for methods. */
     731             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     732             : };
     733             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     734             : static_assert(0 < 1, "There is no slot for us");
     735             : static const JSJitInfo onresume_setterinfo = {
     736             :   { (JSJitGetterOp)set_onresume },
     737             :   { prototypes::id::SpeechSynthesisUtterance },
     738             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     739             :   JSJitInfo::Setter,
     740             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     741             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     742             :   false,  /* isInfallible. False in setters. */
     743             :   false,  /* isMovable.  Not relevant for setters. */
     744             :   false, /* isEliminatable.  Not relevant for setters. */
     745             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     746             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     747             :   false,  /* isTypedMethod.  Only relevant for methods. */
     748             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     749             : };
     750             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     751             : static_assert(0 < 1, "There is no slot for us");
     752             : 
     753             : static bool
     754           0 : get_onmark(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
     755             : {
     756           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnmark());
     757           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     758           0 :   if (result) {
     759           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
     760           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
     761           0 :       return false;
     762             :     }
     763           0 :     return true;
     764             :   } else {
     765           0 :     args.rval().setNull();
     766           0 :     return true;
     767             :   }
     768             : }
     769             : 
     770             : static bool
     771           0 : set_onmark(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
     772             : {
     773           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
     774           0 :   if (args[0].isObject()) {
     775             :     { // scope for tempRoot
     776           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
     777           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
     778             :     }
     779             :   } else {
     780           0 :     arg0 = nullptr;
     781             :   }
     782           0 :   self->SetOnmark(Constify(arg0));
     783           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     784             : 
     785           0 :   return true;
     786             : }
     787             : 
     788             : static const JSJitInfo onmark_getterinfo = {
     789             :   { (JSJitGetterOp)get_onmark },
     790             :   { prototypes::id::SpeechSynthesisUtterance },
     791             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     792             :   JSJitInfo::Getter,
     793             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     794             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     795             :   false,  /* isInfallible. False in setters. */
     796             :   false,  /* isMovable.  Not relevant for setters. */
     797             :   false, /* isEliminatable.  Not relevant for setters. */
     798             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     799             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     800             :   false,  /* isTypedMethod.  Only relevant for methods. */
     801             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     802             : };
     803             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     804             : static_assert(0 < 1, "There is no slot for us");
     805             : static const JSJitInfo onmark_setterinfo = {
     806             :   { (JSJitGetterOp)set_onmark },
     807             :   { prototypes::id::SpeechSynthesisUtterance },
     808             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     809             :   JSJitInfo::Setter,
     810             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     811             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     812             :   false,  /* isInfallible. False in setters. */
     813             :   false,  /* isMovable.  Not relevant for setters. */
     814             :   false, /* isEliminatable.  Not relevant for setters. */
     815             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     816             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     817             :   false,  /* isTypedMethod.  Only relevant for methods. */
     818             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     819             : };
     820             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     821             : static_assert(0 < 1, "There is no slot for us");
     822             : 
     823             : static bool
     824           0 : get_onboundary(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
     825             : {
     826           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnboundary());
     827           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     828           0 :   if (result) {
     829           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
     830           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
     831           0 :       return false;
     832             :     }
     833           0 :     return true;
     834             :   } else {
     835           0 :     args.rval().setNull();
     836           0 :     return true;
     837             :   }
     838             : }
     839             : 
     840             : static bool
     841           0 : set_onboundary(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
     842             : {
     843           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
     844           0 :   if (args[0].isObject()) {
     845             :     { // scope for tempRoot
     846           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
     847           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
     848             :     }
     849             :   } else {
     850           0 :     arg0 = nullptr;
     851             :   }
     852           0 :   self->SetOnboundary(Constify(arg0));
     853           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     854             : 
     855           0 :   return true;
     856             : }
     857             : 
     858             : static const JSJitInfo onboundary_getterinfo = {
     859             :   { (JSJitGetterOp)get_onboundary },
     860             :   { prototypes::id::SpeechSynthesisUtterance },
     861             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     862             :   JSJitInfo::Getter,
     863             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     864             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     865             :   false,  /* isInfallible. False in setters. */
     866             :   false,  /* isMovable.  Not relevant for setters. */
     867             :   false, /* isEliminatable.  Not relevant for setters. */
     868             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     869             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     870             :   false,  /* isTypedMethod.  Only relevant for methods. */
     871             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     872             : };
     873             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     874             : static_assert(0 < 1, "There is no slot for us");
     875             : static const JSJitInfo onboundary_setterinfo = {
     876             :   { (JSJitGetterOp)set_onboundary },
     877             :   { prototypes::id::SpeechSynthesisUtterance },
     878             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     879             :   JSJitInfo::Setter,
     880             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     881             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     882             :   false,  /* isInfallible. False in setters. */
     883             :   false,  /* isMovable.  Not relevant for setters. */
     884             :   false, /* isEliminatable.  Not relevant for setters. */
     885             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     886             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     887             :   false,  /* isTypedMethod.  Only relevant for methods. */
     888             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     889             : };
     890             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     891             : static_assert(0 < 1, "There is no slot for us");
     892             : 
     893             : static bool
     894           0 : get_chosenVoiceURI(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
     895             : {
     896           0 :   DOMString result;
     897           0 :   self->GetChosenVoiceURI(result);
     898           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     899           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
     900           0 :     return false;
     901             :   }
     902           0 :   return true;
     903             : }
     904             : 
     905             : static const JSJitInfo chosenVoiceURI_getterinfo = {
     906             :   { (JSJitGetterOp)get_chosenVoiceURI },
     907             :   { prototypes::id::SpeechSynthesisUtterance },
     908             :   { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
     909             :   JSJitInfo::Getter,
     910             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     911             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
     912             :   false,  /* isInfallible. False in setters. */
     913             :   false,  /* isMovable.  Not relevant for setters. */
     914             :   false, /* isEliminatable.  Not relevant for setters. */
     915             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     916             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     917             :   false,  /* isTypedMethod.  Only relevant for methods. */
     918             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     919             : };
     920             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     921             : static_assert(0 < 1, "There is no slot for us");
     922             : 
     923             : static bool
     924           0 : _addProperty(JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JS::Handle<JS::Value> val)
     925             : {
     926           0 :   mozilla::dom::SpeechSynthesisUtterance* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::SpeechSynthesisUtterance>(obj);
     927             :   // We don't want to preserve if we don't have a wrapper, and we
     928             :   // obviously can't preserve if we're not initialized.
     929           0 :   if (self && self->GetWrapperPreserveColor()) {
     930           0 :     PreserveWrapper(self);
     931             :   }
     932           0 :   return true;
     933             : }
     934             : 
     935             : static void
     936           0 : _finalize(js::FreeOp* fop, JSObject* obj)
     937             : {
     938           0 :   mozilla::dom::SpeechSynthesisUtterance* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::SpeechSynthesisUtterance>(obj);
     939           0 :   if (self) {
     940           0 :     ClearWrapper(self, self, obj);
     941           0 :     AddForDeferredFinalization<mozilla::dom::SpeechSynthesisUtterance>(self);
     942             :   }
     943           0 : }
     944             : 
     945             : static void
     946           0 : _objectMoved(JSObject* obj, const JSObject* old)
     947             : {
     948           0 :   mozilla::dom::SpeechSynthesisUtterance* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::SpeechSynthesisUtterance>(obj);
     949           0 :   if (self) {
     950           0 :     UpdateWrapper(self, self, obj, old);
     951             :   }
     952           0 : }
     953             : 
     954             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
     955             : #if defined(__clang__)
     956             : #pragma clang diagnostic push
     957             : #pragma clang diagnostic ignored "-Wmissing-braces"
     958             : #endif
     959             : static const JSPropertySpec sAttributes_specs[] = {
     960             :   { "text", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &text_getterinfo, GenericBindingSetter, &text_setterinfo },
     961             :   { "lang", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &lang_getterinfo, GenericBindingSetter, &lang_setterinfo },
     962             :   { "voice", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &voice_getterinfo, GenericBindingSetter, &voice_setterinfo },
     963             :   { "volume", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &volume_getterinfo, GenericBindingSetter, &volume_setterinfo },
     964             :   { "rate", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &rate_getterinfo, GenericBindingSetter, &rate_setterinfo },
     965             :   { "pitch", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &pitch_getterinfo, GenericBindingSetter, &pitch_setterinfo },
     966             :   { "onstart", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onstart_getterinfo, GenericBindingSetter, &onstart_setterinfo },
     967             :   { "onend", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onend_getterinfo, GenericBindingSetter, &onend_setterinfo },
     968             :   { "onerror", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onerror_getterinfo, GenericBindingSetter, &onerror_setterinfo },
     969             :   { "onpause", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onpause_getterinfo, GenericBindingSetter, &onpause_setterinfo },
     970             :   { "onresume", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onresume_getterinfo, GenericBindingSetter, &onresume_setterinfo },
     971             :   { "onmark", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onmark_getterinfo, GenericBindingSetter, &onmark_setterinfo },
     972             :   { "onboundary", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onboundary_getterinfo, GenericBindingSetter, &onboundary_setterinfo },
     973             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
     974             : };
     975             : #if defined(__clang__)
     976             : #pragma clang diagnostic pop
     977             : #endif
     978             : 
     979             : 
     980             : // Can't be const because the pref-enabled boolean needs to be writable
     981             : static Prefable<const JSPropertySpec> sAttributes[] = {
     982             :   { nullptr, &sAttributes_specs[0] },
     983             :   { nullptr, nullptr }
     984             : };
     985             : 
     986             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
     987             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
     988             : static_assert(13 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
     989             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
     990             : 
     991             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
     992             : #if defined(__clang__)
     993             : #pragma clang diagnostic push
     994             : #pragma clang diagnostic ignored "-Wmissing-braces"
     995             : #endif
     996             : static const JSPropertySpec sChromeAttributes_specs[] = {
     997             :   { "chosenVoiceURI", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &chosenVoiceURI_getterinfo, nullptr, nullptr },
     998             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
     999             : };
    1000             : #if defined(__clang__)
    1001             : #pragma clang diagnostic pop
    1002             : #endif
    1003             : 
    1004             : 
    1005             : // Can't be const because the pref-enabled boolean needs to be writable
    1006             : static Prefable<const JSPropertySpec> sChromeAttributes[] = {
    1007             :   { nullptr, &sChromeAttributes_specs[0] },
    1008             :   { nullptr, nullptr }
    1009             : };
    1010             : 
    1011             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
    1012             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
    1013             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
    1014             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
    1015             : 
    1016             : 
    1017             : static uint16_t sNativeProperties_sortedPropertyIndices[13];
    1018             : static PropertyInfo sNativeProperties_propertyInfos[13];
    1019             : 
    1020             : static const NativePropertiesN<1> sNativeProperties = {
    1021             :   false, 0,
    1022             :   false, 0,
    1023             :   false, 0,
    1024             :   true,  0 /* sAttributes */,
    1025             :   false, 0,
    1026             :   false, 0,
    1027             :   false, 0,
    1028             :   -1,
    1029             :   13,
    1030             :   sNativeProperties_sortedPropertyIndices,
    1031             :   {
    1032             :     { sAttributes, &sNativeProperties_propertyInfos[0] }
    1033             :   }
    1034             : };
    1035             : static_assert(13 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
    1036             :     "We have a property info count that is oversized");
    1037             : 
    1038             : static uint16_t sChromeOnlyNativeProperties_sortedPropertyIndices[1];
    1039             : static PropertyInfo sChromeOnlyNativeProperties_propertyInfos[1];
    1040             : 
    1041             : static const NativePropertiesN<1> sChromeOnlyNativeProperties = {
    1042             :   false, 0,
    1043             :   false, 0,
    1044             :   false, 0,
    1045             :   true,  0 /* sChromeAttributes */,
    1046             :   false, 0,
    1047             :   false, 0,
    1048             :   false, 0,
    1049             :   -1,
    1050             :   1,
    1051             :   sChromeOnlyNativeProperties_sortedPropertyIndices,
    1052             :   {
    1053             :     { sChromeAttributes, &sChromeOnlyNativeProperties_propertyInfos[0] }
    1054             :   }
    1055             : };
    1056             : static_assert(1 < 1ull << CHAR_BIT * sizeof(sChromeOnlyNativeProperties.propertyInfoCount),
    1057             :     "We have a property info count that is oversized");
    1058             : 
    1059             : static bool
    1060           0 : _constructor(JSContext* cx, unsigned argc, JS::Value* vp)
    1061             : {
    1062           0 :   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
    1063           0 :   JS::Rooted<JSObject*> obj(cx, &args.callee());
    1064           0 :   if (!args.isConstructing()) {
    1065             :     // XXXbz wish I could get the name from the callee instead of
    1066             :     // Adding more relocations
    1067           0 :     return ThrowConstructorWithoutNew(cx, "SpeechSynthesisUtterance");
    1068             :   }
    1069             : 
    1070           0 :   GlobalObject global(cx, obj);
    1071           0 :   if (global.Failed()) {
    1072           0 :     return false;
    1073             :   }
    1074             : 
    1075           0 :   JS::Rooted<JSObject*> desiredProto(cx);
    1076           0 :   if (!GetDesiredProto(cx, args, &desiredProto)) {
    1077           0 :     return false;
    1078             :   }
    1079             : 
    1080           0 :   unsigned argcount = std::min(args.length(), 1u);
    1081           0 :   switch (argcount) {
    1082             :     case 0: {
    1083           0 :       bool objIsXray = xpc::WrapperFactory::IsXrayWrapper(obj);
    1084           0 :       Maybe<JSAutoCompartment> ac;
    1085           0 :       if (objIsXray) {
    1086           0 :         obj = js::CheckedUnwrap(obj);
    1087           0 :         if (!obj) {
    1088           0 :           return false;
    1089             :         }
    1090           0 :         ac.emplace(cx, obj);
    1091           0 :         if (!JS_WrapObject(cx, &desiredProto)) {
    1092           0 :           return false;
    1093             :         }
    1094             :       }
    1095           0 :       binding_detail::FastErrorResult rv;
    1096           0 :       auto result(StrongOrRawPtr<mozilla::dom::SpeechSynthesisUtterance>(mozilla::dom::SpeechSynthesisUtterance::Constructor(global, rv)));
    1097           0 :       if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1098           0 :         return false;
    1099             :       }
    1100           0 :       MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1101             :       static_assert(!IsPointer<decltype(result)>::value,
    1102             :                     "NewObject implies that we need to keep the object alive with a strong reference.");
    1103           0 :       if (!GetOrCreateDOMReflector(cx, result, args.rval(), desiredProto)) {
    1104           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1105           0 :         return false;
    1106             :       }
    1107           0 :       return true;
    1108             :       break;
    1109             :     }
    1110             :     case 1: {
    1111           0 :       bool objIsXray = xpc::WrapperFactory::IsXrayWrapper(obj);
    1112           0 :       binding_detail::FakeString arg0;
    1113           0 :       if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
    1114           0 :         return false;
    1115             :       }
    1116           0 :       Maybe<JSAutoCompartment> ac;
    1117           0 :       if (objIsXray) {
    1118           0 :         obj = js::CheckedUnwrap(obj);
    1119           0 :         if (!obj) {
    1120           0 :           return false;
    1121             :         }
    1122           0 :         ac.emplace(cx, obj);
    1123           0 :         if (!JS_WrapObject(cx, &desiredProto)) {
    1124           0 :           return false;
    1125             :         }
    1126             :       }
    1127           0 :       binding_detail::FastErrorResult rv;
    1128           0 :       auto result(StrongOrRawPtr<mozilla::dom::SpeechSynthesisUtterance>(mozilla::dom::SpeechSynthesisUtterance::Constructor(global, NonNullHelper(Constify(arg0)), rv)));
    1129           0 :       if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1130           0 :         return false;
    1131             :       }
    1132           0 :       MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1133             :       static_assert(!IsPointer<decltype(result)>::value,
    1134             :                     "NewObject implies that we need to keep the object alive with a strong reference.");
    1135           0 :       if (!GetOrCreateDOMReflector(cx, result, args.rval(), desiredProto)) {
    1136           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1137           0 :         return false;
    1138             :       }
    1139           0 :       return true;
    1140             :       break;
    1141             :     }
    1142             :     default: {
    1143           0 :       return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "SpeechSynthesisUtterance");
    1144             :       break;
    1145             :     }
    1146             :   }
    1147             :   MOZ_CRASH("We have an always-returning default case");
    1148             :   return false;
    1149             : }
    1150             : 
    1151             : static const js::ClassOps sInterfaceObjectClassOps = {
    1152             :     nullptr,               /* addProperty */
    1153             :     nullptr,               /* delProperty */
    1154             :     nullptr,               /* getProperty */
    1155             :     nullptr,               /* setProperty */
    1156             :     nullptr,               /* enumerate */
    1157             :     nullptr,               /* newEnumerate */
    1158             :     nullptr,               /* resolve */
    1159             :     nullptr,               /* mayResolve */
    1160             :     nullptr,               /* finalize */
    1161             :     _constructor, /* call */
    1162             :     nullptr,               /* hasInstance */
    1163             :     _constructor, /* construct */
    1164             :     nullptr,               /* trace */
    1165             : };
    1166             : 
    1167             : static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
    1168             :   {
    1169             :     "Function",
    1170             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
    1171             :     &sInterfaceObjectClassOps,
    1172             :     JS_NULL_CLASS_SPEC,
    1173             :     JS_NULL_CLASS_EXT,
    1174             :     &sInterfaceObjectClassObjectOps
    1175             :   },
    1176             :   eInterface,
    1177             :   true,
    1178             :   prototypes::id::SpeechSynthesisUtterance,
    1179             :   PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth,
    1180             :   sNativePropertyHooks,
    1181             :   "function SpeechSynthesisUtterance() {\n    [native code]\n}",
    1182             :   EventTargetBinding::GetConstructorObject
    1183             : };
    1184             : 
    1185             : static const DOMIfaceAndProtoJSClass sPrototypeClass = {
    1186             :   {
    1187             :     "SpeechSynthesisUtterancePrototype",
    1188             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
    1189             :     JS_NULL_CLASS_OPS,
    1190             :     JS_NULL_CLASS_SPEC,
    1191             :     JS_NULL_CLASS_EXT,
    1192             :     JS_NULL_OBJECT_OPS
    1193             :   },
    1194             :   eInterfacePrototype,
    1195             :   false,
    1196             :   prototypes::id::SpeechSynthesisUtterance,
    1197             :   PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth,
    1198             :   sNativePropertyHooks,
    1199             :   "[object SpeechSynthesisUtterancePrototype]",
    1200             :   EventTargetBinding::GetProtoObject
    1201             : };
    1202             : 
    1203             : bool
    1204           0 : ConstructorEnabled(JSContext* aCx, JS::Handle<JSObject*> aObj)
    1205             : {
    1206             :   static bool sPrefValue;
    1207             :   static bool sPrefCacheSetUp = false;
    1208           0 :   if (!sPrefCacheSetUp) {
    1209           0 :     sPrefCacheSetUp = true;
    1210           0 :     Preferences::AddBoolVarCache(&sPrefValue, "media.webspeech.synth.enabled");
    1211             :   }
    1212             : 
    1213           0 :   return sPrefValue;
    1214             : }
    1215             : 
    1216             : JSObject*
    1217           0 : DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
    1218             : {
    1219           0 :   return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
    1220             : }
    1221             : 
    1222             : static const js::ClassOps sClassOps = {
    1223             :   _addProperty, /* addProperty */
    1224             :   nullptr,               /* delProperty */
    1225             :   nullptr,               /* getProperty */
    1226             :   nullptr,               /* setProperty */
    1227             :   nullptr,               /* enumerate */
    1228             :   nullptr, /* newEnumerate */
    1229             :   nullptr, /* resolve */
    1230             :   nullptr, /* mayResolve */
    1231             :   _finalize, /* finalize */
    1232             :   nullptr, /* call */
    1233             :   nullptr,               /* hasInstance */
    1234             :   nullptr,               /* construct */
    1235             :   nullptr, /* trace */
    1236             : };
    1237             : 
    1238             : static const js::ClassExtension sClassExtension = {
    1239             :   nullptr, /* weakmapKeyDelegateOp */
    1240             :   _objectMoved /* objectMovedOp */
    1241             : };
    1242             : 
    1243             : static const DOMJSClass sClass = {
    1244             :   { "SpeechSynthesisUtterance",
    1245             :     JSCLASS_IS_DOMJSCLASS | JSCLASS_FOREGROUND_FINALIZE | JSCLASS_HAS_RESERVED_SLOTS(1),
    1246             :     &sClassOps,
    1247             :     JS_NULL_CLASS_SPEC,
    1248             :     &sClassExtension,
    1249             :     JS_NULL_OBJECT_OPS
    1250             :   },
    1251             :   { prototypes::id::EventTarget, prototypes::id::SpeechSynthesisUtterance, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count },
    1252             :   IsBaseOf<nsISupports, mozilla::dom::SpeechSynthesisUtterance >::value,
    1253             :   sNativePropertyHooks,
    1254             :   FindAssociatedGlobalForNative<mozilla::dom::SpeechSynthesisUtterance>::Get,
    1255             :   GetProtoObjectHandle,
    1256             :   GetCCParticipant<mozilla::dom::SpeechSynthesisUtterance>::Get()
    1257             : };
    1258             : static_assert(1 == DOM_INSTANCE_RESERVED_SLOTS,
    1259             :               "Must have the right minimal number of reserved slots.");
    1260             : static_assert(1 >= 1,
    1261             :               "Must have enough reserved slots.");
    1262             : 
    1263             : const JSClass*
    1264           0 : GetJSClass()
    1265             : {
    1266           0 :   return sClass.ToJSClass();
    1267             : }
    1268             : 
    1269             : bool
    1270           0 : Wrap(JSContext* aCx, mozilla::dom::SpeechSynthesisUtterance* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector)
    1271             : {
    1272             :   MOZ_ASSERT(static_cast<mozilla::dom::SpeechSynthesisUtterance*>(aObject) ==
    1273             :              reinterpret_cast<mozilla::dom::SpeechSynthesisUtterance*>(aObject),
    1274             :              "Multiple inheritance for mozilla::dom::SpeechSynthesisUtterance is broken.");
    1275             :   MOZ_ASSERT(static_cast<mozilla::dom::EventTarget*>(aObject) ==
    1276             :              reinterpret_cast<mozilla::dom::EventTarget*>(aObject),
    1277             :              "Multiple inheritance for mozilla::dom::EventTarget is broken.");
    1278           0 :   MOZ_ASSERT(ToSupportsIsCorrect(aObject));
    1279           0 :   MOZ_ASSERT_IF(aGivenProto, js::IsObjectInContextCompartment(aGivenProto, aCx));
    1280           0 :   MOZ_ASSERT(!aCache->GetWrapper(),
    1281             :              "You should probably not be using Wrap() directly; use "
    1282             :              "GetOrCreateDOMReflector instead");
    1283             : 
    1284           0 :   MOZ_ASSERT(ToSupportsIsOnPrimaryInheritanceChain(aObject, aCache),
    1285             :              "nsISupports must be on our primary inheritance chain");
    1286             : 
    1287           0 :   JS::Rooted<JSObject*> global(aCx, FindAssociatedGlobal(aCx, aObject->GetParentObject()));
    1288           0 :   if (!global) {
    1289           0 :     return false;
    1290             :   }
    1291           0 :   MOZ_ASSERT(JS_IsGlobalObject(global));
    1292           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(global));
    1293             : 
    1294             :   // That might have ended up wrapping us already, due to the wonders
    1295             :   // of XBL.  Check for that, and bail out as needed.
    1296           0 :   aReflector.set(aCache->GetWrapper());
    1297           0 :   if (aReflector) {
    1298             : #ifdef DEBUG
    1299           0 :     binding_detail::AssertReflectorHasGivenProto(aCx, aReflector, aGivenProto);
    1300             : #endif // DEBUG
    1301           0 :     return true;
    1302             :   }
    1303             : 
    1304           0 :   JSAutoCompartment ac(aCx, global);
    1305           0 :   JS::Handle<JSObject*> canonicalProto = GetProtoObjectHandle(aCx);
    1306           0 :   if (!canonicalProto) {
    1307           0 :     return false;
    1308             :   }
    1309           0 :   JS::Rooted<JSObject*> proto(aCx);
    1310           0 :   if (aGivenProto) {
    1311           0 :     proto = aGivenProto;
    1312             :     // Unfortunately, while aGivenProto was in the compartment of aCx
    1313             :     // coming in, we changed compartments to that of "parent" so may need
    1314             :     // to wrap the proto here.
    1315           0 :     if (js::GetContextCompartment(aCx) != js::GetObjectCompartment(proto)) {
    1316           0 :       if (!JS_WrapObject(aCx, &proto)) {
    1317           0 :         return false;
    1318             :       }
    1319             :     }
    1320             :   } else {
    1321           0 :     proto = canonicalProto;
    1322             :   }
    1323             : 
    1324           0 :   BindingJSObjectCreator<mozilla::dom::SpeechSynthesisUtterance> creator(aCx);
    1325           0 :   creator.CreateObject(aCx, sClass.ToJSClass(), proto, aObject, aReflector);
    1326           0 :   if (!aReflector) {
    1327           0 :     return false;
    1328             :   }
    1329             : 
    1330           0 :   aCache->SetWrapper(aReflector);
    1331           0 :   creator.InitializationSucceeded();
    1332             : 
    1333           0 :   MOZ_ASSERT(aCache->GetWrapperPreserveColor() &&
    1334             :              aCache->GetWrapperPreserveColor() == aReflector);
    1335             :   // If proto != canonicalProto, we have to preserve our wrapper;
    1336             :   // otherwise we won't be able to properly recreate it later, since
    1337             :   // we won't know what proto to use.  Note that we don't check
    1338             :   // aGivenProto here, since it's entirely possible (and even
    1339             :   // somewhat common) to have a non-null aGivenProto which is the
    1340             :   // same as canonicalProto.
    1341           0 :   if (proto != canonicalProto) {
    1342           0 :     PreserveWrapper(aObject);
    1343             :   }
    1344             : 
    1345           0 :   return true;
    1346             : }
    1347             : 
    1348             : const NativePropertyHooks sNativePropertyHooks[] = { {
    1349             :   nullptr,
    1350             :   nullptr,
    1351             :   nullptr,
    1352             :   { sNativeProperties.Upcast(), sChromeOnlyNativeProperties.Upcast() },
    1353             :   prototypes::id::SpeechSynthesisUtterance,
    1354             :   constructors::id::SpeechSynthesisUtterance,
    1355             :   EventTargetBinding::sNativePropertyHooks,
    1356             :   &DefaultXrayExpandoObjectClass
    1357             : } };
    1358             : 
    1359             : void
    1360           0 : CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
    1361             : {
    1362           0 :   JS::Handle<JSObject*> parentProto(EventTargetBinding::GetProtoObjectHandle(aCx));
    1363           0 :   if (!parentProto) {
    1364           0 :     return;
    1365             :   }
    1366             : 
    1367           0 :   JS::Handle<JSObject*> constructorProto(EventTargetBinding::GetConstructorObjectHandle(aCx));
    1368           0 :   if (!constructorProto) {
    1369           0 :     return;
    1370             :   }
    1371             : 
    1372             :   static bool sIdsInited = false;
    1373           0 :   if (!sIdsInited && NS_IsMainThread()) {
    1374           0 :     if (!InitIds(aCx, sNativeProperties.Upcast())) {
    1375           0 :       return;
    1376             :     }
    1377           0 :     if (!InitIds(aCx, sChromeOnlyNativeProperties.Upcast())) {
    1378           0 :       return;
    1379             :     }
    1380           0 :     sIdsInited = true;
    1381             :   }
    1382             : 
    1383           0 :   JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::SpeechSynthesisUtterance);
    1384           0 :   JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::SpeechSynthesisUtterance);
    1385           0 :   dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
    1386             :                               &sPrototypeClass.mBase, protoCache,
    1387             :                               constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
    1388             :                               interfaceCache,
    1389             :                               sNativeProperties.Upcast(),
    1390           0 :                               nsContentUtils::ThreadsafeIsSystemCaller(aCx) ? sChromeOnlyNativeProperties.Upcast() : nullptr,
    1391             :                               "SpeechSynthesisUtterance", aDefineOnGlobal,
    1392             :                               nullptr,
    1393           0 :                               false);
    1394             : }
    1395             : 
    1396             : JS::Handle<JSObject*>
    1397           0 : GetProtoObjectHandle(JSContext* aCx)
    1398             : {
    1399             :   /* Get the interface prototype object for this class.  This will create the
    1400             :      object as needed. */
    1401           0 :   bool aDefineOnGlobal = true;
    1402             : 
    1403             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    1404           0 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    1405           0 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    1406           0 :     return nullptr;
    1407             :   }
    1408             : 
    1409             :   /* Check to see whether the interface objects are already installed */
    1410           0 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    1411           0 :   if (!protoAndIfaceCache.HasEntryInSlot(prototypes::id::SpeechSynthesisUtterance)) {
    1412           0 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    1413           0 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    1414             :   }
    1415             : 
    1416             :   /*
    1417             :    * The object might _still_ be null, but that's OK.
    1418             :    *
    1419             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    1420             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    1421             :    * changed after they have been set.
    1422             :    *
    1423             :    * Calling address() avoids the read read barrier that does gray
    1424             :    * unmarking, but it's not possible for the object to be gray here.
    1425             :    */
    1426             : 
    1427           0 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(prototypes::id::SpeechSynthesisUtterance);
    1428           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    1429           0 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    1430             : }
    1431             : 
    1432             : JS::Handle<JSObject*>
    1433           0 : GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
    1434             : {
    1435             :   /* Get the interface object for this class.  This will create the object as
    1436             :      needed. */
    1437             : 
    1438             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    1439           0 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    1440           0 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    1441           0 :     return nullptr;
    1442             :   }
    1443             : 
    1444             :   /* Check to see whether the interface objects are already installed */
    1445           0 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    1446           0 :   if (!protoAndIfaceCache.HasEntryInSlot(constructors::id::SpeechSynthesisUtterance)) {
    1447           0 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    1448           0 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    1449             :   }
    1450             : 
    1451             :   /*
    1452             :    * The object might _still_ be null, but that's OK.
    1453             :    *
    1454             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    1455             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    1456             :    * changed after they have been set.
    1457             :    *
    1458             :    * Calling address() avoids the read read barrier that does gray
    1459             :    * unmarking, but it's not possible for the object to be gray here.
    1460             :    */
    1461             : 
    1462           0 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::SpeechSynthesisUtterance);
    1463           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    1464           0 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    1465             : }
    1466             : 
    1467             : JSObject*
    1468           0 : GetConstructorObject(JSContext* aCx)
    1469             : {
    1470           0 :   return GetConstructorObjectHandle(aCx);
    1471             : }
    1472             : 
    1473             : } // namespace SpeechSynthesisUtteranceBinding
    1474             : 
    1475             : 
    1476             : 
    1477             : } // namespace dom
    1478             : } // namespace mozilla

Generated by: LCOV version 1.13