Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dom/bindings/FetchBinding.cpp
Line
Count
Source (jump to first uncovered line)
1
/* THIS FILE IS AUTOGENERATED FROM Fetch.webidl BY Codegen.py - DO NOT EDIT */
2
3
#include "AtomList.h"
4
#include "FetchBinding.h"
5
#include "jsfriendapi.h"
6
#include "mozilla/OwningNonNull.h"
7
#include "mozilla/dom/BindingUtils.h"
8
#include "mozilla/dom/Blob.h"
9
#include "mozilla/dom/FormData.h"
10
#include "mozilla/dom/NonRefcountedDOMObject.h"
11
#include "mozilla/dom/PrimitiveConversions.h"
12
#include "mozilla/dom/ScriptSettings.h"
13
#include "mozilla/dom/SimpleGlobalObject.h"
14
#include "mozilla/dom/URLSearchParams.h"
15
16
namespace mozilla {
17
namespace dom {
18
19
namespace binding_detail {}; // Just to make sure it's known as a namespace
20
using namespace mozilla::dom::binding_detail;
21
22
23
void
24
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString& aUnion, const char* aName, uint32_t aFlags)
25
0
{
26
0
  if (aUnion.IsBlob()) {
27
0
    ImplCycleCollectionTraverse(aCallback, aUnion.GetAsBlob(), "mBlob", aFlags);
28
0
  } else if (aUnion.IsFormData()) {
29
0
    ImplCycleCollectionTraverse(aCallback, aUnion.GetAsFormData(), "mFormData", aFlags);
30
0
  } else if (aUnion.IsURLSearchParams()) {
31
0
    ImplCycleCollectionTraverse(aCallback, aUnion.GetAsURLSearchParams(), "mURLSearchParams", aFlags);
32
0
  }
33
0
}
34
35
36
void
37
ImplCycleCollectionUnlink(OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString& aUnion)
38
0
{
39
0
  aUnion.Uninit();
40
0
}
41
42
43
bool
44
BlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
45
0
{
46
0
  switch (mType) {
47
0
    case eUninitialized: {
48
0
      return false;
49
0
      break;
50
0
    }
51
0
    case eBlob: {
52
0
      if (!GetOrCreateDOMReflector(cx, mValue.mBlob.Value(), rval)) {
53
0
        MOZ_ASSERT(JS_IsExceptionPending(cx));
54
0
        return false;
55
0
      }
56
0
      return true;
57
0
      break;
58
0
    }
59
0
    case eArrayBufferView: {
60
0
      rval.setObject(*mValue.mArrayBufferView.Value().Obj());
61
0
      if (!MaybeWrapNonDOMObjectValue(cx, rval)) {
62
0
        return false;
63
0
      }
64
0
      return true;
65
0
      break;
66
0
    }
67
0
    case eArrayBuffer: {
68
0
      rval.setObject(*mValue.mArrayBuffer.Value().Obj());
69
0
      if (!MaybeWrapNonDOMObjectValue(cx, rval)) {
70
0
        return false;
71
0
      }
72
0
      return true;
73
0
      break;
74
0
    }
75
0
    case eFormData: {
76
0
      if (!GetOrCreateDOMReflector(cx, mValue.mFormData.Value(), rval)) {
77
0
        MOZ_ASSERT(JS_IsExceptionPending(cx));
78
0
        return false;
79
0
      }
80
0
      return true;
81
0
      break;
82
0
    }
83
0
    case eURLSearchParams: {
84
0
      if (!GetOrCreateDOMReflector(cx, mValue.mURLSearchParams.Value(), rval)) {
85
0
        MOZ_ASSERT(JS_IsExceptionPending(cx));
86
0
        return false;
87
0
      }
88
0
      return true;
89
0
      break;
90
0
    }
91
0
    case eUSVString: {
92
0
      if (!xpc::NonVoidStringToJsval(cx, mValue.mUSVString.Value(), rval)) {
93
0
        return false;
94
0
      }
95
0
      return true;
96
0
      break;
97
0
    }
98
0
    default: {
99
0
      return false;
100
0
      break;
101
0
    }
102
0
  }
103
0
104
0
  return false;
105
0
}
106
107
108
OwningNonNull<mozilla::dom::Blob>&
109
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::RawSetAsBlob()
110
0
{
111
0
  if (mType == eBlob) {
112
0
    return mValue.mBlob.Value();
113
0
  }
114
0
  MOZ_ASSERT(mType == eUninitialized);
115
0
  mType = eBlob;
116
0
  return mValue.mBlob.SetValue();
117
0
}
118
119
OwningNonNull<mozilla::dom::Blob>&
120
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::SetAsBlob()
121
0
{
122
0
  if (mType == eBlob) {
123
0
    return mValue.mBlob.Value();
124
0
  }
125
0
  Uninit();
126
0
  mType = eBlob;
127
0
  return mValue.mBlob.SetValue();
128
0
}
129
130
bool
131
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::TrySetToBlob(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
132
0
{
133
0
  tryNext = false;
134
0
  { // scope for memberSlot
135
0
    OwningNonNull<mozilla::dom::Blob>& memberSlot = RawSetAsBlob();
136
0
    static_assert(IsRefcounted<mozilla::dom::Blob>::value, "We can only store refcounted classes.");{
137
0
      nsresult rv = UnwrapObject<prototypes::id::Blob, mozilla::dom::Blob>(value, memberSlot);
138
0
      if (NS_FAILED(rv)) {
139
0
        DestroyBlob();
140
0
        tryNext = true;
141
0
        return true;
142
0
      }
143
0
    }
144
0
  }
145
0
  return true;
146
0
}
147
148
void
149
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::DestroyBlob()
150
0
{
151
0
  MOZ_ASSERT(IsBlob(), "Wrong type!");
152
0
  mValue.mBlob.Destroy();
153
0
  mType = eUninitialized;
154
0
}
155
156
157
158
159
ArrayBufferView&
160
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::RawSetAsArrayBufferView()
161
0
{
162
0
  if (mType == eArrayBufferView) {
163
0
    return mValue.mArrayBufferView.Value();
164
0
  }
165
0
  MOZ_ASSERT(mType == eUninitialized);
166
0
  mType = eArrayBufferView;
167
0
  return mValue.mArrayBufferView.SetValue();
168
0
}
169
170
ArrayBufferView&
171
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::SetAsArrayBufferView()
172
0
{
173
0
  if (mType == eArrayBufferView) {
174
0
    return mValue.mArrayBufferView.Value();
175
0
  }
176
0
  Uninit();
177
0
  mType = eArrayBufferView;
178
0
  return mValue.mArrayBufferView.SetValue();
179
0
}
180
181
bool
182
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::TrySetToArrayBufferView(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
183
0
{
184
0
  tryNext = false;
185
0
  { // scope for memberSlot
186
0
    ArrayBufferView& memberSlot = RawSetAsArrayBufferView();
187
0
    if (!memberSlot.Init(&value.toObject())) {
188
0
      DestroyArrayBufferView();
189
0
      tryNext = true;
190
0
      return true;
191
0
    }
192
0
  }
193
0
  return true;
194
0
}
195
196
void
197
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::DestroyArrayBufferView()
198
0
{
199
0
  MOZ_ASSERT(IsArrayBufferView(), "Wrong type!");
200
0
  mValue.mArrayBufferView.Destroy();
201
0
  mType = eUninitialized;
202
0
}
203
204
205
206
207
ArrayBuffer&
208
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::RawSetAsArrayBuffer()
209
0
{
210
0
  if (mType == eArrayBuffer) {
211
0
    return mValue.mArrayBuffer.Value();
212
0
  }
213
0
  MOZ_ASSERT(mType == eUninitialized);
214
0
  mType = eArrayBuffer;
215
0
  return mValue.mArrayBuffer.SetValue();
216
0
}
217
218
ArrayBuffer&
219
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::SetAsArrayBuffer()
220
0
{
221
0
  if (mType == eArrayBuffer) {
222
0
    return mValue.mArrayBuffer.Value();
223
0
  }
224
0
  Uninit();
225
0
  mType = eArrayBuffer;
226
0
  return mValue.mArrayBuffer.SetValue();
227
0
}
228
229
bool
230
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::TrySetToArrayBuffer(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
231
0
{
232
0
  tryNext = false;
233
0
  { // scope for memberSlot
234
0
    ArrayBuffer& memberSlot = RawSetAsArrayBuffer();
235
0
    if (!memberSlot.Init(&value.toObject())) {
236
0
      DestroyArrayBuffer();
237
0
      tryNext = true;
238
0
      return true;
239
0
    }
240
0
  }
241
0
  return true;
242
0
}
243
244
void
245
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::DestroyArrayBuffer()
246
0
{
247
0
  MOZ_ASSERT(IsArrayBuffer(), "Wrong type!");
248
0
  mValue.mArrayBuffer.Destroy();
249
0
  mType = eUninitialized;
250
0
}
251
252
253
254
255
OwningNonNull<mozilla::dom::FormData>&
256
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::RawSetAsFormData()
257
0
{
258
0
  if (mType == eFormData) {
259
0
    return mValue.mFormData.Value();
260
0
  }
261
0
  MOZ_ASSERT(mType == eUninitialized);
262
0
  mType = eFormData;
263
0
  return mValue.mFormData.SetValue();
264
0
}
265
266
OwningNonNull<mozilla::dom::FormData>&
267
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::SetAsFormData()
268
0
{
269
0
  if (mType == eFormData) {
270
0
    return mValue.mFormData.Value();
271
0
  }
272
0
  Uninit();
273
0
  mType = eFormData;
274
0
  return mValue.mFormData.SetValue();
275
0
}
276
277
bool
278
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::TrySetToFormData(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
279
0
{
280
0
  tryNext = false;
281
0
  { // scope for memberSlot
282
0
    OwningNonNull<mozilla::dom::FormData>& memberSlot = RawSetAsFormData();
283
0
    static_assert(IsRefcounted<mozilla::dom::FormData>::value, "We can only store refcounted classes.");{
284
0
      nsresult rv = UnwrapObject<prototypes::id::FormData, mozilla::dom::FormData>(value, memberSlot);
285
0
      if (NS_FAILED(rv)) {
286
0
        DestroyFormData();
287
0
        tryNext = true;
288
0
        return true;
289
0
      }
290
0
    }
291
0
  }
292
0
  return true;
293
0
}
294
295
void
296
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::DestroyFormData()
297
0
{
298
0
  MOZ_ASSERT(IsFormData(), "Wrong type!");
299
0
  mValue.mFormData.Destroy();
300
0
  mType = eUninitialized;
301
0
}
302
303
304
305
306
OwningNonNull<mozilla::dom::URLSearchParams>&
307
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::RawSetAsURLSearchParams()
308
0
{
309
0
  if (mType == eURLSearchParams) {
310
0
    return mValue.mURLSearchParams.Value();
311
0
  }
312
0
  MOZ_ASSERT(mType == eUninitialized);
313
0
  mType = eURLSearchParams;
314
0
  return mValue.mURLSearchParams.SetValue();
315
0
}
316
317
OwningNonNull<mozilla::dom::URLSearchParams>&
318
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::SetAsURLSearchParams()
319
0
{
320
0
  if (mType == eURLSearchParams) {
321
0
    return mValue.mURLSearchParams.Value();
322
0
  }
323
0
  Uninit();
324
0
  mType = eURLSearchParams;
325
0
  return mValue.mURLSearchParams.SetValue();
326
0
}
327
328
bool
329
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::TrySetToURLSearchParams(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
330
0
{
331
0
  tryNext = false;
332
0
  { // scope for memberSlot
333
0
    OwningNonNull<mozilla::dom::URLSearchParams>& memberSlot = RawSetAsURLSearchParams();
334
0
    static_assert(IsRefcounted<mozilla::dom::URLSearchParams>::value, "We can only store refcounted classes.");{
335
0
      nsresult rv = UnwrapObject<prototypes::id::URLSearchParams, mozilla::dom::URLSearchParams>(value, memberSlot);
336
0
      if (NS_FAILED(rv)) {
337
0
        DestroyURLSearchParams();
338
0
        tryNext = true;
339
0
        return true;
340
0
      }
341
0
    }
342
0
  }
343
0
  return true;
344
0
}
345
346
void
347
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::DestroyURLSearchParams()
348
0
{
349
0
  MOZ_ASSERT(IsURLSearchParams(), "Wrong type!");
350
0
  mValue.mURLSearchParams.Destroy();
351
0
  mType = eUninitialized;
352
0
}
353
354
355
356
357
nsString&
358
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::RawSetAsUSVString()
359
0
{
360
0
  if (mType == eUSVString) {
361
0
    return mValue.mUSVString.Value();
362
0
  }
363
0
  MOZ_ASSERT(mType == eUninitialized);
364
0
  mType = eUSVString;
365
0
  return mValue.mUSVString.SetValue();
366
0
}
367
368
nsString&
369
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::SetAsUSVString()
370
0
{
371
0
  if (mType == eUSVString) {
372
0
    return mValue.mUSVString.Value();
373
0
  }
374
0
  Uninit();
375
0
  mType = eUSVString;
376
0
  return mValue.mUSVString.SetValue();
377
0
}
378
379
bool
380
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::TrySetToUSVString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
381
0
{
382
0
  tryNext = false;
383
0
  { // scope for memberSlot
384
0
    nsString& memberSlot = RawSetAsUSVString();
385
0
    if (!ConvertJSValueToString(cx, value, eStringify, eStringify, memberSlot)) {
386
0
      return false;
387
0
    }
388
0
    NormalizeUSVString(memberSlot);
389
0
  }
390
0
  return true;
391
0
}
392
393
394
void
395
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::DestroyUSVString()
396
0
{
397
0
  MOZ_ASSERT(IsUSVString(), "Wrong type!");
398
0
  mValue.mUSVString.Destroy();
399
0
  mType = eUninitialized;
400
0
}
401
402
403
404
405
void
406
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::Uninit()
407
{
408
  switch (mType) {
409
    case eUninitialized: {
410
      break;
411
    }
412
    case eBlob: {
413
      DestroyBlob();
414
      break;
415
    }
416
    case eArrayBufferView: {
417
      DestroyArrayBufferView();
418
      break;
419
    }
420
    case eArrayBuffer: {
421
      DestroyArrayBuffer();
422
      break;
423
    }
424
    case eFormData: {
425
      DestroyFormData();
426
      break;
427
    }
428
    case eURLSearchParams: {
429
      DestroyURLSearchParams();
430
      break;
431
    }
432
    case eUSVString: {
433
      DestroyUSVString();
434
      break;
435
    }
436
  }
437
}
438
439
bool
440
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
441
0
{
442
0
  switch (mType) {
443
0
    case eUninitialized: {
444
0
      return false;
445
0
      break;
446
0
    }
447
0
    case eBlob: {
448
0
      if (!GetOrCreateDOMReflector(cx, mValue.mBlob.Value(), rval)) {
449
0
        MOZ_ASSERT(JS_IsExceptionPending(cx));
450
0
        return false;
451
0
      }
452
0
      return true;
453
0
      break;
454
0
    }
455
0
    case eArrayBufferView: {
456
0
      rval.setObject(*mValue.mArrayBufferView.Value().Obj());
457
0
      if (!MaybeWrapNonDOMObjectValue(cx, rval)) {
458
0
        return false;
459
0
      }
460
0
      return true;
461
0
      break;
462
0
    }
463
0
    case eArrayBuffer: {
464
0
      rval.setObject(*mValue.mArrayBuffer.Value().Obj());
465
0
      if (!MaybeWrapNonDOMObjectValue(cx, rval)) {
466
0
        return false;
467
0
      }
468
0
      return true;
469
0
      break;
470
0
    }
471
0
    case eFormData: {
472
0
      if (!GetOrCreateDOMReflector(cx, mValue.mFormData.Value(), rval)) {
473
0
        MOZ_ASSERT(JS_IsExceptionPending(cx));
474
0
        return false;
475
0
      }
476
0
      return true;
477
0
      break;
478
0
    }
479
0
    case eURLSearchParams: {
480
0
      if (!GetOrCreateDOMReflector(cx, mValue.mURLSearchParams.Value(), rval)) {
481
0
        MOZ_ASSERT(JS_IsExceptionPending(cx));
482
0
        return false;
483
0
      }
484
0
      return true;
485
0
      break;
486
0
    }
487
0
    case eUSVString: {
488
0
      if (!xpc::NonVoidStringToJsval(cx, mValue.mUSVString.Value(), rval)) {
489
0
        return false;
490
0
      }
491
0
      return true;
492
0
      break;
493
0
    }
494
0
    default: {
495
0
      return false;
496
0
      break;
497
0
    }
498
0
  }
499
0
500
0
  return false;
501
0
}
502
503
void
504
OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString::TraceUnion(JSTracer* trc)
505
{
506
  switch (mType) {
507
    case eArrayBufferView: {
508
      mValue.mArrayBufferView.Value().TraceSelf(trc);
509
      break;
510
    }
511
    case eArrayBuffer: {
512
      mValue.mArrayBuffer.Value().TraceSelf(trc);
513
      break;
514
    }
515
    default: {
516
      break;
517
    }
518
  }
519
}
520
521
522
523
FetchReadableStreamReadDataArray::FetchReadableStreamReadDataArray()
524
0
{
525
0
  // Safe to pass a null context if we pass a null value
526
0
  Init(nullptr, JS::NullHandleValue);
527
0
}
528
529
530
bool
531
FetchReadableStreamReadDataArray::InitIds(JSContext* cx, FetchReadableStreamReadDataArrayAtoms* atomsCache)
532
0
{
533
0
  MOZ_ASSERT(!*reinterpret_cast<jsid**>(atomsCache));
534
0
535
0
  // Initialize these in reverse order so that any failure leaves the first one
536
0
  // uninitialized.
537
0
  if (!atomsCache->value_id.init(cx, "value")) {
538
0
    return false;
539
0
  }
540
0
  return true;
541
0
}
542
543
bool
544
FetchReadableStreamReadDataArray::Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription, bool passedToJSImpl)
545
0
{
546
0
  // Passing a null JSContext is OK only if we're initing from null,
547
0
  // Since in that case we will not have to do any property gets
548
0
  // Also evaluate isNullOrUndefined in order to avoid false-positive
549
0
  // checkers by static analysis tools
550
0
  MOZ_ASSERT_IF(!cx, val.isNull() && val.isNullOrUndefined());
551
0
  FetchReadableStreamReadDataArrayAtoms* atomsCache = nullptr;
552
0
  if (cx) {
553
0
    atomsCache = GetAtomCache<FetchReadableStreamReadDataArrayAtoms>(cx);
554
0
    if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
555
0
      return false;
556
0
    }
557
0
  }
558
0
559
0
  if (!IsConvertibleToDictionary(val)) {
560
0
    return ThrowErrorMessage(cx, MSG_NOT_DICTIONARY, sourceDescription);
561
0
  }
562
0
563
0
  bool isNull = val.isNullOrUndefined();
564
0
  // We only need these if !isNull, in which case we have |cx|.
565
0
  Maybe<JS::Rooted<JSObject *> > object;
566
0
  Maybe<JS::Rooted<JS::Value> > temp;
567
0
  if (!isNull) {
568
0
    MOZ_ASSERT(cx);
569
0
    object.emplace(cx, &val.toObject());
570
0
    temp.emplace(cx);
571
0
  }
572
0
  if (!isNull) {
573
0
    if (!JS_GetPropertyById(cx, *object, atomsCache->value_id, temp.ptr())) {
574
0
      return false;
575
0
    }
576
0
  }
577
0
  if (!isNull && !temp->isUndefined()) {
578
0
    mValue.Construct();
579
0
    if (temp.ref().isObject()) {
580
0
      if (!(mValue.Value()).Init(&temp.ref().toObject())) {
581
0
        ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "'value' member of FetchReadableStreamReadDataArray", "Uint8Array");
582
0
        return false;
583
0
      }
584
0
    } else {
585
0
      ThrowErrorMessage(cx, MSG_NOT_OBJECT, "'value' member of FetchReadableStreamReadDataArray");
586
0
      return false;
587
0
    }
588
0
    mIsAnyMemberPresent = true;
589
0
  }
590
0
  return true;
591
0
}
592
593
bool
594
FetchReadableStreamReadDataArray::ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const
595
0
{
596
0
  FetchReadableStreamReadDataArrayAtoms* atomsCache = GetAtomCache<FetchReadableStreamReadDataArrayAtoms>(cx);
597
0
  if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
598
0
    return false;
599
0
  }
600
0
601
0
  JS::Rooted<JSObject*> obj(cx, JS_NewPlainObject(cx));
602
0
  if (!obj) {
603
0
    return false;
604
0
  }
605
0
  rval.set(JS::ObjectValue(*obj));
606
0
607
0
  if (mValue.WasPassed()) {
608
0
    do {
609
0
      // block for our 'break' successCode and scope for 'temp' and 'currentValue'
610
0
      JS::Rooted<JS::Value> temp(cx);
611
0
      Uint8Array const & currentValue = mValue.InternalValue();
612
0
      temp.setObject(*currentValue.Obj());
613
0
      if (!MaybeWrapNonDOMObjectValue(cx, &temp)) {
614
0
        return false;
615
0
      }
616
0
      if (!JS_DefinePropertyById(cx, obj, atomsCache->value_id, temp, JSPROP_ENUMERATE)) {
617
0
        return false;
618
0
      }
619
0
      break;
620
0
    } while(false);
621
0
  }
622
0
623
0
  return true;
624
0
}
625
626
void
627
FetchReadableStreamReadDataArray::TraceDictionary(JSTracer* trc)
628
0
{
629
0
  if (mValue.WasPassed()) {
630
0
    mValue.Value().TraceSelf(trc);
631
0
  }
632
0
}
633
634
namespace binding_detail {
635
} // namespace binding_detail
636
637
638
639
FetchReadableStreamReadDataDone::FetchReadableStreamReadDataDone()
640
0
{
641
0
  // Safe to pass a null context if we pass a null value
642
0
  Init(nullptr, JS::NullHandleValue);
643
0
}
644
645
646
647
bool
648
FetchReadableStreamReadDataDone::InitIds(JSContext* cx, FetchReadableStreamReadDataDoneAtoms* atomsCache)
649
0
{
650
0
  MOZ_ASSERT(!*reinterpret_cast<jsid**>(atomsCache));
651
0
652
0
  // Initialize these in reverse order so that any failure leaves the first one
653
0
  // uninitialized.
654
0
  if (!atomsCache->done_id.init(cx, "done")) {
655
0
    return false;
656
0
  }
657
0
  return true;
658
0
}
659
660
bool
661
FetchReadableStreamReadDataDone::Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription, bool passedToJSImpl)
662
0
{
663
0
  // Passing a null JSContext is OK only if we're initing from null,
664
0
  // Since in that case we will not have to do any property gets
665
0
  // Also evaluate isNullOrUndefined in order to avoid false-positive
666
0
  // checkers by static analysis tools
667
0
  MOZ_ASSERT_IF(!cx, val.isNull() && val.isNullOrUndefined());
668
0
  FetchReadableStreamReadDataDoneAtoms* atomsCache = nullptr;
669
0
  if (cx) {
670
0
    atomsCache = GetAtomCache<FetchReadableStreamReadDataDoneAtoms>(cx);
671
0
    if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
672
0
      return false;
673
0
    }
674
0
  }
675
0
676
0
  if (!IsConvertibleToDictionary(val)) {
677
0
    return ThrowErrorMessage(cx, MSG_NOT_DICTIONARY, sourceDescription);
678
0
  }
679
0
680
0
  bool isNull = val.isNullOrUndefined();
681
0
  // We only need these if !isNull, in which case we have |cx|.
682
0
  Maybe<JS::Rooted<JSObject *> > object;
683
0
  Maybe<JS::Rooted<JS::Value> > temp;
684
0
  if (!isNull) {
685
0
    MOZ_ASSERT(cx);
686
0
    object.emplace(cx, &val.toObject());
687
0
    temp.emplace(cx);
688
0
  }
689
0
  if (!isNull) {
690
0
    if (!JS_GetPropertyById(cx, *object, atomsCache->done_id, temp.ptr())) {
691
0
      return false;
692
0
    }
693
0
  }
694
0
  if (!isNull && !temp->isUndefined()) {
695
0
    if (!ValueToPrimitive<bool, eDefault>(cx, temp.ref(), &mDone)) {
696
0
      return false;
697
0
    }
698
0
  } else {
699
0
    mDone = false;
700
0
  }
701
0
  mIsAnyMemberPresent = true;
702
0
  return true;
703
0
}
704
705
bool
706
FetchReadableStreamReadDataDone::Init(const nsAString& aJSON)
707
0
{
708
0
  AutoJSAPI jsapi;
709
0
  JSObject* cleanGlobal = SimpleGlobalObject::Create(SimpleGlobalObject::GlobalType::BindingDetail);
710
0
  if (!cleanGlobal) {
711
0
    return false;
712
0
  }
713
0
  if (!jsapi.Init(cleanGlobal)) {
714
0
    return false;
715
0
  }
716
0
  JSContext* cx = jsapi.cx();
717
0
  JS::Rooted<JS::Value> json(cx);
718
0
  bool ok = ParseJSON(cx, aJSON, &json);
719
0
  NS_ENSURE_TRUE(ok, false);
720
0
  return Init(cx, json);
721
0
}
722
723
bool
724
FetchReadableStreamReadDataDone::ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const
725
0
{
726
0
  FetchReadableStreamReadDataDoneAtoms* atomsCache = GetAtomCache<FetchReadableStreamReadDataDoneAtoms>(cx);
727
0
  if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
728
0
    return false;
729
0
  }
