Line data Source code
1 : /* THIS FILE IS AUTOGENERATED FROM MediaStreamTrack.webidl BY Codegen.py - DO NOT EDIT */
2 :
3 : #include "AtomList.h"
4 : #include "EventHandlerBinding.h"
5 : #include "EventTargetBinding.h"
6 : #include "MediaStreamTrackBinding.h"
7 : #include "MediaTrackSettingsBinding.h"
8 : #include "WrapperFactory.h"
9 : #include "jsapi.h"
10 : #include "mozilla/FloatingPoint.h"
11 : #include "mozilla/OwningNonNull.h"
12 : #include "mozilla/dom/BindingUtils.h"
13 : #include "mozilla/dom/DOMJSClass.h"
14 : #include "mozilla/dom/MediaStreamTrack.h"
15 : #include "mozilla/dom/NonRefcountedDOMObject.h"
16 : #include "mozilla/dom/Nullable.h"
17 : #include "mozilla/dom/PrimitiveConversions.h"
18 : #include "mozilla/dom/Promise.h"
19 : #include "mozilla/dom/ScriptSettings.h"
20 : #include "mozilla/dom/SimpleGlobalObject.h"
21 : #include "mozilla/dom/ToJSValue.h"
22 : #include "mozilla/dom/UnionConversions.h"
23 : #include "mozilla/dom/XrayExpandoClass.h"
24 : #include "nsContentUtils.h"
25 :
26 : namespace mozilla {
27 : namespace dom {
28 :
29 : namespace VideoFacingModeEnumValues {
30 : extern const EnumEntry strings[5] = {
31 : {"user", 4},
32 : {"environment", 11},
33 : {"left", 4},
34 : {"right", 5},
35 : { nullptr, 0 }
36 : };
37 : } // namespace VideoFacingModeEnumValues
38 :
39 : bool
40 0 : ToJSValue(JSContext* aCx, VideoFacingModeEnum aArgument, JS::MutableHandle<JS::Value> aValue)
41 : {
42 0 : MOZ_ASSERT(uint32_t(aArgument) < ArrayLength(VideoFacingModeEnumValues::strings));
43 : JSString* resultStr =
44 0 : JS_NewStringCopyN(aCx, VideoFacingModeEnumValues::strings[uint32_t(aArgument)].value,
45 0 : VideoFacingModeEnumValues::strings[uint32_t(aArgument)].length);
46 0 : if (!resultStr) {
47 0 : return false;
48 : }
49 0 : aValue.setString(resultStr);
50 0 : return true;
51 : }
52 :
53 :
54 : namespace MediaSourceEnumValues {
55 : extern const EnumEntry strings[9] = {
56 : {"camera", 6},
57 : {"screen", 6},
58 : {"application", 11},
59 : {"window", 6},
60 : {"browser", 7},
61 : {"microphone", 10},
62 : {"audioCapture", 12},
63 : {"other", 5},
64 : { nullptr, 0 }
65 : };
66 : } // namespace MediaSourceEnumValues
67 :
68 : bool
69 0 : ToJSValue(JSContext* aCx, MediaSourceEnum aArgument, JS::MutableHandle<JS::Value> aValue)
70 : {
71 0 : MOZ_ASSERT(uint32_t(aArgument) < ArrayLength(MediaSourceEnumValues::strings));
72 : JSString* resultStr =
73 0 : JS_NewStringCopyN(aCx, MediaSourceEnumValues::strings[uint32_t(aArgument)].value,
74 0 : MediaSourceEnumValues::strings[uint32_t(aArgument)].length);
75 0 : if (!resultStr) {
76 0 : return false;
77 : }
78 0 : aValue.setString(resultStr);
79 0 : return true;
80 : }
81 :
82 :
83 : namespace MediaStreamTrackStateValues {
84 : extern const EnumEntry strings[3] = {
85 : {"live", 4},
86 : {"ended", 5},
87 : { nullptr, 0 }
88 : };
89 : } // namespace MediaStreamTrackStateValues
90 :
91 : bool
92 0 : ToJSValue(JSContext* aCx, MediaStreamTrackState aArgument, JS::MutableHandle<JS::Value> aValue)
93 : {
94 0 : MOZ_ASSERT(uint32_t(aArgument) < ArrayLength(MediaStreamTrackStateValues::strings));
95 : JSString* resultStr =
96 0 : JS_NewStringCopyN(aCx, MediaStreamTrackStateValues::strings[uint32_t(aArgument)].value,
97 0 : MediaStreamTrackStateValues::strings[uint32_t(aArgument)].length);
98 0 : if (!resultStr) {
99 0 : return false;
100 : }
101 0 : aValue.setString(resultStr);
102 0 : return true;
103 : }
104 :
105 :
106 : bool
107 0 : BooleanOrConstrainBooleanParameters::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
108 : {
109 0 : switch (mType) {
110 : case eUninitialized: {
111 0 : return false;
112 : break;
113 : }
114 : case eBoolean: {
115 0 : rval.setBoolean(mValue.mBoolean.Value());
116 0 : return true;
117 : break;
118 : }
119 : case eConstrainBooleanParameters: {
120 0 : if (!mValue.mConstrainBooleanParameters.Value().ToObjectInternal(cx, rval)) {
121 0 : return false;
122 : }
123 0 : return true;
124 : break;
125 : }
126 : default: {
127 0 : return false;
128 : break;
129 : }
130 : }
131 :
132 : return false;
133 : }
134 :
135 :
136 : bool&
137 0 : OwningBooleanOrConstrainBooleanParameters::RawSetAsBoolean()
138 : {
139 0 : if (mType == eBoolean) {
140 0 : return mValue.mBoolean.Value();
141 : }
142 0 : MOZ_ASSERT(mType == eUninitialized);
143 0 : mType = eBoolean;
144 0 : return mValue.mBoolean.SetValue();
145 : }
146 :
147 : bool&
148 0 : OwningBooleanOrConstrainBooleanParameters::SetAsBoolean()
149 : {
150 0 : if (mType == eBoolean) {
151 0 : return mValue.mBoolean.Value();
152 : }
153 0 : Uninit();
154 0 : mType = eBoolean;
155 0 : return mValue.mBoolean.SetValue();
156 : }
157 :
158 : bool
159 0 : OwningBooleanOrConstrainBooleanParameters::TrySetToBoolean(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
160 : {
161 0 : tryNext = false;
162 : { // scope for memberSlot
163 0 : bool& memberSlot = RawSetAsBoolean();
164 0 : if (!ValueToPrimitive<bool, eDefault>(cx, value, &memberSlot)) {
165 0 : return false;
166 : }
167 : }
168 0 : return true;
169 : }
170 :
171 : void
172 0 : OwningBooleanOrConstrainBooleanParameters::DestroyBoolean()
173 : {
174 0 : MOZ_ASSERT(IsBoolean(), "Wrong type!");
175 0 : mValue.mBoolean.Destroy();
176 0 : mType = eUninitialized;
177 0 : }
178 :
179 :
180 :
181 :
182 : ConstrainBooleanParameters&
183 0 : OwningBooleanOrConstrainBooleanParameters::RawSetAsConstrainBooleanParameters()
184 : {
185 0 : if (mType == eConstrainBooleanParameters) {
186 0 : return mValue.mConstrainBooleanParameters.Value();
187 : }
188 0 : MOZ_ASSERT(mType == eUninitialized);
189 0 : mType = eConstrainBooleanParameters;
190 0 : return mValue.mConstrainBooleanParameters.SetValue();
191 : }
192 :
193 : ConstrainBooleanParameters&
194 0 : OwningBooleanOrConstrainBooleanParameters::SetAsConstrainBooleanParameters()
195 : {
196 0 : if (mType == eConstrainBooleanParameters) {
197 0 : return mValue.mConstrainBooleanParameters.Value();
198 : }
199 0 : Uninit();
200 0 : mType = eConstrainBooleanParameters;
201 0 : return mValue.mConstrainBooleanParameters.SetValue();
202 : }
203 :
204 : bool
205 0 : OwningBooleanOrConstrainBooleanParameters::TrySetToConstrainBooleanParameters(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
206 : {
207 0 : tryNext = false;
208 : { // scope for memberSlot
209 0 : ConstrainBooleanParameters& memberSlot = RawSetAsConstrainBooleanParameters();
210 0 : if (!IsConvertibleToDictionary(value)) {
211 0 : DestroyConstrainBooleanParameters();
212 0 : tryNext = true;
213 0 : return true;
214 : }
215 0 : if (!memberSlot.Init(cx, value, "Member of BooleanOrConstrainBooleanParameters", passedToJSImpl)) {
216 0 : return false;
217 : }
218 : }
219 0 : return true;
220 : }
221 :
222 : void
223 0 : OwningBooleanOrConstrainBooleanParameters::DestroyConstrainBooleanParameters()
224 : {
225 0 : MOZ_ASSERT(IsConstrainBooleanParameters(), "Wrong type!");
226 0 : mValue.mConstrainBooleanParameters.Destroy();
227 0 : mType = eUninitialized;
228 0 : }
229 :
230 :
231 :
232 :
233 : void
234 0 : OwningBooleanOrConstrainBooleanParameters::Uninit()
235 : {
236 0 : switch (mType) {
237 : case eUninitialized: {
238 0 : break;
239 : }
240 : case eBoolean: {
241 0 : DestroyBoolean();
242 0 : break;
243 : }
244 : case eConstrainBooleanParameters: {
245 0 : DestroyConstrainBooleanParameters();
246 0 : break;
247 : }
248 : }
249 0 : }
250 :
251 : bool
252 0 : OwningBooleanOrConstrainBooleanParameters::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
253 : {
254 0 : switch (mType) {
255 : case eUninitialized: {
256 0 : return false;
257 : break;
258 : }
259 : case eBoolean: {
260 0 : rval.setBoolean(mValue.mBoolean.Value());
261 0 : return true;
262 : break;
263 : }
264 : case eConstrainBooleanParameters: {
265 0 : if (!mValue.mConstrainBooleanParameters.Value().ToObjectInternal(cx, rval)) {
266 0 : return false;
267 : }
268 0 : return true;
269 : break;
270 : }
271 : default: {
272 0 : return false;
273 : break;
274 : }
275 : }
276 :
277 : return false;
278 : }
279 :
280 : void
281 0 : OwningBooleanOrConstrainBooleanParameters::TraceUnion(JSTracer* trc)
282 : {
283 0 : }
284 :
285 : OwningBooleanOrConstrainBooleanParameters&
286 0 : OwningBooleanOrConstrainBooleanParameters::operator=(const OwningBooleanOrConstrainBooleanParameters& aOther)
287 : {
288 0 : switch (aOther.mType) {
289 : case eUninitialized: {
290 0 : MOZ_ASSERT(mType == eUninitialized,
291 : "We need to destroy ourselves?");
292 0 : break;
293 : }
294 : case eBoolean: {
295 0 : SetAsBoolean() = aOther.GetAsBoolean();
296 0 : break;
297 : }
298 : case eConstrainBooleanParameters: {
299 0 : SetAsConstrainBooleanParameters() = aOther.GetAsConstrainBooleanParameters();
300 0 : break;
301 : }
302 : }
303 0 : return *this;
304 : }
305 :
306 :
307 : bool
308 0 : DoubleOrConstrainDoubleRange::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
309 : {
310 0 : switch (mType) {
311 : case eUninitialized: {
312 0 : return false;
313 : break;
314 : }
315 : case eDouble: {
316 0 : rval.set(JS_NumberValue(double(mValue.mDouble.Value())));
317 0 : return true;
318 : break;
319 : }
320 : case eConstrainDoubleRange: {
321 0 : if (!mValue.mConstrainDoubleRange.Value().ToObjectInternal(cx, rval)) {
322 0 : return false;
323 : }
324 0 : return true;
325 : break;
326 : }
327 : default: {
328 0 : return false;
329 : break;
330 : }
331 : }
332 :
333 : return false;
334 : }
335 :
336 :
337 : double&
338 0 : OwningDoubleOrConstrainDoubleRange::RawSetAsDouble()
339 : {
340 0 : if (mType == eDouble) {
341 0 : return mValue.mDouble.Value();
342 : }
343 0 : MOZ_ASSERT(mType == eUninitialized);
344 0 : mType = eDouble;
345 0 : return mValue.mDouble.SetValue();
346 : }
347 :
348 : double&
349 0 : OwningDoubleOrConstrainDoubleRange::SetAsDouble()
350 : {
351 0 : if (mType == eDouble) {
352 0 : return mValue.mDouble.Value();
353 : }
354 0 : Uninit();
355 0 : mType = eDouble;
356 0 : return mValue.mDouble.SetValue();
357 : }
358 :
359 : bool
360 0 : OwningDoubleOrConstrainDoubleRange::TrySetToDouble(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
361 : {
362 0 : tryNext = false;
363 : { // scope for memberSlot
364 0 : double& memberSlot = RawSetAsDouble();
365 0 : if (!ValueToPrimitive<double, eDefault>(cx, value, &memberSlot)) {
366 0 : return false;
367 0 : } else if (!mozilla::IsFinite(memberSlot)) {
368 0 : ThrowErrorMessage(cx, MSG_NOT_FINITE, "Member of DoubleOrConstrainDoubleRange");
369 0 : return false;
370 : }
371 : }
372 0 : return true;
373 : }
374 :
375 : void
376 0 : OwningDoubleOrConstrainDoubleRange::DestroyDouble()
377 : {
378 0 : MOZ_ASSERT(IsDouble(), "Wrong type!");
379 0 : mValue.mDouble.Destroy();
380 0 : mType = eUninitialized;
381 0 : }
382 :
383 :
384 :
385 :
386 : ConstrainDoubleRange&
387 0 : OwningDoubleOrConstrainDoubleRange::RawSetAsConstrainDoubleRange()
388 : {
389 0 : if (mType == eConstrainDoubleRange) {
390 0 : return mValue.mConstrainDoubleRange.Value();
391 : }
392 0 : MOZ_ASSERT(mType == eUninitialized);
393 0 : mType = eConstrainDoubleRange;
394 0 : return mValue.mConstrainDoubleRange.SetValue();
395 : }
396 :
397 : ConstrainDoubleRange&
398 0 : OwningDoubleOrConstrainDoubleRange::SetAsConstrainDoubleRange()
399 : {
400 0 : if (mType == eConstrainDoubleRange) {
401 0 : return mValue.mConstrainDoubleRange.Value();
402 : }
403 0 : Uninit();
404 0 : mType = eConstrainDoubleRange;
405 0 : return mValue.mConstrainDoubleRange.SetValue();
406 : }
407 :
408 : bool
409 0 : OwningDoubleOrConstrainDoubleRange::TrySetToConstrainDoubleRange(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
410 : {
411 0 : tryNext = false;
412 : { // scope for memberSlot
413 0 : ConstrainDoubleRange& memberSlot = RawSetAsConstrainDoubleRange();
414 0 : if (!IsConvertibleToDictionary(value)) {
415 0 : DestroyConstrainDoubleRange();
416 0 : tryNext = true;
417 0 : return true;
418 : }
419 0 : if (!memberSlot.Init(cx, value, "Member of DoubleOrConstrainDoubleRange", passedToJSImpl)) {
420 0 : return false;
421 : }
422 : }
423 0 : return true;
424 : }
425 :
426 : void
427 0 : OwningDoubleOrConstrainDoubleRange::DestroyConstrainDoubleRange()
428 : {
429 0 : MOZ_ASSERT(IsConstrainDoubleRange(), "Wrong type!");
430 0 : mValue.mConstrainDoubleRange.Destroy();
431 0 : mType = eUninitialized;
432 0 : }
433 :
434 :
435 :
436 :
437 : void
438 0 : OwningDoubleOrConstrainDoubleRange::Uninit()
439 : {
440 0 : switch (mType) {
441 : case eUninitialized: {
442 0 : break;
443 : }
444 : case eDouble: {
445 0 : DestroyDouble();
446 0 : break;
447 : }
448 : case eConstrainDoubleRange: {
449 0 : DestroyConstrainDoubleRange();
450 0 : break;
451 : }
452 : }
453 0 : }
454 :
455 : bool
456 0 : OwningDoubleOrConstrainDoubleRange::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
457 : {
458 0 : switch (mType) {
459 : case eUninitialized: {
460 0 : return false;
461 : break;
462 : }
463 : case eDouble: {
464 0 : rval.set(JS_NumberValue(double(mValue.mDouble.Value())));
465 0 : return true;
466 : break;
467 : }
468 : case eConstrainDoubleRange: {
469 0 : if (!mValue.mConstrainDoubleRange.Value().ToObjectInternal(cx, rval)) {
470 0 : return false;
471 : }
472 0 : return true;
473 : break;
474 : }
475 : default: {
476 0 : return false;
477 : break;
478 : }
479 : }
480 :
481 : return false;
482 : }
483 :
484 : void
485 0 : OwningDoubleOrConstrainDoubleRange::TraceUnion(JSTracer* trc)
486 : {
487 0 : }
488 :
489 : OwningDoubleOrConstrainDoubleRange&
490 0 : OwningDoubleOrConstrainDoubleRange::operator=(const OwningDoubleOrConstrainDoubleRange& aOther)
491 : {
492 0 : switch (aOther.mType) {
493 : case eUninitialized: {
494 0 : MOZ_ASSERT(mType == eUninitialized,
495 : "We need to destroy ourselves?");
496 0 : break;
497 : }
498 : case eDouble: {
499 0 : SetAsDouble() = aOther.GetAsDouble();
500 0 : break;
501 : }
502 : case eConstrainDoubleRange: {
503 0 : SetAsConstrainDoubleRange() = aOther.GetAsConstrainDoubleRange();
504 0 : break;
505 : }
506 : }
507 0 : return *this;
508 : }
509 :
510 :
511 : bool
512 0 : LongOrConstrainLongRange::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
513 : {
514 0 : switch (mType) {
515 : case eUninitialized: {
516 0 : return false;
517 : break;
518 : }
519 : case eLong: {
520 0 : rval.setInt32(int32_t(mValue.mLong.Value()));
521 0 : return true;
522 : break;
523 : }
524 : case eConstrainLongRange: {
525 0 : if (!mValue.mConstrainLongRange.Value().ToObjectInternal(cx, rval)) {
526 0 : return false;
527 : }
528 0 : return true;
529 : break;
530 : }
531 : default: {
532 0 : return false;
533 : break;
534 : }
535 : }
536 :
537 : return false;
538 : }
539 :
540 :
541 : int32_t&
542 0 : OwningLongOrConstrainLongRange::RawSetAsLong()
543 : {
544 0 : if (mType == eLong) {
545 0 : return mValue.mLong.Value();
546 : }
547 0 : MOZ_ASSERT(mType == eUninitialized);
548 0 : mType = eLong;
549 0 : return mValue.mLong.SetValue();
550 : }
551 :
552 : int32_t&
553 0 : OwningLongOrConstrainLongRange::SetAsLong()
554 : {
555 0 : if (mType == eLong) {
556 0 : return mValue.mLong.Value();
557 : }
558 0 : Uninit();
559 0 : mType = eLong;
560 0 : return mValue.mLong.SetValue();
561 : }
562 :
563 : bool
564 0 : OwningLongOrConstrainLongRange::TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
565 : {
566 0 : tryNext = false;
567 : { // scope for memberSlot
568 0 : int32_t& memberSlot = RawSetAsLong();
569 0 : if (!ValueToPrimitive<int32_t, eDefault>(cx, value, &memberSlot)) {
570 0 : return false;
571 : }
572 : }
573 0 : return true;
574 : }
575 :
576 : void
577 0 : OwningLongOrConstrainLongRange::DestroyLong()
578 : {
579 0 : MOZ_ASSERT(IsLong(), "Wrong type!");
580 0 : mValue.mLong.Destroy();
581 0 : mType = eUninitialized;
582 0 : }
583 :
584 :
585 :
586 :
587 : ConstrainLongRange&
588 0 : OwningLongOrConstrainLongRange::RawSetAsConstrainLongRange()
589 : {
590 0 : if (mType == eConstrainLongRange) {
591 0 : return mValue.mConstrainLongRange.Value();
592 : }
593 0 : MOZ_ASSERT(mType == eUninitialized);
594 0 : mType = eConstrainLongRange;
595 0 : return mValue.mConstrainLongRange.SetValue();
596 : }
597 :
598 : ConstrainLongRange&
599 0 : OwningLongOrConstrainLongRange::SetAsConstrainLongRange()
600 : {
601 0 : if (mType == eConstrainLongRange) {
602 0 : return mValue.mConstrainLongRange.Value();
603 : }
604 0 : Uninit();
605 0 : mType = eConstrainLongRange;
606 0 : return mValue.mConstrainLongRange.SetValue();
607 : }
608 :
609 : bool
610 0 : OwningLongOrConstrainLongRange::TrySetToConstrainLongRange(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
611 : {
612 0 : tryNext = false;
613 : { // scope for memberSlot
614 0 : ConstrainLongRange& memberSlot = RawSetAsConstrainLongRange();
615 0 : if (!IsConvertibleToDictionary(value)) {
616 0 : DestroyConstrainLongRange();
617 0 : tryNext = true;
618 0 : return true;
619 : }
620 0 : if (!memberSlot.Init(cx, value, "Member of LongOrConstrainLongRange", passedToJSImpl)) {
621 0 : return false;
622 : }
623 : }
624 0 : return true;
625 : }
626 :
627 : void
628 0 : OwningLongOrConstrainLongRange::DestroyConstrainLongRange()
629 : {
630 0 : MOZ_ASSERT(IsConstrainLongRange(), "Wrong type!");
631 0 : mValue.mConstrainLongRange.Destroy();
632 0 : mType = eUninitialized;
633 0 : }
634 :
635 :
636 :
637 :
638 : void
639 0 : OwningLongOrConstrainLongRange::Uninit()
640 : {
641 0 : switch (mType) {
642 : case eUninitialized: {
643 0 : break;
644 : }
645 : case eLong: {
646 0 : DestroyLong();
647 0 : break;
648 : }
649 : case eConstrainLongRange: {
650 0 : DestroyConstrainLongRange();
651 0 : break;
652 : }
653 : }
654 0 : }
655 :
656 : bool
657 0 : OwningLongOrConstrainLongRange::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
658 : {
659 0 : switch (mType) {
660 : case eUninitialized: {
661 0 : return false;
662 : break;
663 : }
664 : case eLong: {
665 0 : rval.setInt32(int32_t(mValue.mLong.Value()));
666 0 : return true;
667 : break;
668 : }
669 : case eConstrainLongRange: {
670 0 : if (!mValue.mConstrainLongRange.Value().ToObjectInternal(cx, rval)) {
671 0 : return false;
672 : }
673 0 : return true;
674 : break;
675 : }
676 : default: {
677 0 : return false;
678 : break;
679 : }
680 : }
681 :
682 : return false;
683 : }
684 :
685 : void
686 0 : OwningLongOrConstrainLongRange::TraceUnion(JSTracer* trc)
687 : {
688 0 : }
689 :
690 : OwningLongOrConstrainLongRange&
691 0 : OwningLongOrConstrainLongRange::operator=(const OwningLongOrConstrainLongRange& aOther)
692 : {
693 0 : switch (aOther.mType) {
694 : case eUninitialized: {
695 0 : MOZ_ASSERT(mType == eUninitialized,
696 : "We need to destroy ourselves?");
697 0 : break;
698 : }
699 : case eLong: {
700 0 : SetAsLong() = aOther.GetAsLong();
701 0 : break;
702 : }
703 : case eConstrainLongRange: {
704 0 : SetAsConstrainLongRange() = aOther.GetAsConstrainLongRange();
705 0 : break;
706 : }
707 : }
708 0 : return *this;
709 : }
710 :
711 :
712 : bool
713 0 : StringOrStringSequenceOrConstrainDOMStringParameters::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
714 : {
715 0 : switch (mType) {
716 : case eUninitialized: {
717 0 : return false;
718 : break;
719 : }
720 : case eString: {
721 0 : if (!xpc::NonVoidStringToJsval(cx, mValue.mString.Value(), rval)) {
722 0 : return false;
723 : }
724 0 : return true;
725 : break;
726 : }
727 : case eStringSequence: {
728 :
729 0 : uint32_t length = mValue.mStringSequence.Value().Length();
730 0 : JS::Rooted<JSObject*> returnArray(cx, JS_NewArrayObject(cx, length));
731 0 : if (!returnArray) {
732 0 : return false;
733 : }
734 : // Scope for 'tmp'
735 : {
736 0 : JS::Rooted<JS::Value> tmp(cx);
737 0 : for (uint32_t sequenceIdx0 = 0; sequenceIdx0 < length; ++sequenceIdx0) {
738 : // Control block to let us common up the JS_DefineElement calls when there
739 : // are different ways to succeed at wrapping the object.
740 : do {
741 0 : if (!xpc::NonVoidStringToJsval(cx, mValue.mStringSequence.Value()[sequenceIdx0], &tmp)) {
742 0 : return false;
743 : }
744 0 : break;
745 : } while (0);
746 0 : if (!JS_DefineElement(cx, returnArray, sequenceIdx0, tmp,
747 : JSPROP_ENUMERATE)) {
748 0 : return false;
749 : }
750 : }
751 : }
752 0 : rval.setObject(*returnArray);
753 0 : return true;
754 : break;
755 : }
756 : case eConstrainDOMStringParameters: {
757 0 : if (!mValue.mConstrainDOMStringParameters.Value().ToObjectInternal(cx, rval)) {
758 0 : return false;
759 : }
760 0 : return true;
761 : break;
762 : }
763 : default: {
764 0 : return false;
765 : break;
766 : }
767 : }
768 :
769 : return false;
770 : }
771 :
772 :
773 : nsString&
774 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::RawSetAsString()
775 : {
776 0 : if (mType == eString) {
777 0 : return mValue.mString.Value();
778 : }
779 0 : MOZ_ASSERT(mType == eUninitialized);
780 0 : mType = eString;
781 0 : return mValue.mString.SetValue();
782 : }
783 :
784 : nsString&
785 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::SetAsString()
786 : {
787 0 : if (mType == eString) {
788 0 : return mValue.mString.Value();
789 : }
790 0 : Uninit();
791 0 : mType = eString;
792 0 : return mValue.mString.SetValue();
793 : }
794 :
795 : bool
796 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
797 : {
798 0 : tryNext = false;
799 : { // scope for memberSlot
800 0 : nsString& memberSlot = RawSetAsString();
801 0 : if (!ConvertJSValueToString(cx, value, eStringify, eStringify, memberSlot)) {
802 0 : return false;
803 : }
804 : }
805 0 : return true;
806 : }
807 :
808 :
809 : void
810 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::DestroyString()
811 : {
812 0 : MOZ_ASSERT(IsString(), "Wrong type!");
813 0 : mValue.mString.Destroy();
814 0 : mType = eUninitialized;
815 0 : }
816 :
817 :
818 :
819 :
820 : Sequence<nsString>&
821 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::RawSetAsStringSequence()
822 : {
823 0 : if (mType == eStringSequence) {
824 0 : return mValue.mStringSequence.Value();
825 : }
826 0 : MOZ_ASSERT(mType == eUninitialized);
827 0 : mType = eStringSequence;
828 0 : return mValue.mStringSequence.SetValue();
829 : }
830 :
831 : Sequence<nsString>&
832 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::SetAsStringSequence()
833 : {
834 0 : if (mType == eStringSequence) {
835 0 : return mValue.mStringSequence.Value();
836 : }
837 0 : Uninit();
838 0 : mType = eStringSequence;
839 0 : return mValue.mStringSequence.SetValue();
840 : }
841 :
842 : bool
843 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::TrySetToStringSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
844 : {
845 0 : tryNext = false;
846 : { // scope for memberSlot
847 0 : Sequence<nsString>& memberSlot = RawSetAsStringSequence();
848 0 : JS::ForOfIterator iter(cx);
849 0 : if (!iter.init(value, JS::ForOfIterator::AllowNonIterable)) {
850 0 : return false;
851 : }
852 0 : if (!iter.valueIsIterable()) {
853 0 : DestroyStringSequence();
854 0 : tryNext = true;
855 0 : return true;
856 : }
857 0 : Sequence<nsString> &arr = memberSlot;
858 0 : JS::Rooted<JS::Value> temp(cx);
859 : while (true) {
860 : bool done;
861 0 : if (!iter.next(&temp, &done)) {
862 0 : return false;
863 : }
864 0 : if (done) {
865 0 : break;
866 : }
867 0 : nsString* slotPtr = arr.AppendElement(mozilla::fallible);
868 0 : if (!slotPtr) {
869 0 : JS_ReportOutOfMemory(cx);
870 0 : return false;
871 : }
872 0 : nsString& slot = *slotPtr;
873 0 : if (!ConvertJSValueToString(cx, temp, eStringify, eStringify, slot)) {
874 0 : return false;
875 : }
876 0 : }
877 : }
878 0 : return true;
879 : }
880 :
881 : void
882 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::DestroyStringSequence()
883 : {
884 0 : MOZ_ASSERT(IsStringSequence(), "Wrong type!");
885 0 : mValue.mStringSequence.Destroy();
886 0 : mType = eUninitialized;
887 0 : }
888 :
889 :
890 :
891 :
892 : ConstrainDOMStringParameters&
893 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::RawSetAsConstrainDOMStringParameters()
894 : {
895 0 : if (mType == eConstrainDOMStringParameters) {
896 0 : return mValue.mConstrainDOMStringParameters.Value();
897 : }
898 0 : MOZ_ASSERT(mType == eUninitialized);
899 0 : mType = eConstrainDOMStringParameters;
900 0 : return mValue.mConstrainDOMStringParameters.SetValue();
901 : }
902 :
903 : ConstrainDOMStringParameters&
904 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::SetAsConstrainDOMStringParameters()
905 : {
906 0 : if (mType == eConstrainDOMStringParameters) {
907 0 : return mValue.mConstrainDOMStringParameters.Value();
908 : }
909 0 : Uninit();
910 0 : mType = eConstrainDOMStringParameters;
911 0 : return mValue.mConstrainDOMStringParameters.SetValue();
912 : }
913 :
914 : bool
915 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::TrySetToConstrainDOMStringParameters(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl)
916 : {
917 0 : tryNext = false;
918 : { // scope for memberSlot
919 0 : ConstrainDOMStringParameters& memberSlot = RawSetAsConstrainDOMStringParameters();
920 0 : if (!IsConvertibleToDictionary(value)) {
921 0 : DestroyConstrainDOMStringParameters();
922 0 : tryNext = true;
923 0 : return true;
924 : }
925 0 : if (!memberSlot.Init(cx, value, "Member of StringOrStringSequenceOrConstrainDOMStringParameters", passedToJSImpl)) {
926 0 : return false;
927 : }
928 : }
929 0 : return true;
930 : }
931 :
932 : void
933 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::DestroyConstrainDOMStringParameters()
934 : {
935 0 : MOZ_ASSERT(IsConstrainDOMStringParameters(), "Wrong type!");
936 0 : mValue.mConstrainDOMStringParameters.Destroy();
937 0 : mType = eUninitialized;
938 0 : }
939 :
940 :
941 :
942 :
943 : void
944 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::Uninit()
945 : {
946 0 : switch (mType) {
947 : case eUninitialized: {
948 0 : break;
949 : }
950 : case eString: {
951 0 : DestroyString();
952 0 : break;
953 : }
954 : case eStringSequence: {
955 0 : DestroyStringSequence();
956 0 : break;
957 : }
958 : case eConstrainDOMStringParameters: {
959 0 : DestroyConstrainDOMStringParameters();
960 0 : break;
961 : }
962 : }
963 0 : }
964 :
965 : bool
966 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const
967 : {
968 0 : switch (mType) {
969 : case eUninitialized: {
970 0 : return false;
971 : break;
972 : }
973 : case eString: {
974 0 : if (!xpc::NonVoidStringToJsval(cx, mValue.mString.Value(), rval)) {
975 0 : return false;
976 : }
977 0 : return true;
978 : break;
979 : }
980 : case eStringSequence: {
981 :
982 0 : uint32_t length = mValue.mStringSequence.Value().Length();
983 0 : JS::Rooted<JSObject*> returnArray(cx, JS_NewArrayObject(cx, length));
984 0 : if (!returnArray) {
985 0 : return false;
986 : }
987 : // Scope for 'tmp'
988 : {
989 0 : JS::Rooted<JS::Value> tmp(cx);
990 0 : for (uint32_t sequenceIdx0 = 0; sequenceIdx0 < length; ++sequenceIdx0) {
991 : // Control block to let us common up the JS_DefineElement calls when there
992 : // are different ways to succeed at wrapping the object.
993 : do {
994 0 : if (!xpc::NonVoidStringToJsval(cx, mValue.mStringSequence.Value()[sequenceIdx0], &tmp)) {
995 0 : return false;
996 : }
997 0 : break;
998 : } while (0);
999 0 : if (!JS_DefineElement(cx, returnArray, sequenceIdx0, tmp,
1000 : JSPROP_ENUMERATE)) {
1001 0 : return false;
1002 : }
1003 : }
1004 : }
1005 0 : rval.setObject(*returnArray);
1006 0 : return true;
1007 : break;
1008 : }
1009 : case eConstrainDOMStringParameters: {
1010 0 : if (!mValue.mConstrainDOMStringParameters.Value().ToObjectInternal(cx, rval)) {
1011 0 : return false;
1012 : }
1013 0 : return true;
1014 : break;
1015 : }
1016 : default: {
1017 0 : return false;
1018 : break;
1019 : }
1020 : }
1021 :
1022 : return false;
1023 : }
1024 :
1025 : void
1026 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::TraceUnion(JSTracer* trc)
1027 : {
1028 0 : }
1029 :
1030 : OwningStringOrStringSequenceOrConstrainDOMStringParameters&
1031 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters::operator=(const OwningStringOrStringSequenceOrConstrainDOMStringParameters& aOther)
1032 : {
1033 0 : switch (aOther.mType) {
1034 : case eUninitialized: {
1035 0 : MOZ_ASSERT(mType == eUninitialized,
1036 : "We need to destroy ourselves?");
1037 0 : break;
1038 : }
1039 : case eString: {
1040 0 : SetAsString() = aOther.GetAsString();
1041 0 : break;
1042 : }
1043 : case eStringSequence: {
1044 0 : SetAsStringSequence() = aOther.GetAsStringSequence();
1045 0 : break;
1046 : }
1047 : case eConstrainDOMStringParameters: {
1048 0 : SetAsConstrainDOMStringParameters() = aOther.GetAsConstrainDOMStringParameters();
1049 0 : break;
1050 : }
1051 : }
1052 0 : return *this;
1053 : }
1054 :
1055 :
1056 :
1057 0 : MediaTrackConstraintSet::MediaTrackConstraintSet()
1058 : {
1059 : // Safe to pass a null context if we pass a null value
1060 0 : Init(nullptr, JS::NullHandleValue);
1061 0 : }
1062 :
1063 :
1064 :
1065 : bool
1066 0 : MediaTrackConstraintSet::InitIds(JSContext* cx, MediaTrackConstraintSetAtoms* atomsCache)
1067 : {
1068 0 : MOZ_ASSERT(!*reinterpret_cast<jsid**>(atomsCache));
1069 :
1070 : // Initialize these in reverse order so that any failure leaves the first one
1071 : // uninitialized.
1072 0 : if (!atomsCache->width_id.init(cx, "width") ||
1073 0 : !atomsCache->viewportWidth_id.init(cx, "viewportWidth") ||
1074 0 : !atomsCache->viewportOffsetY_id.init(cx, "viewportOffsetY") ||
1075 0 : !atomsCache->viewportOffsetX_id.init(cx, "viewportOffsetX") ||
1076 0 : !atomsCache->viewportHeight_id.init(cx, "viewportHeight") ||
1077 0 : !atomsCache->scrollWithPage_id.init(cx, "scrollWithPage") ||
1078 0 : !atomsCache->noiseSuppression_id.init(cx, "noiseSuppression") ||
1079 0 : !atomsCache->mozNoiseSuppression_id.init(cx, "mozNoiseSuppression") ||
1080 0 : !atomsCache->mozAutoGainControl_id.init(cx, "mozAutoGainControl") ||
1081 0 : !atomsCache->mediaSource_id.init(cx, "mediaSource") ||
1082 0 : !atomsCache->height_id.init(cx, "height") ||
1083 0 : !atomsCache->frameRate_id.init(cx, "frameRate") ||
1084 0 : !atomsCache->facingMode_id.init(cx, "facingMode") ||
1085 0 : !atomsCache->echoCancellation_id.init(cx, "echoCancellation") ||
1086 0 : !atomsCache->deviceId_id.init(cx, "deviceId") ||
1087 0 : !atomsCache->channelCount_id.init(cx, "channelCount") ||
1088 0 : !atomsCache->browserWindow_id.init(cx, "browserWindow") ||
1089 0 : !atomsCache->autoGainControl_id.init(cx, "autoGainControl")) {
1090 0 : return false;
1091 : }
1092 0 : return true;
1093 : }
1094 :
1095 : bool
1096 0 : MediaTrackConstraintSet::Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription, bool passedToJSImpl)
1097 : {
1098 : // Passing a null JSContext is OK only if we're initing from null,
1099 : // Since in that case we will not have to do any property gets
1100 : // Also evaluate isNullOrUndefined in order to avoid false-positive
1101 : // checkers by static analysis tools
1102 0 : MOZ_ASSERT_IF(!cx, val.isNull() && val.isNullOrUndefined());
1103 0 : MediaTrackConstraintSetAtoms* atomsCache = nullptr;
1104 0 : if (cx) {
1105 0 : atomsCache = GetAtomCache<MediaTrackConstraintSetAtoms>(cx);
1106 0 : if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
1107 0 : return false;
1108 : }
1109 : }
1110 :
1111 0 : if (!IsConvertibleToDictionary(val)) {
1112 0 : return ThrowErrorMessage(cx, MSG_NOT_DICTIONARY, sourceDescription);
1113 : }
1114 :
1115 0 : bool isNull = val.isNullOrUndefined();
1116 : // We only need these if !isNull, in which case we have |cx|.
1117 0 : Maybe<JS::Rooted<JSObject *> > object;
1118 0 : Maybe<JS::Rooted<JS::Value> > temp;
1119 0 : if (!isNull) {
1120 0 : MOZ_ASSERT(cx);
1121 0 : object.emplace(cx, &val.toObject());
1122 0 : temp.emplace(cx);
1123 : }
1124 0 : if (!isNull) {
1125 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->autoGainControl_id, temp.ptr())) {
1126 0 : return false;
1127 : }
1128 : }
1129 0 : mAutoGainControl.Uninit();
1130 0 : if (!(!isNull && !temp->isUndefined())) {
1131 0 : if (!mAutoGainControl.RawSetAsConstrainBooleanParameters().Init(cx, JS::NullHandleValue, "Member of BooleanOrConstrainBooleanParameters")) {
1132 0 : return false;
1133 : }
1134 : } else {
1135 : {
1136 0 : bool done = false, failed = false, tryNext;
1137 0 : if (!done) {
1138 0 : done = (failed = !mAutoGainControl.TrySetToConstrainBooleanParameters(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1139 : }
1140 0 : if (!done) {
1141 : do {
1142 0 : done = (failed = !mAutoGainControl.TrySetToBoolean(cx, temp.ref(), tryNext)) || !tryNext;
1143 0 : break;
1144 : } while (0);
1145 : }
1146 0 : if (failed) {
1147 0 : return false;
1148 : }
1149 0 : if (!done) {
1150 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'autoGainControl' member of MediaTrackConstraintSet", "ConstrainBooleanParameters");
1151 0 : return false;
1152 : }
1153 : }
1154 : }
1155 0 : mIsAnyMemberPresent = true;
1156 :
1157 0 : if (!isNull) {
1158 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->browserWindow_id, temp.ptr())) {
1159 0 : return false;
1160 : }
1161 : }
1162 0 : if (!isNull && !temp->isUndefined()) {
1163 0 : mBrowserWindow.Construct();
1164 0 : if (!ValueToPrimitive<int64_t, eDefault>(cx, temp.ref(), &(mBrowserWindow.Value()))) {
1165 0 : return false;
1166 : }
1167 0 : mIsAnyMemberPresent = true;
1168 : }
1169 :
1170 0 : if (!isNull) {
1171 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->channelCount_id, temp.ptr())) {
1172 0 : return false;
1173 : }
1174 : }
1175 0 : mChannelCount.Uninit();
1176 0 : if (!(!isNull && !temp->isUndefined())) {
1177 0 : if (!mChannelCount.RawSetAsConstrainLongRange().Init(cx, JS::NullHandleValue, "Member of LongOrConstrainLongRange")) {
1178 0 : return false;
1179 : }
1180 : } else {
1181 : {
1182 0 : bool done = false, failed = false, tryNext;
1183 0 : if (!done) {
1184 0 : done = (failed = !mChannelCount.TrySetToConstrainLongRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1185 : }
1186 0 : if (!done) {
1187 : do {
1188 0 : done = (failed = !mChannelCount.TrySetToLong(cx, temp.ref(), tryNext)) || !tryNext;
1189 0 : break;
1190 : } while (0);
1191 : }
1192 0 : if (failed) {
1193 0 : return false;
1194 : }
1195 0 : if (!done) {
1196 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'channelCount' member of MediaTrackConstraintSet", "ConstrainLongRange");
1197 0 : return false;
1198 : }
1199 : }
1200 : }
1201 0 : mIsAnyMemberPresent = true;
1202 :
1203 0 : if (!isNull) {
1204 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->deviceId_id, temp.ptr())) {
1205 0 : return false;
1206 : }
1207 : }
1208 0 : mDeviceId.Uninit();
1209 0 : if (!(!isNull && !temp->isUndefined())) {
1210 0 : if (!mDeviceId.RawSetAsConstrainDOMStringParameters().Init(cx, JS::NullHandleValue, "Member of StringOrStringSequenceOrConstrainDOMStringParameters")) {
1211 0 : return false;
1212 : }
1213 : } else {
1214 : {
1215 0 : bool done = false, failed = false, tryNext;
1216 0 : if (temp.ref().isObject()) {
1217 0 : done = (failed = !mDeviceId.TrySetToStringSequence(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1218 : }
1219 0 : if (!done) {
1220 0 : done = (failed = !mDeviceId.TrySetToConstrainDOMStringParameters(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1221 : }
1222 0 : if (!done) {
1223 : do {
1224 0 : done = (failed = !mDeviceId.TrySetToString(cx, temp.ref(), tryNext)) || !tryNext;
1225 0 : break;
1226 : } while (0);
1227 : }
1228 0 : if (failed) {
1229 0 : return false;
1230 : }
1231 0 : if (!done) {
1232 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'deviceId' member of MediaTrackConstraintSet", "StringSequence, ConstrainDOMStringParameters");
1233 0 : return false;
1234 : }
1235 : }
1236 : }
1237 0 : mIsAnyMemberPresent = true;
1238 :
1239 0 : if (!isNull) {
1240 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->echoCancellation_id, temp.ptr())) {
1241 0 : return false;
1242 : }
1243 : }
1244 0 : mEchoCancellation.Uninit();
1245 0 : if (!(!isNull && !temp->isUndefined())) {
1246 0 : if (!mEchoCancellation.RawSetAsConstrainBooleanParameters().Init(cx, JS::NullHandleValue, "Member of BooleanOrConstrainBooleanParameters")) {
1247 0 : return false;
1248 : }
1249 : } else {
1250 : {
1251 0 : bool done = false, failed = false, tryNext;
1252 0 : if (!done) {
1253 0 : done = (failed = !mEchoCancellation.TrySetToConstrainBooleanParameters(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1254 : }
1255 0 : if (!done) {
1256 : do {
1257 0 : done = (failed = !mEchoCancellation.TrySetToBoolean(cx, temp.ref(), tryNext)) || !tryNext;
1258 0 : break;
1259 : } while (0);
1260 : }
1261 0 : if (failed) {
1262 0 : return false;
1263 : }
1264 0 : if (!done) {
1265 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'echoCancellation' member of MediaTrackConstraintSet", "ConstrainBooleanParameters");
1266 0 : return false;
1267 : }
1268 : }
1269 : }
1270 0 : mIsAnyMemberPresent = true;
1271 :
1272 0 : if (!isNull) {
1273 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->facingMode_id, temp.ptr())) {
1274 0 : return false;
1275 : }
1276 : }
1277 0 : mFacingMode.Uninit();
1278 0 : if (!(!isNull && !temp->isUndefined())) {
1279 0 : if (!mFacingMode.RawSetAsConstrainDOMStringParameters().Init(cx, JS::NullHandleValue, "Member of StringOrStringSequenceOrConstrainDOMStringParameters")) {
1280 0 : return false;
1281 : }
1282 : } else {
1283 : {
1284 0 : bool done = false, failed = false, tryNext;
1285 0 : if (temp.ref().isObject()) {
1286 0 : done = (failed = !mFacingMode.TrySetToStringSequence(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1287 : }
1288 0 : if (!done) {
1289 0 : done = (failed = !mFacingMode.TrySetToConstrainDOMStringParameters(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1290 : }
1291 0 : if (!done) {
1292 : do {
1293 0 : done = (failed = !mFacingMode.TrySetToString(cx, temp.ref(), tryNext)) || !tryNext;
1294 0 : break;
1295 : } while (0);
1296 : }
1297 0 : if (failed) {
1298 0 : return false;
1299 : }
1300 0 : if (!done) {
1301 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'facingMode' member of MediaTrackConstraintSet", "StringSequence, ConstrainDOMStringParameters");
1302 0 : return false;
1303 : }
1304 : }
1305 : }
1306 0 : mIsAnyMemberPresent = true;
1307 :
1308 0 : if (!isNull) {
1309 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->frameRate_id, temp.ptr())) {
1310 0 : return false;
1311 : }
1312 : }
1313 0 : mFrameRate.Uninit();
1314 0 : if (!(!isNull && !temp->isUndefined())) {
1315 0 : if (!mFrameRate.RawSetAsConstrainDoubleRange().Init(cx, JS::NullHandleValue, "Member of DoubleOrConstrainDoubleRange")) {
1316 0 : return false;
1317 : }
1318 : } else {
1319 : {
1320 0 : bool done = false, failed = false, tryNext;
1321 0 : if (!done) {
1322 0 : done = (failed = !mFrameRate.TrySetToConstrainDoubleRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1323 : }
1324 0 : if (!done) {
1325 : do {
1326 0 : done = (failed = !mFrameRate.TrySetToDouble(cx, temp.ref(), tryNext)) || !tryNext;
1327 0 : break;
1328 : } while (0);
1329 : }
1330 0 : if (failed) {
1331 0 : return false;
1332 : }
1333 0 : if (!done) {
1334 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'frameRate' member of MediaTrackConstraintSet", "ConstrainDoubleRange");
1335 0 : return false;
1336 : }
1337 : }
1338 : }
1339 0 : mIsAnyMemberPresent = true;
1340 :
1341 0 : if (!isNull) {
1342 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->height_id, temp.ptr())) {
1343 0 : return false;
1344 : }
1345 : }
1346 0 : mHeight.Uninit();
1347 0 : if (!(!isNull && !temp->isUndefined())) {
1348 0 : if (!mHeight.RawSetAsConstrainLongRange().Init(cx, JS::NullHandleValue, "Member of LongOrConstrainLongRange")) {
1349 0 : return false;
1350 : }
1351 : } else {
1352 : {
1353 0 : bool done = false, failed = false, tryNext;
1354 0 : if (!done) {
1355 0 : done = (failed = !mHeight.TrySetToConstrainLongRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1356 : }
1357 0 : if (!done) {
1358 : do {
1359 0 : done = (failed = !mHeight.TrySetToLong(cx, temp.ref(), tryNext)) || !tryNext;
1360 0 : break;
1361 : } while (0);
1362 : }
1363 0 : if (failed) {
1364 0 : return false;
1365 : }
1366 0 : if (!done) {
1367 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'height' member of MediaTrackConstraintSet", "ConstrainLongRange");
1368 0 : return false;
1369 : }
1370 : }
1371 : }
1372 0 : mIsAnyMemberPresent = true;
1373 :
1374 0 : if (!isNull) {
1375 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->mediaSource_id, temp.ptr())) {
1376 0 : return false;
1377 : }
1378 : }
1379 0 : if (!isNull && !temp->isUndefined()) {
1380 0 : if (!ConvertJSValueToString(cx, temp.ref(), eStringify, eStringify, mMediaSource)) {
1381 0 : return false;
1382 : }
1383 : } else {
1384 : static const char16_t data[] = { 'c', 'a', 'm', 'e', 'r', 'a', 0 };
1385 0 : mMediaSource.Rebind(data, ArrayLength(data) - 1);
1386 : }
1387 0 : mIsAnyMemberPresent = true;
1388 :
1389 0 : if (!isNull) {
1390 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->mozAutoGainControl_id, temp.ptr())) {
1391 0 : return false;
1392 : }
1393 : }
1394 0 : mMozAutoGainControl.Uninit();
1395 0 : if (!(!isNull && !temp->isUndefined())) {
1396 0 : if (!mMozAutoGainControl.RawSetAsConstrainBooleanParameters().Init(cx, JS::NullHandleValue, "Member of BooleanOrConstrainBooleanParameters")) {
1397 0 : return false;
1398 : }
1399 : } else {
1400 : {
1401 0 : bool done = false, failed = false, tryNext;
1402 0 : if (!done) {
1403 0 : done = (failed = !mMozAutoGainControl.TrySetToConstrainBooleanParameters(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1404 : }
1405 0 : if (!done) {
1406 : do {
1407 0 : done = (failed = !mMozAutoGainControl.TrySetToBoolean(cx, temp.ref(), tryNext)) || !tryNext;
1408 0 : break;
1409 : } while (0);
1410 : }
1411 0 : if (failed) {
1412 0 : return false;
1413 : }
1414 0 : if (!done) {
1415 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'mozAutoGainControl' member of MediaTrackConstraintSet", "ConstrainBooleanParameters");
1416 0 : return false;
1417 : }
1418 : }
1419 : }
1420 0 : mIsAnyMemberPresent = true;
1421 :
1422 0 : if (!isNull) {
1423 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->mozNoiseSuppression_id, temp.ptr())) {
1424 0 : return false;
1425 : }
1426 : }
1427 0 : mMozNoiseSuppression.Uninit();
1428 0 : if (!(!isNull && !temp->isUndefined())) {
1429 0 : if (!mMozNoiseSuppression.RawSetAsConstrainBooleanParameters().Init(cx, JS::NullHandleValue, "Member of BooleanOrConstrainBooleanParameters")) {
1430 0 : return false;
1431 : }
1432 : } else {
1433 : {
1434 0 : bool done = false, failed = false, tryNext;
1435 0 : if (!done) {
1436 0 : done = (failed = !mMozNoiseSuppression.TrySetToConstrainBooleanParameters(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1437 : }
1438 0 : if (!done) {
1439 : do {
1440 0 : done = (failed = !mMozNoiseSuppression.TrySetToBoolean(cx, temp.ref(), tryNext)) || !tryNext;
1441 0 : break;
1442 : } while (0);
1443 : }
1444 0 : if (failed) {
1445 0 : return false;
1446 : }
1447 0 : if (!done) {
1448 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'mozNoiseSuppression' member of MediaTrackConstraintSet", "ConstrainBooleanParameters");
1449 0 : return false;
1450 : }
1451 : }
1452 : }
1453 0 : mIsAnyMemberPresent = true;
1454 :
1455 0 : if (!isNull) {
1456 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->noiseSuppression_id, temp.ptr())) {
1457 0 : return false;
1458 : }
1459 : }
1460 0 : mNoiseSuppression.Uninit();
1461 0 : if (!(!isNull && !temp->isUndefined())) {
1462 0 : if (!mNoiseSuppression.RawSetAsConstrainBooleanParameters().Init(cx, JS::NullHandleValue, "Member of BooleanOrConstrainBooleanParameters")) {
1463 0 : return false;
1464 : }
1465 : } else {
1466 : {
1467 0 : bool done = false, failed = false, tryNext;
1468 0 : if (!done) {
1469 0 : done = (failed = !mNoiseSuppression.TrySetToConstrainBooleanParameters(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1470 : }
1471 0 : if (!done) {
1472 : do {
1473 0 : done = (failed = !mNoiseSuppression.TrySetToBoolean(cx, temp.ref(), tryNext)) || !tryNext;
1474 0 : break;
1475 : } while (0);
1476 : }
1477 0 : if (failed) {
1478 0 : return false;
1479 : }
1480 0 : if (!done) {
1481 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'noiseSuppression' member of MediaTrackConstraintSet", "ConstrainBooleanParameters");
1482 0 : return false;
1483 : }
1484 : }
1485 : }
1486 0 : mIsAnyMemberPresent = true;
1487 :
1488 0 : if (!isNull) {
1489 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->scrollWithPage_id, temp.ptr())) {
1490 0 : return false;
1491 : }
1492 : }
1493 0 : if (!isNull && !temp->isUndefined()) {
1494 0 : mScrollWithPage.Construct();
1495 0 : if (!ValueToPrimitive<bool, eDefault>(cx, temp.ref(), &(mScrollWithPage.Value()))) {
1496 0 : return false;
1497 : }
1498 0 : mIsAnyMemberPresent = true;
1499 : }
1500 :
1501 0 : if (!isNull) {
1502 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->viewportHeight_id, temp.ptr())) {
1503 0 : return false;
1504 : }
1505 : }
1506 0 : mViewportHeight.Uninit();
1507 0 : if (!(!isNull && !temp->isUndefined())) {
1508 0 : if (!mViewportHeight.RawSetAsConstrainLongRange().Init(cx, JS::NullHandleValue, "Member of LongOrConstrainLongRange")) {
1509 0 : return false;
1510 : }
1511 : } else {
1512 : {
1513 0 : bool done = false, failed = false, tryNext;
1514 0 : if (!done) {
1515 0 : done = (failed = !mViewportHeight.TrySetToConstrainLongRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1516 : }
1517 0 : if (!done) {
1518 : do {
1519 0 : done = (failed = !mViewportHeight.TrySetToLong(cx, temp.ref(), tryNext)) || !tryNext;
1520 0 : break;
1521 : } while (0);
1522 : }
1523 0 : if (failed) {
1524 0 : return false;
1525 : }
1526 0 : if (!done) {
1527 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'viewportHeight' member of MediaTrackConstraintSet", "ConstrainLongRange");
1528 0 : return false;
1529 : }
1530 : }
1531 : }
1532 0 : mIsAnyMemberPresent = true;
1533 :
1534 0 : if (!isNull) {
1535 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->viewportOffsetX_id, temp.ptr())) {
1536 0 : return false;
1537 : }
1538 : }
1539 0 : mViewportOffsetX.Uninit();
1540 0 : if (!(!isNull && !temp->isUndefined())) {
1541 0 : if (!mViewportOffsetX.RawSetAsConstrainLongRange().Init(cx, JS::NullHandleValue, "Member of LongOrConstrainLongRange")) {
1542 0 : return false;
1543 : }
1544 : } else {
1545 : {
1546 0 : bool done = false, failed = false, tryNext;
1547 0 : if (!done) {
1548 0 : done = (failed = !mViewportOffsetX.TrySetToConstrainLongRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1549 : }
1550 0 : if (!done) {
1551 : do {
1552 0 : done = (failed = !mViewportOffsetX.TrySetToLong(cx, temp.ref(), tryNext)) || !tryNext;
1553 0 : break;
1554 : } while (0);
1555 : }
1556 0 : if (failed) {
1557 0 : return false;
1558 : }
1559 0 : if (!done) {
1560 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'viewportOffsetX' member of MediaTrackConstraintSet", "ConstrainLongRange");
1561 0 : return false;
1562 : }
1563 : }
1564 : }
1565 0 : mIsAnyMemberPresent = true;
1566 :
1567 0 : if (!isNull) {
1568 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->viewportOffsetY_id, temp.ptr())) {
1569 0 : return false;
1570 : }
1571 : }
1572 0 : mViewportOffsetY.Uninit();
1573 0 : if (!(!isNull && !temp->isUndefined())) {
1574 0 : if (!mViewportOffsetY.RawSetAsConstrainLongRange().Init(cx, JS::NullHandleValue, "Member of LongOrConstrainLongRange")) {
1575 0 : return false;
1576 : }
1577 : } else {
1578 : {
1579 0 : bool done = false, failed = false, tryNext;
1580 0 : if (!done) {
1581 0 : done = (failed = !mViewportOffsetY.TrySetToConstrainLongRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1582 : }
1583 0 : if (!done) {
1584 : do {
1585 0 : done = (failed = !mViewportOffsetY.TrySetToLong(cx, temp.ref(), tryNext)) || !tryNext;
1586 0 : break;
1587 : } while (0);
1588 : }
1589 0 : if (failed) {
1590 0 : return false;
1591 : }
1592 0 : if (!done) {
1593 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'viewportOffsetY' member of MediaTrackConstraintSet", "ConstrainLongRange");
1594 0 : return false;
1595 : }
1596 : }
1597 : }
1598 0 : mIsAnyMemberPresent = true;
1599 :
1600 0 : if (!isNull) {
1601 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->viewportWidth_id, temp.ptr())) {
1602 0 : return false;
1603 : }
1604 : }
1605 0 : mViewportWidth.Uninit();
1606 0 : if (!(!isNull && !temp->isUndefined())) {
1607 0 : if (!mViewportWidth.RawSetAsConstrainLongRange().Init(cx, JS::NullHandleValue, "Member of LongOrConstrainLongRange")) {
1608 0 : return false;
1609 : }
1610 : } else {
1611 : {
1612 0 : bool done = false, failed = false, tryNext;
1613 0 : if (!done) {
1614 0 : done = (failed = !mViewportWidth.TrySetToConstrainLongRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1615 : }
1616 0 : if (!done) {
1617 : do {
1618 0 : done = (failed = !mViewportWidth.TrySetToLong(cx, temp.ref(), tryNext)) || !tryNext;
1619 0 : break;
1620 : } while (0);
1621 : }
1622 0 : if (failed) {
1623 0 : return false;
1624 : }
1625 0 : if (!done) {
1626 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'viewportWidth' member of MediaTrackConstraintSet", "ConstrainLongRange");
1627 0 : return false;
1628 : }
1629 : }
1630 : }
1631 0 : mIsAnyMemberPresent = true;
1632 :
1633 0 : if (!isNull) {
1634 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->width_id, temp.ptr())) {
1635 0 : return false;
1636 : }
1637 : }
1638 0 : mWidth.Uninit();
1639 0 : if (!(!isNull && !temp->isUndefined())) {
1640 0 : if (!mWidth.RawSetAsConstrainLongRange().Init(cx, JS::NullHandleValue, "Member of LongOrConstrainLongRange")) {
1641 0 : return false;
1642 : }
1643 : } else {
1644 : {
1645 0 : bool done = false, failed = false, tryNext;
1646 0 : if (!done) {
1647 0 : done = (failed = !mWidth.TrySetToConstrainLongRange(cx, temp.ref(), tryNext, passedToJSImpl)) || !tryNext;
1648 : }
1649 0 : if (!done) {
1650 : do {
1651 0 : done = (failed = !mWidth.TrySetToLong(cx, temp.ref(), tryNext)) || !tryNext;
1652 0 : break;
1653 : } while (0);
1654 : }
1655 0 : if (failed) {
1656 0 : return false;
1657 : }
1658 0 : if (!done) {
1659 0 : ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "'width' member of MediaTrackConstraintSet", "ConstrainLongRange");
1660 0 : return false;
1661 : }
1662 : }
1663 : }
1664 0 : mIsAnyMemberPresent = true;
1665 0 : return true;
1666 : }
1667 :
1668 : bool
1669 0 : MediaTrackConstraintSet::Init(const nsAString& aJSON)
1670 : {
1671 0 : AutoJSAPI jsapi;
1672 0 : JSObject* cleanGlobal = SimpleGlobalObject::Create(SimpleGlobalObject::GlobalType::BindingDetail);
1673 0 : if (!cleanGlobal) {
1674 0 : return false;
1675 : }
1676 0 : if (!jsapi.Init(cleanGlobal)) {
1677 0 : return false;
1678 : }
1679 0 : JSContext* cx = jsapi.cx();
1680 0 : JS::Rooted<JS::Value> json(cx);
1681 0 : bool ok = ParseJSON(cx, aJSON, &json);
1682 0 : NS_ENSURE_TRUE(ok, false);
1683 0 : return Init(cx, json);
1684 : }
1685 :
1686 : bool
1687 0 : MediaTrackConstraintSet::ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const
1688 : {
1689 0 : MediaTrackConstraintSetAtoms* atomsCache = GetAtomCache<MediaTrackConstraintSetAtoms>(cx);
1690 0 : if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
1691 0 : return false;
1692 : }
1693 :
1694 0 : JS::Rooted<JSObject*> obj(cx, JS_NewPlainObject(cx));
1695 0 : if (!obj) {
1696 0 : return false;
1697 : }
1698 0 : rval.set(JS::ObjectValue(*obj));
1699 :
1700 : do {
1701 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1702 0 : JS::Rooted<JS::Value> temp(cx);
1703 0 : OwningBooleanOrConstrainBooleanParameters const & currentValue = mAutoGainControl;
1704 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1705 0 : return false;
1706 : }
1707 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->autoGainControl_id, temp, JSPROP_ENUMERATE)) {
1708 0 : return false;
1709 : }
1710 0 : break;
1711 : } while(0);
1712 :
1713 0 : if (mBrowserWindow.WasPassed()) {
1714 : do {
1715 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1716 0 : JS::Rooted<JS::Value> temp(cx);
1717 0 : int64_t const & currentValue = mBrowserWindow.InternalValue();
1718 0 : temp.set(JS_NumberValue(double(currentValue)));
1719 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->browserWindow_id, temp, JSPROP_ENUMERATE)) {
1720 0 : return false;
1721 : }
1722 0 : break;
1723 : } while(0);
1724 : }
1725 :
1726 : do {
1727 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1728 0 : JS::Rooted<JS::Value> temp(cx);
1729 0 : OwningLongOrConstrainLongRange const & currentValue = mChannelCount;
1730 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1731 0 : return false;
1732 : }
1733 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->channelCount_id, temp, JSPROP_ENUMERATE)) {
1734 0 : return false;
1735 : }
1736 0 : break;
1737 : } while(0);
1738 :
1739 : do {
1740 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1741 0 : JS::Rooted<JS::Value> temp(cx);
1742 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters const & currentValue = mDeviceId;
1743 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1744 0 : return false;
1745 : }
1746 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->deviceId_id, temp, JSPROP_ENUMERATE)) {
1747 0 : return false;
1748 : }
1749 0 : break;
1750 : } while(0);
1751 :
1752 : do {
1753 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1754 0 : JS::Rooted<JS::Value> temp(cx);
1755 0 : OwningBooleanOrConstrainBooleanParameters const & currentValue = mEchoCancellation;
1756 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1757 0 : return false;
1758 : }
1759 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->echoCancellation_id, temp, JSPROP_ENUMERATE)) {
1760 0 : return false;
1761 : }
1762 0 : break;
1763 : } while(0);
1764 :
1765 : do {
1766 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1767 0 : JS::Rooted<JS::Value> temp(cx);
1768 0 : OwningStringOrStringSequenceOrConstrainDOMStringParameters const & currentValue = mFacingMode;
1769 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1770 0 : return false;
1771 : }
1772 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->facingMode_id, temp, JSPROP_ENUMERATE)) {
1773 0 : return false;
1774 : }
1775 0 : break;
1776 : } while(0);
1777 :
1778 : do {
1779 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1780 0 : JS::Rooted<JS::Value> temp(cx);
1781 0 : OwningDoubleOrConstrainDoubleRange const & currentValue = mFrameRate;
1782 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1783 0 : return false;
1784 : }
1785 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->frameRate_id, temp, JSPROP_ENUMERATE)) {
1786 0 : return false;
1787 : }
1788 0 : break;
1789 : } while(0);
1790 :
1791 : do {
1792 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1793 0 : JS::Rooted<JS::Value> temp(cx);
1794 0 : OwningLongOrConstrainLongRange const & currentValue = mHeight;
1795 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1796 0 : return false;
1797 : }
1798 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->height_id, temp, JSPROP_ENUMERATE)) {
1799 0 : return false;
1800 : }
1801 0 : break;
1802 : } while(0);
1803 :
1804 : do {
1805 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1806 0 : JS::Rooted<JS::Value> temp(cx);
1807 0 : nsString const & currentValue = mMediaSource;
1808 0 : if (!xpc::NonVoidStringToJsval(cx, currentValue, &temp)) {
1809 0 : return false;
1810 : }
1811 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->mediaSource_id, temp, JSPROP_ENUMERATE)) {
1812 0 : return false;
1813 : }
1814 0 : break;
1815 : } while(0);
1816 :
1817 : do {
1818 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1819 0 : JS::Rooted<JS::Value> temp(cx);
1820 0 : OwningBooleanOrConstrainBooleanParameters const & currentValue = mMozAutoGainControl;
1821 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1822 0 : return false;
1823 : }
1824 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->mozAutoGainControl_id, temp, JSPROP_ENUMERATE)) {
1825 0 : return false;
1826 : }
1827 0 : break;
1828 : } while(0);
1829 :
1830 : do {
1831 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1832 0 : JS::Rooted<JS::Value> temp(cx);
1833 0 : OwningBooleanOrConstrainBooleanParameters const & currentValue = mMozNoiseSuppression;
1834 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1835 0 : return false;
1836 : }
1837 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->mozNoiseSuppression_id, temp, JSPROP_ENUMERATE)) {
1838 0 : return false;
1839 : }
1840 0 : break;
1841 : } while(0);
1842 :
1843 : do {
1844 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1845 0 : JS::Rooted<JS::Value> temp(cx);
1846 0 : OwningBooleanOrConstrainBooleanParameters const & currentValue = mNoiseSuppression;
1847 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1848 0 : return false;
1849 : }
1850 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->noiseSuppression_id, temp, JSPROP_ENUMERATE)) {
1851 0 : return false;
1852 : }
1853 0 : break;
1854 : } while(0);
1855 :
1856 0 : if (mScrollWithPage.WasPassed()) {
1857 : do {
1858 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1859 0 : JS::Rooted<JS::Value> temp(cx);
1860 0 : bool const & currentValue = mScrollWithPage.InternalValue();
1861 0 : temp.setBoolean(currentValue);
1862 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->scrollWithPage_id, temp, JSPROP_ENUMERATE)) {
1863 0 : return false;
1864 : }
1865 0 : break;
1866 : } while(0);
1867 : }
1868 :
1869 : do {
1870 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1871 0 : JS::Rooted<JS::Value> temp(cx);
1872 0 : OwningLongOrConstrainLongRange const & currentValue = mViewportHeight;
1873 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1874 0 : return false;
1875 : }
1876 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->viewportHeight_id, temp, JSPROP_ENUMERATE)) {
1877 0 : return false;
1878 : }
1879 0 : break;
1880 : } while(0);
1881 :
1882 : do {
1883 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1884 0 : JS::Rooted<JS::Value> temp(cx);
1885 0 : OwningLongOrConstrainLongRange const & currentValue = mViewportOffsetX;
1886 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1887 0 : return false;
1888 : }
1889 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->viewportOffsetX_id, temp, JSPROP_ENUMERATE)) {
1890 0 : return false;
1891 : }
1892 0 : break;
1893 : } while(0);
1894 :
1895 : do {
1896 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1897 0 : JS::Rooted<JS::Value> temp(cx);
1898 0 : OwningLongOrConstrainLongRange const & currentValue = mViewportOffsetY;
1899 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1900 0 : return false;
1901 : }
1902 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->viewportOffsetY_id, temp, JSPROP_ENUMERATE)) {
1903 0 : return false;
1904 : }
1905 0 : break;
1906 : } while(0);
1907 :
1908 : do {
1909 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1910 0 : JS::Rooted<JS::Value> temp(cx);
1911 0 : OwningLongOrConstrainLongRange const & currentValue = mViewportWidth;
1912 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1913 0 : return false;
1914 : }
1915 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->viewportWidth_id, temp, JSPROP_ENUMERATE)) {
1916 0 : return false;
1917 : }
1918 0 : break;
1919 : } while(0);
1920 :
1921 : do {
1922 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
1923 0 : JS::Rooted<JS::Value> temp(cx);
1924 0 : OwningLongOrConstrainLongRange const & currentValue = mWidth;
1925 0 : if (!currentValue.ToJSVal(cx, obj, &temp)) {
1926 0 : return false;
1927 : }
1928 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->width_id, temp, JSPROP_ENUMERATE)) {
1929 0 : return false;
1930 : }
1931 0 : break;
1932 : } while(0);
1933 :
1934 0 : return true;
1935 : }
1936 :
1937 : bool
1938 0 : MediaTrackConstraintSet::ToJSON(nsAString& aJSON) const
1939 : {
1940 0 : AutoJSAPI jsapi;
1941 0 : jsapi.Init();
1942 0 : JSContext *cx = jsapi.cx();
1943 : // It's safe to use UnprivilegedJunkScopeOrWorkerGlobal here
1944 : // because we'll only be creating objects, in ways that have no
1945 : // side-effects, followed by a call to JS::ToJSONMaybeSafely,
1946 : // which likewise guarantees no side-effects for the sorts of
1947 : // things we will pass it.
1948 0 : JSAutoCompartment ac(cx, binding_detail::UnprivilegedJunkScopeOrWorkerGlobal());
1949 0 : JS::Rooted<JS::Value> val(cx);
1950 0 : if (!ToObjectInternal(cx, &val)) {
1951 0 : return false;
1952 : }
1953 0 : JS::Rooted<JSObject*> obj(cx, &val.toObject());
1954 0 : return StringifyToJSON(cx, obj, aJSON);
1955 : }
1956 :
1957 : void
1958 0 : MediaTrackConstraintSet::TraceDictionary(JSTracer* trc)
1959 : {
1960 0 : }
1961 :
1962 : MediaTrackConstraintSet&
1963 0 : MediaTrackConstraintSet::operator=(const MediaTrackConstraintSet& aOther)
1964 : {
1965 0 : mAutoGainControl = aOther.mAutoGainControl;
1966 0 : mBrowserWindow.Reset();
1967 0 : if (aOther.mBrowserWindow.WasPassed()) {
1968 0 : mBrowserWindow.Construct(aOther.mBrowserWindow.Value());
1969 : }
1970 0 : mChannelCount = aOther.mChannelCount;
1971 0 : mDeviceId = aOther.mDeviceId;
1972 0 : mEchoCancellation = aOther.mEchoCancellation;
1973 0 : mFacingMode = aOther.mFacingMode;
1974 0 : mFrameRate = aOther.mFrameRate;
1975 0 : mHeight = aOther.mHeight;
1976 0 : mMediaSource = aOther.mMediaSource;
1977 0 : mMozAutoGainControl = aOther.mMozAutoGainControl;
1978 0 : mMozNoiseSuppression = aOther.mMozNoiseSuppression;
1979 0 : mNoiseSuppression = aOther.mNoiseSuppression;
1980 0 : mScrollWithPage.Reset();
1981 0 : if (aOther.mScrollWithPage.WasPassed()) {
1982 0 : mScrollWithPage.Construct(aOther.mScrollWithPage.Value());
1983 : }
1984 0 : mViewportHeight = aOther.mViewportHeight;
1985 0 : mViewportOffsetX = aOther.mViewportOffsetX;
1986 0 : mViewportOffsetY = aOther.mViewportOffsetY;
1987 0 : mViewportWidth = aOther.mViewportWidth;
1988 0 : mWidth = aOther.mWidth;
1989 0 : return *this;
1990 : }
1991 :
1992 : namespace binding_detail {
1993 : } // namespace binding_detail
1994 :
1995 :
1996 :
1997 0 : MediaTrackConstraints::MediaTrackConstraints()
1998 0 : : MediaTrackConstraintSet(FastDictionaryInitializer())
1999 : {
2000 : // Safe to pass a null context if we pass a null value
2001 0 : Init(nullptr, JS::NullHandleValue);
2002 0 : }
2003 :
2004 :
2005 :
2006 : bool
2007 0 : MediaTrackConstraints::InitIds(JSContext* cx, MediaTrackConstraintsAtoms* atomsCache)
2008 : {
2009 0 : MOZ_ASSERT(!*reinterpret_cast<jsid**>(atomsCache));
2010 :
2011 : // Initialize these in reverse order so that any failure leaves the first one
2012 : // uninitialized.
2013 0 : if (!atomsCache->advanced_id.init(cx, "advanced")) {
2014 0 : return false;
2015 : }
2016 0 : return true;
2017 : }
2018 :
2019 : bool
2020 0 : MediaTrackConstraints::Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription, bool passedToJSImpl)
2021 : {
2022 : // Passing a null JSContext is OK only if we're initing from null,
2023 : // Since in that case we will not have to do any property gets
2024 : // Also evaluate isNullOrUndefined in order to avoid false-positive
2025 : // checkers by static analysis tools
2026 0 : MOZ_ASSERT_IF(!cx, val.isNull() && val.isNullOrUndefined());
2027 0 : MediaTrackConstraintsAtoms* atomsCache = nullptr;
2028 0 : if (cx) {
2029 0 : atomsCache = GetAtomCache<MediaTrackConstraintsAtoms>(cx);
2030 0 : if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
2031 0 : return false;
2032 : }
2033 : }
2034 :
2035 : // Per spec, we init the parent's members first
2036 0 : if (!MediaTrackConstraintSet::Init(cx, val)) {
2037 0 : return false;
2038 : }
2039 :
2040 0 : bool isNull = val.isNullOrUndefined();
2041 : // We only need these if !isNull, in which case we have |cx|.
2042 0 : Maybe<JS::Rooted<JSObject *> > object;
2043 0 : Maybe<JS::Rooted<JS::Value> > temp;
2044 0 : if (!isNull) {
2045 0 : MOZ_ASSERT(cx);
2046 0 : object.emplace(cx, &val.toObject());
2047 0 : temp.emplace(cx);
2048 : }
2049 0 : if (!isNull) {
2050 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->advanced_id, temp.ptr())) {
2051 0 : return false;
2052 : }
2053 : }
2054 0 : if (!isNull && !temp->isUndefined()) {
2055 0 : mAdvanced.Construct();
2056 0 : if (temp.ref().isObject()) {
2057 0 : JS::ForOfIterator iter(cx);
2058 0 : if (!iter.init(temp.ref(), JS::ForOfIterator::AllowNonIterable)) {
2059 0 : return false;
2060 : }
2061 0 : if (!iter.valueIsIterable()) {
2062 0 : ThrowErrorMessage(cx, MSG_NOT_SEQUENCE, "'advanced' member of MediaTrackConstraints");
2063 0 : return false;
2064 : }
2065 0 : Sequence<MediaTrackConstraintSet> &arr = (mAdvanced.Value());
2066 0 : JS::Rooted<JS::Value> temp(cx);
2067 : while (true) {
2068 : bool done;
2069 0 : if (!iter.next(&temp, &done)) {
2070 0 : return false;
2071 : }
2072 0 : if (done) {
2073 0 : break;
2074 : }
2075 0 : MediaTrackConstraintSet* slotPtr = arr.AppendElement(mozilla::fallible);
2076 0 : if (!slotPtr) {
2077 0 : JS_ReportOutOfMemory(cx);
2078 0 : return false;
2079 : }
2080 0 : MediaTrackConstraintSet& slot = *slotPtr;
2081 0 : if (!slot.Init(cx, temp, "Element of 'advanced' member of MediaTrackConstraints", passedToJSImpl)) {
2082 0 : return false;
2083 : }
2084 0 : }
2085 : } else {
2086 0 : ThrowErrorMessage(cx, MSG_NOT_SEQUENCE, "'advanced' member of MediaTrackConstraints");
2087 0 : return false;
2088 : }
2089 0 : mIsAnyMemberPresent = true;
2090 : }
2091 0 : return true;
2092 : }
2093 :
2094 : bool
2095 0 : MediaTrackConstraints::Init(const nsAString& aJSON)
2096 : {
2097 0 : AutoJSAPI jsapi;
2098 0 : JSObject* cleanGlobal = SimpleGlobalObject::Create(SimpleGlobalObject::GlobalType::BindingDetail);
2099 0 : if (!cleanGlobal) {
2100 0 : return false;
2101 : }
2102 0 : if (!jsapi.Init(cleanGlobal)) {
2103 0 : return false;
2104 : }
2105 0 : JSContext* cx = jsapi.cx();
2106 0 : JS::Rooted<JS::Value> json(cx);
2107 0 : bool ok = ParseJSON(cx, aJSON, &json);
2108 0 : NS_ENSURE_TRUE(ok, false);
2109 0 : return Init(cx, json);
2110 : }
2111 :
2112 : bool
2113 0 : MediaTrackConstraints::ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const
2114 : {
2115 0 : MediaTrackConstraintsAtoms* atomsCache = GetAtomCache<MediaTrackConstraintsAtoms>(cx);
2116 0 : if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
2117 0 : return false;
2118 : }
2119 :
2120 : // Per spec, we define the parent's members first
2121 0 : if (!MediaTrackConstraintSet::ToObjectInternal(cx, rval)) {
2122 0 : return false;
2123 : }
2124 0 : JS::Rooted<JSObject*> obj(cx, &rval.toObject());
2125 :
2126 0 : if (mAdvanced.WasPassed()) {
2127 : do {
2128 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
2129 0 : JS::Rooted<JS::Value> temp(cx);
2130 0 : Sequence<MediaTrackConstraintSet> const & currentValue = mAdvanced.InternalValue();
2131 :
2132 0 : uint32_t length = currentValue.Length();
2133 0 : JS::Rooted<JSObject*> returnArray(cx, JS_NewArrayObject(cx, length));
2134 0 : if (!returnArray) {
2135 0 : return false;
2136 : }
2137 : // Scope for 'tmp'
2138 : {
2139 0 : JS::Rooted<JS::Value> tmp(cx);
2140 0 : for (uint32_t sequenceIdx0 = 0; sequenceIdx0 < length; ++sequenceIdx0) {
2141 : // Control block to let us common up the JS_DefineElement calls when there
2142 : // are different ways to succeed at wrapping the object.
2143 : do {
2144 0 : if (!currentValue[sequenceIdx0].ToObjectInternal(cx, &tmp)) {
2145 0 : return false;
2146 : }
2147 0 : break;
2148 : } while (0);
2149 0 : if (!JS_DefineElement(cx, returnArray, sequenceIdx0, tmp,
2150 : JSPROP_ENUMERATE)) {
2151 0 : return false;
2152 : }
2153 : }
2154 : }
2155 0 : temp.setObject(*returnArray);
2156 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->advanced_id, temp, JSPROP_ENUMERATE)) {
2157 0 : return false;
2158 : }
2159 0 : break;
2160 : } while(0);
2161 : }
2162 :
2163 0 : return true;
2164 : }
2165 :
2166 : bool
2167 0 : MediaTrackConstraints::ToJSON(nsAString& aJSON) const
2168 : {
2169 0 : AutoJSAPI jsapi;
2170 0 : jsapi.Init();
2171 0 : JSContext *cx = jsapi.cx();
2172 : // It's safe to use UnprivilegedJunkScopeOrWorkerGlobal here
2173 : // because we'll only be creating objects, in ways that have no
2174 : // side-effects, followed by a call to JS::ToJSONMaybeSafely,
2175 : // which likewise guarantees no side-effects for the sorts of
2176 : // things we will pass it.
2177 0 : JSAutoCompartment ac(cx, binding_detail::UnprivilegedJunkScopeOrWorkerGlobal());
2178 0 : JS::Rooted<JS::Value> val(cx);
2179 0 : if (!ToObjectInternal(cx, &val)) {
2180 0 : return false;
2181 : }
2182 0 : JS::Rooted<JSObject*> obj(cx, &val.toObject());
2183 0 : return StringifyToJSON(cx, obj, aJSON);
2184 : }
2185 :
2186 : void
2187 0 : MediaTrackConstraints::TraceDictionary(JSTracer* trc)
2188 : {
2189 0 : MediaTrackConstraintSet::TraceDictionary(trc);
2190 0 : }
2191 :
2192 : MediaTrackConstraints&
2193 0 : MediaTrackConstraints::operator=(const MediaTrackConstraints& aOther)
2194 : {
2195 0 : MediaTrackConstraintSet::operator=(aOther);
2196 0 : mAdvanced.Reset();
2197 0 : if (aOther.mAdvanced.WasPassed()) {
2198 0 : mAdvanced.Construct(aOther.mAdvanced.Value());
2199 : }
2200 0 : return *this;
2201 : }
2202 :
2203 : namespace binding_detail {
2204 : } // namespace binding_detail
2205 :
2206 :
2207 : namespace MediaStreamTrackBinding {
2208 :
2209 : static_assert(IsRefcounted<NativeType>::value == IsRefcounted<EventTargetBinding::NativeType>::value,
2210 : "Can't inherit from an interface with a different ownership model.");
2211 :
2212 : static bool
2213 0 : get_kind(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitGetterCallArgs args)
2214 : {
2215 0 : DOMString result;
2216 0 : self->GetKind(result);
2217 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
2218 0 : if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
2219 0 : return false;
2220 : }
2221 0 : return true;
2222 : }
2223 :
2224 : static const JSJitInfo kind_getterinfo = {
2225 : { (JSJitGetterOp)get_kind },
2226 : { prototypes::id::MediaStreamTrack },
2227 : { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
2228 : JSJitInfo::Getter,
2229 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
2230 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
2231 : false, /* isInfallible. False in setters. */
2232 : false, /* isMovable. Not relevant for setters. */
2233 : false, /* isEliminatable. Not relevant for setters. */
2234 : false, /* isAlwaysInSlot. Only relevant for getters. */
2235 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
2236 : false, /* isTypedMethod. Only relevant for methods. */
2237 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
2238 : };
2239 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
2240 : static_assert(0 < 1, "There is no slot for us");
2241 :
2242 : static bool
2243 0 : get_id(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitGetterCallArgs args)
2244 : {
2245 0 : DOMString result;
2246 0 : self->GetId(result);
2247 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
2248 0 : if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
2249 0 : return false;
2250 : }
2251 0 : return true;
2252 : }
2253 :
2254 : static const JSJitInfo id_getterinfo = {
2255 : { (JSJitGetterOp)get_id },
2256 : { prototypes::id::MediaStreamTrack },
2257 : { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
2258 : JSJitInfo::Getter,
2259 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
2260 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
2261 : false, /* isInfallible. False in setters. */
2262 : false, /* isMovable. Not relevant for setters. */
2263 : false, /* isEliminatable. Not relevant for setters. */
2264 : false, /* isAlwaysInSlot. Only relevant for getters. */
2265 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
2266 : false, /* isTypedMethod. Only relevant for methods. */
2267 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
2268 : };
2269 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
2270 : static_assert(0 < 1, "There is no slot for us");
2271 :
2272 : static bool
2273 0 : get_label(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitGetterCallArgs args)
2274 : {
2275 0 : DOMString result;
2276 0 : self->GetLabel(result);
2277 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
2278 0 : if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
2279 0 : return false;
2280 : }
2281 0 : return true;
2282 : }
2283 :
2284 : static const JSJitInfo label_getterinfo = {
2285 : { (JSJitGetterOp)get_label },
2286 : { prototypes::id::MediaStreamTrack },
2287 : { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
2288 : JSJitInfo::Getter,
2289 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
2290 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
2291 : false, /* isInfallible. False in setters. */
2292 : false, /* isMovable. Not relevant for setters. */
2293 : false, /* isEliminatable. Not relevant for setters. */
2294 : false, /* isAlwaysInSlot. Only relevant for getters. */
2295 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
2296 : false, /* isTypedMethod. Only relevant for methods. */
2297 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
2298 : };
2299 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
2300 : static_assert(0 < 1, "There is no slot for us");
2301 :
2302 : static bool
2303 0 : get_enabled(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitGetterCallArgs args)
2304 : {
2305 0 : bool result(self->Enabled());
2306 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
2307 0 : args.rval().setBoolean(result);
2308 0 : return true;
2309 : }
2310 :
2311 : static bool
2312 0 : set_enabled(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitSetterCallArgs args)
2313 : {
2314 : bool arg0;
2315 0 : if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
2316 0 : return false;
2317 : }
2318 0 : self->SetEnabled(arg0);
2319 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
2320 :
2321 0 : return true;
2322 : }
2323 :
2324 : static const JSJitInfo enabled_getterinfo = {
2325 : { (JSJitGetterOp)get_enabled },
2326 : { prototypes::id::MediaStreamTrack },
2327 : { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
2328 : JSJitInfo::Getter,
2329 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
2330 : JSVAL_TYPE_BOOLEAN, /* returnType. Not relevant for setters. */
2331 : true, /* isInfallible. False in setters. */
2332 : false, /* isMovable. Not relevant for setters. */
2333 : false, /* isEliminatable. Not relevant for setters. */
2334 : false, /* isAlwaysInSlot. Only relevant for getters. */
2335 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
2336 : false, /* isTypedMethod. Only relevant for methods. */
2337 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
2338 : };
2339 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
2340 : static_assert(0 < 1, "There is no slot for us");
2341 : static const JSJitInfo enabled_setterinfo = {
2342 : { (JSJitGetterOp)set_enabled },
2343 : { prototypes::id::MediaStreamTrack },
2344 : { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
2345 : JSJitInfo::Setter,
2346 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
2347 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
2348 : false, /* isInfallible. False in setters. */
2349 : false, /* isMovable. Not relevant for setters. */
2350 : false, /* isEliminatable. Not relevant for setters. */
2351 : false, /* isAlwaysInSlot. Only relevant for getters. */
2352 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
2353 : false, /* isTypedMethod. Only relevant for methods. */
2354 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
2355 : };
2356 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
2357 : static_assert(0 < 1, "There is no slot for us");
2358 :
2359 : static bool
2360 0 : get_readyState(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitGetterCallArgs args)
2361 : {
2362 0 : MediaStreamTrackState result(self->ReadyState());
2363 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
2364 0 : if (!ToJSValue(cx, result, args.rval())) {
2365 0 : return false;
2366 : }
2367 0 : return true;
2368 : }
2369 :
2370 : static const JSJitInfo readyState_getterinfo = {
2371 : { (JSJitGetterOp)get_readyState },
2372 : { prototypes::id::MediaStreamTrack },
2373 : { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
2374 : JSJitInfo::Getter,
2375 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
2376 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
2377 : false, /* isInfallible. False in setters. */
2378 : false, /* isMovable. Not relevant for setters. */
2379 : false, /* isEliminatable. Not relevant for setters. */
2380 : false, /* isAlwaysInSlot. Only relevant for getters. */
2381 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
2382 : false, /* isTypedMethod. Only relevant for methods. */
2383 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
2384 : };
2385 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
2386 : static_assert(0 < 1, "There is no slot for us");
2387 :
2388 : static bool
2389 0 : get_onended(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitGetterCallArgs args)
2390 : {
2391 0 : RefPtr<EventHandlerNonNull> result(self->GetOnended());
2392 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
2393 0 : if (result) {
2394 0 : args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
2395 0 : if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
2396 0 : return false;
2397 : }
2398 0 : return true;
2399 : } else {
2400 0 : args.rval().setNull();
2401 0 : return true;
2402 : }
2403 : }
2404 :
2405 : static bool
2406 0 : set_onended(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, JSJitSetterCallArgs args)
2407 : {
2408 0 : RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
2409 0 : if (args[0].isObject()) {
2410 : { // scope for tempRoot
2411 0 : JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
2412 0 : arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
2413 : }
2414 : } else {
2415 0 : arg0 = nullptr;
2416 : }
2417 0 : self->SetOnended(Constify(arg0));
2418 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
2419 :
2420 0 : return true;
2421 : }
2422 :
2423 : static const JSJitInfo onended_getterinfo = {
2424 : { (JSJitGetterOp)get_onended },
2425 : { prototypes::id::MediaStreamTrack },
2426 : { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
2427 : JSJitInfo::Getter,
2428 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
2429 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
2430 : false, /* isInfallible. False in setters. */
2431 : false, /* isMovable. Not relevant for setters. */
2432 : false, /* isEliminatable. Not relevant for setters. */
2433 : false, /* isAlwaysInSlot. Only relevant for getters. */
2434 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
2435 : false, /* isTypedMethod. Only relevant for methods. */
2436 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
2437 : };
2438 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
2439 : static_assert(0 < 1, "There is no slot for us");
2440 : static const JSJitInfo onended_setterinfo = {
2441 : { (JSJitGetterOp)set_onended },
2442 : { prototypes::id::MediaStreamTrack },
2443 : { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
2444 : JSJitInfo::Setter,
2445 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
2446 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
2447 : false, /* isInfallible. False in setters. */
2448 : false, /* isMovable. Not relevant for setters. */
2449 : false, /* isEliminatable. Not relevant for setters. */
2450 : false, /* isAlwaysInSlot. Only relevant for getters. */
2451 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
2452 : false, /* isTypedMethod. Only relevant for methods. */
2453 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
2454 : };
2455 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
2456 : static_assert(0 < 1, "There is no slot for us");
2457 :
2458 : static bool
2459 0 : clone(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, const JSJitMethodCallArgs& args)
2460 : {
2461 0 : auto result(StrongOrRawPtr<mozilla::dom::MediaStreamTrack>(self->Clone()));
2462 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
2463 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
2464 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
2465 0 : return false;
2466 : }
2467 0 : return true;
2468 : }
2469 :
2470 : static const JSJitInfo clone_methodinfo = {
2471 : { (JSJitGetterOp)clone },
2472 : { prototypes::id::MediaStreamTrack },
2473 : { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
2474 : JSJitInfo::Method,
2475 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
2476 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
2477 : false, /* isInfallible. False in setters. */
2478 : false, /* isMovable. Not relevant for setters. */
2479 : false, /* isEliminatable. Not relevant for setters. */
2480 : false, /* isAlwaysInSlot. Only relevant for getters. */
2481 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
2482 : false, /* isTypedMethod. Only relevant for methods. */
2483 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
2484 : };
2485 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
2486 : static_assert(0 < 1, "There is no slot for us");
2487 :
2488 : static bool
2489 0 : stop(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, const JSJitMethodCallArgs& args)
2490 : {
2491 0 : self->Stop();
2492 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
2493 0 : args.rval().setUndefined();
2494 0 : return true;
2495 : }
2496 :
2497 : static const JSJitInfo stop_methodinfo = {
2498 : { (JSJitGetterOp)stop },
2499 : { prototypes::id::MediaStreamTrack },
2500 : { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
2501 : JSJitInfo::Method,
2502 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
2503 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
2504 : true, /* isInfallible. False in setters. */
2505 : false, /* isMovable. Not relevant for setters. */
2506 : false, /* isEliminatable. Not relevant for setters. */
2507 : false, /* isAlwaysInSlot. Only relevant for getters. */
2508 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
2509 : false, /* isTypedMethod. Only relevant for methods. */
2510 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
2511 : };
2512 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
2513 : static_assert(0 < 1, "There is no slot for us");
2514 :
2515 : static bool
2516 0 : getConstraints(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, const JSJitMethodCallArgs& args)
2517 : {
2518 0 : MediaTrackConstraints result;
2519 0 : self->GetConstraints(result);
2520 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
2521 0 : if (!result.ToObjectInternal(cx, args.rval())) {
2522 0 : return false;
2523 : }
2524 0 : return true;
2525 : }
2526 :
2527 : static const JSJitInfo getConstraints_methodinfo = {
2528 : { (JSJitGetterOp)getConstraints },
2529 : { prototypes::id::MediaStreamTrack },
2530 : { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
2531 : JSJitInfo::Method,
2532 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
2533 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
2534 : false, /* isInfallible. False in setters. */
2535 : false, /* isMovable. Not relevant for setters. */
2536 : false, /* isEliminatable. Not relevant for setters. */
2537 : false, /* isAlwaysInSlot. Only relevant for getters. */
2538 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
2539 : false, /* isTypedMethod. Only relevant for methods. */
2540 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
2541 : };
2542 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
2543 : static_assert(0 < 1, "There is no slot for us");
2544 :
2545 : static bool
2546 0 : getSettings(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, const JSJitMethodCallArgs& args)
2547 : {
2548 0 : MediaTrackSettings result;
2549 0 : self->GetSettings(result);
2550 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
2551 0 : if (!result.ToObjectInternal(cx, args.rval())) {
2552 0 : return false;
2553 : }
2554 0 : return true;
2555 : }
2556 :
2557 : static const JSJitInfo getSettings_methodinfo = {
2558 : { (JSJitGetterOp)getSettings },
2559 : { prototypes::id::MediaStreamTrack },
2560 : { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
2561 : JSJitInfo::Method,
2562 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
2563 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
2564 : false, /* isInfallible. False in setters. */
2565 : false, /* isMovable. Not relevant for setters. */
2566 : false, /* isEliminatable. Not relevant for setters. */
2567 : false, /* isAlwaysInSlot. Only relevant for getters. */
2568 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
2569 : false, /* isTypedMethod. Only relevant for methods. */
2570 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
2571 : };
2572 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
2573 : static_assert(0 < 1, "There is no slot for us");
2574 :
2575 : static bool
2576 0 : applyConstraints(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, const JSJitMethodCallArgs& args)
2577 : {
2578 0 : binding_detail::FastMediaTrackConstraints arg0;
2579 0 : if (!arg0.Init(cx, (args.hasDefined(0)) ? args[0] : JS::NullHandleValue, "Argument 1 of MediaStreamTrack.applyConstraints", false)) {
2580 0 : return false;
2581 : }
2582 0 : binding_detail::FastErrorResult rv;
2583 0 : auto result(StrongOrRawPtr<Promise>(self->ApplyConstraints(Constify(arg0), nsContentUtils::IsSystemCaller(cx) ? CallerType::System : CallerType::NonSystem, rv)));
2584 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
2585 0 : return false;
2586 : }
2587 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
2588 0 : if (!ToJSValue(cx, result, args.rval())) {
2589 0 : return false;
2590 : }
2591 0 : return true;
2592 : }
2593 :
2594 : static bool
2595 0 : applyConstraints_promiseWrapper(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::MediaStreamTrack* self, const JSJitMethodCallArgs& args)
2596 : {
2597 : // Make sure to save the callee before someone maybe messes
2598 : // with rval().
2599 0 : JS::Rooted<JSObject*> callee(cx, &args.callee());
2600 0 : bool ok = applyConstraints(cx, obj, self, args);
2601 0 : if (ok) {
2602 0 : return true;
2603 : }
2604 0 : return ConvertExceptionToPromise(cx, xpc::XrayAwareCalleeGlobal(callee),
2605 0 : args.rval());
2606 : }
2607 :
2608 : static const JSJitInfo applyConstraints_methodinfo = {
2609 : { (JSJitGetterOp)applyConstraints_promiseWrapper },
2610 : { prototypes::id::MediaStreamTrack },
2611 : { PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth },
2612 : JSJitInfo::Method,
2613 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
2614 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
2615 : false, /* isInfallible. False in setters. */
2616 : false, /* isMovable. Not relevant for setters. */
2617 : false, /* isEliminatable. Not relevant for setters. */
2618 : false, /* isAlwaysInSlot. Only relevant for getters. */
2619 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
2620 : false, /* isTypedMethod. Only relevant for methods. */
2621 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
2622 : };
2623 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
2624 : static_assert(0 < 1, "There is no slot for us");
2625 :
2626 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
2627 : #if defined(__clang__)
2628 : #pragma clang diagnostic push
2629 : #pragma clang diagnostic ignored "-Wmissing-braces"
2630 : #endif
2631 : static const JSFunctionSpec sMethods_specs[] = {
2632 : JS_FNSPEC("clone", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&clone_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
2633 : JS_FNSPEC("stop", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&stop_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
2634 : JS_FNSPEC("getConstraints", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getConstraints_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
2635 : JS_FNSPEC("getSettings", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getSettings_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
2636 : JS_FNSPEC("applyConstraints", GenericPromiseReturningBindingMethod, reinterpret_cast<const JSJitInfo*>(&applyConstraints_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
2637 : JS_FS_END
2638 : };
2639 : #if defined(__clang__)
2640 : #pragma clang diagnostic pop
2641 : #endif
2642 :
2643 :
2644 : // Can't be const because the pref-enabled boolean needs to be writable
2645 : static Prefable<const JSFunctionSpec> sMethods[] = {
2646 : { nullptr, &sMethods_specs[0] },
2647 : { nullptr, nullptr }
2648 : };
2649 :
2650 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
2651 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
2652 : static_assert(5 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
2653 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
2654 :
2655 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
2656 : #if defined(__clang__)
2657 : #pragma clang diagnostic push
2658 : #pragma clang diagnostic ignored "-Wmissing-braces"
2659 : #endif
2660 : static const JSPropertySpec sAttributes_specs[] = {
2661 : { "kind", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &kind_getterinfo, nullptr, nullptr },
2662 : { "id", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &id_getterinfo, nullptr, nullptr },
2663 : { "label", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &label_getterinfo, nullptr, nullptr },
2664 : { "enabled", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &enabled_getterinfo, GenericBindingSetter, &enabled_setterinfo },
2665 : { "readyState", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &readyState_getterinfo, nullptr, nullptr },
2666 : { "onended", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onended_getterinfo, GenericBindingSetter, &onended_setterinfo },
2667 : { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
2668 : };
2669 : #if defined(__clang__)
2670 : #pragma clang diagnostic pop
2671 : #endif
2672 :
2673 :
2674 : // Can't be const because the pref-enabled boolean needs to be writable
2675 : static Prefable<const JSPropertySpec> sAttributes[] = {
2676 : { nullptr, &sAttributes_specs[0] },
2677 : { nullptr, nullptr }
2678 : };
2679 :
2680 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
2681 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
2682 : static_assert(6 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
2683 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
2684 :
2685 :
2686 : static uint16_t sNativeProperties_sortedPropertyIndices[11];
2687 : static PropertyInfo sNativeProperties_propertyInfos[11];
2688 :
2689 : static const NativePropertiesN<2> sNativeProperties = {
2690 : false, 0,
2691 : false, 0,
2692 : true, 0 /* sMethods */,
2693 : true, 1 /* sAttributes */,
2694 : false, 0,
2695 : false, 0,
2696 : false, 0,
2697 : -1,
2698 : 11,
2699 : sNativeProperties_sortedPropertyIndices,
2700 : {
2701 : { sMethods, &sNativeProperties_propertyInfos[0] },
2702 : { sAttributes, &sNativeProperties_propertyInfos[5] }
2703 : }
2704 : };
2705 : static_assert(11 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
2706 : "We have a property info count that is oversized");
2707 :
2708 : static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
2709 : {
2710 : "Function",
2711 : JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
2712 : &sBoringInterfaceObjectClassClassOps,
2713 : JS_NULL_CLASS_SPEC,
2714 : JS_NULL_CLASS_EXT,
2715 : &sInterfaceObjectClassObjectOps
2716 : },
2717 : eInterface,
2718 : true,
2719 : prototypes::id::MediaStreamTrack,
2720 : PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth,
2721 : sNativePropertyHooks,
2722 : "function MediaStreamTrack() {\n [native code]\n}",
2723 : EventTargetBinding::GetConstructorObject
2724 : };
2725 :
2726 : static const DOMIfaceAndProtoJSClass sPrototypeClass = {
2727 : {
2728 : "MediaStreamTrackPrototype",
2729 : JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
2730 : JS_NULL_CLASS_OPS,
2731 : JS_NULL_CLASS_SPEC,
2732 : JS_NULL_CLASS_EXT,
2733 : JS_NULL_OBJECT_OPS
2734 : },
2735 : eInterfacePrototype,
2736 : false,
2737 : prototypes::id::MediaStreamTrack,
2738 : PrototypeTraits<prototypes::id::MediaStreamTrack>::Depth,
2739 : sNativePropertyHooks,
2740 : "[object MediaStreamTrackPrototype]",
2741 : EventTargetBinding::GetProtoObject
2742 : };
2743 :
2744 : JSObject*
2745 0 : DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
2746 : {
2747 0 : return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
2748 : }
2749 :
2750 : const NativePropertyHooks sNativePropertyHooks[] = { {
2751 : nullptr,
2752 : nullptr,
2753 : nullptr,
2754 : { sNativeProperties.Upcast(), nullptr },
2755 : prototypes::id::MediaStreamTrack,
2756 : constructors::id::MediaStreamTrack,
2757 : EventTargetBinding::sNativePropertyHooks,
2758 : &DefaultXrayExpandoObjectClass
2759 : } };
2760 :
2761 : void
2762 0 : CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
2763 : {
2764 0 : JS::Handle<JSObject*> parentProto(EventTargetBinding::GetProtoObjectHandle(aCx));
2765 0 : if (!parentProto) {
2766 0 : return;
2767 : }
2768 :
2769 0 : JS::Handle<JSObject*> constructorProto(EventTargetBinding::GetConstructorObjectHandle(aCx));
2770 0 : if (!constructorProto) {
2771 0 : return;
2772 : }
2773 :
2774 : static bool sIdsInited = false;
2775 0 : if (!sIdsInited && NS_IsMainThread()) {
2776 0 : if (!InitIds(aCx, sNativeProperties.Upcast())) {
2777 0 : return;
2778 : }
2779 0 : sIdsInited = true;
2780 : }
2781 :
2782 0 : JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::MediaStreamTrack);
2783 0 : JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::MediaStreamTrack);
2784 0 : dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
2785 : &sPrototypeClass.mBase, protoCache,
2786 : constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
2787 : interfaceCache,
2788 : sNativeProperties.Upcast(),
2789 : nullptr,
2790 : "MediaStreamTrack", aDefineOnGlobal,
2791 : nullptr,
2792 0 : false);
2793 : }
2794 :
2795 : JS::Handle<JSObject*>
2796 0 : GetProtoObjectHandle(JSContext* aCx)
2797 : {
2798 : /* Get the interface prototype object for this class. This will create the
2799 : object as needed. */
2800 0 : bool aDefineOnGlobal = true;
2801 :
2802 : /* Make sure our global is sane. Hopefully we can remove this sometime */
2803 0 : JSObject* global = JS::CurrentGlobalOrNull(aCx);
2804 0 : if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
2805 0 : return nullptr;
2806 : }
2807 :
2808 : /* Check to see whether the interface objects are already installed */
2809 0 : ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
2810 0 : if (!protoAndIfaceCache.HasEntryInSlot(prototypes::id::MediaStreamTrack)) {
2811 0 : JS::Rooted<JSObject*> rootedGlobal(aCx, global);
2812 0 : CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
2813 : }
2814 :
2815 : /*
2816 : * The object might _still_ be null, but that's OK.
2817 : *
2818 : * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
2819 : * traced by TraceProtoAndIfaceCache() and its contents are never
2820 : * changed after they have been set.
2821 : *
2822 : * Calling address() avoids the read read barrier that does gray
2823 : * unmarking, but it's not possible for the object to be gray here.
2824 : */
2825 :
2826 0 : const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(prototypes::id::MediaStreamTrack);
2827 0 : MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
2828 0 : return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
2829 : }
2830 :
2831 : JSObject*
2832 0 : GetProtoObject(JSContext* aCx)
2833 : {
2834 0 : return GetProtoObjectHandle(aCx);
2835 : }
2836 :
2837 : JS::Handle<JSObject*>
2838 0 : GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
2839 : {
2840 : /* Get the interface object for this class. This will create the object as
2841 : needed. */
2842 :
2843 : /* Make sure our global is sane. Hopefully we can remove this sometime */
2844 0 : JSObject* global = JS::CurrentGlobalOrNull(aCx);
2845 0 : if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
2846 0 : return nullptr;
2847 : }
2848 :
2849 : /* Check to see whether the interface objects are already installed */
2850 0 : ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
2851 0 : if (!protoAndIfaceCache.HasEntryInSlot(constructors::id::MediaStreamTrack)) {
2852 0 : JS::Rooted<JSObject*> rootedGlobal(aCx, global);
2853 0 : CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
2854 : }
2855 :
2856 : /*
2857 : * The object might _still_ be null, but that's OK.
2858 : *
2859 : * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
2860 : * traced by TraceProtoAndIfaceCache() and its contents are never
2861 : * changed after they have been set.
2862 : *
2863 : * Calling address() avoids the read read barrier that does gray
2864 : * unmarking, but it's not possible for the object to be gray here.
2865 : */
2866 :
2867 0 : const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::MediaStreamTrack);
2868 0 : MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
2869 0 : return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
2870 : }
2871 :
2872 : JSObject*
2873 0 : GetConstructorObject(JSContext* aCx)
2874 : {
2875 0 : return GetConstructorObjectHandle(aCx);
2876 : }
2877 :
2878 : } // namespace MediaStreamTrackBinding
2879 :
2880 :
2881 :
2882 : } // namespace dom
2883 : } // namespace mozilla
|