Coverage Report

Created: 2018-09-25 14:53

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