730
0
731
0
  JS::Rooted<JSObject*> obj(cx, JS_NewPlainObject(cx));
732
0
  if (!obj) {
733
0
    return false;
734
0
  }
735
0
  rval.set(JS::ObjectValue(*obj));
736
0
737
0
  do {
738
0
    // block for our 'break' successCode and scope for 'temp' and 'currentValue'
739
0
    JS::Rooted<JS::Value> temp(cx);
740
0
    bool const & currentValue = mDone;
741
0
    temp.setBoolean(currentValue);
742
0
    if (!JS_DefinePropertyById(cx, obj, atomsCache->done_id, temp, JSPROP_ENUMERATE)) {
743
0
      return false;
744
0
    }
745
0
    break;
746
0
  } while(false);
747
0
748
0
  return true;
749
0
}
750
751
bool
752
FetchReadableStreamReadDataDone::ToJSON(nsAString& aJSON) const
753
0
{
754
0
  AutoJSAPI jsapi;
755
0
  jsapi.Init();
756
0
  JSContext *cx = jsapi.cx();
757
0
  // It's safe to use UnprivilegedJunkScopeOrWorkerGlobal here
758
0
  // because we'll only be creating objects, in ways that have no
759
0
  // side-effects, followed by a call to JS::ToJSONMaybeSafely,
760
0
  // which likewise guarantees no side-effects for the sorts of
761
0
  // things we will pass it.
762
0
  JSAutoRealm ar(cx, UnprivilegedJunkScopeOrWorkerGlobal());
763
0
  JS::Rooted<JS::Value> val(cx);
764
0
  if (!ToObjectInternal(cx, &val)) {
765
0
    return false;
766
0
  }
767
0
  JS::Rooted<JSObject*> obj(cx, &val.toObject());
768
0
  return StringifyToJSON(cx, obj, aJSON);
769
0
}
770
771
void
772
FetchReadableStreamReadDataDone::TraceDictionary(JSTracer* trc)
773
0
{
774
0
}
775
776
FetchReadableStreamReadDataDone&
777
FetchReadableStreamReadDataDone::operator=(const FetchReadableStreamReadDataDone& aOther)
778
0
{
779
0
  DictionaryBase::operator=(aOther);
780
0
  mDone = aOther.mDone;
781
0
  return *this;
782
0
}
783
784
namespace binding_detail {
785
} // namespace binding_detail
786
787
788
} // namespace dom
789
} // namespace mozilla