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
|