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