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