Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dom/bindings/RTCDataChannelBinding.cpp
Line
Count
Source (jump to first uncovered line)
1
/* THIS FILE IS AUTOGENERATED FROM RTCDataChannel.webidl BY Codegen.py - DO NOT EDIT */
2
3
#include "EventHandlerBinding.h"
4
#include "EventTargetBinding.h"
5
#include "RTCDataChannelBinding.h"
6
#include "WrapperFactory.h"
7
#include "jsapi.h"
8
#include "jsfriendapi.h"
9
#include "mozilla/OwningNonNull.h"
10
#include "mozilla/dom/BindingUtils.h"
11
#include "mozilla/dom/Blob.h"
12
#include "mozilla/dom/DOMJSClass.h"
13
#include "mozilla/dom/NonRefcountedDOMObject.h"
14
#include "mozilla/dom/Nullable.h"
15
#include "mozilla/dom/PrimitiveConversions.h"
16
#include "mozilla/dom/TypedArray.h"
17
#include "mozilla/dom/XrayExpandoClass.h"
18
#include "nsDOMDataChannel.h"
19
20
namespace mozilla {
21
namespace dom {
22
23
namespace binding_detail {}; // Just to make sure it's known as a namespace
24
using namespace mozilla::dom::binding_detail;
25
26
27
namespace RTCDataChannelStateValues {
28
extern const EnumEntry strings[5] = {
29
  {"connecting", 10},
30
  {"open", 4},
31
  {"closing", 7},
32
  {"closed", 6},
33
  { nullptr, 0 }
34
};
35
} // namespace RTCDataChannelStateValues
36
37
bool
38
ToJSValue(JSContext* aCx, RTCDataChannelState aArgument, JS::MutableHandle<JS::Value> aValue)
39
0
{
40
0
  MOZ_ASSERT(uint32_t(aArgument) < ArrayLength(RTCDataChannelStateValues::strings));
41
0
  JSString* resultStr =
42
0
    JS_NewStringCopyN(aCx, RTCDataChannelStateValues::strings[uint32_t(aArgument)].value,
43
0
                      RTCDataChannelStateValues::strings[uint32_t(aArgument)].length);
44
0
  if (!resultStr) {
45
0
    return false;
46
0
  }
47
0
  aValue.setString(resultStr);
48
0
  return true;
49
0
}
50
51
52
namespace RTCDataChannelTypeValues {
53
extern const EnumEntry strings[3] = {
54
  {"arraybuffer", 11},
55
  {"blob", 4},
56
  { nullptr, 0 }
57
};
58
} // namespace RTCDataChannelTypeValues
59
60
bool
61
ToJSValue(JSContext* aCx, RTCDataChannelType aArgument, JS::MutableHandle<JS::Value> aValue)
62
0
{
63
0
  MOZ_ASSERT(uint32_t(aArgument) < ArrayLength(RTCDataChannelTypeValues::strings));
64
0
  JSString* resultStr =
65
0
    JS_NewStringCopyN(aCx, RTCDataChannelTypeValues::strings[uint32_t(aArgument)].value,
66
0
                      RTCDataChannelTypeValues::strings[uint32_t(aArgument)].length);
67
0
  if (!resultStr) {
68
0
    return false;
69
0
  }
70
0
  aValue.setString(resultStr);
71
0
  return true;
72
0
}
73
74
75
namespace RTCDataChannel_Binding {
76
77
static_assert(IsRefcounted<NativeType>::value == IsRefcounted<EventTarget_Binding::NativeType>::value,
78
              "Can't inherit from an interface with a different ownership model.");
79
80
MOZ_CAN_RUN_SCRIPT static bool
81
get_label(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
82
0
{
83
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.label", DOM, cx);
84
0
85
0
  DOMString result;
86
0
  self->GetLabel(result);
87
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
88
0
  if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
89
0
    return false;
90
0
  }
91
0
  return true;
92
0
}
93
94
static const JSJitInfo label_getterinfo = {
95
  { (JSJitGetterOp)get_label },
96
  { prototypes::id::RTCDataChannel },
97
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
98
  JSJitInfo::Getter,
99
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
100
  JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
101
  false,  /* isInfallible. False in setters. */
102
  false,  /* isMovable.  Not relevant for setters. */
103
  false, /* isEliminatable.  Not relevant for setters. */
104
  false, /* isAlwaysInSlot.  Only relevant for getters. */
105
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
106
  false,  /* isTypedMethod.  Only relevant for methods. */
107
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
108
};
109
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
110
static_assert(0 < 1, "There is no slot for us");
111
112
MOZ_CAN_RUN_SCRIPT static bool
113
get_reliable(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
114
0
{
115
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.reliable", DOM, cx);
116
0
117
0
  bool result(self->Reliable());
118
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
119
0
  args.rval().setBoolean(result);
120
0
  return true;
121
0
}
122
123
static const JSJitInfo reliable_getterinfo = {
124
  { (JSJitGetterOp)get_reliable },
125
  { prototypes::id::RTCDataChannel },
126
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
127
  JSJitInfo::Getter,
128
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
129
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
130
  true,  /* isInfallible. False in setters. */
131
  false,  /* isMovable.  Not relevant for setters. */
132
  false, /* isEliminatable.  Not relevant for setters. */
133
  false, /* isAlwaysInSlot.  Only relevant for getters. */
134
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
135
  false,  /* isTypedMethod.  Only relevant for methods. */
136
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
137
};
138
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
139
static_assert(0 < 1, "There is no slot for us");
140
141
MOZ_CAN_RUN_SCRIPT static bool
142
get_maxPacketLifeTime(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
143
0
{
144
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.maxPacketLifeTime", DOM, cx);
145
0
146
0
  Nullable<uint16_t> result(self->GetMaxPacketLifeTime());
147
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
148
0
  if (result.IsNull()) {
149
0
    args.rval().setNull();
150
0
    return true;
151
0
  }
152
0
  args.rval().setInt32(int32_t(result.Value()));
153
0
  return true;
154
0
}
155
156
static const JSJitInfo maxPacketLifeTime_getterinfo = {
157
  { (JSJitGetterOp)get_maxPacketLifeTime },
158
  { prototypes::id::RTCDataChannel },
159
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
160
  JSJitInfo::Getter,
161
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
162
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
163
  true,  /* isInfallible. False in setters. */
164
  false,  /* isMovable.  Not relevant for setters. */
165
  false, /* isEliminatable.  Not relevant for setters. */
166
  false, /* isAlwaysInSlot.  Only relevant for getters. */
167
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
168
  false,  /* isTypedMethod.  Only relevant for methods. */
169
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
170
};
171
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
172
static_assert(0 < 1, "There is no slot for us");
173
174
MOZ_CAN_RUN_SCRIPT static bool
175
get_maxRetransmits(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
176
0
{
177
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.maxRetransmits", DOM, cx);
178
0
179
0
  Nullable<uint16_t> result(self->GetMaxRetransmits());
180
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
181
0
  if (result.IsNull()) {
182
0
    args.rval().setNull();
183
0
    return true;
184
0
  }
185
0
  args.rval().setInt32(int32_t(result.Value()));
186
0
  return true;
187
0
}
188
189
static const JSJitInfo maxRetransmits_getterinfo = {
190
  { (JSJitGetterOp)get_maxRetransmits },
191
  { prototypes::id::RTCDataChannel },
192
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
193
  JSJitInfo::Getter,
194
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
195
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
196
  true,  /* isInfallible. False in setters. */
197
  false,  /* isMovable.  Not relevant for setters. */
198
  false, /* isEliminatable.  Not relevant for setters. */
199
  false, /* isAlwaysInSlot.  Only relevant for getters. */
200
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
201
  false,  /* isTypedMethod.  Only relevant for methods. */
202
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
203
};
204
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
205
static_assert(0 < 1, "There is no slot for us");
206
207
MOZ_CAN_RUN_SCRIPT static bool
208
get_readyState(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
209
0
{
210
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.readyState", DOM, cx);
211
0
212
0
  RTCDataChannelState result(self->ReadyState());
213
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
214
0
  if (!ToJSValue(cx, result, args.rval())) {
215
0
    return false;
216
0
  }
217
0
  return true;
218
0
}
219
220
static const JSJitInfo readyState_getterinfo = {
221
  { (JSJitGetterOp)get_readyState },
222
  { prototypes::id::RTCDataChannel },
223
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
224
  JSJitInfo::Getter,
225
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
226
  JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
227
  false,  /* isInfallible. False in setters. */
228
  false,  /* isMovable.  Not relevant for setters. */
229
  false, /* isEliminatable.  Not relevant for setters. */
230
  false, /* isAlwaysInSlot.  Only relevant for getters. */
231
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
232
  false,  /* isTypedMethod.  Only relevant for methods. */
233
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
234
};
235
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
236
static_assert(0 < 1, "There is no slot for us");
237
238
MOZ_CAN_RUN_SCRIPT static bool
239
get_bufferedAmount(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
240
0
{
241
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.bufferedAmount", DOM, cx);
242
0
243
0
  uint32_t result(self->BufferedAmount());
244
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
245
0
  args.rval().setNumber(result);
246
0
  return true;
247
0
}
248
249
static const JSJitInfo bufferedAmount_getterinfo = {
250
  { (JSJitGetterOp)get_bufferedAmount },
251
  { prototypes::id::RTCDataChannel },
252
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
253
  JSJitInfo::Getter,
254
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
255
  JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
256
  true,  /* isInfallible. False in setters. */
257
  false,  /* isMovable.  Not relevant for setters. */
258
  false, /* isEliminatable.  Not relevant for setters. */
259
  false, /* isAlwaysInSlot.  Only relevant for getters. */
260
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
261
  false,  /* isTypedMethod.  Only relevant for methods. */
262
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
263
};
264
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
265
static_assert(0 < 1, "There is no slot for us");
266
267
MOZ_CAN_RUN_SCRIPT static bool
268
get_bufferedAmountLowThreshold(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
269
0
{
270
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.bufferedAmountLowThreshold", DOM, cx);
271
0
272
0
  uint32_t result(self->BufferedAmountLowThreshold());
273
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
274
0
  args.rval().setNumber(result);
275
0
  return true;
276
0
}
277
278
MOZ_CAN_RUN_SCRIPT static bool
279
set_bufferedAmountLowThreshold(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitSetterCallArgs args)
280
0
{
281
0
  AUTO_PROFILER_LABEL_FAST("set RTCDataChannel.bufferedAmountLowThreshold", DOM, cx);
282
0
283
0
  uint32_t arg0;
284
0
  if (!ValueToPrimitive<uint32_t, eDefault>(cx, args[0], &arg0)) {
285
0
    return false;
286
0
  }
287
0
  self->SetBufferedAmountLowThreshold(arg0);
288
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
289
0
290
0
  return true;
291
0
}
292
293
static const JSJitInfo bufferedAmountLowThreshold_getterinfo = {
294
  { (JSJitGetterOp)get_bufferedAmountLowThreshold },
295
  { prototypes::id::RTCDataChannel },
296
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
297
  JSJitInfo::Getter,
298
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
299
  JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
300
  true,  /* isInfallible. False in setters. */
301
  false,  /* isMovable.  Not relevant for setters. */
302
  false, /* isEliminatable.  Not relevant for setters. */
303
  false, /* isAlwaysInSlot.  Only relevant for getters. */
304
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
305
  false,  /* isTypedMethod.  Only relevant for methods. */
306
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
307
};
308
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
309
static_assert(0 < 1, "There is no slot for us");
310
static const JSJitInfo bufferedAmountLowThreshold_setterinfo = {
311
  { (JSJitGetterOp)set_bufferedAmountLowThreshold },
312
  { prototypes::id::RTCDataChannel },
313
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
314
  JSJitInfo::Setter,
315
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
316
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
317
  false,  /* isInfallible. False in setters. */
318
  false,  /* isMovable.  Not relevant for setters. */
319
  false, /* isEliminatable.  Not relevant for setters. */
320
  false, /* isAlwaysInSlot.  Only relevant for getters. */
321
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
322
  false,  /* isTypedMethod.  Only relevant for methods. */
323
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
324
};
325
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
326
static_assert(0 < 1, "There is no slot for us");
327
328
MOZ_CAN_RUN_SCRIPT static bool
329
get_onopen(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
330
0
{
331
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.onopen", DOM, cx);
332
0
333
0
  RefPtr<EventHandlerNonNull> result(self->GetOnopen());
334
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
335
0
  if (result) {
336
0
    args.rval().setObjectOrNull(GetCallbackFromCallbackObject(cx, result));
337
0
    if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
338
0
      return false;
339
0
    }
340
0
    return true;
341
0
  } else {
342
0
    args.rval().setNull();
343
0
    return true;
344
0
  }
345
0
}
346
347
MOZ_CAN_RUN_SCRIPT static bool
348
set_onopen(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitSetterCallArgs args)
349
0
{
350
0
  AUTO_PROFILER_LABEL_FAST("set RTCDataChannel.onopen", DOM, cx);
351
0
352
0
  RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
353
0
  if (args[0].isObject()) {
354
0
    { // scope for tempRoot and tempGlobalRoot if needed
355
0
      arg0 = new binding_detail::FastEventHandlerNonNull(&args[0].toObject(), JS::CurrentGlobalOrNull(cx));
356
0
    }
357
0
  } else {
358
0
    arg0 = nullptr;
359
0
  }
360
0
  self->SetOnopen(Constify(arg0));
361
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
362
0
363
0
  return true;
364
0
}
365
366
static const JSJitInfo onopen_getterinfo = {
367
  { (JSJitGetterOp)get_onopen },
368
  { prototypes::id::RTCDataChannel },
369
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
370
  JSJitInfo::Getter,
371
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
372
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
373
  false,  /* isInfallible. False in setters. */
374
  false,  /* isMovable.  Not relevant for setters. */
375
  false, /* isEliminatable.  Not relevant for setters. */
376
  false, /* isAlwaysInSlot.  Only relevant for getters. */
377
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
378
  false,  /* isTypedMethod.  Only relevant for methods. */
379
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
380
};
381
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
382
static_assert(0 < 1, "There is no slot for us");
383
static const JSJitInfo onopen_setterinfo = {
384
  { (JSJitGetterOp)set_onopen },
385
  { prototypes::id::RTCDataChannel },
386
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
387
  JSJitInfo::Setter,
388
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
389
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
390
  false,  /* isInfallible. False in setters. */
391
  false,  /* isMovable.  Not relevant for setters. */
392
  false, /* isEliminatable.  Not relevant for setters. */
393
  false, /* isAlwaysInSlot.  Only relevant for getters. */
394
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
395
  false,  /* isTypedMethod.  Only relevant for methods. */
396
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
397
};
398
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
399
static_assert(0 < 1, "There is no slot for us");
400
401
MOZ_CAN_RUN_SCRIPT static bool
402
get_onerror(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
403
0
{
404
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.onerror", DOM, cx);
405
0
406
0
  RefPtr<EventHandlerNonNull> result(self->GetOnerror());
407
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
408
0
  if (result) {
409
0
    args.rval().setObjectOrNull(GetCallbackFromCallbackObject(cx, result));
410
0
    if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
411
0
      return false;
412
0
    }
413
0
    return true;
414
0
  } else {
415
0
    args.rval().setNull();
416
0
    return true;
417
0
  }
418
0
}
419
420
MOZ_CAN_RUN_SCRIPT static bool
421
set_onerror(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitSetterCallArgs args)
422
0
{
423
0
  AUTO_PROFILER_LABEL_FAST("set RTCDataChannel.onerror", DOM, cx);
424
0
425
0
  RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
426
0
  if (args[0].isObject()) {
427
0
    { // scope for tempRoot and tempGlobalRoot if needed
428
0
      arg0 = new binding_detail::FastEventHandlerNonNull(&args[0].toObject(), JS::CurrentGlobalOrNull(cx));
429
0
    }
430
0
  } else {
431
0
    arg0 = nullptr;
432
0
  }
433
0
  self->SetOnerror(Constify(arg0));
434
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
435
0
436
0
  return true;
437
0
}
438
439
static const JSJitInfo onerror_getterinfo = {
440
  { (JSJitGetterOp)get_onerror },
441
  { prototypes::id::RTCDataChannel },
442
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
443
  JSJitInfo::Getter,
444
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
445
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
446
  false,  /* isInfallible. False in setters. */
447
  false,  /* isMovable.  Not relevant for setters. */
448
  false, /* isEliminatable.  Not relevant for setters. */
449
  false, /* isAlwaysInSlot.  Only relevant for getters. */
450
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
451
  false,  /* isTypedMethod.  Only relevant for methods. */
452
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
453
};
454
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
455
static_assert(0 < 1, "There is no slot for us");
456
static const JSJitInfo onerror_setterinfo = {
457
  { (JSJitGetterOp)set_onerror },
458
  { prototypes::id::RTCDataChannel },
459
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
460
  JSJitInfo::Setter,
461
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
462
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
463
  false,  /* isInfallible. False in setters. */
464
  false,  /* isMovable.  Not relevant for setters. */
465
  false, /* isEliminatable.  Not relevant for setters. */
466
  false, /* isAlwaysInSlot.  Only relevant for getters. */
467
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
468
  false,  /* isTypedMethod.  Only relevant for methods. */
469
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
470
};
471
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
472
static_assert(0 < 1, "There is no slot for us");
473
474
MOZ_CAN_RUN_SCRIPT static bool
475
get_onclose(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
476
0
{
477
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.onclose", DOM, cx);
478
0
479
0
  RefPtr<EventHandlerNonNull> result(self->GetOnclose());
480
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
481
0
  if (result) {
482
0
    args.rval().setObjectOrNull(GetCallbackFromCallbackObject(cx, result));
483
0
    if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
484
0
      return false;
485
0
    }
486
0
    return true;
487
0
  } else {
488
0
    args.rval().setNull();
489
0
    return true;
490
0
  }
491
0
}
492
493
MOZ_CAN_RUN_SCRIPT static bool
494
set_onclose(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitSetterCallArgs args)
495
0
{
496
0
  AUTO_PROFILER_LABEL_FAST("set RTCDataChannel.onclose", DOM, cx);
497
0
498
0
  RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
499
0
  if (args[0].isObject()) {
500
0
    { // scope for tempRoot and tempGlobalRoot if needed
501
0
      arg0 = new binding_detail::FastEventHandlerNonNull(&args[0].toObject(), JS::CurrentGlobalOrNull(cx));
502
0
    }
503
0
  } else {
504
0
    arg0 = nullptr;
505
0
  }
506
0
  self->SetOnclose(Constify(arg0));
507
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
508
0
509
0
  return true;
510
0
}
511
512
static const JSJitInfo onclose_getterinfo = {
513
  { (JSJitGetterOp)get_onclose },
514
  { prototypes::id::RTCDataChannel },
515
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
516
  JSJitInfo::Getter,
517
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
518
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
519
  false,  /* isInfallible. False in setters. */
520
  false,  /* isMovable.  Not relevant for setters. */
521
  false, /* isEliminatable.  Not relevant for setters. */
522
  false, /* isAlwaysInSlot.  Only relevant for getters. */
523
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
524
  false,  /* isTypedMethod.  Only relevant for methods. */
525
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
526
};
527
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
528
static_assert(0 < 1, "There is no slot for us");
529
static const JSJitInfo onclose_setterinfo = {
530
  { (JSJitGetterOp)set_onclose },
531
  { prototypes::id::RTCDataChannel },
532
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
533
  JSJitInfo::Setter,
534
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
535
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
536
  false,  /* isInfallible. False in setters. */
537
  false,  /* isMovable.  Not relevant for setters. */
538
  false, /* isEliminatable.  Not relevant for setters. */
539
  false, /* isAlwaysInSlot.  Only relevant for getters. */
540
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
541
  false,  /* isTypedMethod.  Only relevant for methods. */
542
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
543
};
544
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
545
static_assert(0 < 1, "There is no slot for us");
546
547
MOZ_CAN_RUN_SCRIPT static bool
548
close(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, const JSJitMethodCallArgs& args)
549
0
{
550
0
  AUTO_PROFILER_LABEL_FAST("RTCDataChannel.close", DOM, cx);
551
0
552
0
  self->Close();
553
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
554
0
  args.rval().setUndefined();
555
0
  return true;
556
0
}
557
558
static const JSJitInfo close_methodinfo = {
559
  { (JSJitGetterOp)close },
560
  { prototypes::id::RTCDataChannel },
561
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
562
  JSJitInfo::Method,
563
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
564
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
565
  true,  /* isInfallible. False in setters. */
566
  false,  /* isMovable.  Not relevant for setters. */
567
  false, /* isEliminatable.  Not relevant for setters. */
568
  false, /* isAlwaysInSlot.  Only relevant for getters. */
569
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
570
  false,  /* isTypedMethod.  Only relevant for methods. */
571
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
572
};
573
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
574
static_assert(0 < 1, "There is no slot for us");
575
576
MOZ_CAN_RUN_SCRIPT static bool
577
get_onmessage(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
578
0
{
579
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.onmessage", DOM, cx);
580
0
581
0
  RefPtr<EventHandlerNonNull> result(self->GetOnmessage());
582
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
583
0
  if (result) {
584
0
    args.rval().setObjectOrNull(GetCallbackFromCallbackObject(cx, result));
585
0
    if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
586
0
      return false;
587
0
    }
588
0
    return true;
589
0
  } else {
590
0
    args.rval().setNull();
591
0
    return true;
592
0
  }
593
0
}
594
595
MOZ_CAN_RUN_SCRIPT static bool
596
set_onmessage(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitSetterCallArgs args)
597
0
{
598
0
  AUTO_PROFILER_LABEL_FAST("set RTCDataChannel.onmessage", DOM, cx);
599
0
600
0
  RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
601
0
  if (args[0].isObject()) {
602
0
    { // scope for tempRoot and tempGlobalRoot if needed
603
0
      arg0 = new binding_detail::FastEventHandlerNonNull(&args[0].toObject(), JS::CurrentGlobalOrNull(cx));
604
0
    }
605
0
  } else {
606
0
    arg0 = nullptr;
607
0
  }
608
0
  self->SetOnmessage(Constify(arg0));
609
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
610
0
611
0
  return true;
612
0
}
613
614
static const JSJitInfo onmessage_getterinfo = {
615
  { (JSJitGetterOp)get_onmessage },
616
  { prototypes::id::RTCDataChannel },
617
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
618
  JSJitInfo::Getter,
619
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
620
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
621
  false,  /* isInfallible. False in setters. */
622
  false,  /* isMovable.  Not relevant for setters. */
623
  false, /* isEliminatable.  Not relevant for setters. */
624
  false, /* isAlwaysInSlot.  Only relevant for getters. */
625
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
626
  false,  /* isTypedMethod.  Only relevant for methods. */
627
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
628
};
629
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
630
static_assert(0 < 1, "There is no slot for us");
631
static const JSJitInfo onmessage_setterinfo = {
632
  { (JSJitGetterOp)set_onmessage },
633
  { prototypes::id::RTCDataChannel },
634
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
635
  JSJitInfo::Setter,
636
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
637
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
638
  false,  /* isInfallible. False in setters. */
639
  false,  /* isMovable.  Not relevant for setters. */
640
  false, /* isEliminatable.  Not relevant for setters. */
641
  false, /* isAlwaysInSlot.  Only relevant for getters. */
642
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
643
  false,  /* isTypedMethod.  Only relevant for methods. */
644
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
645
};
646
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
647
static_assert(0 < 1, "There is no slot for us");
648
649
MOZ_CAN_RUN_SCRIPT static bool
650
get_onbufferedamountlow(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
651
0
{
652
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.onbufferedamountlow", DOM, cx);
653
0
654
0
  RefPtr<EventHandlerNonNull> result(self->GetOnbufferedamountlow());
655
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
656
0
  if (result) {
657
0
    args.rval().setObjectOrNull(GetCallbackFromCallbackObject(cx, result));
658
0
    if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
659
0
      return false;
660
0
    }
661
0
    return true;
662
0
  } else {
663
0
    args.rval().setNull();
664
0
    return true;
665
0
  }
666
0
}
667
668
MOZ_CAN_RUN_SCRIPT static bool
669
set_onbufferedamountlow(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitSetterCallArgs args)
670
0
{
671
0
  AUTO_PROFILER_LABEL_FAST("set RTCDataChannel.onbufferedamountlow", DOM, cx);
672
0
673
0
  RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
674
0
  if (args[0].isObject()) {
675
0
    { // scope for tempRoot and tempGlobalRoot if needed
676
0
      arg0 = new binding_detail::FastEventHandlerNonNull(&args[0].toObject(), JS::CurrentGlobalOrNull(cx));
677
0
    }
678
0
  } else {
679
0
    arg0 = nullptr;
680
0
  }
681
0
  self->SetOnbufferedamountlow(Constify(arg0));
682
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
683
0
684
0
  return true;
685
0
}
686
687
static const JSJitInfo onbufferedamountlow_getterinfo = {
688
  { (JSJitGetterOp)get_onbufferedamountlow },
689
  { prototypes::id::RTCDataChannel },
690
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
691
  JSJitInfo::Getter,
692
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
693
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
694
  false,  /* isInfallible. False in setters. */
695
  false,  /* isMovable.  Not relevant for setters. */
696
  false, /* isEliminatable.  Not relevant for setters. */
697
  false, /* isAlwaysInSlot.  Only relevant for getters. */
698
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
699
  false,  /* isTypedMethod.  Only relevant for methods. */
700
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
701
};
702
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
703
static_assert(0 < 1, "There is no slot for us");
704
static const JSJitInfo onbufferedamountlow_setterinfo = {
705
  { (JSJitGetterOp)set_onbufferedamountlow },
706
  { prototypes::id::RTCDataChannel },
707
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
708
  JSJitInfo::Setter,
709
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
710
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
711
  false,  /* isInfallible. False in setters. */
712
  false,  /* isMovable.  Not relevant for setters. */
713
  false, /* isEliminatable.  Not relevant for setters. */
714
  false, /* isAlwaysInSlot.  Only relevant for getters. */
715
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
716
  false,  /* isTypedMethod.  Only relevant for methods. */
717
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
718
};
719
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
720
static_assert(0 < 1, "There is no slot for us");
721
722
MOZ_CAN_RUN_SCRIPT static bool
723
get_binaryType(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
724
0
{
725
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.binaryType", DOM, cx);
726
0
727
0
  RTCDataChannelType result(self->BinaryType());
728
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
729
0
  if (!ToJSValue(cx, result, args.rval())) {
730
0
    return false;
731
0
  }
732
0
  return true;
733
0
}
734
735
MOZ_CAN_RUN_SCRIPT static bool
736
set_binaryType(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitSetterCallArgs args)
737
0
{
738
0
  AUTO_PROFILER_LABEL_FAST("set RTCDataChannel.binaryType", DOM, cx);
739
0
740
0
  RTCDataChannelType arg0;
741
0
  {
742
0
    int index;
743
0
    if (!FindEnumStringIndex<false>(cx, args[0], RTCDataChannelTypeValues::strings, "RTCDataChannelType", "Value being assigned to RTCDataChannel.binaryType", &index)) {
744
0
      return false;
745
0
    }
746
0
    if (index < 0) {
747
0
      return true;
748
0
    }
749
0
    arg0 = static_cast<RTCDataChannelType>(index);
750
0
  }
751
0
  self->SetBinaryType(arg0);
752
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
753
0
754
0
  return true;
755
0
}
756
757
static const JSJitInfo binaryType_getterinfo = {
758
  { (JSJitGetterOp)get_binaryType },
759
  { prototypes::id::RTCDataChannel },
760
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
761
  JSJitInfo::Getter,
762
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
763
  JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
764
  false,  /* isInfallible. False in setters. */
765
  false,  /* isMovable.  Not relevant for setters. */
766
  false, /* isEliminatable.  Not relevant for setters. */
767
  false, /* isAlwaysInSlot.  Only relevant for getters. */
768
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
769
  false,  /* isTypedMethod.  Only relevant for methods. */
770
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
771
};
772
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
773
static_assert(0 < 1, "There is no slot for us");
774
static const JSJitInfo binaryType_setterinfo = {
775
  { (JSJitGetterOp)set_binaryType },
776
  { prototypes::id::RTCDataChannel },
777
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
778
  JSJitInfo::Setter,
779
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
780
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
781
  false,  /* isInfallible. False in setters. */
782
  false,  /* isMovable.  Not relevant for setters. */
783
  false, /* isEliminatable.  Not relevant for setters. */
784
  false, /* isAlwaysInSlot.  Only relevant for getters. */
785
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
786
  false,  /* isTypedMethod.  Only relevant for methods. */
787
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
788
};
789
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
790
static_assert(0 < 1, "There is no slot for us");
791
792
MOZ_CAN_RUN_SCRIPT static bool
793
send(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, const JSJitMethodCallArgs& args)
794
0
{
795
0
  AUTO_PROFILER_LABEL_FAST("RTCDataChannel.send", DOM, cx);
796
0
797
0
  unsigned argcount = std::min(args.length(), 1u);
798
0
  switch (argcount) {
799
0
    case 1: {
800
0
      if (args[0].isObject()) {
801
0
        do {
802
0
          NonNull<mozilla::dom::Blob> arg0;
803
0
          {
804
0
            nsresult rv = UnwrapObject<prototypes::id::Blob, mozilla::dom::Blob>(args[0], arg0);
805
0
            if (NS_FAILED(rv)) {
806
0
              break;
807
0
            }
808
0
          }
809
0
          FastErrorResult rv;
810
0
          self->Send(MOZ_KnownLive(NonNullHelper(arg0)), rv);
811
0
          if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
812
0
            return false;
813
0
          }
814
0
          MOZ_ASSERT(!JS_IsExceptionPending(cx));
815
0
          args.rval().setUndefined();
816
0
          return true;
817
0
        } while (false);
818
0
        do {
819
0
          RootedSpiderMonkeyInterface<ArrayBuffer> arg0(cx);
820
0
          if (!arg0.Init(&args[0].toObject())) {
821
0
            break;
822
0
          }
823
0
          FastErrorResult rv;
824
0
          self->Send(Constify(arg0), rv);
825
0
          if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
826
0
            return false;
827
0
          }
828
0
          MOZ_ASSERT(!JS_IsExceptionPending(cx));
829
0
          args.rval().setUndefined();
830
0
          return true;
831
0
        } while (false);
832
0
        do {
833
0
          RootedSpiderMonkeyInterface<ArrayBufferView> arg0(cx);
834
0
          if (!arg0.Init(&args[0].toObject())) {
835
0
            break;
836
0
          }
837
0
          FastErrorResult rv;
838
0
          self->Send(Constify(arg0), rv);
839
0
          if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
840
0
            return false;
841
0
          }
842
0
          MOZ_ASSERT(!JS_IsExceptionPending(cx));
843
0
          args.rval().setUndefined();
844
0
          return true;
845
0
        } while (false);
846
0
      }
847
0
      binding_detail::FakeString arg0;
848
0
      if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
849
0
        return false;
850
0
      }
851
0
      FastErrorResult rv;
852
0
      self->Send(NonNullHelper(Constify(arg0)), rv);
853
0
      if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
854
0
        return false;
855
0
      }
856
0
      MOZ_ASSERT(!JS_IsExceptionPending(cx));
857
0
      args.rval().setUndefined();
858
0
      return true;
859
0
      break;
860
0
    }
861
0
    default: {
862
0
      return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "RTCDataChannel.send");
863
0
      break;
864
0
    }
865
0
  }
866
0
  MOZ_CRASH("We have an always-returning default case");
867
0
  return false;
868
0
}
869
870
static const JSJitInfo send_methodinfo = {
871
  { (JSJitGetterOp)send },
872
  { prototypes::id::RTCDataChannel },
873
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
874
  JSJitInfo::Method,
875
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
876
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
877
  false,  /* isInfallible. False in setters. */
878
  false,  /* isMovable.  Not relevant for setters. */
879
  false, /* isEliminatable.  Not relevant for setters. */
880
  false, /* isAlwaysInSlot.  Only relevant for getters. */
881
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
882
  false,  /* isTypedMethod.  Only relevant for methods. */
883
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
884
};
885
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
886
static_assert(0 < 1, "There is no slot for us");
887
888
MOZ_CAN_RUN_SCRIPT static bool
889
get_protocol(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
890
0
{
891
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.protocol", DOM, cx);
892
0
893
0
  DOMString result;
894
0
  self->GetProtocol(result);
895
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
896
0
  if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
897
0
    return false;
898
0
  }
899
0
  return true;
900
0
}
901
902
static const JSJitInfo protocol_getterinfo = {
903
  { (JSJitGetterOp)get_protocol },
904
  { prototypes::id::RTCDataChannel },
905
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
906
  JSJitInfo::Getter,
907
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
908
  JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
909
  false,  /* isInfallible. False in setters. */
910
  false,  /* isMovable.  Not relevant for setters. */
911
  false, /* isEliminatable.  Not relevant for setters. */
912
  false, /* isAlwaysInSlot.  Only relevant for getters. */
913
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
914
  false,  /* isTypedMethod.  Only relevant for methods. */
915
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
916
};
917
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
918
static_assert(0 < 1, "There is no slot for us");
919
920
MOZ_CAN_RUN_SCRIPT static bool
921
get_ordered(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
922
0
{
923
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.ordered", DOM, cx);
924
0
925
0
  bool result(self->Ordered());
926
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
927
0
  args.rval().setBoolean(result);
928
0
  return true;
929
0
}
930
931
static const JSJitInfo ordered_getterinfo = {
932
  { (JSJitGetterOp)get_ordered },
933
  { prototypes::id::RTCDataChannel },
934
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
935
  JSJitInfo::Getter,
936
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
937
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
938
  true,  /* isInfallible. False in setters. */
939
  false,  /* isMovable.  Not relevant for setters. */
940
  false, /* isEliminatable.  Not relevant for setters. */
941
  false, /* isAlwaysInSlot.  Only relevant for getters. */
942
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
943
  false,  /* isTypedMethod.  Only relevant for methods. */
944
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
945
};
946
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
947
static_assert(0 < 1, "There is no slot for us");
948
949
MOZ_CAN_RUN_SCRIPT static bool
950
get_id(JSContext* cx, JS::Handle<JSObject*> obj, nsDOMDataChannel* self, JSJitGetterCallArgs args)
951
0
{
952
0
  AUTO_PROFILER_LABEL_FAST("get RTCDataChannel.id", DOM, cx);
953
0
954
0
  uint16_t result(self->Id());
955
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
956
0
  args.rval().setInt32(int32_t(result));
957
0
  return true;
958
0
}
959
960
static const JSJitInfo id_getterinfo = {
961
  { (JSJitGetterOp)get_id },
962
  { prototypes::id::RTCDataChannel },
963
  { PrototypeTraits<prototypes::id::RTCDataChannel>::Depth },
964
  JSJitInfo::Getter,
965
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
966
  JSVAL_TYPE_INT32,  /* returnType.  Not relevant for setters. */
967
  true,  /* isInfallible. False in setters. */
968
  false,  /* isMovable.  Not relevant for setters. */
969
  false, /* isEliminatable.  Not relevant for setters. */
970
  false, /* isAlwaysInSlot.  Only relevant for getters. */
971
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
972
  false,  /* isTypedMethod.  Only relevant for methods. */
973
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
974
};
975
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
976
static_assert(0 < 1, "There is no slot for us");
977
978
static bool
979
_addProperty(JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JS::Handle<JS::Value> val)
980
0
{
981
0
  nsDOMDataChannel* self = UnwrapPossiblyNotInitializedDOMObject<nsDOMDataChannel>(obj);
982
0
  // We don't want to preserve if we don't have a wrapper, and we
983
0
  // obviously can't preserve if we're not initialized.
984
0
  if (self && self->GetWrapperPreserveColor()) {
985
0
    PreserveWrapper(self);
986
0
  }
987
0
  return true;
988
0
}
989
990
static void
991
_finalize(js::FreeOp* fop, JSObject* obj)
992
0
{
993
0
  nsDOMDataChannel* self = UnwrapPossiblyNotInitializedDOMObject<nsDOMDataChannel>(obj);
994
0
  if (self) {
995
0
    ClearWrapper(self, self, obj);
996
0
    AddForDeferredFinalization<nsDOMDataChannel>(self);
997
0
  }
998
0
}
999
1000
static size_t
1001
_objectMoved(JSObject* obj, JSObject* old)
1002
0
{
1003
0
  nsDOMDataChannel* self = UnwrapPossiblyNotInitializedDOMObject<nsDOMDataChannel>(obj);
1004
0
  if (self) {
1005
0
    UpdateWrapper(self, self, obj, old);
1006
0
  }
1007
0
1008
0
  return 0;
1009
0
}
1010
1011
// We deliberately use brace-elision to make Visual Studio produce better initalization code.
1012
#if defined(__clang__)
1013
#pragma clang diagnostic push
1014
#pragma clang diagnostic ignored "-Wmissing-braces"
1015
#endif
1016
static const JSFunctionSpec sMethods_specs[] = {
1017
  JS_FNSPEC("close", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&close_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1018
  JS_FNSPEC("send", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&send_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1019
  JS_FS_END
1020
};
1021
#if defined(__clang__)
1022
#pragma clang diagnostic pop
1023
#endif
1024
1025
1026
static const Prefable<const JSFunctionSpec> sMethods[] = {
1027
  { nullptr, &sMethods_specs[0] },
1028
  { nullptr, nullptr }
1029
};
1030
1031
static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
1032
    "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
1033
static_assert(2 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
1034
    "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
1035
1036
// We deliberately use brace-elision to make Visual Studio produce better initalization code.
1037
#if defined(__clang__)
1038
#pragma clang diagnostic push
1039
#pragma clang diagnostic ignored "-Wmissing-braces"
1040
#endif
1041
static const JSPropertySpec sAttributes_specs[] = {
1042
  { "label", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &label_getterinfo, nullptr, nullptr },
1043
  { "reliable", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &reliable_getterinfo, nullptr, nullptr },
1044
  { "maxPacketLifeTime", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &maxPacketLifeTime_getterinfo, nullptr, nullptr },
1045
  { "maxRetransmits", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &maxRetransmits_getterinfo, nullptr, nullptr },
1046
  { "readyState", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &readyState_getterinfo, nullptr, nullptr },
1047
  { "bufferedAmount", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &bufferedAmount_getterinfo, nullptr, nullptr },
1048
  { "bufferedAmountLowThreshold", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &bufferedAmountLowThreshold_getterinfo, GenericSetter<NormalThisPolicy>, &bufferedAmountLowThreshold_setterinfo },
1049
  { "onopen", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &onopen_getterinfo, GenericSetter<NormalThisPolicy>, &onopen_setterinfo },
1050
  { "onerror", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &onerror_getterinfo, GenericSetter<NormalThisPolicy>, &onerror_setterinfo },
1051
  { "onclose", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &onclose_getterinfo, GenericSetter<NormalThisPolicy>, &onclose_setterinfo },
1052
  { "onmessage", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &onmessage_getterinfo, GenericSetter<NormalThisPolicy>, &onmessage_setterinfo },
1053
  { "onbufferedamountlow", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &onbufferedamountlow_getterinfo, GenericSetter<NormalThisPolicy>, &onbufferedamountlow_setterinfo },
1054
  { "binaryType", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &binaryType_getterinfo, GenericSetter<NormalThisPolicy>, &binaryType_setterinfo },
1055
  { "protocol", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &protocol_getterinfo, nullptr, nullptr },
1056
  { "ordered", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &ordered_getterinfo, nullptr, nullptr },
1057
  { "id", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &id_getterinfo, nullptr, nullptr },
1058
  { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
1059
};
1060
#if defined(__clang__)
1061
#pragma clang diagnostic pop
1062
#endif
1063
1064
1065
static const Prefable<const JSPropertySpec> sAttributes[] = {
1066
  { nullptr, &sAttributes_specs[0] },
1067
  { nullptr, nullptr }
1068
};
1069
1070
static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
1071
    "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
1072
static_assert(16 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
1073
    "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
1074
1075
1076
static uint16_t sNativeProperties_sortedPropertyIndices[18];
1077
static PropertyInfo sNativeProperties_propertyInfos[18];
1078
1079
static const NativePropertiesN<2> sNativeProperties = {
1080
  false, 0,
1081
  false, 0,
1082
  true,  0 /* sMethods */,
1083
  true,  1 /* sAttributes */,
1084
  false, 0,
1085
  false, 0,
1086
  false, 0,
1087
  -1,
1088
  18,
1089
  sNativeProperties_sortedPropertyIndices,
1090
  {
1091
    { sMethods, &sNativeProperties_propertyInfos[0] },
1092
    { sAttributes, &sNativeProperties_propertyInfos[2] }
1093
  }
1094
};
1095
static_assert(18 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
1096
    "We have a property info count that is oversized");
1097
1098
static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
1099
  {
1100
    "Function",
1101
    JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
1102
    &sBoringInterfaceObjectClassClassOps,
1103
    JS_NULL_CLASS_SPEC,
1104
    JS_NULL_CLASS_EXT,
1105
    &sInterfaceObjectClassObjectOps
1106
  },
1107
  eInterface,
1108
  true,
1109
  prototypes::id::RTCDataChannel,
1110
  PrototypeTraits<prototypes::id::RTCDataChannel>::Depth,
1111
  sNativePropertyHooks,
1112
  "function RTCDataChannel() {\n    [native code]\n}",
1113
  EventTarget_Binding::GetConstructorObject
1114
};
1115
1116
static const DOMIfaceAndProtoJSClass sPrototypeClass = {
1117
  {
1118
    "RTCDataChannelPrototype",
1119
    JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
1120
    JS_NULL_CLASS_OPS,
1121
    JS_NULL_CLASS_SPEC,
1122
    JS_NULL_CLASS_EXT,
1123
    JS_NULL_OBJECT_OPS
1124
  },
1125
  eInterfacePrototype,
1126
  false,
1127
  prototypes::id::RTCDataChannel,
1128
  PrototypeTraits<prototypes::id::RTCDataChannel>::Depth,
1129
  sNativePropertyHooks,
1130
  "[object RTCDataChannelPrototype]",
1131
  EventTarget_Binding::GetProtoObject
1132
};
1133
1134
static const js::ClassOps sClassOps = {
1135
  _addProperty, /* addProperty */
1136
  nullptr,               /* delProperty */
1137
  nullptr,               /* enumerate */
1138
  nullptr, /* newEnumerate */
1139
  nullptr, /* resolve */
1140
  nullptr, /* mayResolve */
1141
  _finalize, /* finalize */
1142
  nullptr, /* call */
1143
  nullptr,               /* hasInstance */
1144
  nullptr,               /* construct */
1145
  nullptr, /* trace */
1146
};
1147
1148
static const js::ClassExtension sClassExtension = {
1149
  nullptr, /* weakmapKeyDelegateOp */
1150
  _objectMoved /* objectMovedOp */
1151
};
1152
1153
static const DOMJSClass sClass = {
1154
  { "RTCDataChannel",
1155
    JSCLASS_IS_DOMJSCLASS | JSCLASS_FOREGROUND_FINALIZE | JSCLASS_HAS_RESERVED_SLOTS(1),
1156
    &sClassOps,
1157
    JS_NULL_CLASS_SPEC,
1158
    &sClassExtension,
1159
    JS_NULL_OBJECT_OPS
1160
  },
1161
  { prototypes::id::EventTarget, prototypes::id::RTCDataChannel, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count },
1162
  IsBaseOf<nsISupports, nsDOMDataChannel >::value,
1163
  sNativePropertyHooks,
1164
  FindAssociatedGlobalForNative<nsDOMDataChannel>::Get,
1165
  GetProtoObjectHandle,
1166
  GetCCParticipant<nsDOMDataChannel>::Get()
1167
};
1168
static_assert(1 == DOM_INSTANCE_RESERVED_SLOTS,
1169
              "Must have the right minimal number of reserved slots.");
1170
static_assert(1 >= 1,
1171
              "Must have enough reserved slots.");
1172
1173
const JSClass*
1174
GetJSClass()
1175
0
{
1176
0
  return sClass.ToJSClass();
1177
0
}
1178
1179
bool
1180
Wrap(JSContext* aCx, nsDOMDataChannel* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector)
1181
0
{
1182
0
  static_assert(!IsBaseOf<NonRefcountedDOMObject, nsDOMDataChannel>::value,
1183
0
                "Shouldn't have wrappercached things that are not refcounted.");
1184
0
  MOZ_ASSERT(static_cast<nsDOMDataChannel*>(aObject) ==
1185
0
             reinterpret_cast<nsDOMDataChannel*>(aObject),
1186
0
             "Multiple inheritance for nsDOMDataChannel is broken.");
1187
0
  MOZ_ASSERT(static_cast<mozilla::dom::EventTarget*>(aObject) ==
1188
0
             reinterpret_cast<mozilla::dom::EventTarget*>(aObject),
1189
0
             "Multiple inheritance for mozilla::dom::EventTarget is broken.");
1190
0
  MOZ_ASSERT(ToSupportsIsCorrect(aObject));
1191
0
  MOZ_ASSERT_IF(aGivenProto, js::IsObjectInContextCompartment(aGivenProto, aCx));
1192
0
  MOZ_ASSERT(!aCache->GetWrapper(),
1193
0
             "You should probably not be using Wrap() directly; use "
1194
0
             "GetOrCreateDOMReflector instead");
1195
0
1196
0
  MOZ_ASSERT(ToSupportsIsOnPrimaryInheritanceChain(aObject, aCache),
1197
0
             "nsISupports must be on our primary inheritance chain");
1198
0
1199
0
  JS::Rooted<JSObject*> global(aCx, FindAssociatedGlobal(aCx, aObject->GetParentObject()));
1200
0
  if (!global) {
1201
0
    return false;
1202
0
  }
1203
0
  MOZ_ASSERT(JS_IsGlobalObject(global));
1204
0
  MOZ_ASSERT(JS::ObjectIsNotGray(global));
1205
0
1206
0
  // That might have ended up wrapping us already, due to the wonders
1207
0
  // of XBL.  Check for that, and bail out as needed.
1208
0
  aReflector.set(aCache->GetWrapper());
1209
0
  if (aReflector) {
1210
#ifdef DEBUG
1211
    AssertReflectorHasGivenProto(aCx, aReflector, aGivenProto);
1212
#endif // DEBUG
1213
    return true;
1214
0
  }
1215
0
1216
0
  JSAutoRealm ar(aCx, global);
1217
0
  JS::Handle<JSObject*> canonicalProto = GetProtoObjectHandle(aCx);
1218
0
  if (!canonicalProto) {
1219
0
    return false;
1220
0
  }
1221
0
  JS::Rooted<JSObject*> proto(aCx);
1222
0
  if (aGivenProto) {
1223
0
    proto = aGivenProto;
1224
0
    // Unfortunately, while aGivenProto was in the compartment of aCx
1225
0
    // coming in, we changed compartments to that of "parent" so may need
1226
0
    // to wrap the proto here.
1227
0
    if (js::GetContextCompartment(aCx) != js::GetObjectCompartment(proto)) {
1228
0
      if (!JS_WrapObject(aCx, &proto)) {
1229
0
        return false;
1230
0
      }
1231
0
    }
1232
0
  } else {
1233
0
    proto = canonicalProto;
1234
0
  }
1235
0
1236
0
  BindingJSObjectCreator<nsDOMDataChannel> creator(aCx);
1237
0
  creator.CreateObject(aCx, sClass.ToJSClass(), proto, aObject, aReflector);
1238
0
  if (!aReflector) {
1239
0
    return false;
1240
0
  }
1241
0
1242
0
  aCache->SetWrapper(aReflector);
1243
0
  creator.InitializationSucceeded();
1244
0
1245
0
  MOZ_ASSERT(aCache->GetWrapperPreserveColor() &&
1246
0
             aCache->GetWrapperPreserveColor() == aReflector);
1247
0
  // If proto != canonicalProto, we have to preserve our wrapper;
1248
0
  // otherwise we won't be able to properly recreate it later, since
1249
0
  // we won't know what proto to use.  Note that we don't check
1250
0
  // aGivenProto here, since it's entirely possible (and even
1251
0
  // somewhat common) to have a non-null aGivenProto which is the
1252
0
  // same as canonicalProto.
1253
0
  if (proto != canonicalProto) {
1254
0
    PreserveWrapper(aObject);
1255
0
  }
1256
0
1257
0
  return true;
1258
0
}
1259
1260
const NativePropertyHooks sNativePropertyHooks[] = { {
1261
  nullptr,
1262
  nullptr,
1263
  nullptr,
1264
  { sNativeProperties.Upcast(), nullptr },
1265
  prototypes::id::RTCDataChannel,
1266
  constructors::id::RTCDataChannel,
1267
  EventTarget_Binding::sNativePropertyHooks,
1268
  &DefaultXrayExpandoObjectClass
1269
} };
1270
1271
void
1272
CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
1273
0
{
1274
0
  JS::Handle<JSObject*> parentProto(EventTarget_Binding::GetProtoObjectHandle(aCx));
1275
0
  if (!parentProto) {
1276
0
    return;
1277
0
  }
1278
0
1279
0
  JS::Handle<JSObject*> constructorProto(EventTarget_Binding::GetConstructorObjectHandle(aCx));
1280
0
  if (!constructorProto) {
1281
0
    return;
1282
0
  }
1283
0
1284
0
  static bool sIdsInited = false;
1285
0
  if (!sIdsInited && NS_IsMainThread()) {
1286
0
    if (!InitIds(aCx, sNativeProperties.Upcast())) {
1287
0
      return;
1288
0
    }
1289
0
    sIdsInited = true;
1290
0
  }
1291
0
1292
0
  JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::RTCDataChannel);
1293
0
  JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::RTCDataChannel);
1294
0
  dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
1295
0
                              &sPrototypeClass.mBase, protoCache,
1296
0
                              nullptr,
1297
0
                              constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
1298
0
                              interfaceCache,
1299
0
                              sNativeProperties.Upcast(),
1300
0
                              nullptr,
1301
0
                              "RTCDataChannel", aDefineOnGlobal,
1302
0
                              nullptr,
1303
0
                              false);
1304
0
}
1305
1306
JSObject*
1307
GetConstructorObject(JSContext* aCx)
1308
0
{
1309
0
  return GetConstructorObjectHandle(aCx);
1310
0
}
1311
1312
} // namespace RTCDataChannel_Binding
1313
1314
1315
1316
} // namespace dom
1317
} // namespace mozilla