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

          Line data    Source code
       1             : /* THIS FILE IS AUTOGENERATED FROM MediaStreamTrack.webidl BY Codegen.py - DO NOT EDIT */
       2             : 
       3             : #include "AtomList.h"
       4             : #include "EventHandlerBinding.h"
       5             : #include "EventTargetBinding.h"
       6             : #include "MediaStreamTrackBinding.h"
       7             : #include "MediaTrackSettingsBinding.h"
       8             : #include "WrapperFactory.h"
       9             : #include "jsapi.h"
      10             : #include "mozilla/FloatingPoint.h"
      11             : #include "mozilla/OwningNonNull.h"
      12             : #include "mozilla/dom/BindingUtils.h"
      13             : #include "mozilla/dom/DOMJSClass.h"
      14             : #include "mozilla/dom/MediaStreamTrack.h"
      15             : #include "mozilla/dom/NonRefcountedDOMObject.h"
      16             : #include "mozilla/dom/Nullable.h"
      17             : #include "mozilla/dom/PrimitiveConversions.h"
      18             : #include "mozilla/dom/Promise.h"
      19             : #include "mozilla/dom/ScriptSettings.h"
      20             : #include "mozilla/dom/SimpleGlobalObject.h"
      21             : #include "mozilla/dom/ToJSValue.h"
      22             : #include "mozilla/dom/UnionConversions.h"
      23             : #include "mozilla/dom/XrayExpandoClass.h"
      24             : #include "nsContentUtils.h"
      25             : 
      26             : namespace mozilla {
      27             : namespace dom {
      28             : 
      29             : namespace VideoFacingModeEnumValues {
      30             : extern const EnumEntry strings[5] = {
      31             :   {"user", 4},
      32             :   {"environment", 11},
      33             :   {"left", 4},
      34             :   {"right", 5},
      35             :   { nullptr, 0 }
      36             : };
      37             : } // namespace VideoFacingModeEnumValues
      38             : 
      39             : bool
      40           0 : ToJSValue(JSContext* aCx, VideoFacingModeEnum aArgument, JS::MutableHandle<JS::Value> aValue)
      41             : {
      42           0 :   MOZ_ASSERT(uint32_t(aArgument) < ArrayLength(VideoFacingModeEnumValues::strings));
      43             :   JSString* resultStr =
      44           0 :     JS_NewStringCopyN(aCx, VideoFacingModeEnumValues::strings[uint32_t(aArgument)].value,
      45           0 :                       VideoFacingModeEnumValues::strings[uint32_t(aArgument)].length);
      46           0 :   if (!resultStr) {
      47           0 :     return false;
      48             :   }
      49           0 :   aValue.setString(resultStr);
      50           0 :   return true;
      51             : }
      52             : 
      53             : 
      54             : namespace MediaSourceEnumValues {
      55             : extern const EnumEntry strings[9] = {
      56             :   {"camera", 6},
      57             :   {"screen", 6},
      58             :   {"application", 11},
      59             :   {"window", 6},
      60             :   {"browser", 7},
      61             :   {"microphone", 10},
      62             :   {"audioCapture", 12},
      63             :   {"other", 5},
      64             :   { nullptr, 0 }
      65             : };
      66             : } // namespace MediaSourceEnumValues
      67             : 
      68             : bool
      69           0 : ToJSValue(JSContext* aCx, MediaSourceEnum aArgument, JS::MutableHandle<JS::Value> aValue)
      70             : {
      71           0 :   MOZ_ASSERT(uint32_t(aArgument) < ArrayLength(MediaSourceEnumValues::strings));
      72             :   JSString* resultStr =
      73           0 :     JS_NewStringCopyN(aCx, MediaSourceEnumValues::strings[uint32_t(aArgument)].value,
      74           0 :                       MediaSourceEnumValues::strings[uint32_t(aArgument)].length);
      75           0 :   if (!resultStr) {
      76           0 :     return false;
      77             :   }
      78           0 :   aValue.setString(resultStr);
      79           0 :   return true;
      80             : }
      81             : 
      82             : 
      83             : namespace MediaStreamTrackStateValues {
      84             : extern const EnumEntry strings[3] = {
      85             :   {"live", 4},
      86             :   {"ended", 5},
      87             :   { nullptr, 0 }
      88             : };
      89             : } // namespace MediaStreamTrackStateValues
      90             : 
      91             : bool
      92           0 : ToJSValue(JSContext* aCx, MediaStreamTrackState aArgument, JS::MutableHandle<JS::Value> aValue)
      93             : {
      94           0 :   MOZ_ASSERT(uint32_t(aArgument) < ArrayLength(MediaStreamTrackStateValues::strings));
      95             :   JSString* resultStr =
      96           0 :     JS_NewStringCopyN(aCx, MediaStreamTrackStateValues::strings[uint32_t(aArgument)].value,
      97           0 :                       MediaStreamTrackStateValues::strings[uint32_t(aArgument)].length);
      98           0 :   if (!resultStr) {
      99           0 :     return false;
     100             :   }
     101           0 :   aValue.setString(resultStr);
     102           0 :   return true;
     103             : }
     104             : 
     105             : 
     106             : bool
     107           0 : BooleanOrConstrainBooleanParameters::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
     108             : {
     109           0 :   switch (mType) {
     110             :     case eUninitialized: {
     111           0 :       return false;
     112             :       break;
     113             :     }
     114             :     case eBoolean: {
     115           0 :       rval.setBoolean(mValue.mBoolean.Value());
     116           0 :       return true;
     117             :       break;
     118             :     }
     119             :     case eConstrainBooleanParameters: {
     120           0 :       if (!mValue.mConstrainBooleanParameters.Value().ToObjectInternal(cx, rval)) {
     121           0 :         return false;
     122             :       }
     123           0 :       return true;
     124             :       break;
     125             :     }
     126             :     default: {
     127           0 :       return false;
     128             :       break;
     129             :     }
     130             :   }
     131             : 
     132             :   return false;
     133             : }
     134             : 
     135             : 
     136             : bool&
     137           0 : OwningBooleanOrConstrainBooleanParameters::RawSetAsBoolean()
     138             : {
     139           0 :   if (mType == eBoolean) {
     140           0 :     return mValue.mBoolean.Value();
     141             :   }
     142           0 :   MOZ_ASSERT(mType == eUninitialized);
     143           0 :   mType = eBoolean;
     144           0 :   return mValue.mBoolean.SetValue();
     145             : }
     146             : 
     147             : bool&
     148           0 : OwningBooleanOrConstrainBooleanParameters::SetAsBoolean()
     149             : {
     150           0 :   if (mType == eBoolean) {
     151           0 :     return mValue.mBoolean.Value();
     152             :   }
     153           0 :   Uninit();
     154           0 :   mType = eBoolean;
     155           0 :   return mValue.mBoolean.SetValue();
     156             : }
     157             : 
     158             : bool
     159           0 : OwningBooleanOrConstrainBooleanParameters::TrySetToBoolean(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     160             : {
     161           0 :   tryNext = false;
     162             :   { // scope for memberSlot
     163           0 :     bool& memberSlot = RawSetAsBoolean();
     164           0 :     if (!ValueToPrimitive<bool, eDefault>(cx, value, &memberSlot)) {
     165           0 :       return false;
     166             :     }
     167             :   }
     168           0 :   return true;
     169             : }
     170             : 
     171             : void
     172           0 : OwningBooleanOrConstrainBooleanParameters::DestroyBoolean()
     173             : {
     174           0 :   MOZ_ASSERT(IsBoolean(), "Wrong type!");
     175           0 :   mValue.mBoolean.Destroy();
     176           0 :   mType = eUninitialized;
     177           0 : }
     178             : 
     179             : 
     180             : 
     181             : 
     182             : ConstrainBooleanParameters&
     183           0 : OwningBooleanOrConstrainBooleanParameters::RawSetAsConstrainBooleanParameters()
     184             : {
     185           0 :   if (mType == eConstrainBooleanParameters) {
     186           0 :     return mValue.mConstrainBooleanParameters.Value();
     187             :   }
     188           0 :   MOZ_ASSERT(mType == eUninitialized);
     189           0 :   mType = eConstrainBooleanParameters;
     190           0 :   return mValue.mConstrainBooleanParameters.SetValue();
     191             : }
     192             : 
     193             : ConstrainBooleanParameters&
     194           0 : OwningBooleanOrConstrainBooleanParameters::SetAsConstrainBooleanParameters()
     195             : {
     196           0 :   if (mType == eConstrainBooleanParameters) {
     197           0 :     return mValue.mConstrainBooleanParameters.Value();
     198             :   }
     199           0 :   Uninit();
     200           0 :   mType = eConstrainBooleanParameters;
     201           0 :   return mValue.mConstrainBooleanParameters.SetValue();
     202             : }
     203             : 
     204             : bool
     205           0 : OwningBooleanOrConstrainBooleanParameters::TrySetToConstrainBooleanParameters(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     206             : {
     207           0 :   tryNext = false;
     208             :   { // scope for memberSlot
     209           0 :     ConstrainBooleanParameters& memberSlot = RawSetAsConstrainBooleanParameters();
     210           0 :     if (!IsConvertibleToDictionary(value)) {
     211           0 :       DestroyConstrainBooleanParameters();
     212           0 :       tryNext = true;
     213           0 :       return true;
     214             :     }
     215           0 :     if (!memberSlot.Init(cx, value,  "Member of BooleanOrConstrainBooleanParameters", passedToJSImpl)) {
     216           0 :       return false;
     217             :     }
     218             :   }
     219           0 :   return true;
     220             : }
     221             : 
     222             : void
     223           0 : OwningBooleanOrConstrainBooleanParameters::DestroyConstrainBooleanParameters()
     224             : {
     225           0 :   MOZ_ASSERT(IsConstrainBooleanParameters(), "Wrong type!");
     226           0 :   mValue.mConstrainBooleanParameters.Destroy();
     227           0 :   mType = eUninitialized;
     228           0 : }
     229             : 
     230             : 
     231             : 
     232             : 
     233             : void
     234           0 : OwningBooleanOrConstrainBooleanParameters::Uninit()
     235             : {
     236           0 :   switch (mType) {
     237             :     case eUninitialized: {
     238           0 :       break;
     239             :     }
     240             :     case eBoolean: {
     241           0 :       DestroyBoolean();
     242           0 :       break;
     243             :     }
     244             :     case eConstrainBooleanParameters: {
     245           0 :       DestroyConstrainBooleanParameters();
     246           0 :       break;
     247             :     }
     248             :   }
     249           0 : }
     250             : 
     251             : bool
     252           0 : OwningBooleanOrConstrainBooleanParameters::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
     253             : {
     254           0 :   switch (mType) {
     255             :     case eUninitialized: {
     256           0 :       return false;
     257             :       break;
     258             :     }
     259             :     case eBoolean: {
     260           0 :       rval.setBoolean(mValue.mBoolean.Value());
     261           0 :       return true;
     262             :       break;
     263             :     }
     264             :     case eConstrainBooleanParameters: {
     265           0 :       if (!mValue.mConstrainBooleanParameters.Value().ToObjectInternal(cx, rval)) {
     266           0 :         return false;
     267             :       }
     268           0 :       return true;
     269             :       break;
     270             :     }
     271             :     default: {
     272           0 :       return false;
     273             :       break;
     274             :     }
     275             :   }
     276             : 
     277             :   return false;
     278             : }
     279             : 
     280             : void
     281           0 : OwningBooleanOrConstrainBooleanParameters::TraceUnion(JSTracer* trc)
     282             : {
     283           0 : }
     284             : 
     285             : OwningBooleanOrConstrainBooleanParameters&
     286           0 : OwningBooleanOrConstrainBooleanParameters::operator=(const OwningBooleanOrConstrainBooleanParameters& aOther)
     287             : {
     288           0 :   switch (aOther.mType) {
     289             :     case eUninitialized: {
     290           0 :       MOZ_ASSERT(mType == eUninitialized,
     291             :                  "We need to destroy ourselves?");
     292           0 :       break;
     293             :     }
     294             :     case eBoolean: {
     295           0 :       SetAsBoolean() = aOther.GetAsBoolean();
     296           0 :       break;
     297             :     }
     298             :     case eConstrainBooleanParameters: {
     299           0 :       SetAsConstrainBooleanParameters() = aOther.GetAsConstrainBooleanParameters();
     300           0 :       break;
     301             :     }
     302             :   }
     303           0 :   return *this;
     304             : }
     305             : 
     306             : 
     307             : bool
     308           0 : DoubleOrConstrainDoubleRange::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
     309             : {
     310           0 :   switch (mType) {
     311             :     case eUninitialized: {
     312           0 :       return false;
     313             :       break;
     314             :     }
     315             :     case eDouble: {
     316           0 :       rval.set(JS_NumberValue(double(mValue.mDouble.Value())));
     317           0 :       return true;
     318             :       break;
     319             :     }
     320             :     case eConstrainDoubleRange: {
     321           0 :       if (!mValue.mConstrainDoubleRange.Value().ToObjectInternal(cx, rval)) {
     322           0 :         return false;
     323             :       }
     324           0 :       return true;
     325             :       break;
     326             :     }
     327             :     default: {
     328           0 :       return false;
     329             :       break;
     330             :     }
     331             :   }
     332             : 
     333             :   return false;
     334             : }
     335             : 
     336             : 
     337             : double&
     338           0 : OwningDoubleOrConstrainDoubleRange::RawSetAsDouble()
     339             : {
     340           0 :   if (mType == eDouble) {
     341           0 :     return mValue.mDouble.Value();
     342             :   }
     343           0 :   MOZ_ASSERT(mType == eUninitialized);
     344           0 :   mType = eDouble;
     345           0 :   return mValue.mDouble.SetValue();
     346             : }
     347             : 
     348             : double&
     349           0 : OwningDoubleOrConstrainDoubleRange::SetAsDouble()
     350             : {
     351           0 :   if (mType == eDouble) {
     352           0 :     return mValue.mDouble.Value();
     353             :   }
     354           0 :   Uninit();
     355           0 :   mType = eDouble;
     356           0 :   return mValue.mDouble.SetValue();
     357             : }
     358             : 
     359             : bool
     360           0 : OwningDoubleOrConstrainDoubleRange::TrySetToDouble(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     361             : {
     362           0 :   tryNext = false;
     363             :   { // scope for memberSlot
     364           0 :     double& memberSlot = RawSetAsDouble();
     365           0 :     if (!ValueToPrimitive<double, eDefault>(cx, value, &memberSlot)) {
     366           0 :       return false;
     367           0 :     } else if (!mozilla::IsFinite(memberSlot)) {
     368           0 :       ThrowErrorMessage(cx, MSG_NOT_FINITE, "Member of DoubleOrConstrainDoubleRange");
     369           0 :       return false;
     370             :     }
     371             :   }
     372           0 :   return true;
     373             : }
     374             : 
     375             : void
     376           0 : OwningDoubleOrConstrainDoubleRange::DestroyDouble()
     377             : {
     378           0 :   MOZ_ASSERT(IsDouble(), "Wrong type!");
     379           0 :   mValue.mDouble.Destroy();
     380           0 :   mType = eUninitialized;
     381           0 : }
     382             : 
     383             : 
     384             : 
     385             : 
     386             : ConstrainDoubleRange&
     387           0 : OwningDoubleOrConstrainDoubleRange::RawSetAsConstrainDoubleRange()
     388             : {
     389           0 :   if (mType == eConstrainDoubleRange) {
     390           0 :     return mValue.mConstrainDoubleRange.Value();
     391             :   }
     392           0 :   MOZ_ASSERT(mType == eUninitialized);
     393           0 :   mType = eConstrainDoubleRange;
     394           0 :   return mValue.mConstrainDoubleRange.SetValue();
     395             : }
     396             : 
     397             : ConstrainDoubleRange&
     398           0 : OwningDoubleOrConstrainDoubleRange::SetAsConstrainDoubleRange()
     399             : {
     400           0 :   if (mType == eConstrainDoubleRange) {
     401           0 :     return mValue.mConstrainDoubleRange.Value();
     402             :   }
     403           0 :   Uninit();
     404           0 :   mType = eConstrainDoubleRange;
     405           0 :   return mValue.mConstrainDoubleRange.SetValue();
     406             : }
     407             : 
     408             : bool
     409           0 : OwningDoubleOrConstrainDoubleRange::TrySetToConstrainDoubleRange(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     410             : {
     411           0 :   tryNext = false;
     412             :   { // scope for memberSlot
     413           0 :     ConstrainDoubleRange& memberSlot = RawSetAsConstrainDoubleRange();
     414           0 :     if (!IsConvertibleToDictionary(value)) {
     415           0 :       DestroyConstrainDoubleRange();
     416           0 :       tryNext = true;
     417           0 :       return true;
     418             :     }
     419           0 :     if (!memberSlot.Init(cx, value,  "Member of DoubleOrConstrainDoubleRange", passedToJSImpl)) {
     420           0 :       return false;
     421             :     }
     422             :   }
     423           0 :   return true;
     424             : }
     425             : 
     426             : void
     427           0 : OwningDoubleOrConstrainDoubleRange::DestroyConstrainDoubleRange()
     428             : {
     429           0 :   MOZ_ASSERT(IsConstrainDoubleRange(), "Wrong type!");
     430           0 :   mValue.mConstrainDoubleRange.Destroy();
     431           0 :   mType = eUninitialized;
     432           0 : }
     433             : 
     434             : 
     435             : 
     436             : 
     437             : void
     438           0 : OwningDoubleOrConstrainDoubleRange::Uninit()
     439             : {
     440           0 :   switch (mType) {
     441             :     case eUninitialized: {
     442           0 :       break;
     443             :     }
     444             :     case eDouble: {
     445           0 :       DestroyDouble();
     446           0 :       break;
     447             :     }
     448             :     case eConstrainDoubleRange: {
     449           0 :       DestroyConstrainDoubleRange();
     450           0 :       break;
     451             :     }
     452             :   }
     453           0 : }
     454             : 
     455             : bool
     456           0 : OwningDoubleOrConstrainDoubleRange::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
     457             : {
     458           0 :   switch (mType) {
     459             :     case eUninitialized: {
     460           0 :       return false;
     461             :       break;
     462             :     }
     463             :     case eDouble: {
     464           0 :       rval.set(JS_NumberValue(double(mValue.mDouble.Value())));
     465           0 :       return true;
     466             :       break;
     467             :     }
     468             :     case eConstrainDoubleRange: {
     469           0 :       if (!mValue.mConstrainDoubleRange.Value().ToObjectInternal(cx, rval)) {
     470           0 :         return false;
     471             :       }
     472           0 :       return true;
     473             :       break;
     474             :     }
     475             :     default: {
     476           0 :       return false;
     477             :       break;
     478             :     }
     479             :   }
     480             : 
     481             :   return false;
     482             : }
     483             : 
     484             : void
     485           0 : OwningDoubleOrConstrainDoubleRange::TraceUnion(JSTracer* trc)
     486             : {
     487           0 : }
     488             : 
     489             : OwningDoubleOrConstrainDoubleRange&
     490           0 : OwningDoubleOrConstrainDoubleRange::operator=(const OwningDoubleOrConstrainDoubleRange& aOther)
     491             : {
     492           0 :   switch (aOther.mType) {
     493             :     case eUninitialized: {
     494           0 :       MOZ_ASSERT(mType == eUninitialized,
     495             :                  "We need to destroy ourselves?");
     496           0 :       break;
     497             :     }
     498             :     case eDouble: {
     499           0 :       SetAsDouble() = aOther.GetAsDouble();
     500           0 :       break;
     501             :     }
     502             :     case eConstrainDoubleRange: {
     503           0 :       SetAsConstrainDoubleRange() = aOther.GetAsConstrainDoubleRange();
     504           0 :       break;
     505             :     }
     506             :   }
     507           0 :   return *this;
     508             : }
     509             : 
     510             : 
     511             : bool
     512           0 : LongOrConstrainLongRange::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
     513             : {
     514           0 :   switch (mType) {
     515             :     case eUninitialized: {
     516           0 :       return false;
     517             :       break;
     518             :     }
     519             :     case eLong: {
     520           0 :       rval.setInt32(int32_t(mValue.mLong.Value()));
     521           0 :       return true;
     522             :       break;
     523             :     }
     524             :     case eConstrainLongRange: {
     525           0 :       if (!mValue.mConstrainLongRange.Value().ToObjectInternal(cx, rval)) {
     526           0 :         return false;
     527             :       }
     528           0 :       return true;
     529             :       break;
     530             :     }
     531             :     default: {
     532           0 :       return false;
     533             :       break;
     534             :     }
     535             :   }
     536             : 
     537             :   return false;
     538             : }
     539             : 
     540             : 
     541             : int32_t&
     542           0 : OwningLongOrConstrainLongRange::RawSetAsLong()
     543             : {
     544           0 :   if (mType == eLong) {
     545           0 :     return mValue.mLong.Value();
     546             :   }
     547           0 :   MOZ_ASSERT(mType == eUninitialized);
     548           0 :   mType = eLong;
     549           0 :   return mValue.mLong.SetValue();
     550             : }
     551             : 
     552             : int32_t&
     553           0 : OwningLongOrConstrainLongRange::SetAsLong()
     554             : {
     555           0 :   if (mType == eLong) {
     556           0 :     return mValue.mLong.Value();
     557             :   }
     558           0 :   Uninit();
     559           0 :   mType = eLong;
     560           0 :   return mValue.mLong.SetValue();
     561             : }
     562             : 
     563             : bool
     564           0 : OwningLongOrConstrainLongRange::TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     565             : {
     566           0 :   tryNext = false;
     567             :   { // scope for memberSlot
     568           0 :     int32_t& memberSlot = RawSetAsLong();
     569           0 :     if (!ValueToPrimitive<int32_t, eDefault>(cx, value, &memberSlot)) {
     570           0 :       return false;
     571             :     }
     572             :   }
     573           0 :   return true;
     574             : }
     575             : 
     576             : void
     577           0 : OwningLongOrConstrainLongRange::DestroyLong()
     578             : {
     579           0 :   MOZ_ASSERT(IsLong(), "Wrong type!");
     580           0 :   mValue.mLong.Destroy();
     581           0 :   mType = eUninitialized;
     582           0 : }
     583             : 
     584             : 
     585             : 
     586             : 
     587             : ConstrainLongRange&
     588           0 : OwningLongOrConstrainLongRange::RawSetAsConstrainLongRange()
     589             : {
     590           0 :   if (mType == eConstrainLongRange) {
     591           0 :     return mValue.mConstrainLongRange.Value();
     592             :   }
     593           0 :   MOZ_ASSERT(mType == eUninitialized);
     594           0 :   mType = eConstrainLongRange;
     595           0 :   return mValue.mConstrainLongRange.SetValue();
     596             : }
     597             : 
     598             : ConstrainLongRange&
     599           0 : OwningLongOrConstrainLongRange::SetAsConstrainLongRange()
     600             : {
     601           0 :   if (mType == eConstrainLongRange) {
     602           0 :     return mValue.mConstrainLongRange.Value();
     603             :   }
     604           0 :   Uninit();
     605           0 :   mType = eConstrainLongRange;
     606           0 :   return mValue.mConstrainLongRange.SetValue();
     607             : }
     608             : 
     609             : bool
     610           0 : OwningLongOrConstrainLongRange::TrySetToConstrainLongRange(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     611             : {
     612           0 :   tryNext = false;
     613             :   { // scope for memberSlot
     614           0 :     ConstrainLongRange& memberSlot = RawSetAsConstrainLongRange();
     615           0 :     if (!IsConvertibleToDictionary(value)) {
     616           0 :       DestroyConstrainLongRange();
     617           0 :       tryNext = true;
     618           0 :       return true;
     619             :     }
     620           0 :     if (!memberSlot.Init(cx, value,  "Member of LongOrConstrainLongRange", passedToJSImpl)) {
     621           0 :       return false;
     622             :     }
     623             :   }
     624           0 :   return true;
     625             : }
     626             : 
     627             : void
     628           0 : OwningLongOrConstrainLongRange::DestroyConstrainLongRange()
     629             : {
     630           0 :   MOZ_ASSERT(IsConstrainLongRange(), "Wrong type!");
     631           0 :   mValue.mConstrainLongRange.Destroy();
     632           0 :   mType = eUninitialized;
     633           0 : }
     634             : 
     635             : 
     636             : 
     637             : 
     638             : void
     639           0 : OwningLongOrConstrainLongRange::Uninit()
     640             : {
     641           0 :   switch (mType) {
     642             :     case eUninitialized: {
     643           0 :       break;
     644             :     }
     645             :     case eLong: {
     646           0 :       DestroyLong();
     647           0 :       break;
     648             :     }
     649             :     case eConstrainLongRange: {
     650           0 :       DestroyConstrainLongRange();
     651           0 :       break;
     652             :     }
     653             :   }
     654           0 : }
     655             : 
     656             : bool
     657           0 : OwningLongOrConstrainLongRange::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
     658             : {
     659           0 :   switch (mType) {
     660             :     case eUninitialized: {
     661           0 :       return false;
     662             :       break;
     663             :     }
     664             :     case eLong: {
     665           0 :       rval.setInt32(int32_t(mValue.mLong.Value()));
     666           0 :       return true;
     667             :       break;
     668             :     }
     669             :     case eConstrainLongRange: {
     670           0 :       if (!mValue.mConstrainLongRange.Value().ToObjectInternal(cx, rval)) {
     671           0 :         return false;
     672             :       }
     673           0 :       return true;
     674             :       break;
     675             :     }
     676             :     default: {
     677           0 :       return false;
     678             :       break;
     679             :     }
     680             :   }
     681             : 
     682             :   return false;
     683             : }
     684             : 
     685             : void
     686           0 : OwningLongOrConstrainLongRange::TraceUnion(JSTracer* trc)
     687             : {
     688           0 : }
     689             : 
     690             : OwningLongOrConstrainLongRange&
     691           0 : OwningLongOrConstrainLongRange::operator=(const OwningLongOrConstrainLongRange& aOther)
     692             : {
     693           0 :   switch (aOther.mType) {
     694             :     case eUninitialized: {
     695           0 :       MOZ_ASSERT(mType == eUninitialized,
     696             :                  "We need to destroy ourselves?");
     697           0 :       break;
     698             :     }
     699             :     case eLong: {
     700           0 :       SetAsLong() = aOther.GetAsLong();
     701           0 :       break;
     702             :     }
     703             :     case eConstrainLongRange: {
     704           0 :       SetAsConstrainLongRange() = aOther.GetAsConstrainLongRange();
     705           0 :       break;
     706             :     }
     707             :   }
     708           0 :   return *this;
     709             : }
     710             : 
     711             : 
     712             : bool
     713           0 : StringOrStringSequenceOrConstrainDOMStringParameters::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
     714             : {
     715           0 :   switch (mType) {
     716             :     case eUninitialized: {
     717           0 :       return false;
     718             :       break;
     719             :     }
     720             :     case eString: {
     721           0 :       if (!xpc::NonVoidStringToJsval(cx, mValue.mString.Value(), rval)) {
     722           0 :         return false;
     723             :       }
     724           0 :       return true;
     725             :       break;
     726             :     }
     727             :     case eStringSequence: {
     728             : 
     729           0 :       uint32_t length = mValue.mStringSequence.Value().Length();
     730           0 :       JS::Rooted<JSObject*> returnArray(cx, JS_NewArrayObject(cx, length));
     731           0 :       if (!returnArray) {
     732           0 :         return false;
     733             :       }
     734             :       // Scope for 'tmp'
     735             :       {
     736           0 :         JS::Rooted<JS::Value> tmp(cx);
     737           0 :         for (uint32_t sequenceIdx0 = 0; sequenceIdx0 < length; ++sequenceIdx0) {
     738             :           // Control block to let us common up the JS_DefineElement calls when there
     739             :           // are different ways to succeed at wrapping the object.
     740             :           do {
     741           0 :             if (!xpc::NonVoidStringToJsval(cx, mValue.mStringSequence.Value()[sequenceIdx0], &tmp)) {
     742           0 :               return false;
     743             :             }
     744           0 :             break;
     745             :           } while (0);
     746           0 :           if (!JS_DefineElement(cx, returnArray, sequenceIdx0, tmp,
     747             :                                 JSPROP_ENUMERATE)) {
     748           0 :             return false;
     749             :           }
     750             :         }
     751             :       }
     752           0 :       rval.setObject(*returnArray);
     753           0 :       return true;
     754             :       break;
     755             :     }
     756             :     case eConstrainDOMStringParameters: {
     757           0 :       if (!mValue.mConstrainDOMStringParameters.Value().ToObjectInternal(cx, rval)) {
     758           0 :         return false;
     759             :       }
     760           0 :       return true;
     761             :       break;
     762             :     }
     763             :     default: {
     764           0 :       return false;
     765             :       break;
     766             :     }
     767             :   }
     768             : 
     769             :   return false;
     770             : }
     771             : 
     772             : 
     773             : nsString&
     774           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::RawSetAsString()
     775             : {
     776           0 :   if (mType == eString) {
     777           0 :     return mValue.mString.Value();
     778             :   }
     779           0 :   MOZ_ASSERT(mType == eUninitialized);
     780           0 :   mType = eString;
     781           0 :   return mValue.mString.SetValue();
     782             : }
     783             : 
     784             : nsString&
     785           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::SetAsString()
     786             : {
     787           0 :   if (mType == eString) {
     788           0 :     return mValue.mString.Value();
     789             :   }
     790           0 :   Uninit();
     791           0 :   mType = eString;
     792           0 :   return mValue.mString.SetValue();
     793             : }
     794             : 
     795             : bool
     796           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     797             : {
     798           0 :   tryNext = false;
     799             :   { // scope for memberSlot
     800           0 :     nsString& memberSlot = RawSetAsString();
     801           0 :     if (!ConvertJSValueToString(cx, value, eStringify, eStringify, memberSlot)) {
     802           0 :       return false;
     803             :     }
     804             :   }
     805           0 :   return true;
     806             : }
     807             : 
     808             : 
     809             : void
     810           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::DestroyString()
     811             : {
     812           0 :   MOZ_ASSERT(IsString(), "Wrong type!");
     813           0 :   mValue.mString.Destroy();
     814           0 :   mType = eUninitialized;
     815           0 : }
     816             : 
     817             : 
     818             : 
     819             : 
     820             : Sequence<nsString>&
     821           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::RawSetAsStringSequence()
     822             : {
     823           0 :   if (mType == eStringSequence) {
     824           0 :     return mValue.mStringSequence.Value();
     825             :   }
     826           0 :   MOZ_ASSERT(mType == eUninitialized);
     827           0 :   mType = eStringSequence;
     828           0 :   return mValue.mStringSequence.SetValue();
     829             : }
     830             : 
     831             : Sequence<nsString>&
     832           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::SetAsStringSequence()
     833             : {
     834           0 :   if (mType == eStringSequence) {
     835           0 :     return mValue.mStringSequence.Value();
     836             :   }
     837           0 :   Uninit();
     838           0 :   mType = eStringSequence;
     839           0 :   return mValue.mStringSequence.SetValue();
     840             : }
     841             : 
     842             : bool
     843           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::TrySetToStringSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     844             : {
     845           0 :   tryNext = false;
     846             :   { // scope for memberSlot
     847           0 :     Sequence<nsString>& memberSlot = RawSetAsStringSequence();
     848           0 :     JS::ForOfIterator iter(cx);
     849           0 :     if (!iter.init(value, JS::ForOfIterator::AllowNonIterable)) {
     850           0 :       return false;
     851             :     }
     852           0 :     if (!iter.valueIsIterable()) {
     853           0 :       DestroyStringSequence();
     854           0 :       tryNext = true;
     855           0 :       return true;
     856             :     }
     857           0 :     Sequence<nsString> &arr = memberSlot;
     858           0 :     JS::Rooted<JS::Value> temp(cx);
     859             :     while (true) {
     860             :       bool done;
     861           0 :       if (!iter.next(&temp, &done)) {
     862           0 :         return false;
     863             :       }
     864           0 :       if (done) {
     865           0 :         break;
     866             :       }
     867           0 :       nsString* slotPtr = arr.AppendElement(mozilla::fallible);
     868           0 :       if (!slotPtr) {
     869           0 :         JS_ReportOutOfMemory(cx);
     870           0 :         return false;
     871             :       }
     872           0 :       nsString& slot = *slotPtr;
     873           0 :       if (!ConvertJSValueToString(cx, temp, eStringify, eStringify, slot)) {
     874           0 :         return false;
     875             :       }
     876           0 :     }
     877             :   }
     878           0 :   return true;
     879             : }
     880             : 
     881             : void
     882           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::DestroyStringSequence()
     883             : {
     884           0 :   MOZ_ASSERT(IsStringSequence(), "Wrong type!");
     885           0 :   mValue.mStringSequence.Destroy();
     886           0 :   mType = eUninitialized;
     887           0 : }
     888             : 
     889             : 
     890             : 
     891             : 
     892             : ConstrainDOMStringParameters&
     893           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::RawSetAsConstrainDOMStringParameters()
     894             : {
     895           0 :   if (mType == eConstrainDOMStringParameters) {
     896           0 :     return mValue.mConstrainDOMStringParameters.Value();
     897             :   }
     898           0 :   MOZ_ASSERT(mType == eUninitialized);
     899           0 :   mType = eConstrainDOMStringParameters;
     900           0 :   return mValue.mConstrainDOMStringParameters.SetValue();
     901             : }
     902             : 
     903             : ConstrainDOMStringParameters&
     904           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::SetAsConstrainDOMStringParameters()
     905             : {
     906           0 :   if (mType == eConstrainDOMStringParameters) {
     907           0 :     return mValue.mConstrainDOMStringParameters.Value();
     908             :   }
     909           0 :   Uninit();
     910           0 :   mType = eConstrainDOMStringParameters;
     911           0 :   return mValue.mConstrainDOMStringParameters.SetValue();
     912             : }
     913             : 
     914             : bool
     915           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::TrySetToConstrainDOMStringParameters(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     916             : {
     917           0 :   tryNext = false;
     918             :   { // scope for memberSlot
     919           0 :     ConstrainDOMStringParameters& memberSlot = RawSetAsConstrainDOMStringParameters();
     920           0 :     if (!IsConvertibleToDictionary(value)) {
     921           0 :       DestroyConstrainDOMStringParameters();
     922           0 :       tryNext = true;
     923           0 :       return true;
     924             :     }
     925           0 :     if (!memberSlot.Init(cx, value,  "Member of StringOrStringSequenceOrConstrainDOMStringParameters", passedToJSImpl)) {
     926           0 :       return false;
     927             :     }
     928             :   }
     929           0 :   return true;
     930             : }
     931             : 
     932             : void
     933           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::DestroyConstrainDOMStringParameters()
     934             : {
     935           0 :   MOZ_ASSERT(IsConstrainDOMStringParameters(), "Wrong type!");
     936           0 :   mValue.mConstrainDOMStringParameters.Destroy();
     937           0 :   mType = eUninitialized;
     938           0 : }
     939             : 
     940             : 
     941             : 
     942             : 
     943             : void
     944           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::Uninit()
     945             : {
     946           0 :   switch (mType) {
     947             :     case eUninitialized: {
     948           0 :       break;
     949             :     }
     950             :     case eString: {
     951           0 :       DestroyString();
     952           0 :       break;
     953             :     }
     954             :     case eStringSequence: {
     955           0 :       DestroyStringSequence();
     956           0 :       break;
     957             :     }
     958             :     case eConstrainDOMStringParameters: {
     959           0 :       DestroyConstrainDOMStringParameters();
     960           0 :       break;
     961             :     }
     962             :   }
     963           0 : }
     964             : 
     965             : bool
     966           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
     967             : {
     968           0 :   switch (mType) {
     969             :     case eUninitialized: {
     970           0 :       return false;
     971             :       break;
     972             :     }
     973             :     case eString: {
     974           0 :       if (!xpc::NonVoidStringToJsval(cx, mValue.mString.Value(), rval)) {
     975           0 :         return false;
     976             :       }
     977           0 :       return true;
     978             :       break;
     979             :     }
     980             :     case eStringSequence: {
     981             : 
     982           0 :       uint32_t length = mValue.mStringSequence.Value().Length();
     983           0 :       JS::Rooted<JSObject*> returnArray(cx, JS_NewArrayObject(cx, length));
     984           0 :       if (!returnArray) {
     985           0 :         return false;
     986             :       }
     987             :       // Scope for 'tmp'
     988             :       {
     989           0 :         JS::Rooted<JS::Value> tmp(cx);
     990           0 :         for (uint32_t sequenceIdx0 = 0; sequenceIdx0 < length; ++sequenceIdx0) {
     991             :           // Control block to let us common up the JS_DefineElement calls when there
     992             :           // are different ways to succeed at wrapping the object.
     993             :           do {
     994           0 :             if (!xpc::NonVoidStringToJsval(cx, mValue.mStringSequence.Value()[sequenceIdx0], &tmp)) {
     995           0 :               return false;
     996             :             }
     997           0 :             break;
     998             :           } while (0);
     999           0 :           if (!JS_DefineElement(cx, returnArray, sequenceIdx0, tmp,
    1000             :                                 JSPROP_ENUMERATE)) {
    1001           0 :             return false;
    1002             :           }
    1003             :         }
    1004             :       }
    1005           0 :       rval.setObject(*returnArray);
    1006           0 :       return true;
    1007             :       break;
    1008             :     }
    1009             :     case eConstrainDOMStringParameters: {
    1010           0 :       if (!mValue.mConstrainDOMStringParameters.Value().ToObjectInternal(cx, rval)) {
    1011           0 :         return false;
    1012             :       }
    1013           0 :       return true;
    1014             :       break;
    1015             :     }
    1016             :     default: {
    1017           0 :       return false;
    1018             :       break;
    1019             :     }
    1020             :   }
    1021             : 
    1022             :   return false;
    1023             : }
    1024             : 
    1025             : void
    1026           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::TraceUnion(JSTracer* trc)
    1027             : {
    1028           0 : }
    1029             : 
    1030             : OwningStringOrStringSequenceOrConstrainDOMStringParameters&
    1031           0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::operator=(const OwningStringOrStringSequenceOrConstrainDOMStringParameters& aOther)
    1032             : {
    1033           0 :   switch (aOther.mType) {
    1034             :     case eUninitialized: {
    1035           0 :       MOZ_ASSERT(mType == eUninitialized,
    1036             :                  "We need to destroy ourselves?");
    1037           0 :       break;
    1038             :     }
    1039             :     case eString: {
    1040           0 :       SetAsString() = aOther.GetAsString();
    1041           0 :       break;
    1042             :     }
    1043             :     case eStringSequence: {
    1044           0 :       SetAsStringSequence() = aOther.GetAsStringSequence();
    1045           0 :       break;
    1046             :     }
    1047             :     case eConstrainDOMStringParameters: {
    1048           0 :       SetAsConstrainDOMStringParameters() = aOther.GetAsConstrainDOMStringParameters();
    1049           0 :       break;
    1050             :     }
    1051             :   }
    1052           0 :   return *this;
    1053             : }
    1054             : 
    1055             : 
    1056             : 
    1057           0 : MediaTrackConstraintSet::MediaTrackConstraintSet()
    1058             : {
    1059             :   // Safe to pass a null context if we pass a null value
    1060           0 :   Init(nullptr, JS::NullHandleValue);
    1061           0 : }
    1062             : 
    1063             : 
    1064             : 
    1065             : bool
    1066           0 : MediaTrackConstraintSet::InitIds(JSContext* cx, MediaTrackConstraintSetAtoms* atomsCache)
    1067             : {
    1068           0 :   MOZ_ASSERT(!*reinterpret_cast<jsid**>(atomsCache));
    1069             : 
    1070             :   // Initialize these in reverse order so that any failure leaves the first one
    1071             :   // uninitialized.
    1072           0 :   if (!atomsCache->width_id.init(cx, "width") ||
    1073           0 :       !atomsCache->viewportWidth_id.init(cx, "viewportWidth") ||
    1074           0 :       !atomsCache->viewportOffsetY_id.init(cx, "viewportOffsetY") ||
    1075           0 :       !atomsCache->viewportOffsetX_id.init(cx, "viewportOffsetX") ||
    1076           0 :       !atomsCache->viewportHeight_id.init(cx, "viewportHeight") ||
    1077           0 :       !atomsCache->scrollWithPage_id.init(cx, "scrollWithPage") ||
    1078           0 :       !atomsCache->noiseSuppression_id.init(cx, "noiseSuppression") ||
    1079           0 :       !atomsCache->mozNoiseSuppression_id.init(cx, "mozNoiseSuppression") ||
    1080           0 :       !atomsCache->mozAutoGainControl_id.init(cx, "mozAutoGainControl") ||
    1081           0 :       !atomsCache->mediaSource_id.init(cx, "mediaSource") ||
    1082           0 :       !atomsCache->height_id.init(cx, "height") ||
    1083           0 :       !atomsCache->frameRate_id.init(cx, "frameRate") ||
    1084           0 :       !atomsCache->facingMode_id.init(cx, "facingMode") ||
    1085           0 :       !atomsCache->echoCancellation_id.init(cx, "echoCancellation") ||
    1086           0 :       !atomsCache->deviceId_id.init(cx, "deviceId") ||
    1087           0 :       !atomsCache->channelCount_id.init(cx, "channelCount") ||
    1088           0 :       !atomsCache->browserWindow_id.init(cx, "browserWindow") ||
    1089           0 :       !atomsCache->autoGainControl_id.init(cx, "autoGainControl")) {
    1090           0 :     return false;
    1091             :   }
    1092           0 :   return true;
    1093             : }
    1094             : 
    1095             : bool
    1096           0 : MediaTrackConstraintSet::Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription, bool passedToJSImpl)
    1097             : {
    1098             :   // Passing a null JSContext is OK only if we're initing from null,
    1099             :   // Since in that case we will not have to do any property gets
    1100             :   // Also evaluate isNullOrUndefined in order to avoid false-positive
    1101             :   // checkers by static analysis tools
    1102           0 :   MOZ_ASSERT_IF(!cx, val.isNull() && val.isNullOrUndefined());
    1103           0 :   MediaTrackConstraintSetAtoms* atomsCache = nullptr;
    1104           0 :   if (cx) {
    1105           0 :     atomsCache = GetAtomCache<MediaTrackConstraintSetAtoms>(cx);
    1106           0 :     if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
    1107           0 :       return false;
    1108             :     }
    1109             :   }
    1110             : 
    1111           0 :   if (!IsConvertibleToDictionary(val)) {
    1112           0 :     return ThrowErrorMessage(cx, MSG_NOT_DICTIONARY, sourceDescription);
    1113             :   }
    1114             : 
    1115           0 :   bool isNull = val.isNullOrUndefined();
    1116             :   // We only need these if !isNull, in which case we have |cx|.
    1117           0 :   Maybe<JS::Rooted<JSObject *> > object;
    1118           0 :   Maybe<JS::Rooted<JS::Value> > temp;
    1119           0 :   if (!isNull) {
    1120           0 :     MOZ_ASSERT(cx);
    1121           0 :     object.emplace(cx, &val.toObject());
    1122           0 :     temp.emplace(cx);
    1123             :   }
    1124           0 :   if (!isNull) {
    1125           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->autoGainControl_id, temp.ptr())) {
    1126           0 :       return false;
    1127             :     }
    1128             :   }
    1129           0 :   mAutoGainControl.Uninit();
    1130           0 :   if (!(!isNull && !temp->isUndefined())) {
    1131           0 :     if (!mAutoGainControl.RawSetAsConstrainBooleanParameters().Init(cx, JS::NullHandleValue, "Member of BooleanOrConstrainBooleanParameters")) {
    1132           0 :       return false;
    1133             :     }
    1134             :   } else {
    1135             :     {
    1136           0 :       bool done = false, failed = false, tryNext;
    1137           0 :       if (!done) {
    1138           0 :         done = (failed = !mAutoGainControl.TrySetToConstrainBooleanParameters(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1139             :       }
    1140           0 :       if (!done) {
    1141             :         do {
    1142           0 :           done = (failed = !mAutoGainControl.TrySetToBoolean(cx, temp.ref(), tryNext)) || !tryNext;
    1143           0 :           break;
    1144             :         } while (0);
    1145             :       }
    1146           0 :       if (failed) {
    1147           0 :         return false;
    1148             :       }
    1149           0 :       if (!done) {
    1150           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'autoGainControl' member of MediaTrackConstraintSet", "ConstrainBooleanParameters");
    1151           0 :         return false;
    1152             :       }
    1153             :     }
    1154             :   }
    1155           0 :   mIsAnyMemberPresent = true;
    1156             : 
    1157           0 :   if (!isNull) {
    1158           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->browserWindow_id, temp.ptr())) {
    1159           0 :       return false;
    1160             :     }
    1161             :   }
    1162           0 :   if (!isNull && !temp->isUndefined()) {
    1163           0 :     mBrowserWindow.Construct();
    1164           0 :     if (!ValueToPrimitive<int64_t, eDefault>(cx, temp.ref(), &(mBrowserWindow.Value()))) {
    1165           0 :       return false;
    1166             :     }
    1167           0 :     mIsAnyMemberPresent = true;
    1168             :   }
    1169             : 
    1170           0 :   if (!isNull) {
    1171           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->channelCount_id, temp.ptr())) {
    1172           0 :       return false;
    1173             :     }
    1174             :   }
    1175           0 :   mChannelCount.Uninit();
    1176           0 :   if (!(!isNull && !temp->isUndefined())) {
    1177           0 :     if (!mChannelCount.RawSetAsConstrainLongRange().Init(cx, JS::NullHandleValue, "Member of LongOrConstrainLongRange")) {
    1178           0 :       return false;
    1179             :     }
    1180             :   } else {
    1181             :     {
    1182           0 :       bool done = false, failed = false, tryNext;
    1183           0 :       if (!done) {
    1184           0 :         done = (failed = !mChannelCount.TrySetToConstrainLongRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1185             :       }
    1186           0 :       if (!done) {
    1187             :         do {
    1188           0 :           done = (failed = !mChannelCount.TrySetToLong(cx, temp.ref(), tryNext)) || !tryNext;
    1189           0 :           break;
    1190             :         } while (0);
    1191             :       }
    1192           0 :       if (failed) {
    1193           0 :         return false;
    1194             :       }
    1195           0 :       if (!done) {
    1196           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'channelCount' member of MediaTrackConstraintSet", "ConstrainLongRange");
    1197           0 :         return false;
    1198             :       }
    1199             :     }
    1200             :   }
    1201           0 :   mIsAnyMemberPresent = true;
    1202             : 
    1203           0 :   if (!isNull) {
    1204           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->deviceId_id, temp.ptr())) {
    1205           0 :       return false;
    1206             :     }
    1207             :   }
    1208           0 :   mDeviceId.Uninit();
    1209           0 :   if (!(!isNull && !temp->isUndefined())) {
    1210           0 :     if (!mDeviceId.RawSetAsConstrainDOMStringParameters().Init(cx, JS::NullHandleValue, "Member of StringOrStringSequenceOrConstrainDOMStringParameters")) {
    1211           0 :       return false;
    1212             :     }
    1213             :   } else {
    1214             :     {
    1215           0 :       bool done = false, failed = false, tryNext;
    1216           0 :       if (temp.ref().isObject()) {
    1217           0 :         done = (failed = !mDeviceId.TrySetToStringSequence(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1218             :       }
    1219           0 :       if (!done) {
    1220           0 :         done = (failed = !mDeviceId.TrySetToConstrainDOMStringParameters(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1221             :       }
    1222           0 :       if (!done) {
    1223             :         do {
    1224           0 :           done = (failed = !mDeviceId.TrySetToString(cx, temp.ref(), tryNext)) || !tryNext;
    1225           0 :           break;
    1226             :         } while (0);
    1227             :       }
    1228           0 :       if (failed) {
    1229           0 :         return false;
    1230             :       }
    1231           0 :       if (!done) {
    1232           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'deviceId' member of MediaTrackConstraintSet", "StringSequence, ConstrainDOMStringParameters");
    1233           0 :         return false;
    1234             :       }
    1235             :     }
    1236             :   }
    1237           0 :   mIsAnyMemberPresent = true;
    1238             : 
    1239           0 :   if (!isNull) {
    1240           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->echoCancellation_id, temp.ptr())) {
    1241           0 :       return false;
    1242             :     }
    1243             :   }
    1244           0 :   mEchoCancellation.Uninit();
    1245           0 :   if (!(!isNull && !temp->isUndefined())) {
    1246           0 :     if (!mEchoCancellation.RawSetAsConstrainBooleanParameters().Init(cx, JS::NullHandleValue, "Member of BooleanOrConstrainBooleanParameters")) {
    1247           0 :       return false;
    1248             :     }
    1249             :   } else {
    1250             :     {
    1251           0 :       bool done = false, failed = false, tryNext;
    1252           0 :       if (!done) {
    1253           0 :         done = (failed = !mEchoCancellation.TrySetToConstrainBooleanParameters(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1254             :       }
    1255           0 :       if (!done) {
    1256             :         do {
    1257           0 :           done = (failed = !mEchoCancellation.TrySetToBoolean(cx, temp.ref(), tryNext)) || !tryNext;
    1258           0 :           break;
    1259             :         } while (0);
    1260             :       }
    1261           0 :       if (failed) {
    1262           0 :         return false;
    1263             :       }
    1264           0 :       if (!done) {
    1265           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'echoCancellation' member of MediaTrackConstraintSet", "ConstrainBooleanParameters");
    1266           0 :         return false;
    1267             :       }
    1268             :     }
    1269             :   }
    1270           0 :   mIsAnyMemberPresent = true;
    1271             : 
    1272           0 :   if (!isNull) {
    1273           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->facingMode_id, temp.ptr())) {
    1274           0 :       return false;
    1275             :     }
    1276             :   }
    1277           0 :   mFacingMode.Uninit();
    1278           0 :   if (!(!isNull && !temp->isUndefined())) {
    1279           0 :     if (!mFacingMode.RawSetAsConstrainDOMStringParameters().Init(cx, JS::NullHandleValue, "Member of StringOrStringSequenceOrConstrainDOMStringParameters")) {
    1280           0 :       return false;
    1281             :     }
    1282             :   } else {
    1283             :     {
    1284           0 :       bool done = false, failed = false, tryNext;
    1285           0 :       if (temp.ref().isObject()) {
    1286           0 :         done = (failed = !mFacingMode.TrySetToStringSequence(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1287             :       }
    1288           0 :       if (!done) {
    1289           0 :         done = (failed = !mFacingMode.TrySetToConstrainDOMStringParameters(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1290             :       }
    1291           0 :       if (!done) {
    1292             :         do {
    1293           0 :           done = (failed = !mFacingMode.TrySetToString(cx, temp.ref(), tryNext)) || !tryNext;
    1294           0 :           break;
    1295             :         } while (0);
    1296             :       }
    1297           0 :       if (failed) {
    1298           0 :         return false;
    1299             :       }
    1300           0 :       if (!done) {
    1301           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'facingMode' member of MediaTrackConstraintSet", "StringSequence, ConstrainDOMStringParameters");
    1302           0 :         return false;
    1303             :       }
    1304             :     }
    1305             :   }
    1306           0 :   mIsAnyMemberPresent = true;
    1307             : 
    1308           0 :   if (!isNull) {
    1309           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->frameRate_id, temp.ptr())) {
    1310           0 :       return false;
    1311             :     }
    1312             :   }
    1313           0 :   mFrameRate.Uninit();
    1314           0 :   if (!(!isNull && !temp->isUndefined())) {
    1315           0 :     if (!mFrameRate.RawSetAsConstrainDoubleRange().Init(cx, JS::NullHandleValue, "Member of DoubleOrConstrainDoubleRange")) {
    1316           0 :       return false;
    1317             :     }
    1318             :   } else {
    1319             :     {
    1320           0 :       bool done = false, failed = false, tryNext;
    1321           0 :       if (!done) {
    1322           0 :         done = (failed = !mFrameRate.TrySetToConstrainDoubleRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1323             :       }
    1324           0 :       if (!done) {
    1325             :         do {
    1326           0 :           done = (failed = !mFrameRate.TrySetToDouble(cx, temp.ref(), tryNext)) || !tryNext;
    1327           0 :           break;
    1328             :         } while (0);
    1329             :       }
    1330           0 :       if (failed) {
    1331           0 :         return false;
    1332             :       }
    1333           0 :       if (!done) {
    1334           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'frameRate' member of MediaTrackConstraintSet", "ConstrainDoubleRange");
    1335           0 :         return false;
    1336             :       }
    1337             :     }
    1338             :   }
    1339           0 :   mIsAnyMemberPresent = true;
    1340             : 
    1341           0 :   if (!isNull) {
    1342           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->height_id, temp.ptr())) {
    1343           0 :       return false;
    1344             :     }
    1345             :   }
    1346           0 :   mHeight.Uninit();
    1347           0 :   if (!(!isNull && !temp->isUndefined())) {
    1348           0 :     if (!mHeight.RawSetAsConstrainLongRange().Init(cx, JS::NullHandleValue, "Member of LongOrConstrainLongRange")) {
    1349           0 :       return false;
    1350             :     }
    1351             :   } else {
    1352             :     {
    1353           0 :       bool done = false, failed = false, tryNext;
    1354           0 :       if (!done) {
    1355           0 :         done = (failed = !mHeight.TrySetToConstrainLongRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1356             :       }
    1357           0 :       if (!done) {
    1358             :         do {
    1359           0 :           done = (failed = !mHeight.TrySetToLong(cx, temp.ref(), tryNext)) || !tryNext;
    1360           0 :           break;
    1361             :         } while (0);
    1362             :       }
    1363           0 :       if (failed) {
    1364           0 :         return false;
    1365             :       }
    1366           0 :       if (!done) {
    1367           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'height' member of MediaTrackConstraintSet", "ConstrainLongRange");
    1368           0 :         return false;
    1369             :       }
    1370             :     }
    1371             :   }
    1372           0 :   mIsAnyMemberPresent = true;
    1373             : 
    1374           0 :   if (!isNull) {
    1375           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->mediaSource_id, temp.ptr())) {
    1376           0 :       return false;
    1377             :     }
    1378             :   }
    1379           0 :   if (!isNull && !temp->isUndefined()) {
    1380           0 :     if (!ConvertJSValueToString(cx, temp.ref(), eStringify, eStringify, mMediaSource)) {
    1381           0 :       return false;
    1382             :     }
    1383             :   } else {
    1384             :     static const char16_t data[] = { 'c', 'a', 'm', 'e', 'r', 'a', 0 };
    1385           0 :     mMediaSource.Rebind(data, ArrayLength(data) - 1);
    1386             :   }
    1387           0 :   mIsAnyMemberPresent = true;
    1388             : 
    1389           0 :   if (!isNull) {
    1390           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->mozAutoGainControl_id, temp.ptr())) {
    1391           0 :       return false;
    1392             :     }
    1393             :   }
    1394           0 :   mMozAutoGainControl.Uninit();
    1395           0 :   if (!(!isNull && !temp->isUndefined())) {
    1396           0 :     if (!mMozAutoGainControl.RawSetAsConstrainBooleanParameters().Init(cx, JS::NullHandleValue, "Member of BooleanOrConstrainBooleanParameters")) {
    1397           0 :       return false;
    1398             :     }
    1399             :   } else {
    1400             :     {
    1401           0 :       bool done = false, failed = false, tryNext;
    1402           0 :       if (!done) {
    1403           0 :         done = (failed = !mMozAutoGainControl.TrySetToConstrainBooleanParameters(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1404             :       }
    1405           0 :       if (!done) {
    1406             :         do {
    1407           0 :           done = (failed = !mMozAutoGainControl.TrySetToBoolean(cx, temp.ref(), tryNext)) || !tryNext;
    1408           0 :           break;
    1409             :         } while (0);
    1410             :       }
    1411           0 :       if (failed) {
    1412           0 :         return false;
    1413             :       }
    1414           0 :       if (!done) {
    1415           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'mozAutoGainControl' member of MediaTrackConstraintSet", "ConstrainBooleanParameters");
    1416           0 :         return false;
    1417             :       }
    1418             :     }
    1419             :   }
    1420           0 :   mIsAnyMemberPresent = true;
    1421             : 
    1422           0 :   if (!isNull) {
    1423           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->mozNoiseSuppression_id, temp.ptr())) {
    1424           0 :       return false;
    1425             :     }
    1426             :   }
    1427           0 :   mMozNoiseSuppression.Uninit();
    1428           0 :   if (!(!isNull && !temp->isUndefined())) {
    1429           0 :     if (!mMozNoiseSuppression.RawSetAsConstrainBooleanParameters().Init(cx, JS::NullHandleValue, "Member of BooleanOrConstrainBooleanParameters")) {
    1430           0 :       return false;
    1431             :     }
    1432             :   } else {
    1433             :     {
    1434           0 :       bool done = false, failed = false, tryNext;
    1435           0 :       if (!done) {
    1436           0 :         done = (failed = !mMozNoiseSuppression.TrySetToConstrainBooleanParameters(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1437             :       }
    1438           0 :       if (!done) {
    1439             :         do {
    1440           0 :           done = (failed = !mMozNoiseSuppression.TrySetToBoolean(cx, temp.ref(), tryNext)) || !tryNext;
    1441           0 :           break;
    1442             :         } while (0);
    1443             :       }
    1444           0 :       if (failed) {
    1445           0 :         return false;
    1446             :       }
    1447           0 :       if (!done) {
    1448           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'mozNoiseSuppression' member of MediaTrackConstraintSet", "ConstrainBooleanParameters");
    1449           0 :         return false;
    1450             :       }
    1451             :     }
    1452             :   }
    1453           0 :   mIsAnyMemberPresent = true;
    1454             : 
    1455           0 :   if (!isNull) {
    1456           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->noiseSuppression_id, temp.ptr())) {
    1457           0 :       return false;
    1458             :     }
    1459             :   }
    1460           0 :   mNoiseSuppression.Uninit();
    1461           0 :   if (!(!isNull && !temp->isUndefined())) {
    1462           0 :     if (!mNoiseSuppression.RawSetAsConstrainBooleanParameters().Init(cx, JS::NullHandleValue, "Member of BooleanOrConstrainBooleanParameters")) {
    1463           0 :       return false;
    1464             :     }
    1465             :   } else {
    1466             :     {
    1467           0 :       bool done = false, failed = false, tryNext;
    1468           0 :       if (!done) {
    1469           0 :         done = (failed = !mNoiseSuppression.TrySetToConstrainBooleanParameters(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1470             :       }
    1471           0 :       if (!done) {
    1472             :         do {
    1473           0 :           done = (failed = !mNoiseSuppression.TrySetToBoolean(cx, temp.ref(), tryNext)) || !tryNext;
    1474           0 :           break;
    1475             :         } while (0);
    1476             :       }
    1477           0 :       if (failed) {
    1478           0 :         return false;
    1479             :       }
    1480           0 :       if (!done) {
    1481           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'noiseSuppression' member of MediaTrackConstraintSet", "ConstrainBooleanParameters");
    1482           0 :         return false;
    1483             :       }
    1484             :     }
    1485             :   }
    1486           0 :   mIsAnyMemberPresent = true;
    1487             : 
    1488           0 :   if (!isNull) {
    1489           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->scrollWithPage_id, temp.ptr())) {
    1490           0 :       return false;
    1491             :     }
    1492             :   }
    1493           0 :   if (!isNull && !temp->isUndefined()) {
    1494           0 :     mScrollWithPage.Construct();
    1495           0 :     if (!ValueToPrimitive<bool, eDefault>(cx, temp.ref(), &(mScrollWithPage.Value()))) {
    1496           0 :       return false;
    1497             :     }
    1498           0 :     mIsAnyMemberPresent = true;
    1499             :   }
    1500             : 
    1501           0 :   if (!isNull) {
    1502           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->viewportHeight_id, temp.ptr())) {
    1503           0 :       return false;
    1504             :     }
    1505             :   }
    1506           0 :   mViewportHeight.Uninit();
    1507           0 :   if (!(!isNull && !temp->isUndefined())) {
    1508           0 :     if (!mViewportHeight.RawSetAsConstrainLongRange().Init(cx, JS::NullHandleValue, "Member of LongOrConstrainLongRange")) {
    1509           0 :       return false;
    1510             :     }
    1511             :   } else {
    1512             :     {
    1513           0 :       bool done = false, failed = false, tryNext;
    1514           0 :       if (!done) {
    1515           0 :         done = (failed = !mViewportHeight.TrySetToConstrainLongRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1516             :       }
    1517           0 :       if (!done) {
    1518             :         do {
    1519           0 :           done = (failed = !mViewportHeight.TrySetToLong(cx, temp.ref(), tryNext)) || !tryNext;
    1520           0 :           break;
    1521             :         } while (0);
    1522             :       }
    1523           0 :       if (failed) {
    1524           0 :         return false;
    1525             :       }
    1526           0 :       if (!done) {
    1527           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'viewportHeight' member of MediaTrackConstraintSet", "ConstrainLongRange");
    1528           0 :         return false;
    1529             :       }
    1530             :     }
    1531             :   }
    1532           0 :   mIsAnyMemberPresent = true;
    1533             : 
    1534           0 :   if (!isNull) {
    1535           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->viewportOffsetX_id, temp.ptr())) {
    1536           0 :       return false;
    1537             :     }
    1538             :   }
    1539           0 :   mViewportOffsetX.Uninit();
    1540           0 :   if (!(!isNull && !temp->isUndefined())) {
    1541           0 :     if (!mViewportOffsetX.RawSetAsConstrainLongRange().Init(cx, JS::NullHandleValue, "Member of LongOrConstrainLongRange")) {
    1542           0 :       return false;
    1543             :     }
    1544             :   } else {
    1545             :     {
    1546           0 :       bool done = false, failed = false, tryNext;
    1547           0 :       if (!done) {
    1548           0 :         done = (failed = !mViewportOffsetX.TrySetToConstrainLongRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1549             :       }
    1550           0 :       if (!done) {
    1551             :         do {
    1552           0 :           done = (failed = !mViewportOffsetX.TrySetToLong(cx, temp.ref(), tryNext)) || !tryNext;
    1553           0 :           break;
    1554             :         } while (0);
    1555             :       }
    1556           0 :       if (failed) {
    1557           0 :         return false;
    1558             :       }
    1559           0 :       if (!done) {
    1560           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'viewportOffsetX' member of MediaTrackConstraintSet", "ConstrainLongRange");
    1561           0 :         return false;
    1562             :       }
    1563             :     }
    1564             :   }
    1565           0 :   mIsAnyMemberPresent = true;
    1566             : 
    1567           0 :   if (!isNull) {
    1568           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->viewportOffsetY_id, temp.ptr())) {
    1569           0 :       return false;
    1570             :     }
    1571             :   }
    1572           0 :   mViewportOffsetY.Uninit();
    1573           0 :   if (!(!isNull && !temp->isUndefined())) {
    1574           0 :     if (!mViewportOffsetY.RawSetAsConstrainLongRange().Init(cx, JS::NullHandleValue, "Member of LongOrConstrainLongRange")) {
    1575           0 :       return false;
    1576             :     }
    1577             :   } else {
    1578             :     {
    1579           0 :       bool done = false, failed = false, tryNext;
    1580           0 :       if (!done) {
    1581           0 :         done = (failed = !mViewportOffsetY.TrySetToConstrainLongRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1582             :       }
    1583           0 :       if (!done) {
    1584             :         do {
    1585           0 :           done = (failed = !mViewportOffsetY.TrySetToLong(cx, temp.ref(), tryNext)) || !tryNext;
    1586           0 :           break;
    1587             :         } while (0);
    1588             :       }
    1589           0 :       if (failed) {
    1590           0 :         return false;
    1591             :       }
    1592           0 :       if (!done) {
    1593           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'viewportOffsetY' member of MediaTrackConstraintSet", "ConstrainLongRange");
    1594           0 :         return false;
    1595             :       }
    1596             :     }
    1597             :   }
    1598           0 :   mIsAnyMemberPresent = true;
    1599             : 
    1600           0 :   if (!isNull) {
    1601           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->viewportWidth_id, temp.ptr())) {
    1602           0 :       return false;
    1603             :     }
    1604             :   }
    1605           0 :   mViewportWidth.Uninit();
    1606           0 :   if (!(!isNull && !temp->isUndefined())) {
    1607           0 :     if (!mViewportWidth.RawSetAsConstrainLongRange().Init(cx, JS::NullHandleValue, "Member of LongOrConstrainLongRange")) {
    1608           0 :       return false;
    1609             :     }
    1610             :   } else {
    1611             :     {
    1612           0 :       bool done = false, failed = false, tryNext;
    1613           0 :       if (!done) {
    1614           0 :         done = (failed = !mViewportWidth.TrySetToConstrainLongRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1615             :       }
    1616           0 :       if (!done) {
    1617             :         do {
    1618           0 :           done = (failed = !mViewportWidth.TrySetToLong(cx, temp.ref(), tryNext)) || !tryNext;
    1619           0 :           break;
    1620             :         } while (0);
    1621             :       }
    1622           0 :       if (failed) {
    1623           0 :         return false;
    1624             :       }
    1625           0 :       if (!done) {
    1626           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'viewportWidth' member of MediaTrackConstraintSet", "ConstrainLongRange");
    1627           0 :         return false;
    1628             :       }
    1629             :     }
    1630             :   }
    1631           0 :   mIsAnyMemberPresent = true;
    1632             : 
    1633           0 :   if (!isNull) {
    1634           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->width_id, temp.ptr())) {
    1635           0 :       return false;
    1636             :     }
    1637             :   }
    1638           0 :   mWidth.Uninit();
    1639           0 :   if (!(!isNull && !temp->isUndefined())) {
    1640           0 :     if (!mWidth.RawSetAsConstrainLongRange().Init(cx, JS::NullHandleValue, "Member of LongOrConstrainLongRange")) {
    1641           0 :       return false;
    1642             :     }
    1643             :   } else {
    1644             :     {
    1645           0 :       bool done = false, failed = false, tryNext;
    1646           0 :       if (!done) {
    1647           0 :         done = (failed = !mWidth.TrySetToConstrainLongRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
    1648             :       }
    1649           0 :       if (!done) {
    1650             :         do {
    1651           0 :           done = (failed = !mWidth.TrySetToLong(cx, temp.ref(), tryNext)) || !tryNext;
    1652           0 :           break;
    1653             :         } while (0);
    1654             :       }
    1655           0 :       if (failed) {
    1656           0 :         return false;
    1657             :       }
    1658           0 :       if (!done) {
    1659           0 :         ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'width' member of MediaTrackConstraintSet", "ConstrainLongRange");
    1660           0 :         return false;
    1661             :       }
    1662             :     }
    1663             :   }
    1664           0 :   mIsAnyMemberPresent = true;
    1665           0 :   return true;
    1666             : }
    1667             : 
    1668             : bool
    1669           0 : MediaTrackConstraintSet::Init(const nsAString& aJSON)
    1670             : {
    1671           0 :   AutoJSAPI jsapi;
    1672           0 :   JSObject* cleanGlobal = SimpleGlobalObject::Create(SimpleGlobalObject::GlobalType::BindingDetail);
    1673           0 :   if (!cleanGlobal) {
    1674           0 :     return false;
    1675             :   }
    1676           0 :   if (!jsapi.Init(cleanGlobal)) {
    1677           0 :     return false;
    1678             :   }
    1679           0 :   JSContext* cx = jsapi.cx();
    1680           0 :   JS::Rooted<JS::Value> json(cx);
    1681           0 :   bool ok = ParseJSON(cx, aJSON, &json);
    1682           0 :   NS_ENSURE_TRUE(ok, false);
    1683           0 :   return Init(cx, json);
    1684             : }
    1685             : 
    1686             : bool
    1687           0 : MediaTrackConstraintSet::ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const
    1688             : {
    1689           0 :   MediaTrackConstraintSetAtoms* atomsCache = GetAtomCache<MediaTrackConstraintSetAtoms>(cx);
    1690           0 :   if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
    1691           0 :     return false;
    1692             :   }
    1693             : 
    1694           0 :   JS::Rooted<JSObject*> obj(cx, JS_NewPlainObject(cx));
    1695           0 :   if (!obj) {
    1696           0 :     return false;
    1697             :   }
    1698           0 :   rval.set(JS::ObjectValue(*obj));
    1699             : 
    1700             :   do {
    1701             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1702           0 :     JS::Rooted<JS::Value> temp(cx);
    1703           0 :     OwningBooleanOrConstrainBooleanParameters const & currentValue = mAutoGainControl;
    1704           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1705           0 :       return false;
    1706             :     }
    1707           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->autoGainControl_id, temp, JSPROP_ENUMERATE)) {
    1708           0 :       return false;
    1709             :     }
    1710           0 :     break;
    1711             :   } while(0);
    1712             : 
    1713           0 :   if (mBrowserWindow.WasPassed()) {
    1714             :     do {
    1715             :       // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1716           0 :       JS::Rooted<JS::Value> temp(cx);
    1717           0 :       int64_t const & currentValue = mBrowserWindow.InternalValue();
    1718           0 :       temp.set(JS_NumberValue(double(currentValue)));
    1719           0 :       if (!JS_DefinePropertyById(cx, obj, atomsCache->browserWindow_id, temp, JSPROP_ENUMERATE)) {
    1720           0 :         return false;
    1721             :       }
    1722           0 :       break;
    1723             :     } while(0);
    1724             :   }
    1725             : 
    1726             :   do {
    1727             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1728           0 :     JS::Rooted<JS::Value> temp(cx);
    1729           0 :     OwningLongOrConstrainLongRange const & currentValue = mChannelCount;
    1730           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1731           0 :       return false;
    1732             :     }
    1733           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->channelCount_id, temp, JSPROP_ENUMERATE)) {
    1734           0 :       return false;
    1735             :     }
    1736           0 :     break;
    1737             :   } while(0);
    1738             : 
    1739             :   do {
    1740             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1741           0 :     JS::Rooted<JS::Value> temp(cx);
    1742           0 :     OwningStringOrStringSequenceOrConstrainDOMStringParameters const & currentValue = mDeviceId;
    1743           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1744           0 :       return false;
    1745             :     }
    1746           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->deviceId_id, temp, JSPROP_ENUMERATE)) {
    1747           0 :       return false;
    1748             :     }
    1749           0 :     break;
    1750             :   } while(0);
    1751             : 
    1752             :   do {
    1753             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1754           0 :     JS::Rooted<JS::Value> temp(cx);
    1755           0 :     OwningBooleanOrConstrainBooleanParameters const & currentValue = mEchoCancellation;
    1756           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1757           0 :       return false;
    1758             :     }
    1759           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->echoCancellation_id, temp, JSPROP_ENUMERATE)) {
    1760           0 :       return false;
    1761             :     }
    1762           0 :     break;
    1763             :   } while(0);
    1764             : 
    1765             :   do {
    1766             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1767           0 :     JS::Rooted<JS::Value> temp(cx);
    1768           0 :     OwningStringOrStringSequenceOrConstrainDOMStringParameters const & currentValue = mFacingMode;
    1769           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1770           0 :       return false;
    1771             :     }
    1772           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->facingMode_id, temp, JSPROP_ENUMERATE)) {
    1773           0 :       return false;
    1774             :     }
    1775           0 :     break;
    1776             :   } while(0);
    1777             : 
    1778             :   do {
    1779             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1780           0 :     JS::Rooted<JS::Value> temp(cx);
    1781           0 :     OwningDoubleOrConstrainDoubleRange const & currentValue = mFrameRate;
    1782           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1783           0 :       return false;
    1784             :     }
    1785           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->frameRate_id, temp, JSPROP_ENUMERATE)) {
    1786           0 :       return false;
    1787             :     }
    1788           0 :     break;
    1789             :   } while(0);
    1790             : 
    1791             :   do {
    1792             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1793           0 :     JS::Rooted<JS::Value> temp(cx);
    1794           0 :     OwningLongOrConstrainLongRange const & currentValue = mHeight;
    1795           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1796           0 :       return false;
    1797             :     }
    1798           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->height_id, temp, JSPROP_ENUMERATE)) {
    1799           0 :       return false;
    1800             :     }
    1801           0 :     break;
    1802             :   } while(0);
    1803             : 
    1804             :   do {
    1805             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1806           0 :     JS::Rooted<JS::Value> temp(cx);
    1807           0 :     nsString const & currentValue = mMediaSource;
    1808           0 :     if (!xpc::NonVoidStringToJsval(cx, currentValue, &temp)) {
    1809           0 :       return false;
    1810             :     }
    1811           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->mediaSource_id, temp, JSPROP_ENUMERATE)) {
    1812           0 :       return false;
    1813             :     }
    1814           0 :     break;
    1815             :   } while(0);
    1816             : 
    1817             :   do {
    1818             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1819           0 :     JS::Rooted<JS::Value> temp(cx);
    1820           0 :     OwningBooleanOrConstrainBooleanParameters const & currentValue = mMozAutoGainControl;
    1821           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1822           0 :       return false;
    1823             :     }
    1824           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->mozAutoGainControl_id, temp, JSPROP_ENUMERATE)) {
    1825           0 :       return false;
    1826             :     }
    1827           0 :     break;
    1828             :   } while(0);
    1829             : 
    1830             :   do {
    1831             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1832           0 :     JS::Rooted<JS::Value> temp(cx);
    1833           0 :     OwningBooleanOrConstrainBooleanParameters const & currentValue = mMozNoiseSuppression;
    1834           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1835           0 :       return false;
    1836             :     }
    1837           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->mozNoiseSuppression_id, temp, JSPROP_ENUMERATE)) {
    1838           0 :       return false;
    1839             :     }
    1840           0 :     break;
    1841             :   } while(0);
    1842             : 
    1843             :   do {
    1844             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1845           0 :     JS::Rooted<JS::Value> temp(cx);
    1846           0 :     OwningBooleanOrConstrainBooleanParameters const & currentValue = mNoiseSuppression;
    1847           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1848           0 :       return false;
    1849             :     }
    1850           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->noiseSuppression_id, temp, JSPROP_ENUMERATE)) {
    1851           0 :       return false;
    1852             :     }
    1853           0 :     break;
    1854             :   } while(0);
    1855             : 
    1856           0 :   if (mScrollWithPage.WasPassed()) {
    1857             :     do {
    1858             :       // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1859           0 :       JS::Rooted<JS::Value> temp(cx);
    1860           0 :       bool const & currentValue = mScrollWithPage.InternalValue();
    1861           0 :       temp.setBoolean(currentValue);
    1862           0 :       if (!JS_DefinePropertyById(cx, obj, atomsCache->scrollWithPage_id, temp, JSPROP_ENUMERATE)) {
    1863           0 :         return false;
    1864             :       }
    1865           0 :       break;
    1866             :     } while(0);
    1867             :   }
    1868             : 
    1869             :   do {
    1870             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1871           0 :     JS::Rooted<JS::Value> temp(cx);
    1872           0 :     OwningLongOrConstrainLongRange const & currentValue = mViewportHeight;
    1873           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1874           0 :       return false;
    1875             :     }
    1876           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->viewportHeight_id, temp, JSPROP_ENUMERATE)) {
    1877           0 :       return false;
    1878             :     }
    1879           0 :     break;
    1880             :   } while(0);
    1881             : 
    1882             :   do {
    1883             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1884           0 :     JS::Rooted<JS::Value> temp(cx);
    1885           0 :     OwningLongOrConstrainLongRange const & currentValue = mViewportOffsetX;
    1886           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1887           0 :       return false;
    1888             :     }
    1889           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->viewportOffsetX_id, temp, JSPROP_ENUMERATE)) {
    1890           0 :       return false;
    1891             :     }
    1892           0 :     break;
    1893             :   } while(0);
    1894             : 
    1895             :   do {
    1896             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1897           0 :     JS::Rooted<JS::Value> temp(cx);
    1898           0 :     OwningLongOrConstrainLongRange const & currentValue = mViewportOffsetY;
    1899           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1900           0 :       return false;
    1901             :     }
    1902           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->viewportOffsetY_id, temp, JSPROP_ENUMERATE)) {
    1903           0 :       return false;
    1904             :     }
    1905           0 :     break;
    1906             :   } while(0);
    1907             : 
    1908             :   do {
    1909             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1910           0 :     JS::Rooted<JS::Value> temp(cx);
    1911           0 :     OwningLongOrConstrainLongRange const & currentValue = mViewportWidth;
    1912           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1913           0 :       return false;
    1914             :     }
    1915           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->viewportWidth_id, temp, JSPROP_ENUMERATE)) {
    1916           0 :       return false;
    1917             :     }
    1918           0 :     break;
    1919             :   } while(0);
    1920             : 
    1921             :   do {
    1922             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    1923           0 :     JS::Rooted<JS::Value> temp(cx);
    1924           0 :     OwningLongOrConstrainLongRange const & currentValue = mWidth;
    1925           0 :     if (!currentValue.ToJSVal(cx, obj, &temp)) {
    1926           0 :       return false;
    1927             :     }
    1928           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->width_id, temp, JSPROP_ENUMERATE)) {
    1929           0 :       return false;
    1930             :     }
    1931           0 :     break;
    1932             :   } while(0);
    1933             : 
    1934           0 :   return true;
    1935             : }
    1936             : 
    1937             : bool
    1938           0 : MediaTrackConstraintSet::ToJSON(nsAString& aJSON) const
    1939             : {
    1940           0 :   AutoJSAPI jsapi;
    1941           0 :   jsapi.Init();
    1942           0 :   JSContext *cx = jsapi.cx();
    1943             :   // It's safe to use UnprivilegedJunkScopeOrWorkerGlobal here
    1944             :   // because we'll only be creating objects, in ways that have no
    1945             :   // side-effects, followed by a call to JS::ToJSONMaybeSafely,
    1946             :   // which likewise guarantees no side-effects for the sorts of
    1947             :   // things we will pass it.
    1948           0 :   JSAutoCompartment ac(cx, binding_detail::UnprivilegedJunkScopeOrWorkerGlobal());
    1949           0 :   JS::Rooted<JS::Value> val(cx);
    1950           0 :   if (!ToObjectInternal(cx, &val)) {
    1951           0 :     return false;
    1952             :   }
    1953           0 :   JS::Rooted<JSObject*> obj(cx, &val.toObject());
    1954           0 :   return StringifyToJSON(cx, obj, aJSON);
    1955             : }
    1956             : 
    1957             : void
    1958           0 : MediaTrackConstraintSet::TraceDictionary(JSTracer* trc)
    1959             : {
    1960           0 : }
    1961             : 
    1962             : MediaTrackConstraintSet&
    1963           0 : MediaTrackConstraintSet::operator=(const MediaTrackConstraintSet& aOther)
    1964             : {
    1965           0 :   mAutoGainControl = aOther.mAutoGainControl;
    1966           0 :   mBrowserWindow.Reset();
    1967           0 :   if (aOther.mBrowserWindow.WasPassed()) {
    1968           0 :     mBrowserWindow.Construct(aOther.mBrowserWindow.Value());
    1969             :   }
    1970           0 :   mChannelCount = aOther.mChannelCount;
    1971           0 :   mDeviceId = aOther.mDeviceId;
    1972           0 :   mEchoCancellation = aOther.mEchoCancellation;
    1973           0 :   mFacingMode = aOther.mFacingMode;
    1974           0 :   mFrameRate = aOther.mFrameRate;
    1975           0 :   mHeight = aOther.mHeight;
    1976           0 :   mMediaSource = aOther.mMediaSource;
    1977           0 :   mMozAutoGainControl = aOther.mMozAutoGainControl;
    1978           0 :   mMozNoiseSuppression = aOther.mMozNoiseSuppression;
    1979           0 :   mNoiseSuppression = aOther.mNoiseSuppression;
    1980           0 :   mScrollWithPage.Reset();
    1981           0 :   if (aOther.mScrollWithPage.WasPassed()) {
    1982           0 :     mScrollWithPage.Construct(aOther.mScrollWithPage.Value());
    1983             :   }
    1984           0 :   mViewportHeight = aOther.mViewportHeight;
    1985           0 :   mViewportOffsetX = aOther.mViewportOffsetX;
    1986           0 :   mViewportOffsetY = aOther.mViewportOffsetY;
    1987           0 :   mViewportWidth = aOther.mViewportWidth;
    1988           0 :   mWidth = aOther.mWidth;
    1989           0 :   return *this;
    1990             : }
    1991             : 
    1992             : namespace binding_detail {
    1993             : } // namespace binding_detail
    1994             : 
    1995             : 
    1996             : 
    1997           0 : MediaTrackConstraints::MediaTrackConstraints()
    1998           0 :   : MediaTrackConstraintSet(FastDictionaryInitializer())
    1999             : {
    2000             :   // Safe to pass a null context if we pass a null value
    2001           0 :   Init(nullptr, JS::NullHandleValue);
    2002           0 : }
    2003             : 
    2004             : 
    2005             : 
    2006             : bool
    2007           0 : MediaTrackConstraints::InitIds(JSContext* cx, MediaTrackConstraintsAtoms* atomsCache)
    2008             : {
    2009           0 :   MOZ_ASSERT(!*reinterpret_cast<jsid**>(atomsCache));
    2010             : 
    2011             :   // Initialize these in reverse order so that any failure leaves the first one
    2012             :   // uninitialized.
    2013           0 :   if (!atomsCache->advanced_id.init(cx, "advanced")) {
    2014           0 :     return false;
    2015             :   }
    2016           0 :   return true;
    2017             : }
    2018             : 
    2019             : bool
    2020           0 : MediaTrackConstraints::Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription, bool passedToJSImpl)
    2021             : {
    2022             :   // Passing a null JSContext is OK only if we're initing from null,
    2023             :   // Since in that case we will not have to do any property gets
    2024             :   // Also evaluate isNullOrUndefined in order to avoid false-positive
    2025             :   // checkers by static analysis tools
    2026           0 :   MOZ_ASSERT_IF(!cx, val.isNull() && val.isNullOrUndefined());
    2027           0 :   MediaTrackConstraintsAtoms* atomsCache = nullptr;
    2028           0 :   if (cx) {
    2029           0 :     atomsCache = GetAtomCache<MediaTrackConstraintsAtoms>(cx);
    2030           0 :     if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
    2031           0 :       return false;
    2032             :     }
    2033             :   }
    2034             : 
    2035             :   // Per spec, we init the parent's members first
    2036           0 :   if (!MediaTrackConstraintSet::Init(cx, val)) {
    2037           0 :     return false;
    2038             :   }
    2039             : 
    2040           0 :   bool isNull = val.isNullOrUndefined();
    2041             :   // We only need these if !isNull, in which case we have |cx|.
    2042           0 :   Maybe<JS::Rooted<JSObject *> > object;
    2043           0 :   Maybe<JS::Rooted<JS::Value> > temp;
    2044           0 :   if (!isNull) {
    2045           0 :     MOZ_ASSERT(cx);
    2046           0 :     object.emplace(cx, &val.toObject());
    2047           0 :     temp.emplace(cx);
    2048             :   }
    2049           0 :   if (!isNull) {
    2050           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->advanced_id, temp.ptr())) {
    2051           0 :       return false;
    2052             :     }
    2053             :   }
    2054           0 :   if (!isNull && !temp->isUndefined()) {
    2055           0 :     mAdvanced.Construct();
    2056           0 :     if (temp.ref().isObject()) {
    2057           0 :       JS::ForOfIterator iter(cx);
    2058           0 :       if (!iter.init(temp.ref(), JS::ForOfIterator::AllowNonIterable)) {
    2059           0 :         return false;
    2060             :       }
    2061           0 :       if (!iter.valueIsIterable()) {
    2062           0 :         ThrowErrorMessage(cx, MSG_NOT_SEQUENCE, "'advanced' member of MediaTrackConstraints");
    2063           0 :         return false;
    2064             :       }
    2065           0 :       Sequence<MediaTrackConstraintSet> &arr = (mAdvanced.Value());
    2066           0 :       JS::Rooted<JS::Value> temp(cx);
    2067             :       while (true) {
    2068             :         bool done;
    2069           0 :         if (!iter.next(&temp, &done)) {
    2070           0 :           return false;
    2071             :         }
    2072           0 :         if (done) {
    2073           0 :           break;
    2074             :         }
    2075           0 :         MediaTrackConstraintSet* slotPtr = arr.AppendElement(mozilla::fallible);
    2076           0 :         if (!slotPtr) {
    2077           0 :           JS_ReportOutOfMemory(cx);
    2078           0 :           return false;
    2079             :         }
    2080           0 :         MediaTrackConstraintSet& slot = *slotPtr;
    2081           0 :         if (!slot.Init(cx, temp,  "Element of 'advanced' member of MediaTrackConstraints", passedToJSImpl)) {
    2082           0 :           return false;
    2083             :         }
    2084           0 :       }
    2085             :     } else {
    2086           0 :       ThrowErrorMessage(cx, MSG_NOT_SEQUENCE, "'advanced' member of MediaTrackConstraints");
    2087           0 :       return false;
    2088             :     }
    2089           0 :     mIsAnyMemberPresent = true;
    2090             :   }
    2091           0 :   return true;
    2092             : }
    2093             : 
    2094             : bool
    2095           0 : MediaTrackConstraints::Init(const nsAString& aJSON)
    2096             : {
    2097           0 :   AutoJSAPI jsapi;
    2098           0 :   JSObject* cleanGlobal = SimpleGlobalObject::Create(SimpleGlobalObject::GlobalType::BindingDetail);
    2099           0 :   if (!cleanGlobal) {
    2100           0 :     return false;
    2101             :   }
    2102           0 :   if (!jsapi.Init(cleanGlobal)) {
    2103           0 :     return false;
    2104             :   }
    2105           0 :   JSContext* cx = jsapi.cx();
    2106           0 :   JS::Rooted<JS::Value> json(cx);
    2107           0 :   bool ok = ParseJSON(cx, aJSON, &json);
    2108           0 :   NS_ENSURE_TRUE(ok, false);
    2109           0 :   return Init(cx, json);
    2110             : }
    2111             : 
    2112             : bool
    2113           0 : MediaTrackConstraints::ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const
    2114             : {
    2115           0 :   MediaTrackConstraintsAtoms* atomsCache = GetAtomCache<MediaTrackConstraintsAtoms>(cx);
    2116           0 :   if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
    2117           0 :     return false;
    2118             :   }
    2119             : 
    2120             :   // Per spec, we define the parent's members first
    2121           0 :   if (!MediaTrackConstraintSet::ToObjectInternal(cx, rval)) {
    2122           0 :     return false;
    2123             :   }
    2124           0 :   JS::Rooted<JSObject*> obj(cx, &rval.toObject());
    2125             : 
    2126           0 :   if (mAdvanced.WasPassed()) {
    2127             :     do {
    2128             :       // block for our 'break' successCode and scope for 'temp' and 'currentValue'
    2129           0 :       JS::Rooted<JS::Value> temp(cx);
    2130           0 :       Sequence<MediaTrackConstraintSet> const & currentValue = mAdvanced.InternalValue();
    2131             : 
    2132           0 :       uint32_t length = currentValue.Length();
    2133           0 :       JS::Rooted<JSObject*> returnArray(cx, JS_NewArrayObject(cx, length));
    2134           0 :       if (!returnArray) {
    2135           0 :         return false;
    2136             :       }
    2137             :       // Scope for 'tmp'
    2138             :       {
    2139           0 :         JS::Rooted<JS::Value> tmp(cx);
    2140           0 :         for (uint32_t sequenceIdx0 = 0; sequenceIdx0 < length; ++sequenceIdx0) {
    2141             :           // Control block to let us common up the JS_DefineElement calls when there
    2142             :           // are different ways to succeed at wrapping the object.
    2143             :           do {
    2144           0 :             if (!currentValue[sequenceIdx0].ToObjectInternal(cx, &tmp)) {
    2145           0 :               return false;
    2146             :             }
    2147           0 :             break;
    2148             :           } while (0);
    2149           0 :           if (!JS_DefineElement(cx, returnArray, sequenceIdx0, tmp,
    2150             :                                 JSPROP_ENUMERATE)) {
    2151           0 :             return false;
    2152             :           }
    2153             :         }
    2154             :       }
    2155           0 :       temp.setObject(*returnArray);
    2156           0 :       if (!JS_DefinePropertyById(cx, obj, atomsCache->advanced_id, temp, JSPROP_ENUMERATE)) {
    2157           0 :         return false;
    2158             :       }
    2159           0 :       break;
    2160             :     } while(0);
    2161             :   }
    2162             : 
    2163           0 :   return true;
    2164             : }
    2165             : 
    2166             : bool
    2167           0 : MediaTrackConstraints::ToJSON(nsAString& aJSON) const
    2168             : {
    2169           0 :   AutoJSAPI jsapi;
    2170           0 :   jsapi.Init();
    2171           0 :   JSContext *cx = jsapi.cx();
    2172             :   // It's safe to use UnprivilegedJunkScopeOrWorkerGlobal here
    2173             :   // because we'll only be creating objects, in ways that have no
    2174             :   // side-effects, followed by a call to JS::ToJSONMaybeSafely,
    2175             :   // which likewise guarantees no side-effects for the sorts of
    2176             :   // things we will pass it.
    2177           0 :   JSAutoCompartment ac(cx, binding_detail::UnprivilegedJunkScopeOrWorkerGlobal());
    2178           0 :   JS::Rooted<JS::Value> val(cx);
    2179           0 :   if (!ToObjectInternal(cx, &val)) {
    2180           0 :     return false;
    2181             :   }
    2182           0 :   JS::Rooted<JSObject*> obj(cx, &val.toObject());
    2183           0 :   return StringifyToJSON(cx, obj, aJSON);
    2184             : }
    2185             : 
    2186             : void
    2187           0 : MediaTrackConstraints::TraceDictionary(JSTracer* trc)
    2188             : {
    2189           0 :   MediaTrackConstraintSet::TraceDictionary(trc);
    2190           0 : }
    2191             : 
    2192             : MediaTrackConstraints&
    2193           0 : MediaTrackConstraints::operator=(const MediaTrackConstraints& aOther)
    2194             : {
    2195           0 :   MediaTrackConstraintSet::operator=(aOther);
    2196           0 :   mAdvanced.Reset();
    2197           0 :   if (aOther.mAdvanced.WasPassed()) {
    2198           0 :     mAdvanced.Construct(aOther.mAdvanced.Value());
    2199             :   }
    2200           0 :   return *this;
    2201             : }
    2202             : 
    2203             : namespace binding_detail {
    2204             : } // namespace binding_detail
    2205             : 
    2206             : 
    2207             : namespace MediaStreamTrackBinding {
    2208             : 
    2209             : static_assert(IsRefcounted<NativeType>::value == IsRefcounted<EventTargetBinding::NativeType>::value,
    2210             :               "Can't inherit from an interface with a different ownership model.");
    2211             : 
    2212             : static bool
    2213           0 : get_kind(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitGetterCallArgs args)
    2214             : {
    2215           0 :   DOMString result;
    2216           0 :   self->GetKind(result);
    2217           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2218           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    2219           0 :     return false;
    2220             :   }
    2221           0 :   return true;
    2222             : }
    2223             : 
    2224             : static const JSJitInfo kind_getterinfo = {
    2225             :   { (JSJitGetterOp)get_kind },
    2226             :   { prototypes::id::MediaStreamTrack },
    2227             :   { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
    2228             :   JSJitInfo::Getter,
    2229             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2230             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
    2231             :   false,  /* isInfallible. False in setters. */
    2232             :   false,  /* isMovable.  Not relevant for setters. */
    2233             :   false, /* isEliminatable.  Not relevant for setters. */
    2234             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2235             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2236             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2237             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2238             : };
    2239             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2240             : static_assert(0 < 1, "There is no slot for us");
    2241             : 
    2242             : static bool
    2243           0 : get_id(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitGetterCallArgs args)
    2244             : {
    2245           0 :   DOMString result;
    2246           0 :   self->GetId(result);
    2247           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2248           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    2249           0 :     return false;
    2250             :   }
    2251           0 :   return true;
    2252             : }
    2253             : 
    2254             : static const JSJitInfo id_getterinfo = {
    2255             :   { (JSJitGetterOp)get_id },
    2256             :   { prototypes::id::MediaStreamTrack },
    2257             :   { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
    2258             :   JSJitInfo::Getter,
    2259             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2260             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
    2261             :   false,  /* isInfallible. False in setters. */
    2262             :   false,  /* isMovable.  Not relevant for setters. */
    2263             :   false, /* isEliminatable.  Not relevant for setters. */
    2264             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2265             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2266             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2267             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2268             : };
    2269             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2270             : static_assert(0 < 1, "There is no slot for us");
    2271             : 
    2272             : static bool
    2273           0 : get_label(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitGetterCallArgs args)
    2274             : {
    2275           0 :   DOMString result;
    2276           0 :   self->GetLabel(result);
    2277           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2278           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    2279           0 :     return false;
    2280             :   }
    2281           0 :   return true;
    2282             : }
    2283             : 
    2284             : static const JSJitInfo label_getterinfo = {
    2285             :   { (JSJitGetterOp)get_label },
    2286             :   { prototypes::id::MediaStreamTrack },
    2287             :   { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
    2288             :   JSJitInfo::Getter,
    2289             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2290             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
    2291             :   false,  /* isInfallible. False in setters. */
    2292             :   false,  /* isMovable.  Not relevant for setters. */
    2293             :   false, /* isEliminatable.  Not relevant for setters. */
    2294             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2295             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2296             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2297             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2298             : };
    2299             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2300             : static_assert(0 < 1, "There is no slot for us");
    2301             : 
    2302             : static bool
    2303           0 : get_enabled(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitGetterCallArgs args)
    2304             : {
    2305           0 :   bool result(self->Enabled());
    2306           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2307           0 :   args.rval().setBoolean(result);
    2308           0 :   return true;
    2309             : }
    2310             : 
    2311             : static bool
    2312           0 : set_enabled(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitSetterCallArgs args)
    2313             : {
    2314             :   bool arg0;
    2315           0 :   if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
    2316           0 :     return false;
    2317             :   }
    2318           0 :   self->SetEnabled(arg0);
    2319           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2320             : 
    2321           0 :   return true;
    2322             : }
    2323             : 
    2324             : static const JSJitInfo enabled_getterinfo = {
    2325             :   { (JSJitGetterOp)get_enabled },
    2326             :   { prototypes::id::MediaStreamTrack },
    2327             :   { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
    2328             :   JSJitInfo::Getter,
    2329             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2330             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    2331             :   true,  /* isInfallible. False in setters. */
    2332             :   false,  /* isMovable.  Not relevant for setters. */
    2333             :   false, /* isEliminatable.  Not relevant for setters. */
    2334             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2335             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2336             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2337             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2338             : };
    2339             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2340             : static_assert(0 < 1, "There is no slot for us");
    2341             : static const JSJitInfo enabled_setterinfo = {
    2342             :   { (JSJitGetterOp)set_enabled },
    2343             :   { prototypes::id::MediaStreamTrack },
    2344             :   { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
    2345             :   JSJitInfo::Setter,
    2346             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2347             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2348             :   false,  /* isInfallible. False in setters. */
    2349             :   false,  /* isMovable.  Not relevant for setters. */
    2350             :   false, /* isEliminatable.  Not relevant for setters. */
    2351             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2352             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2353             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2354             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2355             : };
    2356             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2357             : static_assert(0 < 1, "There is no slot for us");
    2358             : 
    2359             : static bool
    2360           0 : get_readyState(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitGetterCallArgs args)
    2361             : {
    2362           0 :   MediaStreamTrackState result(self->ReadyState());
    2363           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2364           0 :   if (!ToJSValue(cx, result, args.rval())) {
    2365           0 :     return false;
    2366             :   }
    2367           0 :   return true;
    2368             : }
    2369             : 
    2370             : static const JSJitInfo readyState_getterinfo = {
    2371             :   { (JSJitGetterOp)get_readyState },
    2372             :   { prototypes::id::MediaStreamTrack },
    2373             :   { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
    2374             :   JSJitInfo::Getter,
    2375             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2376             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
    2377             :   false,  /* isInfallible. False in setters. */
    2378             :   false,  /* isMovable.  Not relevant for setters. */
    2379             :   false, /* isEliminatable.  Not relevant for setters. */
    2380             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2381             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2382             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2383             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2384             : };
    2385             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2386             : static_assert(0 < 1, "There is no slot for us");
    2387             : 
    2388             : static bool
    2389           0 : get_onended(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitGetterCallArgs args)
    2390             : {
    2391           0 :   RefPtr<EventHandlerNonNull> result(self->GetOnended());
    2392           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2393           0 :   if (result) {
    2394           0 :     args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
    2395           0 :     if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
    2396           0 :       return false;
    2397             :     }
    2398           0 :     return true;
    2399             :   } else {
    2400           0 :     args.rval().setNull();
    2401           0 :     return true;
    2402             :   }
    2403             : }
    2404             : 
    2405             : static bool
    2406           0 : set_onended(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitSetterCallArgs args)
    2407             : {
    2408           0 :   RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
    2409           0 :   if (args[0].isObject()) {
    2410             :     { // scope for tempRoot
    2411           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
    2412           0 :       arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
    2413             :     }
    2414             :   } else {
    2415           0 :     arg0 = nullptr;
    2416             :   }
    2417           0 :   self->SetOnended(Constify(arg0));
    2418           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2419             : 
    2420           0 :   return true;
    2421             : }
    2422             : 
    2423             : static const JSJitInfo onended_getterinfo = {
    2424             :   { (JSJitGetterOp)get_onended },
    2425             :   { prototypes::id::MediaStreamTrack },
    2426             :   { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
    2427             :   JSJitInfo::Getter,
    2428             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2429             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
    2430             :   false,  /* isInfallible. False in setters. */
    2431             :   false,  /* isMovable.  Not relevant for setters. */
    2432             :   false, /* isEliminatable.  Not relevant for setters. */
    2433             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2434             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2435             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2436             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2437             : };
    2438             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2439             : static_assert(0 < 1, "There is no slot for us");
    2440             : static const JSJitInfo onended_setterinfo = {
    2441             :   { (JSJitGetterOp)set_onended },
    2442             :   { prototypes::id::MediaStreamTrack },
    2443             :   { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
    2444             :   JSJitInfo::Setter,
    2445             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2446             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2447             :   false,  /* isInfallible. False in setters. */
    2448             :   false,  /* isMovable.  Not relevant for setters. */
    2449             :   false, /* isEliminatable.  Not relevant for setters. */
    2450             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2451             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2452             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2453             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2454             : };
    2455             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2456             : static_assert(0 < 1, "There is no slot for us");
    2457             : 
    2458             : static bool
    2459           0 : clone(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, const JSJitMethodCallArgs& args)
    2460             : {
    2461           0 :   auto result(StrongOrRawPtr<mozilla::dom::MediaStreamTrack>(self->Clone()));
    2462           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2463           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
    2464           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    2465           0 :     return false;
    2466             :   }
    2467           0 :   return true;
    2468             : }
    2469             : 
    2470             : static const JSJitInfo clone_methodinfo = {
    2471             :   { (JSJitGetterOp)clone },
    2472             :   { prototypes::id::MediaStreamTrack },
    2473             :   { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
    2474             :   JSJitInfo::Method,
    2475             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2476             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
    2477             :   false,  /* isInfallible. False in setters. */
    2478             :   false,  /* isMovable.  Not relevant for setters. */
    2479             :   false, /* isEliminatable.  Not relevant for setters. */
    2480             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2481             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2482             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2483             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2484             : };
    2485             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2486             : static_assert(0 < 1, "There is no slot for us");
    2487             : 
    2488             : static bool
    2489           0 : stop(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, const JSJitMethodCallArgs& args)
    2490             : {
    2491           0 :   self->Stop();
    2492           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2493           0 :   args.rval().setUndefined();
    2494           0 :   return true;
    2495             : }
    2496             : 
    2497             : static const JSJitInfo stop_methodinfo = {
    2498             :   { (JSJitGetterOp)stop },
    2499             :   { prototypes::id::MediaStreamTrack },
    2500             :   { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
    2501             :   JSJitInfo::Method,
    2502             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2503             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2504             :   true,  /* isInfallible. False in setters. */
    2505             :   false,  /* isMovable.  Not relevant for setters. */
    2506             :   false, /* isEliminatable.  Not relevant for setters. */
    2507             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2508             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2509             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2510             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2511             : };
    2512             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2513             : static_assert(0 < 1, "There is no slot for us");
    2514             : 
    2515             : static bool
    2516           0 : getConstraints(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, const JSJitMethodCallArgs& args)
    2517             : {
    2518           0 :   MediaTrackConstraints result;
    2519           0 :   self->GetConstraints(result);
    2520           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2521           0 :   if (!result.ToObjectInternal(cx, args.rval())) {
    2522           0 :     return false;
    2523             :   }
    2524           0 :   return true;
    2525             : }
    2526             : 
    2527             : static const JSJitInfo getConstraints_methodinfo = {
    2528             :   { (JSJitGetterOp)getConstraints },
    2529             :   { prototypes::id::MediaStreamTrack },
    2530             :   { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
    2531             :   JSJitInfo::Method,
    2532             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2533             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
    2534             :   false,  /* isInfallible. False in setters. */
    2535             :   false,  /* isMovable.  Not relevant for setters. */
    2536             :   false, /* isEliminatable.  Not relevant for setters. */
    2537             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2538             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2539             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2540             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2541             : };
    2542             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2543             : static_assert(0 < 1, "There is no slot for us");
    2544             : 
    2545             : static bool
    2546           0 : getSettings(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, const JSJitMethodCallArgs& args)
    2547             : {
    2548           0 :   MediaTrackSettings result;
    2549           0 :   self->GetSettings(result);
    2550           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2551           0 :   if (!result.ToObjectInternal(cx, args.rval())) {
    2552           0 :     return false;
    2553             :   }
    2554           0 :   return true;
    2555             : }
    2556             : 
    2557             : static const JSJitInfo getSettings_methodinfo = {
    2558             :   { (JSJitGetterOp)getSettings },
    2559             :   { prototypes::id::MediaStreamTrack },
    2560             :   { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
    2561             :   JSJitInfo::Method,
    2562             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2563             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
    2564             :   false,  /* isInfallible. False in setters. */
    2565             :   false,  /* isMovable.  Not relevant for setters. */
    2566             :   false, /* isEliminatable.  Not relevant for setters. */
    2567             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2568             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2569             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2570             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2571             : };
    2572             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2573             : static_assert(0 < 1, "There is no slot for us");
    2574             : 
    2575             : static bool
    2576           0 : applyConstraints(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, const JSJitMethodCallArgs& args)
    2577             : {
    2578           0 :   binding_detail::FastMediaTrackConstraints arg0;
    2579           0 :   if (!arg0.Init(cx, (args.hasDefined(0)) ? args[0] : JS::NullHandleValue,  "Argument 1 of MediaStreamTrack.applyConstraints", false)) {
    2580           0 :     return false;
    2581             :   }
    2582           0 :   binding_detail::FastErrorResult rv;
    2583           0 :   auto result(StrongOrRawPtr<Promise>(self->ApplyConstraints(Constify(arg0), nsContentUtils::IsSystemCaller(cx) ? CallerType::System : CallerType::NonSystem, rv)));
    2584           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2585           0 :     return false;
    2586             :   }
    2587           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2588           0 :   if (!ToJSValue(cx, result, args.rval())) {
    2589           0 :     return false;
    2590             :   }
    2591           0 :   return true;
    2592             : }
    2593             : 
    2594             : static bool
    2595           0 : applyConstraints_promiseWrapper(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, const JSJitMethodCallArgs& args)
    2596             : {
    2597             :   // Make sure to save the callee before someone maybe messes
    2598             :   // with rval().
    2599           0 :   JS::Rooted<JSObject*> callee(cx, &args.callee());
    2600           0 :   bool ok = applyConstraints(cx, obj, self, args);
    2601           0 :   if (ok) {
    2602           0 :     return true;
    2603             :   }
    2604           0 :   return ConvertExceptionToPromise(cx, xpc::XrayAwareCalleeGlobal(callee),
    2605           0 :                                    args.rval());
    2606             : }
    2607             : 
    2608             : static const JSJitInfo applyConstraints_methodinfo = {
    2609             :   { (JSJitGetterOp)applyConstraints_promiseWrapper },
    2610             :   { prototypes::id::MediaStreamTrack },
    2611             :   { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
    2612             :   JSJitInfo::Method,
    2613             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2614             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
    2615             :   false,  /* isInfallible. False in setters. */
    2616             :   false,  /* isMovable.  Not relevant for setters. */
    2617             :   false, /* isEliminatable.  Not relevant for setters. */
    2618             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2619             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2620             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2621             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2622             : };
    2623             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2624             : static_assert(0 < 1, "There is no slot for us");
    2625             : 
    2626             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
    2627             : #if defined(__clang__)
    2628             : #pragma clang diagnostic push
    2629             : #pragma clang diagnostic ignored "-Wmissing-braces"
    2630             : #endif
    2631             : static const JSFunctionSpec sMethods_specs[] = {
    2632             :   JS_FNSPEC("clone", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&clone_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2633             :   JS_FNSPEC("stop", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&stop_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2634             :   JS_FNSPEC("getConstraints", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getConstraints_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2635             :   JS_FNSPEC("getSettings", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getSettings_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2636             :   JS_FNSPEC("applyConstraints", GenericPromiseReturningBindingMethod, reinterpret_cast<const JSJitInfo*>(&applyConstraints_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2637             :   JS_FS_END
    2638             : };
    2639             : #if defined(__clang__)
    2640             : #pragma clang diagnostic pop
    2641             : #endif
    2642             : 
    2643             : 
    2644             : // Can't be const because the pref-enabled boolean needs to be writable
    2645             : static Prefable<const JSFunctionSpec> sMethods[] = {
    2646             :   { nullptr, &sMethods_specs[0] },
    2647             :   { nullptr, nullptr }
    2648             : };
    2649             : 
    2650             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
    2651             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
    2652             : static_assert(5 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
    2653             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
    2654             : 
    2655             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
    2656             : #if defined(__clang__)
    2657             : #pragma clang diagnostic push
    2658             : #pragma clang diagnostic ignored "-Wmissing-braces"
    2659             : #endif
    2660             : static const JSPropertySpec sAttributes_specs[] = {
    2661             :   { "kind", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &kind_getterinfo, nullptr, nullptr },
    2662             :   { "id", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &id_getterinfo, nullptr, nullptr },
    2663             :   { "label", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &label_getterinfo, nullptr, nullptr },
    2664             :   { "enabled", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &enabled_getterinfo, GenericBindingSetter, &enabled_setterinfo },
    2665             :   { "readyState", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &readyState_getterinfo, nullptr, nullptr },
    2666             :   { "onended", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onended_getterinfo, GenericBindingSetter, &onended_setterinfo },
    2667             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
    2668             : };
    2669             : #if defined(__clang__)
    2670             : #pragma clang diagnostic pop
    2671             : #endif
    2672             : 
    2673             : 
    2674             : // Can't be const because the pref-enabled boolean needs to be writable
    2675             : static Prefable<const JSPropertySpec> sAttributes[] = {
    2676             :   { nullptr, &sAttributes_specs[0] },
    2677             :   { nullptr, nullptr }
    2678             : };
    2679             : 
    2680             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
    2681             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
    2682             : static_assert(6 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
    2683             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
    2684             : 
    2685             : 
    2686             : static uint16_t sNativeProperties_sortedPropertyIndices[11];
    2687             : static PropertyInfo sNativeProperties_propertyInfos[11];
    2688             : 
    2689             : static const NativePropertiesN<2> sNativeProperties = {
    2690             :   false, 0,
    2691             :   false, 0,
    2692             :   true,  0 /* sMethods */,
    2693             :   true,  1 /* sAttributes */,
    2694             :   false, 0,
    2695             :   false, 0,
    2696             :   false, 0,
    2697             :   -1,
    2698             :   11,
    2699             :   sNativeProperties_sortedPropertyIndices,
    2700             :   {
    2701             :     { sMethods, &sNativeProperties_propertyInfos[0] },
    2702             :     { sAttributes, &sNativeProperties_propertyInfos[5] }
    2703             :   }
    2704             : };
    2705             : static_assert(11 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
    2706             :     "We have a property info count that is oversized");
    2707             : 
    2708             : static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
    2709             :   {
    2710             :     "Function",
    2711             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
    2712             :     &sBoringInterfaceObjectClassClassOps,
    2713             :     JS_NULL_CLASS_SPEC,
    2714             :     JS_NULL_CLASS_EXT,
    2715             :     &sInterfaceObjectClassObjectOps
    2716             :   },
    2717             :   eInterface,
    2718             :   true,
    2719             :   prototypes::id::MediaStreamTrack,
    2720             :   PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth,
    2721             :   sNativePropertyHooks,
    2722             :   "function MediaStreamTrack() {\n    [native code]\n}",
    2723             :   EventTargetBinding::GetConstructorObject
    2724             : };
    2725             : 
    2726             : static const DOMIfaceAndProtoJSClass sPrototypeClass = {
    2727             :   {
    2728             :     "MediaStreamTrackPrototype",
    2729             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
    2730             :     JS_NULL_CLASS_OPS,
    2731             :     JS_NULL_CLASS_SPEC,
    2732             :     JS_NULL_CLASS_EXT,
    2733             :     JS_NULL_OBJECT_OPS
    2734             :   },
    2735             :   eInterfacePrototype,
    2736             :   false,
    2737             :   prototypes::id::MediaStreamTrack,
    2738             :   PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth,
    2739             :   sNativePropertyHooks,
    2740             :   "[object MediaStreamTrackPrototype]",
    2741             :   EventTargetBinding::GetProtoObject
    2742             : };
    2743             : 
    2744             : JSObject*
    2745           0 : DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
    2746             : {
    2747           0 :   return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
    2748             : }
    2749             : 
    2750             : const NativePropertyHooks sNativePropertyHooks[] = { {
    2751             :   nullptr,
    2752             :   nullptr,
    2753             :   nullptr,
    2754             :   { sNativeProperties.Upcast(), nullptr },
    2755             :   prototypes::id::MediaStreamTrack,
    2756             :   constructors::id::MediaStreamTrack,
    2757             :   EventTargetBinding::sNativePropertyHooks,
    2758             :   &DefaultXrayExpandoObjectClass
    2759             : } };
    2760             : 
    2761             : void
    2762           0 : CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
    2763             : {
    2764           0 :   JS::Handle<JSObject*> parentProto(EventTargetBinding::GetProtoObjectHandle(aCx));
    2765           0 :   if (!parentProto) {
    2766           0 :     return;
    2767             :   }
    2768             : 
    2769           0 :   JS::Handle<JSObject*> constructorProto(EventTargetBinding::GetConstructorObjectHandle(aCx));
    2770           0 :   if (!constructorProto) {
    2771           0 :     return;
    2772             :   }
    2773             : 
    2774             :   static bool sIdsInited = false;
    2775           0 :   if (!sIdsInited && NS_IsMainThread()) {
    2776           0 :     if (!InitIds(aCx, sNativeProperties.Upcast())) {
    2777           0 :       return;
    2778             :     }
    2779           0 :     sIdsInited = true;
    2780             :   }
    2781             : 
    2782           0 :   JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::MediaStreamTrack);
    2783           0 :   JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::MediaStreamTrack);
    2784           0 :   dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
    2785             :                               &sPrototypeClass.mBase, protoCache,
    2786             :                               constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
    2787             :                               interfaceCache,
    2788             :                               sNativeProperties.Upcast(),
    2789             :                               nullptr,
    2790             :                               "MediaStreamTrack", aDefineOnGlobal,
    2791             :                               nullptr,
    2792           0 :                               false);
    2793             : }
    2794             : 
    2795             : JS::Handle<JSObject*>
    2796           0 : GetProtoObjectHandle(JSContext* aCx)
    2797             : {
    2798             :   /* Get the interface prototype object for this class.  This will create the
    2799             :      object as needed. */
    2800           0 :   bool aDefineOnGlobal = true;
    2801             : 
    2802             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    2803           0 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    2804           0 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    2805           0 :     return nullptr;
    2806             :   }
    2807             : 
    2808             :   /* Check to see whether the interface objects are already installed */
    2809           0 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    2810           0 :   if (!protoAndIfaceCache.HasEntryInSlot(prototypes::id::MediaStreamTrack)) {
    2811           0 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    2812           0 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    2813             :   }
    2814             : 
    2815             :   /*
    2816             :    * The object might _still_ be null, but that's OK.
    2817             :    *
    2818             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    2819             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    2820             :    * changed after they have been set.
    2821             :    *
    2822             :    * Calling address() avoids the read read barrier that does gray
    2823             :    * unmarking, but it's not possible for the object to be gray here.
    2824             :    */
    2825             : 
    2826           0 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(prototypes::id::MediaStreamTrack);
    2827           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    2828           0 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    2829             : }
    2830             : 
    2831             : JSObject*
    2832           0 : GetProtoObject(JSContext* aCx)
    2833             : {
    2834           0 :   return GetProtoObjectHandle(aCx);
    2835             : }
    2836             : 
    2837             : JS::Handle<JSObject*>
    2838           0 : GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
    2839             : {
    2840             :   /* Get the interface object for this class.  This will create the object as
    2841             :      needed. */
    2842             : 
    2843             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    2844           0 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    2845           0 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    2846           0 :     return nullptr;
    2847             :   }
    2848             : 
    2849             :   /* Check to see whether the interface objects are already installed */
    2850           0 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    2851           0 :   if (!protoAndIfaceCache.HasEntryInSlot(constructors::id::MediaStreamTrack)) {
    2852           0 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    2853           0 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    2854             :   }
    2855             : 
    2856             :   /*
    2857             :    * The object might _still_ be null, but that's OK.
    2858             :    *
    2859             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    2860             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    2861             :    * changed after they have been set.
    2862             :    *
    2863             :    * Calling address() avoids the read read barrier that does gray
    2864             :    * unmarking, but it's not possible for the object to be gray here.
    2865             :    */
    2866             : 
    2867           0 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::MediaStreamTrack);
    2868           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    2869           0 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    2870             : }
    2871             : 
    2872             : JSObject*
    2873           0 : GetConstructorObject(JSContext* aCx)
    2874             : {
    2875           0 :   return GetConstructorObjectHandle(aCx);
    2876             : }
    2877             : 
    2878             : } // namespace MediaStreamTrackBinding
    2879             : 
    2880             : 
    2881             : 
    2882             : } // namespace dom
    2883             : } // namespace mozilla

Generated by: LCOV version 1.13