Line data Source code
1 : /* THIS FILE IS AUTOGENERATED FROM SpeechSynthesisUtterance.webidl BY Codegen.py - DO NOT EDIT */
2 :
3 : #include "EventHandlerBinding.h"
4 : #include "EventTargetBinding.h"
5 : #include "SpeechSynthesisUtteranceBinding.h"
6 : #include "WrapperFactory.h"
7 : #include "mozilla/FloatingPoint.h"
8 : #include "mozilla/OwningNonNull.h"
9 : #include "mozilla/Preferences.h"
10 : #include "mozilla/dom/BindingUtils.h"
11 : #include "mozilla/dom/DOMJSClass.h"
12 : #include "mozilla/dom/NonRefcountedDOMObject.h"
13 : #include "mozilla/dom/Nullable.h"
14 : #include "mozilla/dom/PrimitiveConversions.h"
15 : #include "mozilla/dom/SpeechSynthesisUtterance.h"
16 : #include "mozilla/dom/SpeechSynthesisVoice.h"
17 : #include "mozilla/dom/XrayExpandoClass.h"
18 : #include "nsContentUtils.h"
19 :
20 : namespace mozilla {
21 : namespace dom {
22 :
23 : namespace SpeechSynthesisUtteranceBinding {
24 :
25 : static_assert(IsRefcounted<NativeType>::value == IsRefcounted<EventTargetBinding::NativeType>::value,
26 : "Can't inherit from an interface with a different ownership model.");
27 :
28 : static bool
29 0 : get_text(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
30 : {
31 0 : DOMString result;
32 0 : self->GetText(result);
33 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
34 0 : if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
35 0 : return false;
36 : }
37 0 : return true;
38 : }
39 :
40 : static bool
41 0 : set_text(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
42 : {
43 0 : binding_detail::FakeString arg0;
44 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
45 0 : return false;
46 : }
47 0 : self->SetText(NonNullHelper(Constify(arg0)));
48 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
49 :
50 0 : return true;
51 : }
52 :
53 : static const JSJitInfo text_getterinfo = {
54 : { (JSJitGetterOp)get_text },
55 : { prototypes::id::SpeechSynthesisUtterance },
56 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
57 : JSJitInfo::Getter,
58 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
59 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
60 : false, /* isInfallible. False in setters. */
61 : false, /* isMovable. Not relevant for setters. */
62 : false, /* isEliminatable. Not relevant for setters. */
63 : false, /* isAlwaysInSlot. Only relevant for getters. */
64 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
65 : false, /* isTypedMethod. Only relevant for methods. */
66 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
67 : };
68 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
69 : static_assert(0 < 1, "There is no slot for us");
70 : static const JSJitInfo text_setterinfo = {
71 : { (JSJitGetterOp)set_text },
72 : { prototypes::id::SpeechSynthesisUtterance },
73 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
74 : JSJitInfo::Setter,
75 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
76 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
77 : false, /* isInfallible. False in setters. */
78 : false, /* isMovable. Not relevant for setters. */
79 : false, /* isEliminatable. Not relevant for setters. */
80 : false, /* isAlwaysInSlot. Only relevant for getters. */
81 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
82 : false, /* isTypedMethod. Only relevant for methods. */
83 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
84 : };
85 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
86 : static_assert(0 < 1, "There is no slot for us");
87 :
88 : static bool
89 0 : get_lang(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
90 : {
91 0 : DOMString result;
92 0 : self->GetLang(result);
93 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
94 0 : if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
95 0 : return false;
96 : }
97 0 : return true;
98 : }
99 :
100 : static bool
101 0 : set_lang(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
102 : {
103 0 : binding_detail::FakeString arg0;
104 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
105 0 : return false;
106 : }
107 0 : self->SetLang(NonNullHelper(Constify(arg0)));
108 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
109 :
110 0 : return true;
111 : }
112 :
113 : static const JSJitInfo lang_getterinfo = {
114 : { (JSJitGetterOp)get_lang },
115 : { prototypes::id::SpeechSynthesisUtterance },
116 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
117 : JSJitInfo::Getter,
118 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
119 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
120 : false, /* isInfallible. False in setters. */
121 : false, /* isMovable. Not relevant for setters. */
122 : false, /* isEliminatable. Not relevant for setters. */
123 : false, /* isAlwaysInSlot. Only relevant for getters. */
124 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
125 : false, /* isTypedMethod. Only relevant for methods. */
126 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
127 : };
128 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
129 : static_assert(0 < 1, "There is no slot for us");
130 : static const JSJitInfo lang_setterinfo = {
131 : { (JSJitGetterOp)set_lang },
132 : { prototypes::id::SpeechSynthesisUtterance },
133 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
134 : JSJitInfo::Setter,
135 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
136 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
137 : false, /* isInfallible. False in setters. */
138 : false, /* isMovable. Not relevant for setters. */
139 : false, /* isEliminatable. Not relevant for setters. */
140 : false, /* isAlwaysInSlot. Only relevant for getters. */
141 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
142 : false, /* isTypedMethod. Only relevant for methods. */
143 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
144 : };
145 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
146 : static_assert(0 < 1, "There is no slot for us");
147 :
148 : static bool
149 0 : get_voice(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
150 : {
151 0 : auto result(StrongOrRawPtr<mozilla::dom::SpeechSynthesisVoice>(self->GetVoice()));
152 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
153 0 : if (!result) {
154 0 : args.rval().setNull();
155 0 : return true;
156 : }
157 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
158 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
159 0 : return false;
160 : }
161 0 : return true;
162 : }
163 :
164 : static bool
165 0 : set_voice(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
166 : {
167 : mozilla::dom::SpeechSynthesisVoice* arg0;
168 0 : if (args[0].isObject()) {
169 : {
170 0 : nsresult rv = UnwrapObject<prototypes::id::SpeechSynthesisVoice, mozilla::dom::SpeechSynthesisVoice>(args[0], arg0);
171 0 : if (NS_FAILED(rv)) {
172 0 : ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Value being assigned to SpeechSynthesisUtterance.voice", "SpeechSynthesisVoice");
173 0 : return false;
174 : }
175 : }
176 0 : } else if (args[0].isNullOrUndefined()) {
177 0 : arg0 = nullptr;
178 : } else {
179 0 : ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Value being assigned to SpeechSynthesisUtterance.voice");
180 0 : return false;
181 : }
182 0 : self->SetVoice(Constify(arg0));
183 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
184 :
185 0 : return true;
186 : }
187 :
188 : static const JSJitInfo voice_getterinfo = {
189 : { (JSJitGetterOp)get_voice },
190 : { prototypes::id::SpeechSynthesisUtterance },
191 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
192 : JSJitInfo::Getter,
193 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
194 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
195 : false, /* isInfallible. False in setters. */
196 : false, /* isMovable. Not relevant for setters. */
197 : false, /* isEliminatable. Not relevant for setters. */
198 : false, /* isAlwaysInSlot. Only relevant for getters. */
199 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
200 : false, /* isTypedMethod. Only relevant for methods. */
201 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
202 : };
203 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
204 : static_assert(0 < 1, "There is no slot for us");
205 : static const JSJitInfo voice_setterinfo = {
206 : { (JSJitGetterOp)set_voice },
207 : { prototypes::id::SpeechSynthesisUtterance },
208 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
209 : JSJitInfo::Setter,
210 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
211 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
212 : false, /* isInfallible. False in setters. */
213 : false, /* isMovable. Not relevant for setters. */
214 : false, /* isEliminatable. Not relevant for setters. */
215 : false, /* isAlwaysInSlot. Only relevant for getters. */
216 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
217 : false, /* isTypedMethod. Only relevant for methods. */
218 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
219 : };
220 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
221 : static_assert(0 < 1, "There is no slot for us");
222 :
223 : static bool
224 0 : get_volume(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
225 : {
226 0 : float result(self->Volume());
227 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
228 0 : args.rval().set(JS_NumberValue(double(result)));
229 0 : return true;
230 : }
231 :
232 : static bool
233 0 : set_volume(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
234 : {
235 : float arg0;
236 0 : if (!ValueToPrimitive<float, eDefault>(cx, args[0], &arg0)) {
237 0 : return false;
238 0 : } else if (!mozilla::IsFinite(arg0)) {
239 0 : ThrowErrorMessage(cx, MSG_NOT_FINITE, "Value being assigned to SpeechSynthesisUtterance.volume");
240 0 : return false;
241 : }
242 0 : self->SetVolume(arg0);
243 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
244 :
245 0 : return true;
246 : }
247 :
248 : static const JSJitInfo volume_getterinfo = {
249 : { (JSJitGetterOp)get_volume },
250 : { prototypes::id::SpeechSynthesisUtterance },
251 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
252 : JSJitInfo::Getter,
253 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
254 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
255 : true, /* isInfallible. False in setters. */
256 : false, /* isMovable. Not relevant for setters. */
257 : false, /* isEliminatable. Not relevant for setters. */
258 : false, /* isAlwaysInSlot. Only relevant for getters. */
259 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
260 : false, /* isTypedMethod. Only relevant for methods. */
261 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
262 : };
263 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
264 : static_assert(0 < 1, "There is no slot for us");
265 : static const JSJitInfo volume_setterinfo = {
266 : { (JSJitGetterOp)set_volume },
267 : { prototypes::id::SpeechSynthesisUtterance },
268 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
269 : JSJitInfo::Setter,
270 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
271 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
272 : false, /* isInfallible. False in setters. */
273 : false, /* isMovable. Not relevant for setters. */
274 : false, /* isEliminatable. Not relevant for setters. */
275 : false, /* isAlwaysInSlot. Only relevant for getters. */
276 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
277 : false, /* isTypedMethod. Only relevant for methods. */
278 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
279 : };
280 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
281 : static_assert(0 < 1, "There is no slot for us");
282 :
283 : static bool
284 0 : get_rate(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
285 : {
286 0 : float result(self->Rate());
287 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
288 0 : args.rval().set(JS_NumberValue(double(result)));
289 0 : return true;
290 : }
291 :
292 : static bool
293 0 : set_rate(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
294 : {
295 : float arg0;
296 0 : if (!ValueToPrimitive<float, eDefault>(cx, args[0], &arg0)) {
297 0 : return false;
298 0 : } else if (!mozilla::IsFinite(arg0)) {
299 0 : ThrowErrorMessage(cx, MSG_NOT_FINITE, "Value being assigned to SpeechSynthesisUtterance.rate");
300 0 : return false;
301 : }
302 0 : self->SetRate(arg0);
303 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
304 :
305 0 : return true;
306 : }
307 :
308 : static const JSJitInfo rate_getterinfo = {
309 : { (JSJitGetterOp)get_rate },
310 : { prototypes::id::SpeechSynthesisUtterance },
311 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
312 : JSJitInfo::Getter,
313 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
314 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
315 : true, /* isInfallible. False in setters. */
316 : false, /* isMovable. Not relevant for setters. */
317 : false, /* isEliminatable. Not relevant for setters. */
318 : false, /* isAlwaysInSlot. Only relevant for getters. */
319 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
320 : false, /* isTypedMethod. Only relevant for methods. */
321 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
322 : };
323 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
324 : static_assert(0 < 1, "There is no slot for us");
325 : static const JSJitInfo rate_setterinfo = {
326 : { (JSJitGetterOp)set_rate },
327 : { prototypes::id::SpeechSynthesisUtterance },
328 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
329 : JSJitInfo::Setter,
330 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
331 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
332 : false, /* isInfallible. False in setters. */
333 : false, /* isMovable. Not relevant for setters. */
334 : false, /* isEliminatable. Not relevant for setters. */
335 : false, /* isAlwaysInSlot. Only relevant for getters. */
336 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
337 : false, /* isTypedMethod. Only relevant for methods. */
338 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
339 : };
340 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
341 : static_assert(0 < 1, "There is no slot for us");
342 :
343 : static bool
344 0 : get_pitch(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
345 : {
346 0 : float result(self->Pitch());
347 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
348 0 : args.rval().set(JS_NumberValue(double(result)));
349 0 : return true;
350 : }
351 :
352 : static bool
353 0 : set_pitch(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
354 : {
355 : float arg0;
356 0 : if (!ValueToPrimitive<float, eDefault>(cx, args[0], &arg0)) {
357 0 : return false;
358 0 : } else if (!mozilla::IsFinite(arg0)) {
359 0 : ThrowErrorMessage(cx, MSG_NOT_FINITE, "Value being assigned to SpeechSynthesisUtterance.pitch");
360 0 : return false;
361 : }
362 0 : self->SetPitch(arg0);
363 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
364 :
365 0 : return true;
366 : }
367 :
368 : static const JSJitInfo pitch_getterinfo = {
369 : { (JSJitGetterOp)get_pitch },
370 : { prototypes::id::SpeechSynthesisUtterance },
371 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
372 : JSJitInfo::Getter,
373 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
374 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
375 : true, /* isInfallible. False in setters. */
376 : false, /* isMovable. Not relevant for setters. */
377 : false, /* isEliminatable. Not relevant for setters. */
378 : false, /* isAlwaysInSlot. Only relevant for getters. */
379 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
380 : false, /* isTypedMethod. Only relevant for methods. */
381 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
382 : };
383 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
384 : static_assert(0 < 1, "There is no slot for us");
385 : static const JSJitInfo pitch_setterinfo = {
386 : { (JSJitGetterOp)set_pitch },
387 : { prototypes::id::SpeechSynthesisUtterance },
388 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
389 : JSJitInfo::Setter,
390 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
391 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
392 : false, /* isInfallible. False in setters. */
393 : false, /* isMovable. Not relevant for setters. */
394 : false, /* isEliminatable. Not relevant for setters. */
395 : false, /* isAlwaysInSlot. Only relevant for getters. */
396 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
397 : false, /* isTypedMethod. Only relevant for methods. */
398 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
399 : };
400 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
401 : static_assert(0 < 1, "There is no slot for us");
402 :
403 : static bool
404 0 : get_onstart(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
405 : {
406 0 : RefPtr<EventHandlerNonNull> result(self->GetOnstart());
407 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
408 0 : if (result) {
409 0 : args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
410 0 : if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
411 0 : return false;
412 : }
413 0 : return true;
414 : } else {
415 0 : args.rval().setNull();
416 0 : return true;
417 : }
418 : }
419 :
420 : static bool
421 0 : set_onstart(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
422 : {
423 0 : RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
424 0 : if (args[0].isObject()) {
425 : { // scope for tempRoot
426 0 : JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
427 0 : arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
428 : }
429 : } else {
430 0 : arg0 = nullptr;
431 : }
432 0 : self->SetOnstart(Constify(arg0));
433 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
434 :
435 0 : return true;
436 : }
437 :
438 : static const JSJitInfo onstart_getterinfo = {
439 : { (JSJitGetterOp)get_onstart },
440 : { prototypes::id::SpeechSynthesisUtterance },
441 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
442 : JSJitInfo::Getter,
443 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
444 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
445 : false, /* isInfallible. False in setters. */
446 : false, /* isMovable. Not relevant for setters. */
447 : false, /* isEliminatable. Not relevant for setters. */
448 : false, /* isAlwaysInSlot. Only relevant for getters. */
449 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
450 : false, /* isTypedMethod. Only relevant for methods. */
451 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
452 : };
453 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
454 : static_assert(0 < 1, "There is no slot for us");
455 : static const JSJitInfo onstart_setterinfo = {
456 : { (JSJitGetterOp)set_onstart },
457 : { prototypes::id::SpeechSynthesisUtterance },
458 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
459 : JSJitInfo::Setter,
460 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
461 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
462 : false, /* isInfallible. False in setters. */
463 : false, /* isMovable. Not relevant for setters. */
464 : false, /* isEliminatable. Not relevant for setters. */
465 : false, /* isAlwaysInSlot. Only relevant for getters. */
466 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
467 : false, /* isTypedMethod. Only relevant for methods. */
468 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
469 : };
470 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
471 : static_assert(0 < 1, "There is no slot for us");
472 :
473 : static bool
474 0 : get_onend(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
475 : {
476 0 : RefPtr<EventHandlerNonNull> result(self->GetOnend());
477 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
478 0 : if (result) {
479 0 : args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
480 0 : if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
481 0 : return false;
482 : }
483 0 : return true;
484 : } else {
485 0 : args.rval().setNull();
486 0 : return true;
487 : }
488 : }
489 :
490 : static bool
491 0 : set_onend(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
492 : {
493 0 : RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
494 0 : if (args[0].isObject()) {
495 : { // scope for tempRoot
496 0 : JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
497 0 : arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
498 : }
499 : } else {
500 0 : arg0 = nullptr;
501 : }
502 0 : self->SetOnend(Constify(arg0));
503 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
504 :
505 0 : return true;
506 : }
507 :
508 : static const JSJitInfo onend_getterinfo = {
509 : { (JSJitGetterOp)get_onend },
510 : { prototypes::id::SpeechSynthesisUtterance },
511 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
512 : JSJitInfo::Getter,
513 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
514 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
515 : false, /* isInfallible. False in setters. */
516 : false, /* isMovable. Not relevant for setters. */
517 : false, /* isEliminatable. Not relevant for setters. */
518 : false, /* isAlwaysInSlot. Only relevant for getters. */
519 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
520 : false, /* isTypedMethod. Only relevant for methods. */
521 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
522 : };
523 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
524 : static_assert(0 < 1, "There is no slot for us");
525 : static const JSJitInfo onend_setterinfo = {
526 : { (JSJitGetterOp)set_onend },
527 : { prototypes::id::SpeechSynthesisUtterance },
528 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
529 : JSJitInfo::Setter,
530 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
531 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
532 : false, /* isInfallible. False in setters. */
533 : false, /* isMovable. Not relevant for setters. */
534 : false, /* isEliminatable. Not relevant for setters. */
535 : false, /* isAlwaysInSlot. Only relevant for getters. */
536 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
537 : false, /* isTypedMethod. Only relevant for methods. */
538 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
539 : };
540 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
541 : static_assert(0 < 1, "There is no slot for us");
542 :
543 : static bool
544 0 : get_onerror(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
545 : {
546 0 : RefPtr<EventHandlerNonNull> result(self->GetOnerror());
547 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
548 0 : if (result) {
549 0 : args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
550 0 : if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
551 0 : return false;
552 : }
553 0 : return true;
554 : } else {
555 0 : args.rval().setNull();
556 0 : return true;
557 : }
558 : }
559 :
560 : static bool
561 0 : set_onerror(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
562 : {
563 0 : RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
564 0 : if (args[0].isObject()) {
565 : { // scope for tempRoot
566 0 : JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
567 0 : arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
568 : }
569 : } else {
570 0 : arg0 = nullptr;
571 : }
572 0 : self->SetOnerror(Constify(arg0));
573 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
574 :
575 0 : return true;
576 : }
577 :
578 : static const JSJitInfo onerror_getterinfo = {
579 : { (JSJitGetterOp)get_onerror },
580 : { prototypes::id::SpeechSynthesisUtterance },
581 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
582 : JSJitInfo::Getter,
583 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
584 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
585 : false, /* isInfallible. False in setters. */
586 : false, /* isMovable. Not relevant for setters. */
587 : false, /* isEliminatable. Not relevant for setters. */
588 : false, /* isAlwaysInSlot. Only relevant for getters. */
589 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
590 : false, /* isTypedMethod. Only relevant for methods. */
591 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
592 : };
593 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
594 : static_assert(0 < 1, "There is no slot for us");
595 : static const JSJitInfo onerror_setterinfo = {
596 : { (JSJitGetterOp)set_onerror },
597 : { prototypes::id::SpeechSynthesisUtterance },
598 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
599 : JSJitInfo::Setter,
600 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
601 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
602 : false, /* isInfallible. False in setters. */
603 : false, /* isMovable. Not relevant for setters. */
604 : false, /* isEliminatable. Not relevant for setters. */
605 : false, /* isAlwaysInSlot. Only relevant for getters. */
606 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
607 : false, /* isTypedMethod. Only relevant for methods. */
608 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
609 : };
610 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
611 : static_assert(0 < 1, "There is no slot for us");
612 :
613 : static bool
614 0 : get_onpause(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
615 : {
616 0 : RefPtr<EventHandlerNonNull> result(self->GetOnpause());
617 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
618 0 : if (result) {
619 0 : args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
620 0 : if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
621 0 : return false;
622 : }
623 0 : return true;
624 : } else {
625 0 : args.rval().setNull();
626 0 : return true;
627 : }
628 : }
629 :
630 : static bool
631 0 : set_onpause(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
632 : {
633 0 : RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
634 0 : if (args[0].isObject()) {
635 : { // scope for tempRoot
636 0 : JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
637 0 : arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
638 : }
639 : } else {
640 0 : arg0 = nullptr;
641 : }
642 0 : self->SetOnpause(Constify(arg0));
643 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
644 :
645 0 : return true;
646 : }
647 :
648 : static const JSJitInfo onpause_getterinfo = {
649 : { (JSJitGetterOp)get_onpause },
650 : { prototypes::id::SpeechSynthesisUtterance },
651 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
652 : JSJitInfo::Getter,
653 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
654 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
655 : false, /* isInfallible. False in setters. */
656 : false, /* isMovable. Not relevant for setters. */
657 : false, /* isEliminatable. Not relevant for setters. */
658 : false, /* isAlwaysInSlot. Only relevant for getters. */
659 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
660 : false, /* isTypedMethod. Only relevant for methods. */
661 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
662 : };
663 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
664 : static_assert(0 < 1, "There is no slot for us");
665 : static const JSJitInfo onpause_setterinfo = {
666 : { (JSJitGetterOp)set_onpause },
667 : { prototypes::id::SpeechSynthesisUtterance },
668 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
669 : JSJitInfo::Setter,
670 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
671 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
672 : false, /* isInfallible. False in setters. */
673 : false, /* isMovable. Not relevant for setters. */
674 : false, /* isEliminatable. Not relevant for setters. */
675 : false, /* isAlwaysInSlot. Only relevant for getters. */
676 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
677 : false, /* isTypedMethod. Only relevant for methods. */
678 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
679 : };
680 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
681 : static_assert(0 < 1, "There is no slot for us");
682 :
683 : static bool
684 0 : get_onresume(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
685 : {
686 0 : RefPtr<EventHandlerNonNull> result(self->GetOnresume());
687 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
688 0 : if (result) {
689 0 : args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
690 0 : if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
691 0 : return false;
692 : }
693 0 : return true;
694 : } else {
695 0 : args.rval().setNull();
696 0 : return true;
697 : }
698 : }
699 :
700 : static bool
701 0 : set_onresume(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
702 : {
703 0 : RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
704 0 : if (args[0].isObject()) {
705 : { // scope for tempRoot
706 0 : JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
707 0 : arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
708 : }
709 : } else {
710 0 : arg0 = nullptr;
711 : }
712 0 : self->SetOnresume(Constify(arg0));
713 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
714 :
715 0 : return true;
716 : }
717 :
718 : static const JSJitInfo onresume_getterinfo = {
719 : { (JSJitGetterOp)get_onresume },
720 : { prototypes::id::SpeechSynthesisUtterance },
721 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
722 : JSJitInfo::Getter,
723 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
724 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
725 : false, /* isInfallible. False in setters. */
726 : false, /* isMovable. Not relevant for setters. */
727 : false, /* isEliminatable. Not relevant for setters. */
728 : false, /* isAlwaysInSlot. Only relevant for getters. */
729 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
730 : false, /* isTypedMethod. Only relevant for methods. */
731 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
732 : };
733 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
734 : static_assert(0 < 1, "There is no slot for us");
735 : static const JSJitInfo onresume_setterinfo = {
736 : { (JSJitGetterOp)set_onresume },
737 : { prototypes::id::SpeechSynthesisUtterance },
738 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
739 : JSJitInfo::Setter,
740 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
741 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
742 : false, /* isInfallible. False in setters. */
743 : false, /* isMovable. Not relevant for setters. */
744 : false, /* isEliminatable. Not relevant for setters. */
745 : false, /* isAlwaysInSlot. Only relevant for getters. */
746 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
747 : false, /* isTypedMethod. Only relevant for methods. */
748 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
749 : };
750 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
751 : static_assert(0 < 1, "There is no slot for us");
752 :
753 : static bool
754 0 : get_onmark(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
755 : {
756 0 : RefPtr<EventHandlerNonNull> result(self->GetOnmark());
757 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
758 0 : if (result) {
759 0 : args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
760 0 : if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
761 0 : return false;
762 : }
763 0 : return true;
764 : } else {
765 0 : args.rval().setNull();
766 0 : return true;
767 : }
768 : }
769 :
770 : static bool
771 0 : set_onmark(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
772 : {
773 0 : RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
774 0 : if (args[0].isObject()) {
775 : { // scope for tempRoot
776 0 : JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
777 0 : arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
778 : }
779 : } else {
780 0 : arg0 = nullptr;
781 : }
782 0 : self->SetOnmark(Constify(arg0));
783 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
784 :
785 0 : return true;
786 : }
787 :
788 : static const JSJitInfo onmark_getterinfo = {
789 : { (JSJitGetterOp)get_onmark },
790 : { prototypes::id::SpeechSynthesisUtterance },
791 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
792 : JSJitInfo::Getter,
793 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
794 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
795 : false, /* isInfallible. False in setters. */
796 : false, /* isMovable. Not relevant for setters. */
797 : false, /* isEliminatable. Not relevant for setters. */
798 : false, /* isAlwaysInSlot. Only relevant for getters. */
799 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
800 : false, /* isTypedMethod. Only relevant for methods. */
801 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
802 : };
803 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
804 : static_assert(0 < 1, "There is no slot for us");
805 : static const JSJitInfo onmark_setterinfo = {
806 : { (JSJitGetterOp)set_onmark },
807 : { prototypes::id::SpeechSynthesisUtterance },
808 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
809 : JSJitInfo::Setter,
810 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
811 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
812 : false, /* isInfallible. False in setters. */
813 : false, /* isMovable. Not relevant for setters. */
814 : false, /* isEliminatable. Not relevant for setters. */
815 : false, /* isAlwaysInSlot. Only relevant for getters. */
816 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
817 : false, /* isTypedMethod. Only relevant for methods. */
818 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
819 : };
820 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
821 : static_assert(0 < 1, "There is no slot for us");
822 :
823 : static bool
824 0 : get_onboundary(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
825 : {
826 0 : RefPtr<EventHandlerNonNull> result(self->GetOnboundary());
827 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
828 0 : if (result) {
829 0 : args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
830 0 : if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
831 0 : return false;
832 : }
833 0 : return true;
834 : } else {
835 0 : args.rval().setNull();
836 0 : return true;
837 : }
838 : }
839 :
840 : static bool
841 0 : set_onboundary(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitSetterCallArgs args)
842 : {
843 0 : RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
844 0 : if (args[0].isObject()) {
845 : { // scope for tempRoot
846 0 : JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
847 0 : arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
848 : }
849 : } else {
850 0 : arg0 = nullptr;
851 : }
852 0 : self->SetOnboundary(Constify(arg0));
853 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
854 :
855 0 : return true;
856 : }
857 :
858 : static const JSJitInfo onboundary_getterinfo = {
859 : { (JSJitGetterOp)get_onboundary },
860 : { prototypes::id::SpeechSynthesisUtterance },
861 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
862 : JSJitInfo::Getter,
863 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
864 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
865 : false, /* isInfallible. False in setters. */
866 : false, /* isMovable. Not relevant for setters. */
867 : false, /* isEliminatable. Not relevant for setters. */
868 : false, /* isAlwaysInSlot. Only relevant for getters. */
869 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
870 : false, /* isTypedMethod. Only relevant for methods. */
871 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
872 : };
873 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
874 : static_assert(0 < 1, "There is no slot for us");
875 : static const JSJitInfo onboundary_setterinfo = {
876 : { (JSJitGetterOp)set_onboundary },
877 : { prototypes::id::SpeechSynthesisUtterance },
878 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
879 : JSJitInfo::Setter,
880 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
881 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
882 : false, /* isInfallible. False in setters. */
883 : false, /* isMovable. Not relevant for setters. */
884 : false, /* isEliminatable. Not relevant for setters. */
885 : false, /* isAlwaysInSlot. Only relevant for getters. */
886 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
887 : false, /* isTypedMethod. Only relevant for methods. */
888 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
889 : };
890 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
891 : static_assert(0 < 1, "There is no slot for us");
892 :
893 : static bool
894 0 : get_chosenVoiceURI(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::SpeechSynthesisUtterance* self, JSJitGetterCallArgs args)
895 : {
896 0 : DOMString result;
897 0 : self->GetChosenVoiceURI(result);
898 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
899 0 : if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
900 0 : return false;
901 : }
902 0 : return true;
903 : }
904 :
905 : static const JSJitInfo chosenVoiceURI_getterinfo = {
906 : { (JSJitGetterOp)get_chosenVoiceURI },
907 : { prototypes::id::SpeechSynthesisUtterance },
908 : { PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth },
909 : JSJitInfo::Getter,
910 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
911 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
912 : false, /* isInfallible. False in setters. */
913 : false, /* isMovable. Not relevant for setters. */
914 : false, /* isEliminatable. Not relevant for setters. */
915 : false, /* isAlwaysInSlot. Only relevant for getters. */
916 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
917 : false, /* isTypedMethod. Only relevant for methods. */
918 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
919 : };
920 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
921 : static_assert(0 < 1, "There is no slot for us");
922 :
923 : static bool
924 0 : _addProperty(JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JS::Handle<JS::Value> val)
925 : {
926 0 : mozilla::dom::SpeechSynthesisUtterance* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::SpeechSynthesisUtterance>(obj);
927 : // We don't want to preserve if we don't have a wrapper, and we
928 : // obviously can't preserve if we're not initialized.
929 0 : if (self && self->GetWrapperPreserveColor()) {
930 0 : PreserveWrapper(self);
931 : }
932 0 : return true;
933 : }
934 :
935 : static void
936 0 : _finalize(js::FreeOp* fop, JSObject* obj)
937 : {
938 0 : mozilla::dom::SpeechSynthesisUtterance* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::SpeechSynthesisUtterance>(obj);
939 0 : if (self) {
940 0 : ClearWrapper(self, self, obj);
941 0 : AddForDeferredFinalization<mozilla::dom::SpeechSynthesisUtterance>(self);
942 : }
943 0 : }
944 :
945 : static void
946 0 : _objectMoved(JSObject* obj, const JSObject* old)
947 : {
948 0 : mozilla::dom::SpeechSynthesisUtterance* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::SpeechSynthesisUtterance>(obj);
949 0 : if (self) {
950 0 : UpdateWrapper(self, self, obj, old);
951 : }
952 0 : }
953 :
954 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
955 : #if defined(__clang__)
956 : #pragma clang diagnostic push
957 : #pragma clang diagnostic ignored "-Wmissing-braces"
958 : #endif
959 : static const JSPropertySpec sAttributes_specs[] = {
960 : { "text", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &text_getterinfo, GenericBindingSetter, &text_setterinfo },
961 : { "lang", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &lang_getterinfo, GenericBindingSetter, &lang_setterinfo },
962 : { "voice", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &voice_getterinfo, GenericBindingSetter, &voice_setterinfo },
963 : { "volume", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &volume_getterinfo, GenericBindingSetter, &volume_setterinfo },
964 : { "rate", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &rate_getterinfo, GenericBindingSetter, &rate_setterinfo },
965 : { "pitch", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &pitch_getterinfo, GenericBindingSetter, &pitch_setterinfo },
966 : { "onstart", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onstart_getterinfo, GenericBindingSetter, &onstart_setterinfo },
967 : { "onend", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onend_getterinfo, GenericBindingSetter, &onend_setterinfo },
968 : { "onerror", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onerror_getterinfo, GenericBindingSetter, &onerror_setterinfo },
969 : { "onpause", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onpause_getterinfo, GenericBindingSetter, &onpause_setterinfo },
970 : { "onresume", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onresume_getterinfo, GenericBindingSetter, &onresume_setterinfo },
971 : { "onmark", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onmark_getterinfo, GenericBindingSetter, &onmark_setterinfo },
972 : { "onboundary", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onboundary_getterinfo, GenericBindingSetter, &onboundary_setterinfo },
973 : { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
974 : };
975 : #if defined(__clang__)
976 : #pragma clang diagnostic pop
977 : #endif
978 :
979 :
980 : // Can't be const because the pref-enabled boolean needs to be writable
981 : static Prefable<const JSPropertySpec> sAttributes[] = {
982 : { nullptr, &sAttributes_specs[0] },
983 : { nullptr, nullptr }
984 : };
985 :
986 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
987 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
988 : static_assert(13 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
989 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
990 :
991 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
992 : #if defined(__clang__)
993 : #pragma clang diagnostic push
994 : #pragma clang diagnostic ignored "-Wmissing-braces"
995 : #endif
996 : static const JSPropertySpec sChromeAttributes_specs[] = {
997 : { "chosenVoiceURI", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &chosenVoiceURI_getterinfo, nullptr, nullptr },
998 : { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
999 : };
1000 : #if defined(__clang__)
1001 : #pragma clang diagnostic pop
1002 : #endif
1003 :
1004 :
1005 : // Can't be const because the pref-enabled boolean needs to be writable
1006 : static Prefable<const JSPropertySpec> sChromeAttributes[] = {
1007 : { nullptr, &sChromeAttributes_specs[0] },
1008 : { nullptr, nullptr }
1009 : };
1010 :
1011 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
1012 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
1013 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
1014 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
1015 :
1016 :
1017 : static uint16_t sNativeProperties_sortedPropertyIndices[13];
1018 : static PropertyInfo sNativeProperties_propertyInfos[13];
1019 :
1020 : static const NativePropertiesN<1> sNativeProperties = {
1021 : false, 0,
1022 : false, 0,
1023 : false, 0,
1024 : true, 0 /* sAttributes */,
1025 : false, 0,
1026 : false, 0,
1027 : false, 0,
1028 : -1,
1029 : 13,
1030 : sNativeProperties_sortedPropertyIndices,
1031 : {
1032 : { sAttributes, &sNativeProperties_propertyInfos[0] }
1033 : }
1034 : };
1035 : static_assert(13 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
1036 : "We have a property info count that is oversized");
1037 :
1038 : static uint16_t sChromeOnlyNativeProperties_sortedPropertyIndices[1];
1039 : static PropertyInfo sChromeOnlyNativeProperties_propertyInfos[1];
1040 :
1041 : static const NativePropertiesN<1> sChromeOnlyNativeProperties = {
1042 : false, 0,
1043 : false, 0,
1044 : false, 0,
1045 : true, 0 /* sChromeAttributes */,
1046 : false, 0,
1047 : false, 0,
1048 : false, 0,
1049 : -1,
1050 : 1,
1051 : sChromeOnlyNativeProperties_sortedPropertyIndices,
1052 : {
1053 : { sChromeAttributes, &sChromeOnlyNativeProperties_propertyInfos[0] }
1054 : }
1055 : };
1056 : static_assert(1 < 1ull << CHAR_BIT * sizeof(sChromeOnlyNativeProperties.propertyInfoCount),
1057 : "We have a property info count that is oversized");
1058 :
1059 : static bool
1060 0 : _constructor(JSContext* cx, unsigned argc, JS::Value* vp)
1061 : {
1062 0 : JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
1063 0 : JS::Rooted<JSObject*> obj(cx, &args.callee());
1064 0 : if (!args.isConstructing()) {
1065 : // XXXbz wish I could get the name from the callee instead of
1066 : // Adding more relocations
1067 0 : return ThrowConstructorWithoutNew(cx, "SpeechSynthesisUtterance");
1068 : }
1069 :
1070 0 : GlobalObject global(cx, obj);
1071 0 : if (global.Failed()) {
1072 0 : return false;
1073 : }
1074 :
1075 0 : JS::Rooted<JSObject*> desiredProto(cx);
1076 0 : if (!GetDesiredProto(cx, args, &desiredProto)) {
1077 0 : return false;
1078 : }
1079 :
1080 0 : unsigned argcount = std::min(args.length(), 1u);
1081 0 : switch (argcount) {
1082 : case 0: {
1083 0 : bool objIsXray = xpc::WrapperFactory::IsXrayWrapper(obj);
1084 0 : Maybe<JSAutoCompartment> ac;
1085 0 : if (objIsXray) {
1086 0 : obj = js::CheckedUnwrap(obj);
1087 0 : if (!obj) {
1088 0 : return false;
1089 : }
1090 0 : ac.emplace(cx, obj);
1091 0 : if (!JS_WrapObject(cx, &desiredProto)) {
1092 0 : return false;
1093 : }
1094 : }
1095 0 : binding_detail::FastErrorResult rv;
1096 0 : auto result(StrongOrRawPtr<mozilla::dom::SpeechSynthesisUtterance>(mozilla::dom::SpeechSynthesisUtterance::Constructor(global, rv)));
1097 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
1098 0 : return false;
1099 : }
1100 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1101 : static_assert(!IsPointer<decltype(result)>::value,
1102 : "NewObject implies that we need to keep the object alive with a strong reference.");
1103 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval(), desiredProto)) {
1104 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
1105 0 : return false;
1106 : }
1107 0 : return true;
1108 : break;
1109 : }
1110 : case 1: {
1111 0 : bool objIsXray = xpc::WrapperFactory::IsXrayWrapper(obj);
1112 0 : binding_detail::FakeString arg0;
1113 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
1114 0 : return false;
1115 : }
1116 0 : Maybe<JSAutoCompartment> ac;
1117 0 : if (objIsXray) {
1118 0 : obj = js::CheckedUnwrap(obj);
1119 0 : if (!obj) {
1120 0 : return false;
1121 : }
1122 0 : ac.emplace(cx, obj);
1123 0 : if (!JS_WrapObject(cx, &desiredProto)) {
1124 0 : return false;
1125 : }
1126 : }
1127 0 : binding_detail::FastErrorResult rv;
1128 0 : auto result(StrongOrRawPtr<mozilla::dom::SpeechSynthesisUtterance>(mozilla::dom::SpeechSynthesisUtterance::Constructor(global, NonNullHelper(Constify(arg0)), rv)));
1129 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
1130 0 : return false;
1131 : }
1132 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1133 : static_assert(!IsPointer<decltype(result)>::value,
1134 : "NewObject implies that we need to keep the object alive with a strong reference.");
1135 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval(), desiredProto)) {
1136 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
1137 0 : return false;
1138 : }
1139 0 : return true;
1140 : break;
1141 : }
1142 : default: {
1143 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "SpeechSynthesisUtterance");
1144 : break;
1145 : }
1146 : }
1147 : MOZ_CRASH("We have an always-returning default case");
1148 : return false;
1149 : }
1150 :
1151 : static const js::ClassOps sInterfaceObjectClassOps = {
1152 : nullptr, /* addProperty */
1153 : nullptr, /* delProperty */
1154 : nullptr, /* getProperty */
1155 : nullptr, /* setProperty */
1156 : nullptr, /* enumerate */
1157 : nullptr, /* newEnumerate */
1158 : nullptr, /* resolve */
1159 : nullptr, /* mayResolve */
1160 : nullptr, /* finalize */
1161 : _constructor, /* call */
1162 : nullptr, /* hasInstance */
1163 : _constructor, /* construct */
1164 : nullptr, /* trace */
1165 : };
1166 :
1167 : static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
1168 : {
1169 : "Function",
1170 : JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
1171 : &sInterfaceObjectClassOps,
1172 : JS_NULL_CLASS_SPEC,
1173 : JS_NULL_CLASS_EXT,
1174 : &sInterfaceObjectClassObjectOps
1175 : },
1176 : eInterface,
1177 : true,
1178 : prototypes::id::SpeechSynthesisUtterance,
1179 : PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth,
1180 : sNativePropertyHooks,
1181 : "function SpeechSynthesisUtterance() {\n [native code]\n}",
1182 : EventTargetBinding::GetConstructorObject
1183 : };
1184 :
1185 : static const DOMIfaceAndProtoJSClass sPrototypeClass = {
1186 : {
1187 : "SpeechSynthesisUtterancePrototype",
1188 : JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
1189 : JS_NULL_CLASS_OPS,
1190 : JS_NULL_CLASS_SPEC,
1191 : JS_NULL_CLASS_EXT,
1192 : JS_NULL_OBJECT_OPS
1193 : },
1194 : eInterfacePrototype,
1195 : false,
1196 : prototypes::id::SpeechSynthesisUtterance,
1197 : PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>::Depth,
1198 : sNativePropertyHooks,
1199 : "[object SpeechSynthesisUtterancePrototype]",
1200 : EventTargetBinding::GetProtoObject
1201 : };
1202 :
1203 : bool
1204 0 : ConstructorEnabled(JSContext* aCx, JS::Handle<JSObject*> aObj)
1205 : {
1206 : static bool sPrefValue;
1207 : static bool sPrefCacheSetUp = false;
1208 0 : if (!sPrefCacheSetUp) {
1209 0 : sPrefCacheSetUp = true;
1210 0 : Preferences::AddBoolVarCache(&sPrefValue, "media.webspeech.synth.enabled");
1211 : }
1212 :
1213 0 : return sPrefValue;
1214 : }
1215 :
1216 : JSObject*
1217 0 : DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
1218 : {
1219 0 : return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
1220 : }
1221 :
1222 : static const js::ClassOps sClassOps = {
1223 : _addProperty, /* addProperty */
1224 : nullptr, /* delProperty */
1225 : nullptr, /* getProperty */
1226 : nullptr, /* setProperty */
1227 : nullptr, /* enumerate */
1228 : nullptr, /* newEnumerate */
1229 : nullptr, /* resolve */
1230 : nullptr, /* mayResolve */
1231 : _finalize, /* finalize */
1232 : nullptr, /* call */
1233 : nullptr, /* hasInstance */
1234 : nullptr, /* construct */
1235 : nullptr, /* trace */
1236 : };
1237 :
1238 : static const js::ClassExtension sClassExtension = {
1239 : nullptr, /* weakmapKeyDelegateOp */
1240 : _objectMoved /* objectMovedOp */
1241 : };
1242 :
1243 : static const DOMJSClass sClass = {
1244 : { "SpeechSynthesisUtterance",
1245 : JSCLASS_IS_DOMJSCLASS | JSCLASS_FOREGROUND_FINALIZE | JSCLASS_HAS_RESERVED_SLOTS(1),
1246 : &sClassOps,
1247 : JS_NULL_CLASS_SPEC,
1248 : &sClassExtension,
1249 : JS_NULL_OBJECT_OPS
1250 : },
1251 : { prototypes::id::EventTarget, prototypes::id::SpeechSynthesisUtterance, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count },
1252 : IsBaseOf<nsISupports, mozilla::dom::SpeechSynthesisUtterance >::value,
1253 : sNativePropertyHooks,
1254 : FindAssociatedGlobalForNative<mozilla::dom::SpeechSynthesisUtterance>::Get,
1255 : GetProtoObjectHandle,
1256 : GetCCParticipant<mozilla::dom::SpeechSynthesisUtterance>::Get()
1257 : };
1258 : static_assert(1 == DOM_INSTANCE_RESERVED_SLOTS,
1259 : "Must have the right minimal number of reserved slots.");
1260 : static_assert(1 >= 1,
1261 : "Must have enough reserved slots.");
1262 :
1263 : const JSClass*
1264 0 : GetJSClass()
1265 : {
1266 0 : return sClass.ToJSClass();
1267 : }
1268 :
1269 : bool
1270 0 : Wrap(JSContext* aCx, mozilla::dom::SpeechSynthesisUtterance* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector)
1271 : {
1272 : MOZ_ASSERT(static_cast<mozilla::dom::SpeechSynthesisUtterance*>(aObject) ==
1273 : reinterpret_cast<mozilla::dom::SpeechSynthesisUtterance*>(aObject),
1274 : "Multiple inheritance for mozilla::dom::SpeechSynthesisUtterance is broken.");
1275 : MOZ_ASSERT(static_cast<mozilla::dom::EventTarget*>(aObject) ==
1276 : reinterpret_cast<mozilla::dom::EventTarget*>(aObject),
1277 : "Multiple inheritance for mozilla::dom::EventTarget is broken.");
1278 0 : MOZ_ASSERT(ToSupportsIsCorrect(aObject));
1279 0 : MOZ_ASSERT_IF(aGivenProto, js::IsObjectInContextCompartment(aGivenProto, aCx));
1280 0 : MOZ_ASSERT(!aCache->GetWrapper(),
1281 : "You should probably not be using Wrap() directly; use "
1282 : "GetOrCreateDOMReflector instead");
1283 :
1284 0 : MOZ_ASSERT(ToSupportsIsOnPrimaryInheritanceChain(aObject, aCache),
1285 : "nsISupports must be on our primary inheritance chain");
1286 :
1287 0 : JS::Rooted<JSObject*> global(aCx, FindAssociatedGlobal(aCx, aObject->GetParentObject()));
1288 0 : if (!global) {
1289 0 : return false;
1290 : }
1291 0 : MOZ_ASSERT(JS_IsGlobalObject(global));
1292 0 : MOZ_ASSERT(JS::ObjectIsNotGray(global));
1293 :
1294 : // That might have ended up wrapping us already, due to the wonders
1295 : // of XBL. Check for that, and bail out as needed.
1296 0 : aReflector.set(aCache->GetWrapper());
1297 0 : if (aReflector) {
1298 : #ifdef DEBUG
1299 0 : binding_detail::AssertReflectorHasGivenProto(aCx, aReflector, aGivenProto);
1300 : #endif // DEBUG
1301 0 : return true;
1302 : }
1303 :
1304 0 : JSAutoCompartment ac(aCx, global);
1305 0 : JS::Handle<JSObject*> canonicalProto = GetProtoObjectHandle(aCx);
1306 0 : if (!canonicalProto) {
1307 0 : return false;
1308 : }
1309 0 : JS::Rooted<JSObject*> proto(aCx);
1310 0 : if (aGivenProto) {
1311 0 : proto = aGivenProto;
1312 : // Unfortunately, while aGivenProto was in the compartment of aCx
1313 : // coming in, we changed compartments to that of "parent" so may need
1314 : // to wrap the proto here.
1315 0 : if (js::GetContextCompartment(aCx) != js::GetObjectCompartment(proto)) {
1316 0 : if (!JS_WrapObject(aCx, &proto)) {
1317 0 : return false;
1318 : }
1319 : }
1320 : } else {
1321 0 : proto = canonicalProto;
1322 : }
1323 :
1324 0 : BindingJSObjectCreator<mozilla::dom::SpeechSynthesisUtterance> creator(aCx);
1325 0 : creator.CreateObject(aCx, sClass.ToJSClass(), proto, aObject, aReflector);
1326 0 : if (!aReflector) {
1327 0 : return false;
1328 : }
1329 :
1330 0 : aCache->SetWrapper(aReflector);
1331 0 : creator.InitializationSucceeded();
1332 :
1333 0 : MOZ_ASSERT(aCache->GetWrapperPreserveColor() &&
1334 : aCache->GetWrapperPreserveColor() == aReflector);
1335 : // If proto != canonicalProto, we have to preserve our wrapper;
1336 : // otherwise we won't be able to properly recreate it later, since
1337 : // we won't know what proto to use. Note that we don't check
1338 : // aGivenProto here, since it's entirely possible (and even
1339 : // somewhat common) to have a non-null aGivenProto which is the
1340 : // same as canonicalProto.
1341 0 : if (proto != canonicalProto) {
1342 0 : PreserveWrapper(aObject);
1343 : }
1344 :
1345 0 : return true;
1346 : }
1347 :
1348 : const NativePropertyHooks sNativePropertyHooks[] = { {
1349 : nullptr,
1350 : nullptr,
1351 : nullptr,
1352 : { sNativeProperties.Upcast(), sChromeOnlyNativeProperties.Upcast() },
1353 : prototypes::id::SpeechSynthesisUtterance,
1354 : constructors::id::SpeechSynthesisUtterance,
1355 : EventTargetBinding::sNativePropertyHooks,
1356 : &DefaultXrayExpandoObjectClass
1357 : } };
1358 :
1359 : void
1360 0 : CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
1361 : {
1362 0 : JS::Handle<JSObject*> parentProto(EventTargetBinding::GetProtoObjectHandle(aCx));
1363 0 : if (!parentProto) {
1364 0 : return;
1365 : }
1366 :
1367 0 : JS::Handle<JSObject*> constructorProto(EventTargetBinding::GetConstructorObjectHandle(aCx));
1368 0 : if (!constructorProto) {
1369 0 : return;
1370 : }
1371 :
1372 : static bool sIdsInited = false;
1373 0 : if (!sIdsInited && NS_IsMainThread()) {
1374 0 : if (!InitIds(aCx, sNativeProperties.Upcast())) {
1375 0 : return;
1376 : }
1377 0 : if (!InitIds(aCx, sChromeOnlyNativeProperties.Upcast())) {
1378 0 : return;
1379 : }
1380 0 : sIdsInited = true;
1381 : }
1382 :
1383 0 : JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::SpeechSynthesisUtterance);
1384 0 : JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::SpeechSynthesisUtterance);
1385 0 : dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
1386 : &sPrototypeClass.mBase, protoCache,
1387 : constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
1388 : interfaceCache,
1389 : sNativeProperties.Upcast(),
1390 0 : nsContentUtils::ThreadsafeIsSystemCaller(aCx) ? sChromeOnlyNativeProperties.Upcast() : nullptr,
1391 : "SpeechSynthesisUtterance", aDefineOnGlobal,
1392 : nullptr,
1393 0 : false);
1394 : }
1395 :
1396 : JS::Handle<JSObject*>
1397 0 : GetProtoObjectHandle(JSContext* aCx)
1398 : {
1399 : /* Get the interface prototype object for this class. This will create the
1400 : object as needed. */
1401 0 : bool aDefineOnGlobal = true;
1402 :
1403 : /* Make sure our global is sane. Hopefully we can remove this sometime */
1404 0 : JSObject* global = JS::CurrentGlobalOrNull(aCx);
1405 0 : if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
1406 0 : return nullptr;
1407 : }
1408 :
1409 : /* Check to see whether the interface objects are already installed */
1410 0 : ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
1411 0 : if (!protoAndIfaceCache.HasEntryInSlot(prototypes::id::SpeechSynthesisUtterance)) {
1412 0 : JS::Rooted<JSObject*> rootedGlobal(aCx, global);
1413 0 : CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
1414 : }
1415 :
1416 : /*
1417 : * The object might _still_ be null, but that's OK.
1418 : *
1419 : * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
1420 : * traced by TraceProtoAndIfaceCache() and its contents are never
1421 : * changed after they have been set.
1422 : *
1423 : * Calling address() avoids the read read barrier that does gray
1424 : * unmarking, but it's not possible for the object to be gray here.
1425 : */
1426 :
1427 0 : const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(prototypes::id::SpeechSynthesisUtterance);
1428 0 : MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
1429 0 : return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
1430 : }
1431 :
1432 : JS::Handle<JSObject*>
1433 0 : GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
1434 : {
1435 : /* Get the interface object for this class. This will create the object as
1436 : needed. */
1437 :
1438 : /* Make sure our global is sane. Hopefully we can remove this sometime */
1439 0 : JSObject* global = JS::CurrentGlobalOrNull(aCx);
1440 0 : if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
1441 0 : return nullptr;
1442 : }
1443 :
1444 : /* Check to see whether the interface objects are already installed */
1445 0 : ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
1446 0 : if (!protoAndIfaceCache.HasEntryInSlot(constructors::id::SpeechSynthesisUtterance)) {
1447 0 : JS::Rooted<JSObject*> rootedGlobal(aCx, global);
1448 0 : CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
1449 : }
1450 :
1451 : /*
1452 : * The object might _still_ be null, but that's OK.
1453 : *
1454 : * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
1455 : * traced by TraceProtoAndIfaceCache() and its contents are never
1456 : * changed after they have been set.
1457 : *
1458 : * Calling address() avoids the read read barrier that does gray
1459 : * unmarking, but it's not possible for the object to be gray here.
1460 : */
1461 :
1462 0 : const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::SpeechSynthesisUtterance);
1463 0 : MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
1464 0 : return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
1465 : }
1466 :
1467 : JSObject*
1468 0 : GetConstructorObject(JSContext* aCx)
1469 : {
1470 0 : return GetConstructorObjectHandle(aCx);
1471 : }
1472 :
1473 : } // namespace SpeechSynthesisUtteranceBinding
1474 :
1475 :
1476 :
1477 : } // namespace dom
1478 : } // namespace mozilla
|