LCOV - code coverage report
Current view: top level - obj-x86_64-pc-linux-gnu/dom/bindings - ImageBitmapBinding.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 22 743 3.0 %
Date: 2017-07-14 16:53:18 Functions: 3 69 4.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* THIS FILE IS AUTOGENERATED FROM ImageBitmap.webidl BY Codegen.py - DO NOT EDIT */
       2             : 
       3             : #include "AtomList.h"
       4             : #include "ImageBitmapBinding.h"
       5             : #include "WrapperFactory.h"
       6             : #include "jsapi.h"
       7             : #include "mozilla/OwningNonNull.h"
       8             : #include "mozilla/dom/BindingUtils.h"
       9             : #include "mozilla/dom/Blob.h"
      10             : #include "mozilla/dom/CanvasRenderingContext2D.h"
      11             : #include "mozilla/dom/DOMJSClass.h"
      12             : #include "mozilla/dom/HTMLCanvasElement.h"
      13             : #include "mozilla/dom/HTMLImageElement.h"
      14             : #include "mozilla/dom/HTMLVideoElement.h"
      15             : #include "mozilla/dom/ImageBitmap.h"
      16             : #include "mozilla/dom/ImageData.h"
      17             : #include "mozilla/dom/NonRefcountedDOMObject.h"
      18             : #include "mozilla/dom/PrimitiveConversions.h"
      19             : #include "mozilla/dom/Promise.h"
      20             : #include "mozilla/dom/ScriptSettings.h"
      21             : #include "mozilla/dom/SimpleGlobalObject.h"
      22             : #include "mozilla/dom/ToJSValue.h"
      23             : #include "mozilla/dom/UnionConversions.h"
      24             : #include "mozilla/dom/UnionTypes.h"
      25             : #include "mozilla/dom/XrayExpandoClass.h"
      26             : 
      27             : namespace mozilla {
      28             : namespace dom {
      29             : 
      30             : namespace ImageBitmapFormatValues {
      31             : extern const EnumEntry strings[14] = {
      32             :   {"RGBA32", 6},
      33             :   {"BGRA32", 6},
      34             :   {"RGB24", 5},
      35             :   {"BGR24", 5},
      36             :   {"GRAY8", 5},
      37             :   {"YUV444P", 7},
      38             :   {"YUV422P", 7},
      39             :   {"YUV420P", 7},
      40             :   {"YUV420SP_NV12", 13},
      41             :   {"YUV420SP_NV21", 13},
      42             :   {"HSV", 3},
      43             :   {"Lab", 3},
      44             :   {"DEPTH", 5},
      45             :   { nullptr, 0 }
      46             : };
      47             : } // namespace ImageBitmapFormatValues
      48             : 
      49             : bool
      50           0 : ToJSValue(JSContext* aCx, ImageBitmapFormat aArgument, JS::MutableHandle<JS::Value> aValue)
      51             : {
      52           0 :   MOZ_ASSERT(uint32_t(aArgument) < ArrayLength(ImageBitmapFormatValues::strings));
      53             :   JSString* resultStr =
      54           0 :     JS_NewStringCopyN(aCx, ImageBitmapFormatValues::strings[uint32_t(aArgument)].value,
      55           0 :                       ImageBitmapFormatValues::strings[uint32_t(aArgument)].length);
      56           0 :   if (!resultStr) {
      57           0 :     return false;
      58             :   }
      59           0 :   aValue.setString(resultStr);
      60           0 :   return true;
      61             : }
      62             : 
      63             : 
      64             : namespace ChannelPixelLayoutDataTypeValues {
      65             : extern const EnumEntry strings[9] = {
      66             :   {"uint8", 5},
      67             :   {"int8", 4},
      68             :   {"uint16", 6},
      69             :   {"int16", 5},
      70             :   {"uint32", 6},
      71             :   {"int32", 5},
      72             :   {"float32", 7},
      73             :   {"float64", 7},
      74             :   { nullptr, 0 }
      75             : };
      76             : } // namespace ChannelPixelLayoutDataTypeValues
      77             : 
      78             : bool
      79           0 : ToJSValue(JSContext* aCx, ChannelPixelLayoutDataType aArgument, JS::MutableHandle<JS::Value> aValue)
      80             : {
      81           0 :   MOZ_ASSERT(uint32_t(aArgument) < ArrayLength(ChannelPixelLayoutDataTypeValues::strings));
      82             :   JSString* resultStr =
      83           0 :     JS_NewStringCopyN(aCx, ChannelPixelLayoutDataTypeValues::strings[uint32_t(aArgument)].value,
      84           0 :                       ChannelPixelLayoutDataTypeValues::strings[uint32_t(aArgument)].length);
      85           0 :   if (!resultStr) {
      86           0 :     return false;
      87             :   }
      88           0 :   aValue.setString(resultStr);
      89           0 :   return true;
      90             : }
      91             : 
      92             : 
      93             : void
      94           0 : ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer& aUnion, const char* aName, uint32_t aFlags)
      95             : {
      96           0 :   if (aUnion.IsHTMLImageElement()) {
      97           0 :     ImplCycleCollectionTraverse(aCallback, aUnion.GetAsHTMLImageElement(), "mHTMLImageElement", aFlags);
      98           0 :   } else if (aUnion.IsHTMLVideoElement()) {
      99           0 :     ImplCycleCollectionTraverse(aCallback, aUnion.GetAsHTMLVideoElement(), "mHTMLVideoElement", aFlags);
     100           0 :   } else if (aUnion.IsHTMLCanvasElement()) {
     101           0 :     ImplCycleCollectionTraverse(aCallback, aUnion.GetAsHTMLCanvasElement(), "mHTMLCanvasElement", aFlags);
     102           0 :   } else if (aUnion.IsBlob()) {
     103           0 :     ImplCycleCollectionTraverse(aCallback, aUnion.GetAsBlob(), "mBlob", aFlags);
     104           0 :   } else if (aUnion.IsImageData()) {
     105           0 :     ImplCycleCollectionTraverse(aCallback, aUnion.GetAsImageData(), "mImageData", aFlags);
     106           0 :   } else if (aUnion.IsCanvasRenderingContext2D()) {
     107           0 :     ImplCycleCollectionTraverse(aCallback, aUnion.GetAsCanvasRenderingContext2D(), "mCanvasRenderingContext2D", aFlags);
     108           0 :   } else if (aUnion.IsImageBitmap()) {
     109           0 :     ImplCycleCollectionTraverse(aCallback, aUnion.GetAsImageBitmap(), "mImageBitmap", aFlags);
     110             :   }
     111           0 : }
     112             : 
     113             : 
     114             : void
     115           0 : ImplCycleCollectionUnlink(OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer& aUnion)
     116             : {
     117           0 :   aUnion.Uninit();
     118           0 : }
     119             : 
     120             : 
     121             : 
     122           0 : ChannelPixelLayout::ChannelPixelLayout()
     123             : {
     124             :   // Safe to pass a null context if we pass a null value
     125           0 :   Init(nullptr, JS::NullHandleValue);
     126           0 : }
     127             : 
     128             : 
     129             : 
     130             : bool
     131           0 : ChannelPixelLayout::InitIds(JSContext* cx, ChannelPixelLayoutAtoms* atomsCache)
     132             : {
     133           0 :   MOZ_ASSERT(!*reinterpret_cast<jsid**>(atomsCache));
     134             : 
     135             :   // Initialize these in reverse order so that any failure leaves the first one
     136             :   // uninitialized.
     137           0 :   if (!atomsCache->width_id.init(cx, "width") ||
     138           0 :       !atomsCache->stride_id.init(cx, "stride") ||
     139           0 :       !atomsCache->skip_id.init(cx, "skip") ||
     140           0 :       !atomsCache->offset_id.init(cx, "offset") ||
     141           0 :       !atomsCache->height_id.init(cx, "height") ||
     142           0 :       !atomsCache->dataType_id.init(cx, "dataType")) {
     143           0 :     return false;
     144             :   }
     145           0 :   return true;
     146             : }
     147             : 
     148             : bool
     149           0 : ChannelPixelLayout::Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription, bool passedToJSImpl)
     150             : {
     151             :   // Passing a null JSContext is OK only if we're initing from null,
     152             :   // Since in that case we will not have to do any property gets
     153             :   // Also evaluate isNullOrUndefined in order to avoid false-positive
     154             :   // checkers by static analysis tools
     155           0 :   MOZ_ASSERT_IF(!cx, val.isNull() && val.isNullOrUndefined());
     156           0 :   ChannelPixelLayoutAtoms* atomsCache = nullptr;
     157           0 :   if (cx) {
     158           0 :     atomsCache = GetAtomCache<ChannelPixelLayoutAtoms>(cx);
     159           0 :     if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
     160           0 :       return false;
     161             :     }
     162             :   }
     163             : 
     164           0 :   if (!IsConvertibleToDictionary(val)) {
     165           0 :     return ThrowErrorMessage(cx, MSG_NOT_DICTIONARY, sourceDescription);
     166             :   }
     167             : 
     168           0 :   bool isNull = val.isNullOrUndefined();
     169             :   // We only need these if !isNull, in which case we have |cx|.
     170           0 :   Maybe<JS::Rooted<JSObject *> > object;
     171           0 :   Maybe<JS::Rooted<JS::Value> > temp;
     172           0 :   if (!isNull) {
     173           0 :     MOZ_ASSERT(cx);
     174           0 :     object.emplace(cx, &val.toObject());
     175           0 :     temp.emplace(cx);
     176             :   }
     177           0 :   if (!isNull) {
     178           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->dataType_id, temp.ptr())) {
     179           0 :       return false;
     180             :     }
     181             :   }
     182           0 :   if (!isNull && !temp->isUndefined()) {
     183             :     {
     184             :       int index;
     185           0 :       if (!FindEnumStringIndex<true>(cx, temp.ref(), ChannelPixelLayoutDataTypeValues::strings, "ChannelPixelLayoutDataType", "'dataType' member of ChannelPixelLayout", &index)) {
     186           0 :         return false;
     187             :       }
     188           0 :       MOZ_ASSERT(index >= 0);
     189           0 :       mDataType = static_cast<ChannelPixelLayoutDataType>(index);
     190             :     }
     191           0 :     mIsAnyMemberPresent = true;
     192           0 :   } else if (cx) {
     193             :     // Don't error out if we have no cx.  In that
     194             :     // situation the caller is default-constructing us and we'll
     195             :     // just assume they know what they're doing.
     196           0 :     return ThrowErrorMessage(cx, MSG_MISSING_REQUIRED_DICTIONARY_MEMBER,
     197           0 :                              "'dataType' member of ChannelPixelLayout");
     198             :   }
     199             : 
     200           0 :   if (!isNull) {
     201           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->height_id, temp.ptr())) {
     202           0 :       return false;
     203             :     }
     204             :   }
     205           0 :   if (!isNull && !temp->isUndefined()) {
     206           0 :     if (!ValueToPrimitive<uint32_t, eDefault>(cx, temp.ref(), &mHeight)) {
     207           0 :       return false;
     208             :     }
     209           0 :     mIsAnyMemberPresent = true;
     210           0 :   } else if (cx) {
     211             :     // Don't error out if we have no cx.  In that
     212             :     // situation the caller is default-constructing us and we'll
     213             :     // just assume they know what they're doing.
     214           0 :     return ThrowErrorMessage(cx, MSG_MISSING_REQUIRED_DICTIONARY_MEMBER,
     215           0 :                              "'height' member of ChannelPixelLayout");
     216             :   }
     217             : 
     218           0 :   if (!isNull) {
     219           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->offset_id, temp.ptr())) {
     220           0 :       return false;
     221             :     }
     222             :   }
     223           0 :   if (!isNull && !temp->isUndefined()) {
     224           0 :     if (!ValueToPrimitive<uint32_t, eDefault>(cx, temp.ref(), &mOffset)) {
     225           0 :       return false;
     226             :     }
     227           0 :     mIsAnyMemberPresent = true;
     228           0 :   } else if (cx) {
     229             :     // Don't error out if we have no cx.  In that
     230             :     // situation the caller is default-constructing us and we'll
     231             :     // just assume they know what they're doing.
     232           0 :     return ThrowErrorMessage(cx, MSG_MISSING_REQUIRED_DICTIONARY_MEMBER,
     233           0 :                              "'offset' member of ChannelPixelLayout");
     234             :   }
     235             : 
     236           0 :   if (!isNull) {
     237           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->skip_id, temp.ptr())) {
     238           0 :       return false;
     239             :     }
     240             :   }
     241           0 :   if (!isNull && !temp->isUndefined()) {
     242           0 :     if (!ValueToPrimitive<uint32_t, eDefault>(cx, temp.ref(), &mSkip)) {
     243           0 :       return false;
     244             :     }
     245           0 :     mIsAnyMemberPresent = true;
     246           0 :   } else if (cx) {
     247             :     // Don't error out if we have no cx.  In that
     248             :     // situation the caller is default-constructing us and we'll
     249             :     // just assume they know what they're doing.
     250           0 :     return ThrowErrorMessage(cx, MSG_MISSING_REQUIRED_DICTIONARY_MEMBER,
     251           0 :                              "'skip' member of ChannelPixelLayout");
     252             :   }
     253             : 
     254           0 :   if (!isNull) {
     255           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->stride_id, temp.ptr())) {
     256           0 :       return false;
     257             :     }
     258             :   }
     259           0 :   if (!isNull && !temp->isUndefined()) {
     260           0 :     if (!ValueToPrimitive<uint32_t, eDefault>(cx, temp.ref(), &mStride)) {
     261           0 :       return false;
     262             :     }
     263           0 :     mIsAnyMemberPresent = true;
     264           0 :   } else if (cx) {
     265             :     // Don't error out if we have no cx.  In that
     266             :     // situation the caller is default-constructing us and we'll
     267             :     // just assume they know what they're doing.
     268           0 :     return ThrowErrorMessage(cx, MSG_MISSING_REQUIRED_DICTIONARY_MEMBER,
     269           0 :                              "'stride' member of ChannelPixelLayout");
     270             :   }
     271             : 
     272           0 :   if (!isNull) {
     273           0 :     if (!JS_GetPropertyById(cx, *object, atomsCache->width_id, temp.ptr())) {
     274           0 :       return false;
     275             :     }
     276             :   }
     277           0 :   if (!isNull && !temp->isUndefined()) {
     278           0 :     if (!ValueToPrimitive<uint32_t, eDefault>(cx, temp.ref(), &mWidth)) {
     279           0 :       return false;
     280             :     }
     281           0 :     mIsAnyMemberPresent = true;
     282           0 :   } else if (cx) {
     283             :     // Don't error out if we have no cx.  In that
     284             :     // situation the caller is default-constructing us and we'll
     285             :     // just assume they know what they're doing.
     286           0 :     return ThrowErrorMessage(cx, MSG_MISSING_REQUIRED_DICTIONARY_MEMBER,
     287           0 :                              "'width' member of ChannelPixelLayout");
     288             :   }
     289           0 :   return true;
     290             : }
     291             : 
     292             : bool
     293           0 : ChannelPixelLayout::Init(const nsAString& aJSON)
     294             : {
     295           0 :   AutoJSAPI jsapi;
     296           0 :   JSObject* cleanGlobal = SimpleGlobalObject::Create(SimpleGlobalObject::GlobalType::BindingDetail);
     297           0 :   if (!cleanGlobal) {
     298           0 :     return false;
     299             :   }
     300           0 :   if (!jsapi.Init(cleanGlobal)) {
     301           0 :     return false;
     302             :   }
     303           0 :   JSContext* cx = jsapi.cx();
     304           0 :   JS::Rooted<JS::Value> json(cx);
     305           0 :   bool ok = ParseJSON(cx, aJSON, &json);
     306           0 :   NS_ENSURE_TRUE(ok, false);
     307           0 :   return Init(cx, json);
     308             : }
     309             : 
     310             : bool
     311           0 : ChannelPixelLayout::ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const
     312             : {
     313           0 :   ChannelPixelLayoutAtoms* atomsCache = GetAtomCache<ChannelPixelLayoutAtoms>(cx);
     314           0 :   if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
     315           0 :     return false;
     316             :   }
     317             : 
     318           0 :   JS::Rooted<JSObject*> obj(cx, JS_NewPlainObject(cx));
     319           0 :   if (!obj) {
     320           0 :     return false;
     321             :   }
     322           0 :   rval.set(JS::ObjectValue(*obj));
     323             : 
     324             :   do {
     325             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
     326           0 :     JS::Rooted<JS::Value> temp(cx);
     327           0 :     ChannelPixelLayoutDataType const & currentValue = mDataType;
     328           0 :     if (!ToJSValue(cx, currentValue, &temp)) {
     329           0 :       return false;
     330             :     }
     331           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->dataType_id, temp, JSPROP_ENUMERATE)) {
     332           0 :       return false;
     333             :     }
     334           0 :     break;
     335             :   } while(0);
     336             : 
     337             :   do {
     338             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
     339           0 :     JS::Rooted<JS::Value> temp(cx);
     340           0 :     uint32_t const & currentValue = mHeight;
     341           0 :     temp.setNumber(currentValue);
     342           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->height_id, temp, JSPROP_ENUMERATE)) {
     343           0 :       return false;
     344             :     }
     345           0 :     break;
     346             :   } while(0);
     347             : 
     348             :   do {
     349             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
     350           0 :     JS::Rooted<JS::Value> temp(cx);
     351           0 :     uint32_t const & currentValue = mOffset;
     352           0 :     temp.setNumber(currentValue);
     353           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->offset_id, temp, JSPROP_ENUMERATE)) {
     354           0 :       return false;
     355             :     }
     356           0 :     break;
     357             :   } while(0);
     358             : 
     359             :   do {
     360             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
     361           0 :     JS::Rooted<JS::Value> temp(cx);
     362           0 :     uint32_t const & currentValue = mSkip;
     363           0 :     temp.setNumber(currentValue);
     364           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->skip_id, temp, JSPROP_ENUMERATE)) {
     365           0 :       return false;
     366             :     }
     367           0 :     break;
     368             :   } while(0);
     369             : 
     370             :   do {
     371             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
     372           0 :     JS::Rooted<JS::Value> temp(cx);
     373           0 :     uint32_t const & currentValue = mStride;
     374           0 :     temp.setNumber(currentValue);
     375           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->stride_id, temp, JSPROP_ENUMERATE)) {
     376           0 :       return false;
     377             :     }
     378           0 :     break;
     379             :   } while(0);
     380             : 
     381             :   do {
     382             :     // block for our 'break' successCode and scope for 'temp' and 'currentValue'
     383           0 :     JS::Rooted<JS::Value> temp(cx);
     384           0 :     uint32_t const & currentValue = mWidth;
     385           0 :     temp.setNumber(currentValue);
     386           0 :     if (!JS_DefinePropertyById(cx, obj, atomsCache->width_id, temp, JSPROP_ENUMERATE)) {
     387           0 :       return false;
     388             :     }
     389           0 :     break;
     390             :   } while(0);
     391             : 
     392           0 :   return true;
     393             : }
     394             : 
     395             : bool
     396           0 : ChannelPixelLayout::ToJSON(nsAString& aJSON) const
     397             : {
     398           0 :   AutoJSAPI jsapi;
     399           0 :   jsapi.Init();
     400           0 :   JSContext *cx = jsapi.cx();
     401             :   // It's safe to use UnprivilegedJunkScopeOrWorkerGlobal here
     402             :   // because we'll only be creating objects, in ways that have no
     403             :   // side-effects, followed by a call to JS::ToJSONMaybeSafely,
     404             :   // which likewise guarantees no side-effects for the sorts of
     405             :   // things we will pass it.
     406           0 :   JSAutoCompartment ac(cx, binding_detail::UnprivilegedJunkScopeOrWorkerGlobal());
     407           0 :   JS::Rooted<JS::Value> val(cx);
     408           0 :   if (!ToObjectInternal(cx, &val)) {
     409           0 :     return false;
     410             :   }
     411           0 :   JS::Rooted<JSObject*> obj(cx, &val.toObject());
     412           0 :   return StringifyToJSON(cx, obj, aJSON);
     413             : }
     414             : 
     415             : void
     416           0 : ChannelPixelLayout::TraceDictionary(JSTracer* trc)
     417             : {
     418           0 : }
     419             : 
     420             : ChannelPixelLayout&
     421           0 : ChannelPixelLayout::operator=(const ChannelPixelLayout& aOther)
     422             : {
     423           0 :   mDataType = aOther.mDataType;
     424           0 :   mHeight = aOther.mHeight;
     425           0 :   mOffset = aOther.mOffset;
     426           0 :   mSkip = aOther.mSkip;
     427           0 :   mStride = aOther.mStride;
     428           0 :   mWidth = aOther.mWidth;
     429           0 :   return *this;
     430             : }
     431             : 
     432             : namespace binding_detail {
     433             : } // namespace binding_detail
     434             : 
     435             : 
     436             : bool
     437           0 : HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
     438             : {
     439           0 :   switch (mType) {
     440             :     case eUninitialized: {
     441           0 :       return false;
     442             :       break;
     443             :     }
     444             :     case eHTMLImageElement: {
     445           0 :       if (!GetOrCreateDOMReflector(cx, mValue.mHTMLImageElement.Value(), rval)) {
     446           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
     447           0 :         return false;
     448             :       }
     449           0 :       return true;
     450             :       break;
     451             :     }
     452             :     case eHTMLVideoElement: {
     453           0 :       if (!GetOrCreateDOMReflector(cx, mValue.mHTMLVideoElement.Value(), rval)) {
     454           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
     455           0 :         return false;
     456             :       }
     457           0 :       return true;
     458             :       break;
     459             :     }
     460             :     case eHTMLCanvasElement: {
     461           0 :       if (!GetOrCreateDOMReflector(cx, mValue.mHTMLCanvasElement.Value(), rval)) {
     462           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
     463           0 :         return false;
     464             :       }
     465           0 :       return true;
     466             :       break;
     467             :     }
     468             :     case eBlob: {
     469           0 :       if (!GetOrCreateDOMReflector(cx, mValue.mBlob.Value(), rval)) {
     470           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
     471           0 :         return false;
     472             :       }
     473           0 :       return true;
     474             :       break;
     475             :     }
     476             :     case eImageData: {
     477           0 :       if (!WrapNewBindingNonWrapperCachedObject(cx, scopeObj, mValue.mImageData.Value(), rval)) {
     478           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
     479           0 :         return false;
     480             :       }
     481           0 :       return true;
     482             :       break;
     483             :     }
     484             :     case eCanvasRenderingContext2D: {
     485           0 :       if (!GetOrCreateDOMReflector(cx, mValue.mCanvasRenderingContext2D.Value(), rval)) {
     486           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
     487           0 :         return false;
     488             :       }
     489           0 :       return true;
     490             :       break;
     491             :     }
     492             :     case eImageBitmap: {
     493           0 :       if (!GetOrCreateDOMReflector(cx, mValue.mImageBitmap.Value(), rval)) {
     494           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
     495           0 :         return false;
     496             :       }
     497           0 :       return true;
     498             :       break;
     499             :     }
     500             :     case eArrayBufferView: {
     501           0 :       rval.setObject(*mValue.mArrayBufferView.Value().Obj());
     502           0 :       if (!MaybeWrapNonDOMObjectValue(cx, rval)) {
     503           0 :         return false;
     504             :       }
     505           0 :       return true;
     506             :       break;
     507             :     }
     508             :     case eArrayBuffer: {
     509           0 :       rval.setObject(*mValue.mArrayBuffer.Value().Obj());
     510           0 :       if (!MaybeWrapNonDOMObjectValue(cx, rval)) {
     511           0 :         return false;
     512             :       }
     513           0 :       return true;
     514             :       break;
     515             :     }
     516             :     default: {
     517           0 :       return false;
     518             :       break;
     519             :     }
     520             :   }
     521             : 
     522             :   return false;
     523             : }
     524             : 
     525             : 
     526             : OwningNonNull<mozilla::dom::HTMLImageElement>&
     527           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::RawSetAsHTMLImageElement()
     528             : {
     529           0 :   if (mType == eHTMLImageElement) {
     530           0 :     return mValue.mHTMLImageElement.Value();
     531             :   }
     532           0 :   MOZ_ASSERT(mType == eUninitialized);
     533           0 :   mType = eHTMLImageElement;
     534           0 :   return mValue.mHTMLImageElement.SetValue();
     535             : }
     536             : 
     537             : OwningNonNull<mozilla::dom::HTMLImageElement>&
     538           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::SetAsHTMLImageElement()
     539             : {
     540           0 :   if (mType == eHTMLImageElement) {
     541           0 :     return mValue.mHTMLImageElement.Value();
     542             :   }
     543           0 :   Uninit();
     544           0 :   mType = eHTMLImageElement;
     545           0 :   return mValue.mHTMLImageElement.SetValue();
     546             : }
     547             : 
     548             : bool
     549           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::TrySetToHTMLImageElement(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     550             : {
     551           0 :   tryNext = false;
     552             :   { // scope for memberSlot
     553           0 :     OwningNonNull<mozilla::dom::HTMLImageElement>& memberSlot = RawSetAsHTMLImageElement();
     554             :     static_assert(IsRefcounted<mozilla::dom::HTMLImageElement>::value, "We can only store refcounted classes.");{
     555           0 :       nsresult rv = UnwrapObject<prototypes::id::HTMLImageElement, mozilla::dom::HTMLImageElement>(value, memberSlot);
     556           0 :       if (NS_FAILED(rv)) {
     557           0 :         DestroyHTMLImageElement();
     558           0 :         tryNext = true;
     559           0 :         return true;
     560             :       }
     561             :     }
     562             :   }
     563           0 :   return true;
     564             : }
     565             : 
     566             : void
     567           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::DestroyHTMLImageElement()
     568             : {
     569           0 :   MOZ_ASSERT(IsHTMLImageElement(), "Wrong type!");
     570           0 :   mValue.mHTMLImageElement.Destroy();
     571           0 :   mType = eUninitialized;
     572           0 : }
     573             : 
     574             : 
     575             : 
     576             : 
     577             : OwningNonNull<mozilla::dom::HTMLVideoElement>&
     578           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::RawSetAsHTMLVideoElement()
     579             : {
     580           0 :   if (mType == eHTMLVideoElement) {
     581           0 :     return mValue.mHTMLVideoElement.Value();
     582             :   }
     583           0 :   MOZ_ASSERT(mType == eUninitialized);
     584           0 :   mType = eHTMLVideoElement;
     585           0 :   return mValue.mHTMLVideoElement.SetValue();
     586             : }
     587             : 
     588             : OwningNonNull<mozilla::dom::HTMLVideoElement>&
     589           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::SetAsHTMLVideoElement()
     590             : {
     591           0 :   if (mType == eHTMLVideoElement) {
     592           0 :     return mValue.mHTMLVideoElement.Value();
     593             :   }
     594           0 :   Uninit();
     595           0 :   mType = eHTMLVideoElement;
     596           0 :   return mValue.mHTMLVideoElement.SetValue();
     597             : }
     598             : 
     599             : bool
     600           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::TrySetToHTMLVideoElement(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     601             : {
     602           0 :   tryNext = false;
     603             :   { // scope for memberSlot
     604           0 :     OwningNonNull<mozilla::dom::HTMLVideoElement>& memberSlot = RawSetAsHTMLVideoElement();
     605             :     static_assert(IsRefcounted<mozilla::dom::HTMLVideoElement>::value, "We can only store refcounted classes.");{
     606           0 :       nsresult rv = UnwrapObject<prototypes::id::HTMLVideoElement, mozilla::dom::HTMLVideoElement>(value, memberSlot);
     607           0 :       if (NS_FAILED(rv)) {
     608           0 :         DestroyHTMLVideoElement();
     609           0 :         tryNext = true;
     610           0 :         return true;
     611             :       }
     612             :     }
     613             :   }
     614           0 :   return true;
     615             : }
     616             : 
     617             : void
     618           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::DestroyHTMLVideoElement()
     619             : {
     620           0 :   MOZ_ASSERT(IsHTMLVideoElement(), "Wrong type!");
     621           0 :   mValue.mHTMLVideoElement.Destroy();
     622           0 :   mType = eUninitialized;
     623           0 : }
     624             : 
     625             : 
     626             : 
     627             : 
     628             : OwningNonNull<mozilla::dom::HTMLCanvasElement>&
     629           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::RawSetAsHTMLCanvasElement()
     630             : {
     631           0 :   if (mType == eHTMLCanvasElement) {
     632           0 :     return mValue.mHTMLCanvasElement.Value();
     633             :   }
     634           0 :   MOZ_ASSERT(mType == eUninitialized);
     635           0 :   mType = eHTMLCanvasElement;
     636           0 :   return mValue.mHTMLCanvasElement.SetValue();
     637             : }
     638             : 
     639             : OwningNonNull<mozilla::dom::HTMLCanvasElement>&
     640           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::SetAsHTMLCanvasElement()
     641             : {
     642           0 :   if (mType == eHTMLCanvasElement) {
     643           0 :     return mValue.mHTMLCanvasElement.Value();
     644             :   }
     645           0 :   Uninit();
     646           0 :   mType = eHTMLCanvasElement;
     647           0 :   return mValue.mHTMLCanvasElement.SetValue();
     648             : }
     649             : 
     650             : bool
     651           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::TrySetToHTMLCanvasElement(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     652             : {
     653           0 :   tryNext = false;
     654             :   { // scope for memberSlot
     655           0 :     OwningNonNull<mozilla::dom::HTMLCanvasElement>& memberSlot = RawSetAsHTMLCanvasElement();
     656             :     static_assert(IsRefcounted<mozilla::dom::HTMLCanvasElement>::value, "We can only store refcounted classes.");{
     657           0 :       nsresult rv = UnwrapObject<prototypes::id::HTMLCanvasElement, mozilla::dom::HTMLCanvasElement>(value, memberSlot);
     658           0 :       if (NS_FAILED(rv)) {
     659           0 :         DestroyHTMLCanvasElement();
     660           0 :         tryNext = true;
     661           0 :         return true;
     662             :       }
     663             :     }
     664             :   }
     665           0 :   return true;
     666             : }
     667             : 
     668             : void
     669           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::DestroyHTMLCanvasElement()
     670             : {
     671           0 :   MOZ_ASSERT(IsHTMLCanvasElement(), "Wrong type!");
     672           0 :   mValue.mHTMLCanvasElement.Destroy();
     673           0 :   mType = eUninitialized;
     674           0 : }
     675             : 
     676             : 
     677             : 
     678             : 
     679             : OwningNonNull<mozilla::dom::Blob>&
     680           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::RawSetAsBlob()
     681             : {
     682           0 :   if (mType == eBlob) {
     683           0 :     return mValue.mBlob.Value();
     684             :   }
     685           0 :   MOZ_ASSERT(mType == eUninitialized);
     686           0 :   mType = eBlob;
     687           0 :   return mValue.mBlob.SetValue();
     688             : }
     689             : 
     690             : OwningNonNull<mozilla::dom::Blob>&
     691           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::SetAsBlob()
     692             : {
     693           0 :   if (mType == eBlob) {
     694           0 :     return mValue.mBlob.Value();
     695             :   }
     696           0 :   Uninit();
     697           0 :   mType = eBlob;
     698           0 :   return mValue.mBlob.SetValue();
     699             : }
     700             : 
     701             : bool
     702           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::TrySetToBlob(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     703             : {
     704           0 :   tryNext = false;
     705             :   { // scope for memberSlot
     706           0 :     OwningNonNull<mozilla::dom::Blob>& memberSlot = RawSetAsBlob();
     707             :     static_assert(IsRefcounted<mozilla::dom::Blob>::value, "We can only store refcounted classes.");{
     708           0 :       nsresult rv = UnwrapObject<prototypes::id::Blob, mozilla::dom::Blob>(value, memberSlot);
     709           0 :       if (NS_FAILED(rv)) {
     710           0 :         DestroyBlob();
     711           0 :         tryNext = true;
     712           0 :         return true;
     713             :       }
     714             :     }
     715             :   }
     716           0 :   return true;
     717             : }
     718             : 
     719             : void
     720           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::DestroyBlob()
     721             : {
     722           0 :   MOZ_ASSERT(IsBlob(), "Wrong type!");
     723           0 :   mValue.mBlob.Destroy();
     724           0 :   mType = eUninitialized;
     725           0 : }
     726             : 
     727             : 
     728             : 
     729             : 
     730             : OwningNonNull<mozilla::dom::ImageData>&
     731           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::RawSetAsImageData()
     732             : {
     733           0 :   if (mType == eImageData) {
     734           0 :     return mValue.mImageData.Value();
     735             :   }
     736           0 :   MOZ_ASSERT(mType == eUninitialized);
     737           0 :   mType = eImageData;
     738           0 :   return mValue.mImageData.SetValue();
     739             : }
     740             : 
     741             : OwningNonNull<mozilla::dom::ImageData>&
     742           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::SetAsImageData()
     743             : {
     744           0 :   if (mType == eImageData) {
     745           0 :     return mValue.mImageData.Value();
     746             :   }
     747           0 :   Uninit();
     748           0 :   mType = eImageData;
     749           0 :   return mValue.mImageData.SetValue();
     750             : }
     751             : 
     752             : bool
     753           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::TrySetToImageData(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     754             : {
     755           0 :   tryNext = false;
     756             :   { // scope for memberSlot
     757           0 :     OwningNonNull<mozilla::dom::ImageData>& memberSlot = RawSetAsImageData();
     758             :     static_assert(IsRefcounted<mozilla::dom::ImageData>::value, "We can only store refcounted classes.");{
     759           0 :       nsresult rv = UnwrapObject<prototypes::id::ImageData, mozilla::dom::ImageData>(value, memberSlot);
     760           0 :       if (NS_FAILED(rv)) {
     761           0 :         DestroyImageData();
     762           0 :         tryNext = true;
     763           0 :         return true;
     764             :       }
     765             :     }
     766             :   }
     767           0 :   return true;
     768             : }
     769             : 
     770             : void
     771           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::DestroyImageData()
     772             : {
     773           0 :   MOZ_ASSERT(IsImageData(), "Wrong type!");
     774           0 :   mValue.mImageData.Destroy();
     775           0 :   mType = eUninitialized;
     776           0 : }
     777             : 
     778             : 
     779             : 
     780             : 
     781             : OwningNonNull<mozilla::dom::CanvasRenderingContext2D>&
     782           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::RawSetAsCanvasRenderingContext2D()
     783             : {
     784           0 :   if (mType == eCanvasRenderingContext2D) {
     785           0 :     return mValue.mCanvasRenderingContext2D.Value();
     786             :   }
     787           0 :   MOZ_ASSERT(mType == eUninitialized);
     788           0 :   mType = eCanvasRenderingContext2D;
     789           0 :   return mValue.mCanvasRenderingContext2D.SetValue();
     790             : }
     791             : 
     792             : OwningNonNull<mozilla::dom::CanvasRenderingContext2D>&
     793           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::SetAsCanvasRenderingContext2D()
     794             : {
     795           0 :   if (mType == eCanvasRenderingContext2D) {
     796           0 :     return mValue.mCanvasRenderingContext2D.Value();
     797             :   }
     798           0 :   Uninit();
     799           0 :   mType = eCanvasRenderingContext2D;
     800           0 :   return mValue.mCanvasRenderingContext2D.SetValue();
     801             : }
     802             : 
     803             : bool
     804           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::TrySetToCanvasRenderingContext2D(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     805             : {
     806           0 :   tryNext = false;
     807             :   { // scope for memberSlot
     808           0 :     OwningNonNull<mozilla::dom::CanvasRenderingContext2D>& memberSlot = RawSetAsCanvasRenderingContext2D();
     809             :     static_assert(IsRefcounted<mozilla::dom::CanvasRenderingContext2D>::value, "We can only store refcounted classes.");{
     810           0 :       nsresult rv = UnwrapObject<prototypes::id::CanvasRenderingContext2D, mozilla::dom::CanvasRenderingContext2D>(value, memberSlot);
     811           0 :       if (NS_FAILED(rv)) {
     812           0 :         DestroyCanvasRenderingContext2D();
     813           0 :         tryNext = true;
     814           0 :         return true;
     815             :       }
     816             :     }
     817             :   }
     818           0 :   return true;
     819             : }
     820             : 
     821             : void
     822           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::DestroyCanvasRenderingContext2D()
     823             : {
     824           0 :   MOZ_ASSERT(IsCanvasRenderingContext2D(), "Wrong type!");
     825           0 :   mValue.mCanvasRenderingContext2D.Destroy();
     826           0 :   mType = eUninitialized;
     827           0 : }
     828             : 
     829             : 
     830             : 
     831             : 
     832             : OwningNonNull<mozilla::dom::ImageBitmap>&
     833           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::RawSetAsImageBitmap()
     834             : {
     835           0 :   if (mType == eImageBitmap) {
     836           0 :     return mValue.mImageBitmap.Value();
     837             :   }
     838           0 :   MOZ_ASSERT(mType == eUninitialized);
     839           0 :   mType = eImageBitmap;
     840           0 :   return mValue.mImageBitmap.SetValue();
     841             : }
     842             : 
     843             : OwningNonNull<mozilla::dom::ImageBitmap>&
     844           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::SetAsImageBitmap()
     845             : {
     846           0 :   if (mType == eImageBitmap) {
     847           0 :     return mValue.mImageBitmap.Value();
     848             :   }
     849           0 :   Uninit();
     850           0 :   mType = eImageBitmap;
     851           0 :   return mValue.mImageBitmap.SetValue();
     852             : }
     853             : 
     854             : bool
     855           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::TrySetToImageBitmap(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     856             : {
     857           0 :   tryNext = false;
     858             :   { // scope for memberSlot
     859           0 :     OwningNonNull<mozilla::dom::ImageBitmap>& memberSlot = RawSetAsImageBitmap();
     860             :     static_assert(IsRefcounted<mozilla::dom::ImageBitmap>::value, "We can only store refcounted classes.");{
     861           0 :       nsresult rv = UnwrapObject<prototypes::id::ImageBitmap, mozilla::dom::ImageBitmap>(value, memberSlot);
     862           0 :       if (NS_FAILED(rv)) {
     863           0 :         DestroyImageBitmap();
     864           0 :         tryNext = true;
     865           0 :         return true;
     866             :       }
     867             :     }
     868             :   }
     869           0 :   return true;
     870             : }
     871             : 
     872             : void
     873           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::DestroyImageBitmap()
     874             : {
     875           0 :   MOZ_ASSERT(IsImageBitmap(), "Wrong type!");
     876           0 :   mValue.mImageBitmap.Destroy();
     877           0 :   mType = eUninitialized;
     878           0 : }
     879             : 
     880             : 
     881             : 
     882             : 
     883             : ArrayBufferView&
     884           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::RawSetAsArrayBufferView()
     885             : {
     886           0 :   if (mType == eArrayBufferView) {
     887           0 :     return mValue.mArrayBufferView.Value();
     888             :   }
     889           0 :   MOZ_ASSERT(mType == eUninitialized);
     890           0 :   mType = eArrayBufferView;
     891           0 :   return mValue.mArrayBufferView.SetValue();
     892             : }
     893             : 
     894             : ArrayBufferView&
     895           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::SetAsArrayBufferView()
     896             : {
     897           0 :   if (mType == eArrayBufferView) {
     898           0 :     return mValue.mArrayBufferView.Value();
     899             :   }
     900           0 :   Uninit();
     901           0 :   mType = eArrayBufferView;
     902           0 :   return mValue.mArrayBufferView.SetValue();
     903             : }
     904             : 
     905             : bool
     906           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::TrySetToArrayBufferView(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     907             : {
     908           0 :   tryNext = false;
     909             :   { // scope for memberSlot
     910           0 :     ArrayBufferView& memberSlot = RawSetAsArrayBufferView();
     911           0 :     if (!memberSlot.Init(&value.toObject())) {
     912           0 :       DestroyArrayBufferView();
     913           0 :       tryNext = true;
     914           0 :       return true;
     915             :     }
     916             :   }
     917           0 :   return true;
     918             : }
     919             : 
     920             : void
     921           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::DestroyArrayBufferView()
     922             : {
     923           0 :   MOZ_ASSERT(IsArrayBufferView(), "Wrong type!");
     924           0 :   mValue.mArrayBufferView.Destroy();
     925           0 :   mType = eUninitialized;
     926           0 : }
     927             : 
     928             : 
     929             : 
     930             : 
     931             : ArrayBuffer&
     932           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::RawSetAsArrayBuffer()
     933             : {
     934           0 :   if (mType == eArrayBuffer) {
     935           0 :     return mValue.mArrayBuffer.Value();
     936             :   }
     937           0 :   MOZ_ASSERT(mType == eUninitialized);
     938           0 :   mType = eArrayBuffer;
     939           0 :   return mValue.mArrayBuffer.SetValue();
     940             : }
     941             : 
     942             : ArrayBuffer&
     943           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::SetAsArrayBuffer()
     944             : {
     945           0 :   if (mType == eArrayBuffer) {
     946           0 :     return mValue.mArrayBuffer.Value();
     947             :   }
     948           0 :   Uninit();
     949           0 :   mType = eArrayBuffer;
     950           0 :   return mValue.mArrayBuffer.SetValue();
     951             : }
     952             : 
     953             : bool
     954           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::TrySetToArrayBuffer(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
     955             : {
     956           0 :   tryNext = false;
     957             :   { // scope for memberSlot
     958           0 :     ArrayBuffer& memberSlot = RawSetAsArrayBuffer();
     959           0 :     if (!memberSlot.Init(&value.toObject())) {
     960           0 :       DestroyArrayBuffer();
     961           0 :       tryNext = true;
     962           0 :       return true;
     963             :     }
     964             :   }
     965           0 :   return true;
     966             : }
     967             : 
     968             : void
     969           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::DestroyArrayBuffer()
     970             : {
     971           0 :   MOZ_ASSERT(IsArrayBuffer(), "Wrong type!");
     972           0 :   mValue.mArrayBuffer.Destroy();
     973           0 :   mType = eUninitialized;
     974           0 : }
     975             : 
     976             : 
     977             : 
     978             : 
     979             : void
     980           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::Uninit()
     981             : {
     982           0 :   switch (mType) {
     983             :     case eUninitialized: {
     984           0 :       break;
     985             :     }
     986             :     case eHTMLImageElement: {
     987           0 :       DestroyHTMLImageElement();
     988           0 :       break;
     989             :     }
     990             :     case eHTMLVideoElement: {
     991           0 :       DestroyHTMLVideoElement();
     992           0 :       break;
     993             :     }
     994             :     case eHTMLCanvasElement: {
     995           0 :       DestroyHTMLCanvasElement();
     996           0 :       break;
     997             :     }
     998             :     case eBlob: {
     999           0 :       DestroyBlob();
    1000           0 :       break;
    1001             :     }
    1002             :     case eImageData: {
    1003           0 :       DestroyImageData();
    1004           0 :       break;
    1005             :     }
    1006             :     case eCanvasRenderingContext2D: {
    1007           0 :       DestroyCanvasRenderingContext2D();
    1008           0 :       break;
    1009             :     }
    1010             :     case eImageBitmap: {
    1011           0 :       DestroyImageBitmap();
    1012           0 :       break;
    1013             :     }
    1014             :     case eArrayBufferView: {
    1015           0 :       DestroyArrayBufferView();
    1016           0 :       break;
    1017             :     }
    1018             :     case eArrayBuffer: {
    1019           0 :       DestroyArrayBuffer();
    1020           0 :       break;
    1021             :     }
    1022             :   }
    1023           0 : }
    1024             : 
    1025             : bool
    1026           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
    1027             : {
    1028           0 :   switch (mType) {
    1029             :     case eUninitialized: {
    1030           0 :       return false;
    1031             :       break;
    1032             :     }
    1033             :     case eHTMLImageElement: {
    1034           0 :       if (!GetOrCreateDOMReflector(cx, mValue.mHTMLImageElement.Value(), rval)) {
    1035           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1036           0 :         return false;
    1037             :       }
    1038           0 :       return true;
    1039             :       break;
    1040             :     }
    1041             :     case eHTMLVideoElement: {
    1042           0 :       if (!GetOrCreateDOMReflector(cx, mValue.mHTMLVideoElement.Value(), rval)) {
    1043           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1044           0 :         return false;
    1045             :       }
    1046           0 :       return true;
    1047             :       break;
    1048             :     }
    1049             :     case eHTMLCanvasElement: {
    1050           0 :       if (!GetOrCreateDOMReflector(cx, mValue.mHTMLCanvasElement.Value(), rval)) {
    1051           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1052           0 :         return false;
    1053             :       }
    1054           0 :       return true;
    1055             :       break;
    1056             :     }
    1057             :     case eBlob: {
    1058           0 :       if (!GetOrCreateDOMReflector(cx, mValue.mBlob.Value(), rval)) {
    1059           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1060           0 :         return false;
    1061             :       }
    1062           0 :       return true;
    1063             :       break;
    1064             :     }
    1065             :     case eImageData: {
    1066           0 :       if (!WrapNewBindingNonWrapperCachedObject(cx, scopeObj, mValue.mImageData.Value(), rval)) {
    1067           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1068           0 :         return false;
    1069             :       }
    1070           0 :       return true;
    1071             :       break;
    1072             :     }
    1073             :     case eCanvasRenderingContext2D: {
    1074           0 :       if (!GetOrCreateDOMReflector(cx, mValue.mCanvasRenderingContext2D.Value(), rval)) {
    1075           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1076           0 :         return false;
    1077             :       }
    1078           0 :       return true;
    1079             :       break;
    1080             :     }
    1081             :     case eImageBitmap: {
    1082           0 :       if (!GetOrCreateDOMReflector(cx, mValue.mImageBitmap.Value(), rval)) {
    1083           0 :         MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    1084           0 :         return false;
    1085             :       }
    1086           0 :       return true;
    1087             :       break;
    1088             :     }
    1089             :     case eArrayBufferView: {
    1090           0 :       rval.setObject(*mValue.mArrayBufferView.Value().Obj());
    1091           0 :       if (!MaybeWrapNonDOMObjectValue(cx, rval)) {
    1092           0 :         return false;
    1093             :       }
    1094           0 :       return true;
    1095             :       break;
    1096             :     }
    1097             :     case eArrayBuffer: {
    1098           0 :       rval.setObject(*mValue.mArrayBuffer.Value().Obj());
    1099           0 :       if (!MaybeWrapNonDOMObjectValue(cx, rval)) {
    1100           0 :         return false;
    1101             :       }
    1102           0 :       return true;
    1103             :       break;
    1104             :     }
    1105             :     default: {
    1106           0 :       return false;
    1107             :       break;
    1108             :     }
    1109             :   }
    1110             : 
    1111             :   return false;
    1112             : }
    1113             : 
    1114             : void
    1115           0 : OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer::TraceUnion(JSTracer* trc)
    1116             : {
    1117           0 :   switch (mType) {
    1118             :     case eArrayBufferView: {
    1119           0 :       mValue.mArrayBufferView.Value().TraceSelf(trc);
    1120           0 :       break;
    1121             :     }
    1122             :     case eArrayBuffer: {
    1123           0 :       mValue.mArrayBuffer.Value().TraceSelf(trc);
    1124           0 :       break;
    1125             :     }
    1126             :     default: {
    1127           0 :       break;
    1128             :     }
    1129             :   }
    1130           0 : }
    1131             : 
    1132             : 
    1133             : namespace ImageBitmapBinding {
    1134             : 
    1135             : static bool
    1136           0 : get_width(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::ImageBitmap* self, JSJitGetterCallArgs args)
    1137             : {
    1138           0 :   uint32_t result(self->Width());
    1139           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1140           0 :   args.rval().setNumber(result);
    1141           0 :   return true;
    1142             : }
    1143             : 
    1144             : static const JSJitInfo width_getterinfo = {
    1145             :   { (JSJitGetterOp)get_width },
    1146             :   { prototypes::id::ImageBitmap },
    1147             :   { PrototypeTraits<prototypes::id::ImageBitmap>::Depth },
    1148             :   JSJitInfo::Getter,
    1149             :   JSJitInfo::AliasNone, /* aliasSet.  Not relevant for setters. */
    1150             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
    1151             :   true,  /* isInfallible. False in setters. */
    1152             :   true,  /* isMovable.  Not relevant for setters. */
    1153             :   true, /* isEliminatable.  Not relevant for setters. */
    1154             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1155             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1156             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1157             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1158             : };
    1159             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1160             : static_assert(0 < 1, "There is no slot for us");
    1161             : 
    1162             : static bool
    1163           0 : get_height(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::ImageBitmap* self, JSJitGetterCallArgs args)
    1164             : {
    1165           0 :   uint32_t result(self->Height());
    1166           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1167           0 :   args.rval().setNumber(result);
    1168           0 :   return true;
    1169             : }
    1170             : 
    1171             : static const JSJitInfo height_getterinfo = {
    1172             :   { (JSJitGetterOp)get_height },
    1173             :   { prototypes::id::ImageBitmap },
    1174             :   { PrototypeTraits<prototypes::id::ImageBitmap>::Depth },
    1175             :   JSJitInfo::Getter,
    1176             :   JSJitInfo::AliasNone, /* aliasSet.  Not relevant for setters. */
    1177             :   JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
    1178             :   true,  /* isInfallible. False in setters. */
    1179             :   true,  /* isMovable.  Not relevant for setters. */
    1180             :   true, /* isEliminatable.  Not relevant for setters. */
    1181             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1182             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1183             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1184             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1185             : };
    1186             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1187             : static_assert(0 < 1, "There is no slot for us");
    1188             : 
    1189             : static bool
    1190           0 : close(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::ImageBitmap* self, const JSJitMethodCallArgs& args)
    1191             : {
    1192           0 :   self->Close();
    1193           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1194           0 :   args.rval().setUndefined();
    1195           0 :   return true;
    1196             : }
    1197             : 
    1198             : static const JSJitInfo close_methodinfo = {
    1199             :   { (JSJitGetterOp)close },
    1200             :   { prototypes::id::ImageBitmap },
    1201             :   { PrototypeTraits<prototypes::id::ImageBitmap>::Depth },
    1202             :   JSJitInfo::Method,
    1203             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1204             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1205             :   true,  /* isInfallible. False in setters. */
    1206             :   false,  /* isMovable.  Not relevant for setters. */
    1207             :   false, /* isEliminatable.  Not relevant for setters. */
    1208             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1209             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1210             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1211             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1212             : };
    1213             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1214             : static_assert(0 < 1, "There is no slot for us");
    1215             : 
    1216             : static bool
    1217           0 : findOptimalFormat(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::ImageBitmap* self, const JSJitMethodCallArgs& args)
    1218             : {
    1219           0 :   Optional<Sequence<ImageBitmapFormat>> arg0;
    1220           0 :   if (args.hasDefined(0)) {
    1221           0 :     arg0.Construct();
    1222           0 :     if (args[0].isObject()) {
    1223           0 :       JS::ForOfIterator iter(cx);
    1224           0 :       if (!iter.init(args[0], JS::ForOfIterator::AllowNonIterable)) {
    1225           0 :         return false;
    1226             :       }
    1227           0 :       if (!iter.valueIsIterable()) {
    1228           0 :         ThrowErrorMessage(cx, MSG_NOT_SEQUENCE, "Argument 1 of ImageBitmap.findOptimalFormat");
    1229           0 :         return false;
    1230             :       }
    1231           0 :       Sequence<ImageBitmapFormat> &arr = arg0.Value();
    1232           0 :       JS::Rooted<JS::Value> temp(cx);
    1233             :       while (true) {
    1234             :         bool done;
    1235           0 :         if (!iter.next(&temp, &done)) {
    1236           0 :           return false;
    1237             :         }
    1238           0 :         if (done) {
    1239           0 :           break;
    1240             :         }
    1241           0 :         ImageBitmapFormat* slotPtr = arr.AppendElement(mozilla::fallible);
    1242           0 :         if (!slotPtr) {
    1243           0 :           JS_ReportOutOfMemory(cx);
    1244           0 :           return false;
    1245             :         }
    1246           0 :         ImageBitmapFormat& slot = *slotPtr;
    1247             :         {
    1248             :           int index;
    1249           0 :           if (!FindEnumStringIndex<true>(cx, temp, ImageBitmapFormatValues::strings, "ImageBitmapFormat", "Element of argument 1 of ImageBitmap.findOptimalFormat", &index)) {
    1250           0 :             return false;
    1251             :           }
    1252           0 :           MOZ_ASSERT(index >= 0);
    1253           0 :           slot = static_cast<ImageBitmapFormat>(index);
    1254             :         }
    1255           0 :       }
    1256             :     } else {
    1257           0 :       ThrowErrorMessage(cx, MSG_NOT_SEQUENCE, "Argument 1 of ImageBitmap.findOptimalFormat");
    1258           0 :       return false;
    1259             :     }
    1260             :   }
    1261           0 :   binding_detail::FastErrorResult rv;
    1262           0 :   ImageBitmapFormat result(self->FindOptimalFormat(Constify(arg0), rv));
    1263           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1264           0 :     return false;
    1265             :   }
    1266           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1267           0 :   if (!ToJSValue(cx, result, args.rval())) {
    1268           0 :     return false;
    1269             :   }
    1270           0 :   return true;
    1271             : }
    1272             : 
    1273             : static const JSJitInfo findOptimalFormat_methodinfo = {
    1274             :   { (JSJitGetterOp)findOptimalFormat },
    1275             :   { prototypes::id::ImageBitmap },
    1276             :   { PrototypeTraits<prototypes::id::ImageBitmap>::Depth },
    1277             :   JSJitInfo::Method,
    1278             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1279             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
    1280             :   false,  /* isInfallible. False in setters. */
    1281             :   false,  /* isMovable.  Not relevant for setters. */
    1282             :   false, /* isEliminatable.  Not relevant for setters. */
    1283             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1284             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1285             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1286             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1287             : };
    1288             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1289             : static_assert(0 < 1, "There is no slot for us");
    1290             : 
    1291             : static bool
    1292           0 : mappedDataLength(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::ImageBitmap* self, const JSJitMethodCallArgs& args)
    1293             : {
    1294           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    1295           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "ImageBitmap.mappedDataLength");
    1296             :   }
    1297             :   ImageBitmapFormat arg0;
    1298             :   {
    1299             :     int index;
    1300           0 :     if (!FindEnumStringIndex<true>(cx, args[0], ImageBitmapFormatValues::strings, "ImageBitmapFormat", "Argument 1 of ImageBitmap.mappedDataLength", &index)) {
    1301           0 :       return false;
    1302             :     }
    1303           0 :     MOZ_ASSERT(index >= 0);
    1304           0 :     arg0 = static_cast<ImageBitmapFormat>(index);
    1305             :   }
    1306           0 :   binding_detail::FastErrorResult rv;
    1307           0 :   int32_t result(self->MappedDataLength(arg0, rv));
    1308           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1309           0 :     return false;
    1310             :   }
    1311           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1312           0 :   args.rval().setInt32(int32_t(result));
    1313           0 :   return true;
    1314             : }
    1315             : 
    1316             : static const JSJitInfo mappedDataLength_methodinfo = {
    1317             :   { (JSJitGetterOp)mappedDataLength },
    1318             :   { prototypes::id::ImageBitmap },
    1319             :   { PrototypeTraits<prototypes::id::ImageBitmap>::Depth },
    1320             :   JSJitInfo::Method,
    1321             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1322             :   JSVAL_TYPE_INT32,  /* returnType.  Not relevant for setters. */
    1323             :   false,  /* isInfallible. False in setters. */
    1324             :   false,  /* isMovable.  Not relevant for setters. */
    1325             :   false, /* isEliminatable.  Not relevant for setters. */
    1326             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1327             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1328             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1329             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1330             : };
    1331             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1332             : static_assert(0 < 1, "There is no slot for us");
    1333             : 
    1334             : static bool
    1335           0 : mapDataInto(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::ImageBitmap* self, const JSJitMethodCallArgs& args)
    1336             : {
    1337           0 :   if (MOZ_UNLIKELY(args.length() < 3)) {
    1338           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "ImageBitmap.mapDataInto");
    1339             :   }
    1340             :   ImageBitmapFormat arg0;
    1341             :   {
    1342             :     int index;
    1343           0 :     if (!FindEnumStringIndex<true>(cx, args[0], ImageBitmapFormatValues::strings, "ImageBitmapFormat", "Argument 1 of ImageBitmap.mapDataInto", &index)) {
    1344           0 :       return false;
    1345             :     }
    1346           0 :     MOZ_ASSERT(index >= 0);
    1347           0 :     arg0 = static_cast<ImageBitmapFormat>(index);
    1348             :   }
    1349           0 :   ArrayBufferViewOrArrayBuffer arg1;
    1350           0 :   ArrayBufferViewOrArrayBufferArgument arg1_holder(arg1);
    1351             :   {
    1352           0 :     bool done = false, failed = false, tryNext;
    1353           0 :     if (args[1].isObject()) {
    1354           0 :       done = (failed = !arg1_holder.TrySetToArrayBufferView(cx, args[1], tryNext, false)) || !tryNext ||
    1355           0 :              (failed = !arg1_holder.TrySetToArrayBuffer(cx, args[1], tryNext, false)) || !tryNext;
    1356             : 
    1357             :     }
    1358           0 :     if (failed) {
    1359           0 :       return false;
    1360             :     }
    1361           0 :     if (!done) {
    1362           0 :       ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "Argument 2 of ImageBitmap.mapDataInto", "ArrayBufferView, ArrayBuffer");
    1363           0 :       return false;
    1364             :     }
    1365             :   }
    1366             :   int32_t arg2;
    1367           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[2], &arg2)) {
    1368           0 :     return false;
    1369             :   }
    1370           0 :   binding_detail::FastErrorResult rv;
    1371           0 :   auto result(StrongOrRawPtr<Promise>(self->MapDataInto(cx, arg0, Constify(arg1), arg2, rv)));
    1372           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1373           0 :     return false;
    1374             :   }
    1375           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1376           0 :   if (!ToJSValue(cx, result, args.rval())) {
    1377           0 :     return false;
    1378             :   }
    1379           0 :   return true;
    1380             : }
    1381             : 
    1382             : static bool
    1383           0 : mapDataInto_promiseWrapper(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::ImageBitmap* self, const JSJitMethodCallArgs& args)
    1384             : {
    1385             :   // Make sure to save the callee before someone maybe messes
    1386             :   // with rval().
    1387           0 :   JS::Rooted<JSObject*> callee(cx, &args.callee());
    1388           0 :   bool ok = mapDataInto(cx, obj, self, args);
    1389           0 :   if (ok) {
    1390           0 :     return true;
    1391             :   }
    1392           0 :   return ConvertExceptionToPromise(cx, xpc::XrayAwareCalleeGlobal(callee),
    1393           0 :                                    args.rval());
    1394             : }
    1395             : 
    1396             : static const JSJitInfo mapDataInto_methodinfo = {
    1397             :   { (JSJitGetterOp)mapDataInto_promiseWrapper },
    1398             :   { prototypes::id::ImageBitmap },
    1399             :   { PrototypeTraits<prototypes::id::ImageBitmap>::Depth },
    1400             :   JSJitInfo::Method,
    1401             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1402             :   JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
    1403             :   false,  /* isInfallible. False in setters. */
    1404             :   false,  /* isMovable.  Not relevant for setters. */
    1405             :   false, /* isEliminatable.  Not relevant for setters. */
    1406             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1407             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1408             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1409             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1410             : };
    1411             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1412             : static_assert(0 < 1, "There is no slot for us");
    1413             : 
    1414             : static bool
    1415           0 : _addProperty(JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JS::Handle<JS::Value> val)
    1416             : {
    1417           0 :   mozilla::dom::ImageBitmap* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::ImageBitmap>(obj);
    1418             :   // We don't want to preserve if we don't have a wrapper, and we
    1419             :   // obviously can't preserve if we're not initialized.
    1420           0 :   if (self && self->GetWrapperPreserveColor()) {
    1421           0 :     PreserveWrapper(self);
    1422             :   }
    1423           0 :   return true;
    1424             : }
    1425             : 
    1426             : static void
    1427           0 : _finalize(js::FreeOp* fop, JSObject* obj)
    1428             : {
    1429           0 :   mozilla::dom::ImageBitmap* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::ImageBitmap>(obj);
    1430           0 :   if (self) {
    1431           0 :     ClearWrapper(self, self, obj);
    1432           0 :     AddForDeferredFinalization<mozilla::dom::ImageBitmap>(self);
    1433             :   }
    1434           0 : }
    1435             : 
    1436             : static void
    1437           0 : _objectMoved(JSObject* obj, const JSObject* old)
    1438             : {
    1439           0 :   mozilla::dom::ImageBitmap* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::ImageBitmap>(obj);
    1440           0 :   if (self) {
    1441           0 :     UpdateWrapper(self, self, obj, old);
    1442             :   }
    1443           0 : }
    1444             : 
    1445             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
    1446             : #if defined(__clang__)
    1447             : #pragma clang diagnostic push
    1448             : #pragma clang diagnostic ignored "-Wmissing-braces"
    1449             : #endif
    1450             : static const JSFunctionSpec sMethods_specs[] = {
    1451             :   JS_FNSPEC("close", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&close_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    1452             :   JS_FS_END,
    1453             :   JS_FNSPEC("findOptimalFormat", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&findOptimalFormat_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    1454             :   JS_FNSPEC("mappedDataLength", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&mappedDataLength_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    1455             :   JS_FNSPEC("mapDataInto", GenericPromiseReturningBindingMethod, reinterpret_cast<const JSJitInfo*>(&mapDataInto_methodinfo), 3, JSPROP_ENUMERATE, nullptr),
    1456             :   JS_FS_END
    1457             : };
    1458             : #if defined(__clang__)
    1459             : #pragma clang diagnostic pop
    1460             : #endif
    1461             : 
    1462             : static PrefableDisablers sMethods_disablers2 = {
    1463             :   true, false, 0, &mozilla::dom::ImageBitmap::ExtensionsEnabled
    1464             : };
    1465             : 
    1466             : // Can't be const because the pref-enabled boolean needs to be writable
    1467             : static Prefable<const JSFunctionSpec> sMethods[] = {
    1468             :   { nullptr, &sMethods_specs[0] },
    1469             :   { &sMethods_disablers2, &sMethods_specs[2] },
    1470             :   { nullptr, nullptr }
    1471             : };
    1472             : 
    1473             : static_assert(2 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
    1474             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
    1475             : static_assert(3 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
    1476             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
    1477             : 
    1478             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
    1479             : #if defined(__clang__)
    1480             : #pragma clang diagnostic push
    1481             : #pragma clang diagnostic ignored "-Wmissing-braces"
    1482             : #endif
    1483             : static const JSPropertySpec sAttributes_specs[] = {
    1484             :   { "width", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &width_getterinfo, nullptr, nullptr },
    1485             :   { "height", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &height_getterinfo, nullptr, nullptr },
    1486             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
    1487             : };
    1488             : #if defined(__clang__)
    1489             : #pragma clang diagnostic pop
    1490             : #endif
    1491             : 
    1492             : 
    1493             : // Can't be const because the pref-enabled boolean needs to be writable
    1494             : static Prefable<const JSPropertySpec> sAttributes[] = {
    1495             :   { nullptr, &sAttributes_specs[0] },
    1496             :   { nullptr, nullptr }
    1497             : };
    1498             : 
    1499             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
    1500             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
    1501             : static_assert(2 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
    1502             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
    1503             : 
    1504             : 
    1505             : static uint16_t sNativeProperties_sortedPropertyIndices[6];
    1506             : static PropertyInfo sNativeProperties_propertyInfos[6];
    1507             : 
    1508             : static const NativePropertiesN<2> sNativeProperties = {
    1509             :   false, 0,
    1510             :   false, 0,
    1511             :   true,  0 /* sMethods */,
    1512             :   true,  1 /* sAttributes */,
    1513             :   false, 0,
    1514             :   false, 0,
    1515             :   false, 0,
    1516             :   -1,
    1517             :   6,
    1518             :   sNativeProperties_sortedPropertyIndices,
    1519             :   {
    1520             :     { sMethods, &sNativeProperties_propertyInfos[0] },
    1521             :     { sAttributes, &sNativeProperties_propertyInfos[4] }
    1522             :   }
    1523             : };
    1524             : static_assert(6 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
    1525             :     "We have a property info count that is oversized");
    1526             : 
    1527             : static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
    1528             :   {
    1529             :     "Function",
    1530             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
    1531             :     &sBoringInterfaceObjectClassClassOps,
    1532             :     JS_NULL_CLASS_SPEC,
    1533             :     JS_NULL_CLASS_EXT,
    1534             :     &sInterfaceObjectClassObjectOps
    1535             :   },
    1536             :   eInterface,
    1537             :   true,
    1538             :   prototypes::id::ImageBitmap,
    1539             :   PrototypeTraits<prototypes::id::ImageBitmap>::Depth,
    1540             :   sNativePropertyHooks,
    1541             :   "function ImageBitmap() {\n    [native code]\n}",
    1542             :   JS::GetRealmFunctionPrototype
    1543             : };
    1544             : 
    1545             : static const DOMIfaceAndProtoJSClass sPrototypeClass = {
    1546             :   {
    1547             :     "ImageBitmapPrototype",
    1548             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
    1549             :     JS_NULL_CLASS_OPS,
    1550             :     JS_NULL_CLASS_SPEC,
    1551             :     JS_NULL_CLASS_EXT,
    1552             :     JS_NULL_OBJECT_OPS
    1553             :   },
    1554             :   eInterfacePrototype,
    1555             :   false,
    1556             :   prototypes::id::ImageBitmap,
    1557             :   PrototypeTraits<prototypes::id::ImageBitmap>::Depth,
    1558             :   sNativePropertyHooks,
    1559             :   "[object ImageBitmapPrototype]",
    1560             :   JS::GetRealmObjectPrototype
    1561             : };
    1562             : 
    1563             : JSObject*
    1564           0 : DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
    1565             : {
    1566           0 :   return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
    1567             : }
    1568             : 
    1569             : static const js::ClassOps sClassOps = {
    1570             :   _addProperty, /* addProperty */
    1571             :   nullptr,               /* delProperty */
    1572             :   nullptr,               /* getProperty */
    1573             :   nullptr,               /* setProperty */
    1574             :   nullptr,               /* enumerate */
    1575             :   nullptr, /* newEnumerate */
    1576             :   nullptr, /* resolve */
    1577             :   nullptr, /* mayResolve */
    1578             :   _finalize, /* finalize */
    1579             :   nullptr, /* call */
    1580             :   nullptr,               /* hasInstance */
    1581             :   nullptr,               /* construct */
    1582             :   nullptr, /* trace */
    1583             : };
    1584             : 
    1585             : static const js::ClassExtension sClassExtension = {
    1586             :   nullptr, /* weakmapKeyDelegateOp */
    1587             :   _objectMoved /* objectMovedOp */
    1588             : };
    1589             : 
    1590             : static const DOMJSClass sClass = {
    1591             :   { "ImageBitmap",
    1592             :     JSCLASS_IS_DOMJSCLASS | JSCLASS_FOREGROUND_FINALIZE | JSCLASS_HAS_RESERVED_SLOTS(1),
    1593             :     &sClassOps,
    1594             :     JS_NULL_CLASS_SPEC,
    1595             :     &sClassExtension,
    1596             :     JS_NULL_OBJECT_OPS
    1597             :   },
    1598             :   { prototypes::id::ImageBitmap, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count },
    1599             :   IsBaseOf<nsISupports, mozilla::dom::ImageBitmap >::value,
    1600             :   sNativePropertyHooks,
    1601             :   FindAssociatedGlobalForNative<mozilla::dom::ImageBitmap>::Get,
    1602             :   GetProtoObjectHandle,
    1603             :   GetCCParticipant<mozilla::dom::ImageBitmap>::Get()
    1604             : };
    1605             : static_assert(1 == DOM_INSTANCE_RESERVED_SLOTS,
    1606             :               "Must have the right minimal number of reserved slots.");
    1607             : static_assert(1 >= 1,
    1608             :               "Must have enough reserved slots.");
    1609             : 
    1610             : const JSClass*
    1611           0 : GetJSClass()
    1612             : {
    1613           0 :   return sClass.ToJSClass();
    1614             : }
    1615             : 
    1616             : bool
    1617           0 : Wrap(JSContext* aCx, mozilla::dom::ImageBitmap* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector)
    1618             : {
    1619             :   MOZ_ASSERT(static_cast<mozilla::dom::ImageBitmap*>(aObject) ==
    1620             :              reinterpret_cast<mozilla::dom::ImageBitmap*>(aObject),
    1621             :              "Multiple inheritance for mozilla::dom::ImageBitmap is broken.");
    1622           0 :   MOZ_ASSERT(ToSupportsIsCorrect(aObject));
    1623           0 :   MOZ_ASSERT_IF(aGivenProto, js::IsObjectInContextCompartment(aGivenProto, aCx));
    1624           0 :   MOZ_ASSERT(!aCache->GetWrapper(),
    1625             :              "You should probably not be using Wrap() directly; use "
    1626             :              "GetOrCreateDOMReflector instead");
    1627             : 
    1628           0 :   MOZ_ASSERT(ToSupportsIsOnPrimaryInheritanceChain(aObject, aCache),
    1629             :              "nsISupports must be on our primary inheritance chain");
    1630             : 
    1631           0 :   JS::Rooted<JSObject*> global(aCx, FindAssociatedGlobal(aCx, aObject->GetParentObject()));
    1632           0 :   if (!global) {
    1633           0 :     return false;
    1634             :   }
    1635           0 :   MOZ_ASSERT(JS_IsGlobalObject(global));
    1636           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(global));
    1637             : 
    1638             :   // That might have ended up wrapping us already, due to the wonders
    1639             :   // of XBL.  Check for that, and bail out as needed.
    1640           0 :   aReflector.set(aCache->GetWrapper());
    1641           0 :   if (aReflector) {
    1642             : #ifdef DEBUG
    1643           0 :     binding_detail::AssertReflectorHasGivenProto(aCx, aReflector, aGivenProto);
    1644             : #endif // DEBUG
    1645           0 :     return true;
    1646             :   }
    1647             : 
    1648           0 :   JSAutoCompartment ac(aCx, global);
    1649           0 :   JS::Handle<JSObject*> canonicalProto = GetProtoObjectHandle(aCx);
    1650           0 :   if (!canonicalProto) {
    1651           0 :     return false;
    1652             :   }
    1653           0 :   JS::Rooted<JSObject*> proto(aCx);
    1654           0 :   if (aGivenProto) {
    1655           0 :     proto = aGivenProto;
    1656             :     // Unfortunately, while aGivenProto was in the compartment of aCx
    1657             :     // coming in, we changed compartments to that of "parent" so may need
    1658             :     // to wrap the proto here.
    1659           0 :     if (js::GetContextCompartment(aCx) != js::GetObjectCompartment(proto)) {
    1660           0 :       if (!JS_WrapObject(aCx, &proto)) {
    1661           0 :         return false;
    1662             :       }
    1663             :     }
    1664             :   } else {
    1665           0 :     proto = canonicalProto;
    1666             :   }
    1667             : 
    1668           0 :   BindingJSObjectCreator<mozilla::dom::ImageBitmap> creator(aCx);
    1669           0 :   creator.CreateObject(aCx, sClass.ToJSClass(), proto, aObject, aReflector);
    1670           0 :   if (!aReflector) {
    1671           0 :     return false;
    1672             :   }
    1673             : 
    1674           0 :   aCache->SetWrapper(aReflector);
    1675           0 :   creator.InitializationSucceeded();
    1676             : 
    1677           0 :   MOZ_ASSERT(aCache->GetWrapperPreserveColor() &&
    1678             :              aCache->GetWrapperPreserveColor() == aReflector);
    1679             :   // If proto != canonicalProto, we have to preserve our wrapper;
    1680             :   // otherwise we won't be able to properly recreate it later, since
    1681             :   // we won't know what proto to use.  Note that we don't check
    1682             :   // aGivenProto here, since it's entirely possible (and even
    1683             :   // somewhat common) to have a non-null aGivenProto which is the
    1684             :   // same as canonicalProto.
    1685           0 :   if (proto != canonicalProto) {
    1686           0 :     PreserveWrapper(aObject);
    1687             :   }
    1688             : 
    1689           0 :   return true;
    1690             : }
    1691             : 
    1692             : const NativePropertyHooks sNativePropertyHooks[] = { {
    1693             :   nullptr,
    1694             :   nullptr,
    1695             :   nullptr,
    1696             :   { sNativeProperties.Upcast(), nullptr },
    1697             :   prototypes::id::ImageBitmap,
    1698             :   constructors::id::ImageBitmap,
    1699             :   nullptr,
    1700             :   &DefaultXrayExpandoObjectClass
    1701             : } };
    1702             : 
    1703             : void
    1704           1 : CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
    1705             : {
    1706           2 :   JS::Rooted<JSObject*> parentProto(aCx, JS::GetRealmObjectPrototype(aCx));
    1707           1 :   if (!parentProto) {
    1708           0 :     return;
    1709             :   }
    1710             : 
    1711           2 :   JS::Rooted<JSObject*> constructorProto(aCx, JS::GetRealmFunctionPrototype(aCx));
    1712           1 :   if (!constructorProto) {
    1713           0 :     return;
    1714             :   }
    1715             : 
    1716             :   static bool sIdsInited = false;
    1717           1 :   if (!sIdsInited && NS_IsMainThread()) {
    1718           0 :     if (!InitIds(aCx, sNativeProperties.Upcast())) {
    1719           0 :       return;
    1720             :     }
    1721           0 :     sIdsInited = true;
    1722             :   }
    1723             : 
    1724           1 :   JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::ImageBitmap);
    1725           1 :   JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::ImageBitmap);
    1726           2 :   dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
    1727             :                               &sPrototypeClass.mBase, protoCache,
    1728             :                               constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
    1729             :                               interfaceCache,
    1730             :                               sNativeProperties.Upcast(),
    1731             :                               nullptr,
    1732             :                               "ImageBitmap", aDefineOnGlobal,
    1733             :                               nullptr,
    1734           1 :                               false);
    1735             : }
    1736             : 
    1737             : JS::Handle<JSObject*>
    1738           0 : GetProtoObjectHandle(JSContext* aCx)
    1739             : {
    1740             :   /* Get the interface prototype object for this class.  This will create the
    1741             :      object as needed. */
    1742           0 :   bool aDefineOnGlobal = true;
    1743             : 
    1744             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    1745           0 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    1746           0 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    1747           0 :     return nullptr;
    1748             :   }
    1749             : 
    1750             :   /* Check to see whether the interface objects are already installed */
    1751           0 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    1752           0 :   if (!protoAndIfaceCache.HasEntryInSlot(prototypes::id::ImageBitmap)) {
    1753           0 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    1754           0 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    1755             :   }
    1756             : 
    1757             :   /*
    1758             :    * The object might _still_ be null, but that's OK.
    1759             :    *
    1760             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    1761             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    1762             :    * changed after they have been set.
    1763             :    *
    1764             :    * Calling address() avoids the read read barrier that does gray
    1765             :    * unmarking, but it's not possible for the object to be gray here.
    1766             :    */
    1767             : 
    1768           0 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(prototypes::id::ImageBitmap);
    1769           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    1770           0 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    1771             : }
    1772             : 
    1773             : JS::Handle<JSObject*>
    1774           1 : GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
    1775             : {
    1776             :   /* Get the interface object for this class.  This will create the object as
    1777             :      needed. */
    1778             : 
    1779             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    1780           1 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    1781           1 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    1782           0 :     return nullptr;
    1783             :   }
    1784             : 
    1785             :   /* Check to see whether the interface objects are already installed */
    1786           1 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    1787           1 :   if (!protoAndIfaceCache.HasEntryInSlot(constructors::id::ImageBitmap)) {
    1788           2 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    1789           1 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    1790             :   }
    1791             : 
    1792             :   /*
    1793             :    * The object might _still_ be null, but that's OK.
    1794             :    *
    1795             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    1796             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    1797             :    * changed after they have been set.
    1798             :    *
    1799             :    * Calling address() avoids the read read barrier that does gray
    1800             :    * unmarking, but it's not possible for the object to be gray here.
    1801             :    */
    1802             : 
    1803           1 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::ImageBitmap);
    1804           1 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    1805           1 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    1806             : }
    1807             : 
    1808             : JSObject*
    1809           1 : GetConstructorObject(JSContext* aCx)
    1810             : {
    1811           1 :   return GetConstructorObjectHandle(aCx);
    1812             : }
    1813             : 
    1814             : } // namespace ImageBitmapBinding
    1815             : 
    1816             : 
    1817             : 
    1818             : } // namespace dom
    1819             : } // namespace mozilla

Generated by: LCOV version 1.13