Line data Source code
1 : /* THIS FILE IS AUTOGENERATED FROM DataTransfer.webidl BY Codegen.py - DO NOT EDIT */
2 :
3 : #include "DataTransferBinding.h"
4 : #include "WrapperFactory.h"
5 : #include "XrayWrapper.h"
6 : #include "mozilla/OwningNonNull.h"
7 : #include "mozilla/Preferences.h"
8 : #include "mozilla/UseCounter.h"
9 : #include "mozilla/dom/BindingUtils.h"
10 : #include "mozilla/dom/DOMJSClass.h"
11 : #include "mozilla/dom/DOMStringList.h"
12 : #include "mozilla/dom/DataTransfer.h"
13 : #include "mozilla/dom/DataTransferItemList.h"
14 : #include "mozilla/dom/Element.h"
15 : #include "mozilla/dom/FileList.h"
16 : #include "mozilla/dom/NonRefcountedDOMObject.h"
17 : #include "mozilla/dom/Nullable.h"
18 : #include "mozilla/dom/PrimitiveConversions.h"
19 : #include "mozilla/dom/Promise.h"
20 : #include "mozilla/dom/ToJSValue.h"
21 : #include "mozilla/dom/XrayExpandoClass.h"
22 : #include "nsContentUtils.h"
23 : #include "nsINode.h"
24 :
25 : namespace mozilla {
26 : namespace dom {
27 :
28 : namespace DataTransferBinding {
29 :
30 : static bool
31 0 : get_dropEffect(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, JSJitGetterCallArgs args)
32 : {
33 0 : DOMString result;
34 0 : self->GetDropEffect(result);
35 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
36 0 : if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
37 0 : return false;
38 : }
39 0 : return true;
40 : }
41 :
42 : static bool
43 0 : set_dropEffect(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, JSJitSetterCallArgs args)
44 : {
45 0 : binding_detail::FakeString arg0;
46 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
47 0 : return false;
48 : }
49 0 : self->SetDropEffect(NonNullHelper(Constify(arg0)));
50 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
51 :
52 0 : return true;
53 : }
54 :
55 : static const JSJitInfo dropEffect_getterinfo = {
56 : { (JSJitGetterOp)get_dropEffect },
57 : { prototypes::id::DataTransfer },
58 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
59 : JSJitInfo::Getter,
60 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
61 : JSVAL_TYPE_STRING, /* 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 < 2, "There is no slot for us");
72 : static const JSJitInfo dropEffect_setterinfo = {
73 : { (JSJitGetterOp)set_dropEffect },
74 : { prototypes::id::DataTransfer },
75 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
76 : JSJitInfo::Setter,
77 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
78 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
79 : false, /* isInfallible. False in setters. */
80 : false, /* isMovable. Not relevant for setters. */
81 : false, /* isEliminatable. Not relevant for setters. */
82 : false, /* isAlwaysInSlot. Only relevant for getters. */
83 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
84 : false, /* isTypedMethod. Only relevant for methods. */
85 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
86 : };
87 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
88 : static_assert(0 < 2, "There is no slot for us");
89 :
90 : static bool
91 0 : get_effectAllowed(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, JSJitGetterCallArgs args)
92 : {
93 0 : DOMString result;
94 0 : self->GetEffectAllowed(result);
95 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
96 0 : if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
97 0 : return false;
98 : }
99 0 : return true;
100 : }
101 :
102 : static bool
103 0 : set_effectAllowed(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, JSJitSetterCallArgs args)
104 : {
105 0 : binding_detail::FakeString arg0;
106 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
107 0 : return false;
108 : }
109 0 : self->SetEffectAllowed(NonNullHelper(Constify(arg0)));
110 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
111 :
112 0 : return true;
113 : }
114 :
115 : static const JSJitInfo effectAllowed_getterinfo = {
116 : { (JSJitGetterOp)get_effectAllowed },
117 : { prototypes::id::DataTransfer },
118 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
119 : JSJitInfo::Getter,
120 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
121 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
122 : false, /* isInfallible. False in setters. */
123 : false, /* isMovable. Not relevant for setters. */
124 : false, /* isEliminatable. Not relevant for setters. */
125 : false, /* isAlwaysInSlot. Only relevant for getters. */
126 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
127 : false, /* isTypedMethod. Only relevant for methods. */
128 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
129 : };
130 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
131 : static_assert(0 < 2, "There is no slot for us");
132 : static const JSJitInfo effectAllowed_setterinfo = {
133 : { (JSJitGetterOp)set_effectAllowed },
134 : { prototypes::id::DataTransfer },
135 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
136 : JSJitInfo::Setter,
137 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
138 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
139 : false, /* isInfallible. False in setters. */
140 : false, /* isMovable. Not relevant for setters. */
141 : false, /* isEliminatable. Not relevant for setters. */
142 : false, /* isAlwaysInSlot. Only relevant for getters. */
143 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
144 : false, /* isTypedMethod. Only relevant for methods. */
145 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
146 : };
147 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
148 : static_assert(0 < 2, "There is no slot for us");
149 :
150 : static bool
151 0 : get_items(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, JSJitGetterCallArgs args)
152 : {
153 0 : auto result(StrongOrRawPtr<mozilla::dom::DataTransferItemList>(self->Items()));
154 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
155 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
156 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
157 0 : return false;
158 : }
159 0 : return true;
160 : }
161 :
162 : static const JSJitInfo items_getterinfo = {
163 : { (JSJitGetterOp)get_items },
164 : { prototypes::id::DataTransfer },
165 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
166 : JSJitInfo::Getter,
167 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
168 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
169 : false, /* isInfallible. False in setters. */
170 : false, /* isMovable. Not relevant for setters. */
171 : false, /* isEliminatable. Not relevant for setters. */
172 : false, /* isAlwaysInSlot. Only relevant for getters. */
173 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
174 : false, /* isTypedMethod. Only relevant for methods. */
175 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
176 : };
177 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
178 : static_assert(0 < 2, "There is no slot for us");
179 :
180 : static bool
181 0 : setDragImage(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, const JSJitMethodCallArgs& args)
182 : {
183 0 : if (MOZ_UNLIKELY(args.length() < 3)) {
184 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "DataTransfer.setDragImage");
185 : }
186 0 : NonNull<mozilla::dom::Element> arg0;
187 0 : if (args[0].isObject()) {
188 : {
189 0 : nsresult rv = UnwrapObject<prototypes::id::Element, mozilla::dom::Element>(args[0], arg0);
190 0 : if (NS_FAILED(rv)) {
191 0 : ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of DataTransfer.setDragImage", "Element");
192 0 : return false;
193 : }
194 : }
195 : } else {
196 0 : ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of DataTransfer.setDragImage");
197 0 : return false;
198 : }
199 : int32_t arg1;
200 0 : if (!ValueToPrimitive<int32_t, eDefault>(cx, args[1], &arg1)) {
201 0 : return false;
202 : }
203 : int32_t arg2;
204 0 : if (!ValueToPrimitive<int32_t, eDefault>(cx, args[2], &arg2)) {
205 0 : return false;
206 : }
207 0 : self->SetDragImage(NonNullHelper(arg0), arg1, arg2);
208 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
209 0 : args.rval().setUndefined();
210 0 : return true;
211 : }
212 :
213 : static const JSJitInfo setDragImage_methodinfo = {
214 : { (JSJitGetterOp)setDragImage },
215 : { prototypes::id::DataTransfer },
216 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
217 : JSJitInfo::Method,
218 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
219 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
220 : false, /* isInfallible. False in setters. */
221 : false, /* isMovable. Not relevant for setters. */
222 : false, /* isEliminatable. Not relevant for setters. */
223 : false, /* isAlwaysInSlot. Only relevant for getters. */
224 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
225 : false, /* isTypedMethod. Only relevant for methods. */
226 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
227 : };
228 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
229 : static_assert(0 < 2, "There is no slot for us");
230 :
231 : static bool
232 0 : get_types(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, JSJitGetterCallArgs args)
233 : {
234 : // Have to either root across the getter call or reget after.
235 : bool isXray;
236 0 : JS::Rooted<JSObject*> slotStorage(cx, GetCachedSlotStorageObject(cx, obj, &isXray));
237 0 : if (!slotStorage) {
238 0 : return false;
239 : }
240 0 : const size_t slotIndex = isXray ? (xpc::JSSLOT_EXPANDO_COUNT + 0) : (DOM_INSTANCE_RESERVED_SLOTS + 0);
241 0 : MOZ_ASSERT(JSCLASS_RESERVED_SLOTS(js::GetObjectClass(slotStorage)) > slotIndex);
242 : {
243 : // Scope for cachedVal
244 0 : JS::Value cachedVal = js::GetReservedSlot(slotStorage, slotIndex);
245 0 : if (!cachedVal.isUndefined()) {
246 0 : args.rval().set(cachedVal);
247 : // The cached value is in the compartment of slotStorage,
248 : // so wrap into the caller compartment as needed.
249 0 : return MaybeWrapNonDOMObjectValue(cx, args.rval());
250 : }
251 : }
252 :
253 0 : nsTArray<nsString> result;
254 0 : self->GetTypes(result, nsContentUtils::IsSystemCaller(cx) ? CallerType::System : CallerType::NonSystem);
255 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
256 : {
257 0 : JS::Rooted<JSObject*> conversionScope(cx, isXray ? obj : slotStorage);
258 0 : JSAutoCompartment ac(cx, conversionScope);
259 : do { // block we break out of when done wrapping
260 :
261 0 : uint32_t length = result.Length();
262 0 : JS::Rooted<JSObject*> returnArray(cx, JS_NewArrayObject(cx, length));
263 0 : if (!returnArray) {
264 0 : return false;
265 : }
266 : // Scope for 'tmp'
267 : {
268 0 : JS::Rooted<JS::Value> tmp(cx);
269 0 : for (uint32_t sequenceIdx0 = 0; sequenceIdx0 < length; ++sequenceIdx0) {
270 : // Control block to let us common up the JS_DefineElement calls when there
271 : // are different ways to succeed at wrapping the object.
272 : do {
273 0 : if (!xpc::NonVoidStringToJsval(cx, result[sequenceIdx0], &tmp)) {
274 0 : return false;
275 : }
276 0 : break;
277 : } while (0);
278 0 : if (!JS_DefineElement(cx, returnArray, sequenceIdx0, tmp,
279 : JSPROP_ENUMERATE)) {
280 0 : return false;
281 : }
282 : }
283 : }
284 0 : args.rval().setObject(*returnArray);
285 0 : break;
286 : } while (0);
287 0 : if (args.rval().isObject() && nsContentUtils::ThreadsafeIsSystemCaller(cx)) {
288 0 : JS::Rooted<JSObject*> rvalObj(cx, &args.rval().toObject());
289 0 : JS::Rooted<JS::Value> includesVal(cx);
290 0 : if (!JS_GetProperty(cx, rvalObj, "includes", &includesVal) ||
291 0 : !JS_DefineProperty(cx, rvalObj, "contains", includesVal, JSPROP_ENUMERATE)) {
292 0 : return false;
293 : }
294 : }
295 :
296 0 : JS::Rooted<JSObject*> rvalObj(cx, &args.rval().toObject());
297 0 : if (!JS_FreezeObject(cx, rvalObj)) {
298 0 : return false;
299 : }
300 : }
301 : { // And now store things in the compartment of our slotStorage.
302 0 : JSAutoCompartment ac(cx, slotStorage);
303 : // Make a copy so that we don't do unnecessary wrapping on args.rval().
304 0 : JS::Rooted<JS::Value> storedVal(cx, args.rval());
305 0 : if (!MaybeWrapNonDOMObjectValue(cx, &storedVal)) {
306 0 : return false;
307 : }
308 0 : js::SetReservedSlot(slotStorage, slotIndex, storedVal);
309 0 : if (!isXray) {
310 : // In the Xray case we don't need to do this, because getting the
311 : // expando object already preserved our wrapper.
312 0 : PreserveWrapper(self);
313 : }
314 : }
315 : // And now make sure args.rval() is in the caller compartment
316 0 : return MaybeWrapNonDOMObjectValue(cx, args.rval());
317 : }
318 :
319 : static const JSJitInfo types_getterinfo = {
320 : { (JSJitGetterOp)get_types },
321 : { prototypes::id::DataTransfer },
322 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
323 : JSJitInfo::Getter,
324 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
325 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
326 : false, /* isInfallible. False in setters. */
327 : true, /* isMovable. Not relevant for setters. */
328 : true, /* isEliminatable. Not relevant for setters. */
329 : false, /* isAlwaysInSlot. Only relevant for getters. */
330 : true, /* isLazilyCachedInSlot. Only relevant for getters. */
331 : false, /* isTypedMethod. Only relevant for methods. */
332 : (DOM_INSTANCE_RESERVED_SLOTS + 0) /* Reserved slot index, if we're stored in a slot, else 0. */
333 : };
334 : static_assert((DOM_INSTANCE_RESERVED_SLOTS + 0) <= JSJitInfo::maxSlotIndex, "We won't fit");
335 : static_assert((DOM_INSTANCE_RESERVED_SLOTS + 0) < 2, "There is no slot for us");
336 :
337 : static bool
338 0 : getData(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, const JSJitMethodCallArgs& args)
339 : {
340 0 : if (MOZ_UNLIKELY(args.length() < 1)) {
341 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "DataTransfer.getData");
342 : }
343 0 : binding_detail::FakeString arg0;
344 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
345 0 : return false;
346 : }
347 0 : binding_detail::FastErrorResult rv;
348 0 : JSCompartment* compartment = js::GetContextCompartment(cx);
349 0 : MOZ_ASSERT(compartment);
350 0 : JSPrincipals* principals = JS_GetCompartmentPrincipals(compartment);
351 : // Initializing a nonnull is pretty darn annoying...
352 0 : NonNull<nsIPrincipal> subjectPrincipal;
353 0 : subjectPrincipal = static_cast<nsIPrincipal*>(nsJSPrincipals::get(principals));
354 0 : DOMString result;
355 0 : self->GetData(NonNullHelper(Constify(arg0)), result, subjectPrincipal, rv);
356 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
357 0 : return false;
358 : }
359 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
360 0 : if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
361 0 : return false;
362 : }
363 0 : return true;
364 : }
365 :
366 : static const JSJitInfo getData_methodinfo = {
367 : { (JSJitGetterOp)getData },
368 : { prototypes::id::DataTransfer },
369 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
370 : JSJitInfo::Method,
371 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
372 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
373 : false, /* isInfallible. False in setters. */
374 : false, /* isMovable. Not relevant for setters. */
375 : false, /* isEliminatable. Not relevant for setters. */
376 : false, /* isAlwaysInSlot. Only relevant for getters. */
377 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
378 : false, /* isTypedMethod. Only relevant for methods. */
379 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
380 : };
381 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
382 : static_assert(0 < 2, "There is no slot for us");
383 :
384 : static bool
385 0 : setData(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, const JSJitMethodCallArgs& args)
386 : {
387 0 : if (MOZ_UNLIKELY(args.length() < 2)) {
388 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "DataTransfer.setData");
389 : }
390 0 : binding_detail::FakeString arg0;
391 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
392 0 : return false;
393 : }
394 0 : binding_detail::FakeString arg1;
395 0 : if (!ConvertJSValueToString(cx, args[1], eStringify, eStringify, arg1)) {
396 0 : return false;
397 : }
398 0 : binding_detail::FastErrorResult rv;
399 0 : JSCompartment* compartment = js::GetContextCompartment(cx);
400 0 : MOZ_ASSERT(compartment);
401 0 : JSPrincipals* principals = JS_GetCompartmentPrincipals(compartment);
402 : // Initializing a nonnull is pretty darn annoying...
403 0 : NonNull<nsIPrincipal> subjectPrincipal;
404 0 : subjectPrincipal = static_cast<nsIPrincipal*>(nsJSPrincipals::get(principals));
405 0 : self->SetData(NonNullHelper(Constify(arg0)), NonNullHelper(Constify(arg1)), subjectPrincipal, rv);
406 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
407 0 : return false;
408 : }
409 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
410 0 : args.rval().setUndefined();
411 0 : return true;
412 : }
413 :
414 : static const JSJitInfo setData_methodinfo = {
415 : { (JSJitGetterOp)setData },
416 : { prototypes::id::DataTransfer },
417 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
418 : JSJitInfo::Method,
419 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
420 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
421 : false, /* isInfallible. False in setters. */
422 : false, /* isMovable. Not relevant for setters. */
423 : false, /* isEliminatable. Not relevant for setters. */
424 : false, /* isAlwaysInSlot. Only relevant for getters. */
425 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
426 : false, /* isTypedMethod. Only relevant for methods. */
427 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
428 : };
429 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
430 : static_assert(0 < 2, "There is no slot for us");
431 :
432 : static bool
433 0 : clearData(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, const JSJitMethodCallArgs& args)
434 : {
435 0 : Optional<nsAString> arg0;
436 0 : binding_detail::FakeString arg0_holder;
437 0 : if (args.hasDefined(0)) {
438 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0_holder)) {
439 0 : return false;
440 : }
441 0 : arg0 = &arg0_holder;
442 : }
443 0 : binding_detail::FastErrorResult rv;
444 0 : JSCompartment* compartment = js::GetContextCompartment(cx);
445 0 : MOZ_ASSERT(compartment);
446 0 : JSPrincipals* principals = JS_GetCompartmentPrincipals(compartment);
447 : // Initializing a nonnull is pretty darn annoying...
448 0 : NonNull<nsIPrincipal> subjectPrincipal;
449 0 : subjectPrincipal = static_cast<nsIPrincipal*>(nsJSPrincipals::get(principals));
450 0 : self->ClearData(NonNullHelper(Constify(arg0)), subjectPrincipal, rv);
451 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
452 0 : return false;
453 : }
454 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
455 0 : args.rval().setUndefined();
456 0 : return true;
457 : }
458 :
459 : static const JSJitInfo clearData_methodinfo = {
460 : { (JSJitGetterOp)clearData },
461 : { prototypes::id::DataTransfer },
462 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
463 : JSJitInfo::Method,
464 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
465 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
466 : false, /* isInfallible. False in setters. */
467 : false, /* isMovable. Not relevant for setters. */
468 : false, /* isEliminatable. Not relevant for setters. */
469 : false, /* isAlwaysInSlot. Only relevant for getters. */
470 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
471 : false, /* isTypedMethod. Only relevant for methods. */
472 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
473 : };
474 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
475 : static_assert(0 < 2, "There is no slot for us");
476 :
477 : static bool
478 0 : get_files(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, JSJitGetterCallArgs args)
479 : {
480 0 : binding_detail::FastErrorResult rv;
481 0 : JSCompartment* compartment = js::GetContextCompartment(cx);
482 0 : MOZ_ASSERT(compartment);
483 0 : JSPrincipals* principals = JS_GetCompartmentPrincipals(compartment);
484 : // Initializing a nonnull is pretty darn annoying...
485 0 : NonNull<nsIPrincipal> subjectPrincipal;
486 0 : subjectPrincipal = static_cast<nsIPrincipal*>(nsJSPrincipals::get(principals));
487 0 : auto result(StrongOrRawPtr<mozilla::dom::FileList>(self->GetFiles(subjectPrincipal, rv)));
488 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
489 0 : return false;
490 : }
491 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
492 0 : if (!result) {
493 0 : args.rval().setNull();
494 0 : return true;
495 : }
496 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
497 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
498 0 : return false;
499 : }
500 0 : return true;
501 : }
502 :
503 : static const JSJitInfo files_getterinfo = {
504 : { (JSJitGetterOp)get_files },
505 : { prototypes::id::DataTransfer },
506 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
507 : JSJitInfo::Getter,
508 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
509 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
510 : false, /* isInfallible. False in setters. */
511 : false, /* isMovable. Not relevant for setters. */
512 : false, /* isEliminatable. Not relevant for setters. */
513 : false, /* isAlwaysInSlot. Only relevant for getters. */
514 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
515 : false, /* isTypedMethod. Only relevant for methods. */
516 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
517 : };
518 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
519 : static_assert(0 < 2, "There is no slot for us");
520 :
521 : static bool
522 0 : getFilesAndDirectories(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, const JSJitMethodCallArgs& args)
523 : {
524 0 : binding_detail::FastErrorResult rv;
525 0 : JSCompartment* compartment = js::GetContextCompartment(cx);
526 0 : MOZ_ASSERT(compartment);
527 0 : JSPrincipals* principals = JS_GetCompartmentPrincipals(compartment);
528 : // Initializing a nonnull is pretty darn annoying...
529 0 : NonNull<nsIPrincipal> subjectPrincipal;
530 0 : subjectPrincipal = static_cast<nsIPrincipal*>(nsJSPrincipals::get(principals));
531 0 : auto result(StrongOrRawPtr<Promise>(self->GetFilesAndDirectories(subjectPrincipal, rv)));
532 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
533 0 : return false;
534 : }
535 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
536 0 : if (!ToJSValue(cx, result, args.rval())) {
537 0 : return false;
538 : }
539 0 : return true;
540 : }
541 :
542 : static bool
543 0 : getFilesAndDirectories_promiseWrapper(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, const JSJitMethodCallArgs& args)
544 : {
545 : // Make sure to save the callee before someone maybe messes
546 : // with rval().
547 0 : JS::Rooted<JSObject*> callee(cx, &args.callee());
548 0 : bool ok = getFilesAndDirectories(cx, obj, self, args);
549 0 : if (ok) {
550 0 : return true;
551 : }
552 0 : return ConvertExceptionToPromise(cx, xpc::XrayAwareCalleeGlobal(callee),
553 0 : args.rval());
554 : }
555 :
556 : static const JSJitInfo getFilesAndDirectories_methodinfo = {
557 : { (JSJitGetterOp)getFilesAndDirectories_promiseWrapper },
558 : { prototypes::id::DataTransfer },
559 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
560 : JSJitInfo::Method,
561 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
562 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
563 : false, /* isInfallible. False in setters. */
564 : false, /* isMovable. Not relevant for setters. */
565 : false, /* isEliminatable. Not relevant for setters. */
566 : false, /* isAlwaysInSlot. Only relevant for getters. */
567 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
568 : false, /* isTypedMethod. Only relevant for methods. */
569 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
570 : };
571 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
572 : static_assert(0 < 2, "There is no slot for us");
573 :
574 : static bool
575 0 : getFiles(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, const JSJitMethodCallArgs& args)
576 : {
577 : bool arg0;
578 0 : if (args.hasDefined(0)) {
579 0 : if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
580 0 : return false;
581 : }
582 : } else {
583 0 : arg0 = false;
584 : }
585 0 : binding_detail::FastErrorResult rv;
586 0 : JSCompartment* compartment = js::GetContextCompartment(cx);
587 0 : MOZ_ASSERT(compartment);
588 0 : JSPrincipals* principals = JS_GetCompartmentPrincipals(compartment);
589 : // Initializing a nonnull is pretty darn annoying...
590 0 : NonNull<nsIPrincipal> subjectPrincipal;
591 0 : subjectPrincipal = static_cast<nsIPrincipal*>(nsJSPrincipals::get(principals));
592 0 : auto result(StrongOrRawPtr<Promise>(self->GetFiles(arg0, subjectPrincipal, rv)));
593 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
594 0 : return false;
595 : }
596 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
597 0 : if (!ToJSValue(cx, result, args.rval())) {
598 0 : return false;
599 : }
600 0 : return true;
601 : }
602 :
603 : static bool
604 0 : getFiles_promiseWrapper(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, const JSJitMethodCallArgs& args)
605 : {
606 : // Make sure to save the callee before someone maybe messes
607 : // with rval().
608 0 : JS::Rooted<JSObject*> callee(cx, &args.callee());
609 0 : bool ok = getFiles(cx, obj, self, args);
610 0 : if (ok) {
611 0 : return true;
612 : }
613 0 : return ConvertExceptionToPromise(cx, xpc::XrayAwareCalleeGlobal(callee),
614 0 : args.rval());
615 : }
616 :
617 : static const JSJitInfo getFiles_methodinfo = {
618 : { (JSJitGetterOp)getFiles_promiseWrapper },
619 : { prototypes::id::DataTransfer },
620 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
621 : JSJitInfo::Method,
622 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
623 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
624 : false, /* isInfallible. False in setters. */
625 : false, /* isMovable. Not relevant for setters. */
626 : false, /* isEliminatable. Not relevant for setters. */
627 : false, /* isAlwaysInSlot. Only relevant for getters. */
628 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
629 : false, /* isTypedMethod. Only relevant for methods. */
630 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
631 : };
632 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
633 : static_assert(0 < 2, "There is no slot for us");
634 :
635 : static bool
636 0 : addElement(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, const JSJitMethodCallArgs& args)
637 : {
638 0 : if (MOZ_UNLIKELY(args.length() < 1)) {
639 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "DataTransfer.addElement");
640 : }
641 0 : NonNull<mozilla::dom::Element> arg0;
642 0 : if (args[0].isObject()) {
643 : {
644 0 : nsresult rv = UnwrapObject<prototypes::id::Element, mozilla::dom::Element>(args[0], arg0);
645 0 : if (NS_FAILED(rv)) {
646 0 : ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of DataTransfer.addElement", "Element");
647 0 : return false;
648 : }
649 : }
650 : } else {
651 0 : ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of DataTransfer.addElement");
652 0 : return false;
653 : }
654 0 : binding_detail::FastErrorResult rv;
655 0 : self->AddElement(NonNullHelper(arg0), rv);
656 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
657 0 : return false;
658 : }
659 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
660 0 : SetDocumentAndPageUseCounter(cx, obj, eUseCounter_DataTransfer_addElement);
661 0 : args.rval().setUndefined();
662 0 : return true;
663 : }
664 :
665 : static const JSJitInfo addElement_methodinfo = {
666 : { (JSJitGetterOp)addElement },
667 : { prototypes::id::DataTransfer },
668 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
669 : JSJitInfo::Method,
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 < 2, "There is no slot for us");
682 :
683 : static bool
684 0 : get_mozItemCount(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, JSJitGetterCallArgs args)
685 : {
686 0 : uint32_t result(self->MozItemCount());
687 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
688 0 : SetDocumentAndPageUseCounter(cx, obj, eUseCounter_DataTransfer_mozItemCount_getter);
689 0 : args.rval().setNumber(result);
690 0 : return true;
691 : }
692 :
693 : static const JSJitInfo mozItemCount_getterinfo = {
694 : { (JSJitGetterOp)get_mozItemCount },
695 : { prototypes::id::DataTransfer },
696 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
697 : JSJitInfo::Getter,
698 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
699 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
700 : true, /* isInfallible. False in setters. */
701 : false, /* isMovable. Not relevant for setters. */
702 : false, /* isEliminatable. Not relevant for setters. */
703 : false, /* isAlwaysInSlot. Only relevant for getters. */
704 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
705 : false, /* isTypedMethod. Only relevant for methods. */
706 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
707 : };
708 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
709 : static_assert(0 < 2, "There is no slot for us");
710 :
711 : static bool
712 0 : get_mozCursor(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, JSJitGetterCallArgs args)
713 : {
714 0 : DOMString result;
715 0 : self->GetMozCursor(result);
716 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
717 0 : SetDocumentAndPageUseCounter(cx, obj, eUseCounter_DataTransfer_mozCursor_getter);
718 0 : if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
719 0 : return false;
720 : }
721 0 : return true;
722 : }
723 :
724 : static bool
725 0 : set_mozCursor(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, JSJitSetterCallArgs args)
726 : {
727 0 : binding_detail::FakeString arg0;
728 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
729 0 : return false;
730 : }
731 0 : self->SetMozCursor(NonNullHelper(Constify(arg0)));
732 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
733 0 : SetDocumentAndPageUseCounter(cx, obj, eUseCounter_DataTransfer_mozCursor_setter);
734 :
735 0 : return true;
736 : }
737 :
738 : static const JSJitInfo mozCursor_getterinfo = {
739 : { (JSJitGetterOp)get_mozCursor },
740 : { prototypes::id::DataTransfer },
741 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
742 : JSJitInfo::Getter,
743 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
744 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
745 : false, /* isInfallible. False in setters. */
746 : false, /* isMovable. Not relevant for setters. */
747 : false, /* isEliminatable. Not relevant for setters. */
748 : false, /* isAlwaysInSlot. Only relevant for getters. */
749 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
750 : false, /* isTypedMethod. Only relevant for methods. */
751 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
752 : };
753 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
754 : static_assert(0 < 2, "There is no slot for us");
755 : static const JSJitInfo mozCursor_setterinfo = {
756 : { (JSJitGetterOp)set_mozCursor },
757 : { prototypes::id::DataTransfer },
758 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
759 : JSJitInfo::Setter,
760 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
761 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
762 : false, /* isInfallible. False in setters. */
763 : false, /* isMovable. Not relevant for setters. */
764 : false, /* isEliminatable. Not relevant for setters. */
765 : false, /* isAlwaysInSlot. Only relevant for getters. */
766 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
767 : false, /* isTypedMethod. Only relevant for methods. */
768 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
769 : };
770 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
771 : static_assert(0 < 2, "There is no slot for us");
772 :
773 : static bool
774 0 : mozTypesAt(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, const JSJitMethodCallArgs& args)
775 : {
776 0 : if (MOZ_UNLIKELY(args.length() < 1)) {
777 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "DataTransfer.mozTypesAt");
778 : }
779 : uint32_t arg0;
780 0 : if (!ValueToPrimitive<uint32_t, eDefault>(cx, args[0], &arg0)) {
781 0 : return false;
782 : }
783 0 : binding_detail::FastErrorResult rv;
784 0 : auto result(StrongOrRawPtr<mozilla::dom::DOMStringList>(self->MozTypesAt(arg0, nsContentUtils::IsSystemCaller(cx) ? CallerType::System : CallerType::NonSystem, rv)));
785 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
786 0 : return false;
787 : }
788 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
789 0 : SetDocumentAndPageUseCounter(cx, obj, eUseCounter_DataTransfer_mozTypesAt);
790 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
791 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
792 0 : return false;
793 : }
794 0 : return true;
795 : }
796 :
797 : static const JSJitInfo mozTypesAt_methodinfo = {
798 : { (JSJitGetterOp)mozTypesAt },
799 : { prototypes::id::DataTransfer },
800 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
801 : JSJitInfo::Method,
802 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
803 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
804 : false, /* isInfallible. False in setters. */
805 : false, /* isMovable. Not relevant for setters. */
806 : false, /* isEliminatable. Not relevant for setters. */
807 : false, /* isAlwaysInSlot. Only relevant for getters. */
808 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
809 : false, /* isTypedMethod. Only relevant for methods. */
810 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
811 : };
812 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
813 : static_assert(0 < 2, "There is no slot for us");
814 :
815 : static bool
816 0 : mozClearDataAt(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, const JSJitMethodCallArgs& args)
817 : {
818 0 : if (MOZ_UNLIKELY(args.length() < 2)) {
819 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "DataTransfer.mozClearDataAt");
820 : }
821 0 : binding_detail::FakeString arg0;
822 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
823 0 : return false;
824 : }
825 : uint32_t arg1;
826 0 : if (!ValueToPrimitive<uint32_t, eDefault>(cx, args[1], &arg1)) {
827 0 : return false;
828 : }
829 0 : binding_detail::FastErrorResult rv;
830 0 : JSCompartment* compartment = js::GetContextCompartment(cx);
831 0 : MOZ_ASSERT(compartment);
832 0 : JSPrincipals* principals = JS_GetCompartmentPrincipals(compartment);
833 : // Initializing a nonnull is pretty darn annoying...
834 0 : NonNull<nsIPrincipal> subjectPrincipal;
835 0 : subjectPrincipal = static_cast<nsIPrincipal*>(nsJSPrincipals::get(principals));
836 0 : self->MozClearDataAt(NonNullHelper(Constify(arg0)), arg1, subjectPrincipal, rv);
837 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
838 0 : return false;
839 : }
840 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
841 0 : SetDocumentAndPageUseCounter(cx, obj, eUseCounter_DataTransfer_mozClearDataAt);
842 0 : args.rval().setUndefined();
843 0 : return true;
844 : }
845 :
846 : static const JSJitInfo mozClearDataAt_methodinfo = {
847 : { (JSJitGetterOp)mozClearDataAt },
848 : { prototypes::id::DataTransfer },
849 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
850 : JSJitInfo::Method,
851 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
852 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
853 : false, /* isInfallible. False in setters. */
854 : false, /* isMovable. Not relevant for setters. */
855 : false, /* isEliminatable. Not relevant for setters. */
856 : false, /* isAlwaysInSlot. Only relevant for getters. */
857 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
858 : false, /* isTypedMethod. Only relevant for methods. */
859 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
860 : };
861 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
862 : static_assert(0 < 2, "There is no slot for us");
863 :
864 : static bool
865 0 : mozSetDataAt(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, const JSJitMethodCallArgs& args)
866 : {
867 0 : if (MOZ_UNLIKELY(args.length() < 3)) {
868 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "DataTransfer.mozSetDataAt");
869 : }
870 0 : binding_detail::FakeString arg0;
871 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
872 0 : return false;
873 : }
874 0 : JS::Rooted<JS::Value> arg1(cx);
875 0 : arg1 = args[1];
876 : uint32_t arg2;
877 0 : if (!ValueToPrimitive<uint32_t, eDefault>(cx, args[2], &arg2)) {
878 0 : return false;
879 : }
880 0 : binding_detail::FastErrorResult rv;
881 0 : JSCompartment* compartment = js::GetContextCompartment(cx);
882 0 : MOZ_ASSERT(compartment);
883 0 : JSPrincipals* principals = JS_GetCompartmentPrincipals(compartment);
884 : // Initializing a nonnull is pretty darn annoying...
885 0 : NonNull<nsIPrincipal> subjectPrincipal;
886 0 : subjectPrincipal = static_cast<nsIPrincipal*>(nsJSPrincipals::get(principals));
887 0 : self->MozSetDataAt(cx, NonNullHelper(Constify(arg0)), arg1, arg2, subjectPrincipal, rv);
888 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
889 0 : return false;
890 : }
891 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
892 0 : SetDocumentAndPageUseCounter(cx, obj, eUseCounter_DataTransfer_mozSetDataAt);
893 0 : args.rval().setUndefined();
894 0 : return true;
895 : }
896 :
897 : static const JSJitInfo mozSetDataAt_methodinfo = {
898 : { (JSJitGetterOp)mozSetDataAt },
899 : { prototypes::id::DataTransfer },
900 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
901 : JSJitInfo::Method,
902 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
903 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
904 : false, /* isInfallible. False in setters. */
905 : false, /* isMovable. Not relevant for setters. */
906 : false, /* isEliminatable. Not relevant for setters. */
907 : false, /* isAlwaysInSlot. Only relevant for getters. */
908 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
909 : false, /* isTypedMethod. Only relevant for methods. */
910 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
911 : };
912 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
913 : static_assert(0 < 2, "There is no slot for us");
914 :
915 : static bool
916 0 : mozGetDataAt(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, const JSJitMethodCallArgs& args)
917 : {
918 0 : if (MOZ_UNLIKELY(args.length() < 2)) {
919 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "DataTransfer.mozGetDataAt");
920 : }
921 0 : binding_detail::FakeString arg0;
922 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
923 0 : return false;
924 : }
925 : uint32_t arg1;
926 0 : if (!ValueToPrimitive<uint32_t, eDefault>(cx, args[1], &arg1)) {
927 0 : return false;
928 : }
929 0 : binding_detail::FastErrorResult rv;
930 0 : JSCompartment* compartment = js::GetContextCompartment(cx);
931 0 : MOZ_ASSERT(compartment);
932 0 : JSPrincipals* principals = JS_GetCompartmentPrincipals(compartment);
933 : // Initializing a nonnull is pretty darn annoying...
934 0 : NonNull<nsIPrincipal> subjectPrincipal;
935 0 : subjectPrincipal = static_cast<nsIPrincipal*>(nsJSPrincipals::get(principals));
936 0 : JS::Rooted<JS::Value> result(cx);
937 0 : self->MozGetDataAt(cx, NonNullHelper(Constify(arg0)), arg1, &result, subjectPrincipal, rv);
938 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
939 0 : return false;
940 : }
941 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
942 0 : SetDocumentAndPageUseCounter(cx, obj, eUseCounter_DataTransfer_mozGetDataAt);
943 0 : JS::ExposeValueToActiveJS(result);
944 0 : args.rval().set(result);
945 0 : if (!MaybeWrapValue(cx, args.rval())) {
946 0 : return false;
947 : }
948 0 : return true;
949 : }
950 :
951 : static const JSJitInfo mozGetDataAt_methodinfo = {
952 : { (JSJitGetterOp)mozGetDataAt },
953 : { prototypes::id::DataTransfer },
954 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
955 : JSJitInfo::Method,
956 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
957 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
958 : false, /* isInfallible. False in setters. */
959 : false, /* isMovable. Not relevant for setters. */
960 : false, /* isEliminatable. Not relevant for setters. */
961 : false, /* isAlwaysInSlot. Only relevant for getters. */
962 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
963 : false, /* isTypedMethod. Only relevant for methods. */
964 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
965 : };
966 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
967 : static_assert(0 < 2, "There is no slot for us");
968 :
969 : static bool
970 0 : updateDragImage(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, const JSJitMethodCallArgs& args)
971 : {
972 0 : if (MOZ_UNLIKELY(args.length() < 3)) {
973 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "DataTransfer.updateDragImage");
974 : }
975 0 : NonNull<mozilla::dom::Element> arg0;
976 0 : if (args[0].isObject()) {
977 : {
978 0 : nsresult rv = UnwrapObject<prototypes::id::Element, mozilla::dom::Element>(args[0], arg0);
979 0 : if (NS_FAILED(rv)) {
980 0 : ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of DataTransfer.updateDragImage", "Element");
981 0 : return false;
982 : }
983 : }
984 : } else {
985 0 : ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of DataTransfer.updateDragImage");
986 0 : return false;
987 : }
988 : int32_t arg1;
989 0 : if (!ValueToPrimitive<int32_t, eDefault>(cx, args[1], &arg1)) {
990 0 : return false;
991 : }
992 : int32_t arg2;
993 0 : if (!ValueToPrimitive<int32_t, eDefault>(cx, args[2], &arg2)) {
994 0 : return false;
995 : }
996 0 : self->UpdateDragImage(NonNullHelper(arg0), arg1, arg2);
997 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
998 0 : args.rval().setUndefined();
999 0 : return true;
1000 : }
1001 :
1002 : static const JSJitInfo updateDragImage_methodinfo = {
1003 : { (JSJitGetterOp)updateDragImage },
1004 : { prototypes::id::DataTransfer },
1005 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
1006 : JSJitInfo::Method,
1007 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
1008 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
1009 : false, /* isInfallible. False in setters. */
1010 : false, /* isMovable. Not relevant for setters. */
1011 : false, /* isEliminatable. Not relevant for setters. */
1012 : false, /* isAlwaysInSlot. Only relevant for getters. */
1013 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1014 : false, /* isTypedMethod. Only relevant for methods. */
1015 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1016 : };
1017 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1018 : static_assert(0 < 2, "There is no slot for us");
1019 :
1020 : static bool
1021 0 : get_mozUserCancelled(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, JSJitGetterCallArgs args)
1022 : {
1023 0 : bool result(self->MozUserCancelled());
1024 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1025 0 : SetDocumentAndPageUseCounter(cx, obj, eUseCounter_DataTransfer_mozUserCancelled_getter);
1026 0 : args.rval().setBoolean(result);
1027 0 : return true;
1028 : }
1029 :
1030 : static const JSJitInfo mozUserCancelled_getterinfo = {
1031 : { (JSJitGetterOp)get_mozUserCancelled },
1032 : { prototypes::id::DataTransfer },
1033 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
1034 : JSJitInfo::Getter,
1035 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
1036 : JSVAL_TYPE_BOOLEAN, /* returnType. Not relevant for setters. */
1037 : true, /* isInfallible. False in setters. */
1038 : false, /* isMovable. Not relevant for setters. */
1039 : false, /* isEliminatable. Not relevant for setters. */
1040 : false, /* isAlwaysInSlot. Only relevant for getters. */
1041 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1042 : false, /* isTypedMethod. Only relevant for methods. */
1043 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1044 : };
1045 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1046 : static_assert(0 < 2, "There is no slot for us");
1047 :
1048 : static bool
1049 0 : get_mozSourceNode(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::DataTransfer* self, JSJitGetterCallArgs args)
1050 : {
1051 0 : auto result(StrongOrRawPtr<nsINode>(self->GetMozSourceNode()));
1052 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1053 0 : SetDocumentAndPageUseCounter(cx, obj, eUseCounter_DataTransfer_mozSourceNode_getter);
1054 0 : if (!result) {
1055 0 : args.rval().setNull();
1056 0 : return true;
1057 : }
1058 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
1059 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
1060 0 : return false;
1061 : }
1062 0 : return true;
1063 : }
1064 :
1065 : static const JSJitInfo mozSourceNode_getterinfo = {
1066 : { (JSJitGetterOp)get_mozSourceNode },
1067 : { prototypes::id::DataTransfer },
1068 : { PrototypeTraits<prototypes::id::DataTransfer>::Depth },
1069 : JSJitInfo::Getter,
1070 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
1071 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
1072 : false, /* isInfallible. False in setters. */
1073 : false, /* isMovable. Not relevant for setters. */
1074 : false, /* isEliminatable. Not relevant for setters. */
1075 : false, /* isAlwaysInSlot. Only relevant for getters. */
1076 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1077 : false, /* isTypedMethod. Only relevant for methods. */
1078 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1079 : };
1080 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1081 : static_assert(0 < 2, "There is no slot for us");
1082 :
1083 : static bool
1084 0 : _addProperty(JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JS::Handle<JS::Value> val)
1085 : {
1086 0 : mozilla::dom::DataTransfer* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::DataTransfer>(obj);
1087 : // We don't want to preserve if we don't have a wrapper, and we
1088 : // obviously can't preserve if we're not initialized.
1089 0 : if (self && self->GetWrapperPreserveColor()) {
1090 0 : PreserveWrapper(self);
1091 : }
1092 0 : return true;
1093 : }
1094 :
1095 : static void
1096 0 : _finalize(js::FreeOp* fop, JSObject* obj)
1097 : {
1098 0 : mozilla::dom::DataTransfer* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::DataTransfer>(obj);
1099 0 : if (self) {
1100 0 : ClearWrapper(self, self, obj);
1101 0 : AddForDeferredFinalization<mozilla::dom::DataTransfer>(self);
1102 : }
1103 0 : }
1104 :
1105 : static void
1106 0 : _objectMoved(JSObject* obj, const JSObject* old)
1107 : {
1108 0 : mozilla::dom::DataTransfer* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::DataTransfer>(obj);
1109 0 : if (self) {
1110 0 : UpdateWrapper(self, self, obj, old);
1111 : }
1112 0 : }
1113 :
1114 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
1115 : #if defined(__clang__)
1116 : #pragma clang diagnostic push
1117 : #pragma clang diagnostic ignored "-Wmissing-braces"
1118 : #endif
1119 : static const JSFunctionSpec sMethods_specs[] = {
1120 : JS_FNSPEC("setDragImage", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&setDragImage_methodinfo), 3, JSPROP_ENUMERATE, nullptr),
1121 : JS_FNSPEC("getData", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getData_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1122 : JS_FNSPEC("setData", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&setData_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
1123 : JS_FNSPEC("clearData", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&clearData_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1124 : JS_FS_END,
1125 : JS_FNSPEC("getFilesAndDirectories", GenericPromiseReturningBindingMethod, reinterpret_cast<const JSJitInfo*>(&getFilesAndDirectories_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1126 : JS_FNSPEC("getFiles", GenericPromiseReturningBindingMethod, reinterpret_cast<const JSJitInfo*>(&getFiles_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1127 : JS_FS_END,
1128 : JS_FNSPEC("addElement", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&addElement_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1129 : JS_FNSPEC("mozTypesAt", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&mozTypesAt_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1130 : JS_FNSPEC("mozClearDataAt", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&mozClearDataAt_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
1131 : JS_FNSPEC("mozSetDataAt", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&mozSetDataAt_methodinfo), 3, JSPROP_ENUMERATE, nullptr),
1132 : JS_FNSPEC("mozGetDataAt", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&mozGetDataAt_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
1133 : JS_FS_END
1134 : };
1135 : #if defined(__clang__)
1136 : #pragma clang diagnostic pop
1137 : #endif
1138 :
1139 : static PrefableDisablers sMethods_disablers5 = {
1140 : true, false, 0, nullptr
1141 : };
1142 :
1143 : // Can't be const because the pref-enabled boolean needs to be writable
1144 : static Prefable<const JSFunctionSpec> sMethods[] = {
1145 : { nullptr, &sMethods_specs[0] },
1146 : { &sMethods_disablers5, &sMethods_specs[5] },
1147 : { nullptr, &sMethods_specs[8] },
1148 : { nullptr, nullptr }
1149 : };
1150 :
1151 : static_assert(3 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
1152 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
1153 : static_assert(5 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
1154 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
1155 :
1156 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
1157 : #if defined(__clang__)
1158 : #pragma clang diagnostic push
1159 : #pragma clang diagnostic ignored "-Wmissing-braces"
1160 : #endif
1161 : static const JSFunctionSpec sChromeMethods_specs[] = {
1162 : JS_FNSPEC("updateDragImage", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&updateDragImage_methodinfo), 3, JSPROP_ENUMERATE, nullptr),
1163 : JS_FS_END
1164 : };
1165 : #if defined(__clang__)
1166 : #pragma clang diagnostic pop
1167 : #endif
1168 :
1169 :
1170 : // Can't be const because the pref-enabled boolean needs to be writable
1171 : static Prefable<const JSFunctionSpec> sChromeMethods[] = {
1172 : { nullptr, &sChromeMethods_specs[0] },
1173 : { nullptr, nullptr }
1174 : };
1175 :
1176 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
1177 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
1178 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
1179 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
1180 :
1181 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
1182 : #if defined(__clang__)
1183 : #pragma clang diagnostic push
1184 : #pragma clang diagnostic ignored "-Wmissing-braces"
1185 : #endif
1186 : static const JSPropertySpec sAttributes_specs[] = {
1187 : { "dropEffect", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &dropEffect_getterinfo, GenericBindingSetter, &dropEffect_setterinfo },
1188 : { "effectAllowed", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &effectAllowed_getterinfo, GenericBindingSetter, &effectAllowed_setterinfo },
1189 : { "items", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &items_getterinfo, nullptr, nullptr },
1190 : { "types", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &types_getterinfo, nullptr, nullptr },
1191 : { "files", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &files_getterinfo, nullptr, nullptr },
1192 : { "mozItemCount", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mozItemCount_getterinfo, nullptr, nullptr },
1193 : { "mozCursor", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mozCursor_getterinfo, GenericBindingSetter, &mozCursor_setterinfo },
1194 : { "mozUserCancelled", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mozUserCancelled_getterinfo, nullptr, nullptr },
1195 : { "mozSourceNode", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mozSourceNode_getterinfo, nullptr, nullptr },
1196 : { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
1197 : };
1198 : #if defined(__clang__)
1199 : #pragma clang diagnostic pop
1200 : #endif
1201 :
1202 :
1203 : // Can't be const because the pref-enabled boolean needs to be writable
1204 : static Prefable<const JSPropertySpec> sAttributes[] = {
1205 : { nullptr, &sAttributes_specs[0] },
1206 : { nullptr, nullptr }
1207 : };
1208 :
1209 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
1210 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
1211 : static_assert(9 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
1212 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
1213 :
1214 :
1215 : static uint16_t sNativeProperties_sortedPropertyIndices[20];
1216 : static PropertyInfo sNativeProperties_propertyInfos[20];
1217 :
1218 : static const NativePropertiesN<2> sNativeProperties = {
1219 : false, 0,
1220 : false, 0,
1221 : true, 0 /* sMethods */,
1222 : true, 1 /* sAttributes */,
1223 : false, 0,
1224 : false, 0,
1225 : false, 0,
1226 : -1,
1227 : 20,
1228 : sNativeProperties_sortedPropertyIndices,
1229 : {
1230 : { sMethods, &sNativeProperties_propertyInfos[0] },
1231 : { sAttributes, &sNativeProperties_propertyInfos[11] }
1232 : }
1233 : };
1234 : static_assert(20 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
1235 : "We have a property info count that is oversized");
1236 :
1237 : static uint16_t sChromeOnlyNativeProperties_sortedPropertyIndices[1];
1238 : static PropertyInfo sChromeOnlyNativeProperties_propertyInfos[1];
1239 :
1240 : static const NativePropertiesN<1> sChromeOnlyNativeProperties = {
1241 : false, 0,
1242 : false, 0,
1243 : true, 0 /* sChromeMethods */,
1244 : false, 0,
1245 : false, 0,
1246 : false, 0,
1247 : false, 0,
1248 : -1,
1249 : 1,
1250 : sChromeOnlyNativeProperties_sortedPropertyIndices,
1251 : {
1252 : { sChromeMethods, &sChromeOnlyNativeProperties_propertyInfos[0] }
1253 : }
1254 : };
1255 : static_assert(1 < 1ull << CHAR_BIT * sizeof(sChromeOnlyNativeProperties.propertyInfoCount),
1256 : "We have a property info count that is oversized");
1257 :
1258 : static bool
1259 0 : _constructor(JSContext* cx, unsigned argc, JS::Value* vp)
1260 : {
1261 0 : JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
1262 0 : JS::Rooted<JSObject*> obj(cx, &args.callee());
1263 0 : if (!nsContentUtils::ThreadsafeIsSystemCaller(cx)) {
1264 0 : return ThrowingConstructor(cx, argc, vp);
1265 : }
1266 :
1267 0 : if (!args.isConstructing()) {
1268 : // XXXbz wish I could get the name from the callee instead of
1269 : // Adding more relocations
1270 0 : return ThrowConstructorWithoutNew(cx, "DataTransfer");
1271 : }
1272 :
1273 0 : GlobalObject global(cx, obj);
1274 0 : if (global.Failed()) {
1275 0 : return false;
1276 : }
1277 :
1278 0 : JS::Rooted<JSObject*> desiredProto(cx);
1279 0 : if (!GetDesiredProto(cx, args, &desiredProto)) {
1280 0 : return false;
1281 : }
1282 :
1283 0 : if (MOZ_UNLIKELY(args.length() < 2)) {
1284 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "DataTransfer");
1285 : }
1286 0 : bool objIsXray = xpc::WrapperFactory::IsXrayWrapper(obj);
1287 0 : binding_detail::FakeString arg0;
1288 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
1289 0 : return false;
1290 : }
1291 : bool arg1;
1292 0 : if (!ValueToPrimitive<bool, eDefault>(cx, args[1], &arg1)) {
1293 0 : return false;
1294 : }
1295 0 : Maybe<JSAutoCompartment> ac;
1296 0 : if (objIsXray) {
1297 0 : obj = js::CheckedUnwrap(obj);
1298 0 : if (!obj) {
1299 0 : return false;
1300 : }
1301 0 : ac.emplace(cx, obj);
1302 0 : if (!JS_WrapObject(cx, &desiredProto)) {
1303 0 : return false;
1304 : }
1305 : }
1306 0 : binding_detail::FastErrorResult rv;
1307 0 : auto result(StrongOrRawPtr<mozilla::dom::DataTransfer>(mozilla::dom::DataTransfer::Constructor(global, NonNullHelper(Constify(arg0)), arg1, rv)));
1308 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
1309 0 : return false;
1310 : }
1311 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1312 : static_assert(!IsPointer<decltype(result)>::value,
1313 : "NewObject implies that we need to keep the object alive with a strong reference.");
1314 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval(), desiredProto)) {
1315 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
1316 0 : return false;
1317 : }
1318 0 : return true;
1319 : }
1320 :
1321 : static const js::ClassOps sInterfaceObjectClassOps = {
1322 : nullptr, /* addProperty */
1323 : nullptr, /* delProperty */
1324 : nullptr, /* getProperty */
1325 : nullptr, /* setProperty */
1326 : nullptr, /* enumerate */
1327 : nullptr, /* newEnumerate */
1328 : nullptr, /* resolve */
1329 : nullptr, /* mayResolve */
1330 : nullptr, /* finalize */
1331 : _constructor, /* call */
1332 : nullptr, /* hasInstance */
1333 : _constructor, /* construct */
1334 : nullptr, /* trace */
1335 : };
1336 :
1337 : static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
1338 : {
1339 : "Function",
1340 : JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
1341 : &sInterfaceObjectClassOps,
1342 : JS_NULL_CLASS_SPEC,
1343 : JS_NULL_CLASS_EXT,
1344 : &sInterfaceObjectClassObjectOps
1345 : },
1346 : eInterface,
1347 : true,
1348 : prototypes::id::DataTransfer,
1349 : PrototypeTraits<prototypes::id::DataTransfer>::Depth,
1350 : sNativePropertyHooks,
1351 : "function DataTransfer() {\n [native code]\n}",
1352 : JS::GetRealmFunctionPrototype
1353 : };
1354 :
1355 : static const DOMIfaceAndProtoJSClass sPrototypeClass = {
1356 : {
1357 : "DataTransferPrototype",
1358 : JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
1359 : JS_NULL_CLASS_OPS,
1360 : JS_NULL_CLASS_SPEC,
1361 : JS_NULL_CLASS_EXT,
1362 : JS_NULL_OBJECT_OPS
1363 : },
1364 : eInterfacePrototype,
1365 : false,
1366 : prototypes::id::DataTransfer,
1367 : PrototypeTraits<prototypes::id::DataTransfer>::Depth,
1368 : sNativePropertyHooks,
1369 : "[object DataTransferPrototype]",
1370 : JS::GetRealmObjectPrototype
1371 : };
1372 :
1373 : JSObject*
1374 0 : DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
1375 : {
1376 0 : return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
1377 : }
1378 :
1379 : static const js::ClassOps sClassOps = {
1380 : _addProperty, /* addProperty */
1381 : nullptr, /* delProperty */
1382 : nullptr, /* getProperty */
1383 : nullptr, /* setProperty */
1384 : nullptr, /* enumerate */
1385 : nullptr, /* newEnumerate */
1386 : nullptr, /* resolve */
1387 : nullptr, /* mayResolve */
1388 : _finalize, /* finalize */
1389 : nullptr, /* call */
1390 : nullptr, /* hasInstance */
1391 : nullptr, /* construct */
1392 : nullptr, /* trace */
1393 : };
1394 :
1395 : static const js::ClassExtension sClassExtension = {
1396 : nullptr, /* weakmapKeyDelegateOp */
1397 : _objectMoved /* objectMovedOp */
1398 : };
1399 :
1400 : static const DOMJSClass sClass = {
1401 : { "DataTransfer",
1402 : JSCLASS_IS_DOMJSCLASS | JSCLASS_FOREGROUND_FINALIZE | JSCLASS_HAS_RESERVED_SLOTS(2),
1403 : &sClassOps,
1404 : JS_NULL_CLASS_SPEC,
1405 : &sClassExtension,
1406 : JS_NULL_OBJECT_OPS
1407 : },
1408 : { prototypes::id::DataTransfer, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count },
1409 : IsBaseOf<nsISupports, mozilla::dom::DataTransfer >::value,
1410 : sNativePropertyHooks,
1411 : FindAssociatedGlobalForNative<mozilla::dom::DataTransfer>::Get,
1412 : GetProtoObjectHandle,
1413 : GetCCParticipant<mozilla::dom::DataTransfer>::Get()
1414 : };
1415 : static_assert(1 == DOM_INSTANCE_RESERVED_SLOTS,
1416 : "Must have the right minimal number of reserved slots.");
1417 : static_assert(2 >= 2,
1418 : "Must have enough reserved slots.");
1419 :
1420 : const JSClass*
1421 0 : GetJSClass()
1422 : {
1423 0 : return sClass.ToJSClass();
1424 : }
1425 :
1426 : bool
1427 0 : Wrap(JSContext* aCx, mozilla::dom::DataTransfer* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector)
1428 : {
1429 : MOZ_ASSERT(static_cast<mozilla::dom::DataTransfer*>(aObject) ==
1430 : reinterpret_cast<mozilla::dom::DataTransfer*>(aObject),
1431 : "Multiple inheritance for mozilla::dom::DataTransfer is broken.");
1432 0 : MOZ_ASSERT(ToSupportsIsCorrect(aObject));
1433 0 : MOZ_ASSERT_IF(aGivenProto, js::IsObjectInContextCompartment(aGivenProto, aCx));
1434 0 : MOZ_ASSERT(!aCache->GetWrapper(),
1435 : "You should probably not be using Wrap() directly; use "
1436 : "GetOrCreateDOMReflector instead");
1437 :
1438 0 : MOZ_ASSERT(ToSupportsIsOnPrimaryInheritanceChain(aObject, aCache),
1439 : "nsISupports must be on our primary inheritance chain");
1440 :
1441 0 : JS::Rooted<JSObject*> global(aCx, FindAssociatedGlobal(aCx, aObject->GetParentObject()));
1442 0 : if (!global) {
1443 0 : return false;
1444 : }
1445 0 : MOZ_ASSERT(JS_IsGlobalObject(global));
1446 0 : MOZ_ASSERT(JS::ObjectIsNotGray(global));
1447 :
1448 : // That might have ended up wrapping us already, due to the wonders
1449 : // of XBL. Check for that, and bail out as needed.
1450 0 : aReflector.set(aCache->GetWrapper());
1451 0 : if (aReflector) {
1452 : #ifdef DEBUG
1453 0 : binding_detail::AssertReflectorHasGivenProto(aCx, aReflector, aGivenProto);
1454 : #endif // DEBUG
1455 0 : return true;
1456 : }
1457 :
1458 0 : JSAutoCompartment ac(aCx, global);
1459 0 : JS::Handle<JSObject*> canonicalProto = GetProtoObjectHandle(aCx);
1460 0 : if (!canonicalProto) {
1461 0 : return false;
1462 : }
1463 0 : JS::Rooted<JSObject*> proto(aCx);
1464 0 : if (aGivenProto) {
1465 0 : proto = aGivenProto;
1466 : // Unfortunately, while aGivenProto was in the compartment of aCx
1467 : // coming in, we changed compartments to that of "parent" so may need
1468 : // to wrap the proto here.
1469 0 : if (js::GetContextCompartment(aCx) != js::GetObjectCompartment(proto)) {
1470 0 : if (!JS_WrapObject(aCx, &proto)) {
1471 0 : return false;
1472 : }
1473 : }
1474 : } else {
1475 0 : proto = canonicalProto;
1476 : }
1477 :
1478 0 : BindingJSObjectCreator<mozilla::dom::DataTransfer> creator(aCx);
1479 0 : creator.CreateObject(aCx, sClass.ToJSClass(), proto, aObject, aReflector);
1480 0 : if (!aReflector) {
1481 0 : return false;
1482 : }
1483 :
1484 0 : aCache->SetWrapper(aReflector);
1485 0 : creator.InitializationSucceeded();
1486 :
1487 0 : MOZ_ASSERT(aCache->GetWrapperPreserveColor() &&
1488 : aCache->GetWrapperPreserveColor() == aReflector);
1489 : // If proto != canonicalProto, we have to preserve our wrapper;
1490 : // otherwise we won't be able to properly recreate it later, since
1491 : // we won't know what proto to use. Note that we don't check
1492 : // aGivenProto here, since it's entirely possible (and even
1493 : // somewhat common) to have a non-null aGivenProto which is the
1494 : // same as canonicalProto.
1495 0 : if (proto != canonicalProto) {
1496 0 : PreserveWrapper(aObject);
1497 : }
1498 :
1499 0 : return true;
1500 : }
1501 :
1502 : // This may allocate too many slots, because we only really need
1503 : // slots for our non-interface-typed members that we cache. But
1504 : // allocating slots only for those would make the slot index
1505 : // computations much more complicated, so let's do this the simple
1506 : // way for now.
1507 : DEFINE_XRAY_EXPANDO_CLASS(static, sXrayExpandoObjectClass, 1);
1508 :
1509 : const NativePropertyHooks sNativePropertyHooks[] = { {
1510 : nullptr,
1511 : nullptr,
1512 : nullptr,
1513 : { sNativeProperties.Upcast(), sChromeOnlyNativeProperties.Upcast() },
1514 : prototypes::id::DataTransfer,
1515 : constructors::id::DataTransfer,
1516 : nullptr,
1517 : &sXrayExpandoObjectClass
1518 : } };
1519 :
1520 : void
1521 0 : ClearCachedTypesValue(mozilla::dom::DataTransfer* aObject)
1522 : {
1523 : JSObject* obj;
1524 0 : obj = aObject->GetWrapper();
1525 0 : if (!obj) {
1526 0 : return;
1527 : }
1528 0 : js::SetReservedSlot(obj, (DOM_INSTANCE_RESERVED_SLOTS + 0), JS::UndefinedValue());
1529 0 : xpc::ClearXrayExpandoSlots(obj, (xpc::JSSLOT_EXPANDO_COUNT + 0));
1530 : }
1531 :
1532 : void
1533 0 : CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
1534 : {
1535 0 : JS::Rooted<JSObject*> parentProto(aCx, JS::GetRealmObjectPrototype(aCx));
1536 0 : if (!parentProto) {
1537 0 : return;
1538 : }
1539 :
1540 0 : JS::Rooted<JSObject*> constructorProto(aCx, JS::GetRealmFunctionPrototype(aCx));
1541 0 : if (!constructorProto) {
1542 0 : return;
1543 : }
1544 :
1545 : static bool sIdsInited = false;
1546 0 : if (!sIdsInited && NS_IsMainThread()) {
1547 0 : if (!InitIds(aCx, sNativeProperties.Upcast())) {
1548 0 : return;
1549 : }
1550 0 : if (!InitIds(aCx, sChromeOnlyNativeProperties.Upcast())) {
1551 0 : return;
1552 : }
1553 0 : sIdsInited = true;
1554 : }
1555 :
1556 : static bool sPrefCachesInited = false;
1557 0 : if (!sPrefCachesInited && NS_IsMainThread()) {
1558 0 : sPrefCachesInited = true;
1559 0 : Preferences::AddBoolVarCache(&sMethods[1].disablers->enabled, "dom.input.dirpicker");
1560 : }
1561 :
1562 0 : JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::DataTransfer);
1563 0 : JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::DataTransfer);
1564 0 : dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
1565 : &sPrototypeClass.mBase, protoCache,
1566 : constructorProto, &sInterfaceObjectClass.mBase, 2, nullptr,
1567 : interfaceCache,
1568 : sNativeProperties.Upcast(),
1569 0 : nsContentUtils::ThreadsafeIsSystemCaller(aCx) ? sChromeOnlyNativeProperties.Upcast() : nullptr,
1570 : "DataTransfer", aDefineOnGlobal,
1571 : nullptr,
1572 0 : false);
1573 : }
1574 :
1575 : JS::Handle<JSObject*>
1576 0 : GetProtoObjectHandle(JSContext* aCx)
1577 : {
1578 : /* Get the interface prototype object for this class. This will create the
1579 : object as needed. */
1580 0 : bool aDefineOnGlobal = true;
1581 :
1582 : /* Make sure our global is sane. Hopefully we can remove this sometime */
1583 0 : JSObject* global = JS::CurrentGlobalOrNull(aCx);
1584 0 : if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
1585 0 : return nullptr;
1586 : }
1587 :
1588 : /* Check to see whether the interface objects are already installed */
1589 0 : ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
1590 0 : if (!protoAndIfaceCache.HasEntryInSlot(prototypes::id::DataTransfer)) {
1591 0 : JS::Rooted<JSObject*> rootedGlobal(aCx, global);
1592 0 : CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
1593 : }
1594 :
1595 : /*
1596 : * The object might _still_ be null, but that's OK.
1597 : *
1598 : * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
1599 : * traced by TraceProtoAndIfaceCache() and its contents are never
1600 : * changed after they have been set.
1601 : *
1602 : * Calling address() avoids the read read barrier that does gray
1603 : * unmarking, but it's not possible for the object to be gray here.
1604 : */
1605 :
1606 0 : const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(prototypes::id::DataTransfer);
1607 0 : MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
1608 0 : return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
1609 : }
1610 :
1611 : JS::Handle<JSObject*>
1612 0 : GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
1613 : {
1614 : /* Get the interface object for this class. This will create the object as
1615 : needed. */
1616 :
1617 : /* Make sure our global is sane. Hopefully we can remove this sometime */
1618 0 : JSObject* global = JS::CurrentGlobalOrNull(aCx);
1619 0 : if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
1620 0 : return nullptr;
1621 : }
1622 :
1623 : /* Check to see whether the interface objects are already installed */
1624 0 : ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
1625 0 : if (!protoAndIfaceCache.HasEntryInSlot(constructors::id::DataTransfer)) {
1626 0 : JS::Rooted<JSObject*> rootedGlobal(aCx, global);
1627 0 : CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
1628 : }
1629 :
1630 : /*
1631 : * The object might _still_ be null, but that's OK.
1632 : *
1633 : * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
1634 : * traced by TraceProtoAndIfaceCache() and its contents are never
1635 : * changed after they have been set.
1636 : *
1637 : * Calling address() avoids the read read barrier that does gray
1638 : * unmarking, but it's not possible for the object to be gray here.
1639 : */
1640 :
1641 0 : const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::DataTransfer);
1642 0 : MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
1643 0 : return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
1644 : }
1645 :
1646 : JSObject*
1647 0 : GetConstructorObject(JSContext* aCx)
1648 : {
1649 0 : return GetConstructorObjectHandle(aCx);
1650 : }
1651 :
1652 : } // namespace DataTransferBinding
1653 :
1654 :
1655 :
1656 : } // namespace dom
1657 : } // namespace mozilla
|