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