Coverage Report

Created: 2018-09-25 14:53

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