Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dom/bindings/IDBDatabaseBinding.cpp
Line
Count
Source (jump to first uncovered line)
1
/* THIS FILE IS AUTOGENERATED FROM IDBDatabase.webidl BY Codegen.py - DO NOT EDIT */
2
3
#include "EventHandlerBinding.h"
4
#include "EventTargetBinding.h"
5
#include "IDBDatabaseBinding.h"
6
#include "IDBObjectStoreBinding.h"
7
#include "WrapperFactory.h"
8
#include "mozilla/OwningNonNull.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/IDBDatabase.h"
14
#include "mozilla/dom/IDBObjectStore.h"
15
#include "mozilla/dom/IDBRequest.h"
16
#include "mozilla/dom/IDBTransaction.h"
17
#include "mozilla/dom/IndexedDatabaseManager.h"
18
#include "mozilla/dom/NonRefcountedDOMObject.h"
19
#include "mozilla/dom/Nullable.h"
20
#include "mozilla/dom/PrimitiveConversions.h"
21
#include "mozilla/dom/UnionConversions.h"
22
#include "mozilla/dom/UnionTypes.h"
23
#include "mozilla/dom/XrayExpandoClass.h"
24
25
namespace mozilla {
26
namespace dom {
27
28
namespace binding_detail {}; // Just to make sure it's known as a namespace
29
using namespace mozilla::dom::binding_detail;
30
31
32
namespace IDBDatabase_Binding {
33
34
static_assert(IsRefcounted<NativeType>::value == IsRefcounted<EventTarget_Binding::NativeType>::value,
35
              "Can't inherit from an interface with a different ownership model.");
36
37
MOZ_CAN_RUN_SCRIPT static bool
38
get_name(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, JSJitGetterCallArgs args)
39
0
{
40
0
  AUTO_PROFILER_LABEL_FAST("get IDBDatabase.name", DOM, cx);
41
0
42
0
  DOMString result;
43
0
  self->GetName(result);
44
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
45
0
  if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
46
0
    return false;
47
0
  }
48
0
  return true;
49
0
}
50
51
static const JSJitInfo name_getterinfo = {
52
  { (JSJitGetterOp)get_name },
53
  { prototypes::id::IDBDatabase },
54
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
55
  JSJitInfo::Getter,
56
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
57
  JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
58
  false,  /* isInfallible. False in setters. */
59
  false,  /* isMovable.  Not relevant for setters. */
60
  false, /* isEliminatable.  Not relevant for setters. */
61
  false, /* isAlwaysInSlot.  Only relevant for getters. */
62
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
63
  false,  /* isTypedMethod.  Only relevant for methods. */
64
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
65
};
66
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
67
static_assert(0 < 1, "There is no slot for us");
68
69
MOZ_CAN_RUN_SCRIPT static bool
70
get_version(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, JSJitGetterCallArgs args)
71
0
{
72
0
  AUTO_PROFILER_LABEL_FAST("get IDBDatabase.version", DOM, cx);
73
0
74
0
  uint64_t result(self->Version());
75
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
76
0
  args.rval().set(JS_NumberValue(double(result)));
77
0
  return true;
78
0
}
79
80
static const JSJitInfo version_getterinfo = {
81
  { (JSJitGetterOp)get_version },
82
  { prototypes::id::IDBDatabase },
83
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
84
  JSJitInfo::Getter,
85
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
86
  JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
87
  true,  /* isInfallible. False in setters. */
88
  false,  /* isMovable.  Not relevant for setters. */
89
  false, /* isEliminatable.  Not relevant for setters. */
90
  false, /* isAlwaysInSlot.  Only relevant for getters. */
91
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
92
  false,  /* isTypedMethod.  Only relevant for methods. */
93
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
94
};
95
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
96
static_assert(0 < 1, "There is no slot for us");
97
98
MOZ_CAN_RUN_SCRIPT static bool
99
get_objectStoreNames(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, JSJitGetterCallArgs args)
100
0
{
101
0
  AUTO_PROFILER_LABEL_FAST("get IDBDatabase.objectStoreNames", DOM, cx);
102
0
103
0
  auto result(StrongOrRawPtr<mozilla::dom::DOMStringList>(self->ObjectStoreNames()));
104
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
105
0
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
106
0
    MOZ_ASSERT(JS_IsExceptionPending(cx));
107
0
    return false;
108
0
  }
109
0
  return true;
110
0
}
111
112
static const JSJitInfo objectStoreNames_getterinfo = {
113
  { (JSJitGetterOp)get_objectStoreNames },
114
  { prototypes::id::IDBDatabase },
115
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
116
  JSJitInfo::Getter,
117
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
118
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
119
  false,  /* isInfallible. False in setters. */
120
  false,  /* isMovable.  Not relevant for setters. */
121
  false, /* isEliminatable.  Not relevant for setters. */
122
  false, /* isAlwaysInSlot.  Only relevant for getters. */
123
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
124
  false,  /* isTypedMethod.  Only relevant for methods. */
125
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
126
};
127
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
128
static_assert(0 < 1, "There is no slot for us");
129
130
MOZ_CAN_RUN_SCRIPT static bool
131
createObjectStore(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, const JSJitMethodCallArgs& args)
132
0
{
133
0
  AUTO_PROFILER_LABEL_FAST("IDBDatabase.createObjectStore", DOM, cx);
134
0
135
0
  if (MOZ_UNLIKELY(args.length() < 1)) {
136
0
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "IDBDatabase.createObjectStore");
137
0
  }
138
0
  binding_detail::FakeString arg0;
139
0
  if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
140
0
    return false;
141
0
  }
142
0
  binding_detail::FastIDBObjectStoreParameters arg1;
143
0
  if (!arg1.Init(cx, (args.hasDefined(1)) ? args[1] : JS::NullHandleValue,  "Argument 2 of IDBDatabase.createObjectStore", false)) {
144
0
    return false;
145
0
  }
146
0
  FastErrorResult rv;
147
0
  auto result(StrongOrRawPtr<mozilla::dom::IDBObjectStore>(self->CreateObjectStore(NonNullHelper(Constify(arg0)), Constify(arg1), rv)));
148
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
149
0
    return false;
150
0
  }
151
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
152
0
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
153
0
    MOZ_ASSERT(JS_IsExceptionPending(cx));
154
0
    return false;
155
0
  }
156
0
  return true;
157
0
}
158
159
static const JSJitInfo createObjectStore_methodinfo = {
160
  { (JSJitGetterOp)createObjectStore },
161
  { prototypes::id::IDBDatabase },
162
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
163
  JSJitInfo::Method,
164
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
165
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
166
  false,  /* isInfallible. False in setters. */
167
  false,  /* isMovable.  Not relevant for setters. */
168
  false, /* isEliminatable.  Not relevant for setters. */
169
  false, /* isAlwaysInSlot.  Only relevant for getters. */
170
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
171
  false,  /* isTypedMethod.  Only relevant for methods. */
172
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
173
};
174
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
175
static_assert(0 < 1, "There is no slot for us");
176
177
MOZ_CAN_RUN_SCRIPT static bool
178
deleteObjectStore(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, const JSJitMethodCallArgs& args)
179
0
{
180
0
  AUTO_PROFILER_LABEL_FAST("IDBDatabase.deleteObjectStore", DOM, cx);
181
0
182
0
  if (MOZ_UNLIKELY(args.length() < 1)) {
183
0
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "IDBDatabase.deleteObjectStore");
184
0
  }
185
0
  binding_detail::FakeString arg0;
186
0
  if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
187
0
    return false;
188
0
  }
189
0
  FastErrorResult rv;
190
0
  self->DeleteObjectStore(NonNullHelper(Constify(arg0)), rv);
191
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
192
0
    return false;
193
0
  }
194
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
195
0
  args.rval().setUndefined();
196
0
  return true;
197
0
}
198
199
static const JSJitInfo deleteObjectStore_methodinfo = {
200
  { (JSJitGetterOp)deleteObjectStore },
201
  { prototypes::id::IDBDatabase },
202
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
203
  JSJitInfo::Method,
204
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
205
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
206
  false,  /* isInfallible. False in setters. */
207
  false,  /* isMovable.  Not relevant for setters. */
208
  false, /* isEliminatable.  Not relevant for setters. */
209
  false, /* isAlwaysInSlot.  Only relevant for getters. */
210
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
211
  false,  /* isTypedMethod.  Only relevant for methods. */
212
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
213
};
214
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
215
static_assert(0 < 1, "There is no slot for us");
216
217
MOZ_CAN_RUN_SCRIPT static bool
218
transaction(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, const JSJitMethodCallArgs& args)
219
0
{
220
0
  AUTO_PROFILER_LABEL_FAST("IDBDatabase.transaction", DOM, cx);
221
0
222
0
  if (MOZ_UNLIKELY(args.length() < 1)) {
223
0
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "IDBDatabase.transaction");
224
0
  }
225
0
  StringOrStringSequence arg0;
226
0
  StringOrStringSequenceArgument arg0_holder(arg0);
227
0
  {
228
0
    bool done = false, failed = false, tryNext;
229
0
    if (args[0].isObject()) {
230
0
      done = (failed = !arg0_holder.TrySetToStringSequence(cx, args[0], tryNext, false)) || !tryNext;
231
0
    }
232
0
    if (!done) {
233
0
      do {
234
0
        done = (failed = !arg0_holder.TrySetToString(cx, args[0], tryNext)) || !tryNext;
235
0
        break;
236
0
      } while (false);
237
0
    }
238
0
    if (failed) {
239
0
      return false;
240
0
    }
241
0
    if (!done) {
242
0
      ThrowErrorMessage(cx, MSG_NOT_IN_UNION, "Argument 1 of IDBDatabase.transaction", "StringSequence");
243
0
      return false;
244
0
    }
245
0
  }
246
0
  IDBTransactionMode arg1;
247
0
  if (args.hasDefined(1)) {
248
0
    {
249
0
      int index;
250
0
      if (!FindEnumStringIndex<true>(cx, args[1], IDBTransactionModeValues::strings, "IDBTransactionMode", "Argument 2 of IDBDatabase.transaction", &index)) {
251
0
        return false;
252
0
      }
253
0
      MOZ_ASSERT(index >= 0);
254
0
      arg1 = static_cast<IDBTransactionMode>(index);
255
0
    }
256
0
  } else {
257
0
    arg1 = IDBTransactionMode::Readonly;
258
0
  }
259
0
  FastErrorResult rv;
260
0
  auto result(StrongOrRawPtr<mozilla::dom::IDBTransaction>(self->Transaction(cx, Constify(arg0), arg1, rv)));
261
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
262
0
    return false;
263
0
  }
264
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
265
0
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
266
0
    MOZ_ASSERT(JS_IsExceptionPending(cx));
267
0
    return false;
268
0
  }
269
0
  return true;
270
0
}
271
272
static const JSJitInfo transaction_methodinfo = {
273
  { (JSJitGetterOp)transaction },
274
  { prototypes::id::IDBDatabase },
275
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
276
  JSJitInfo::Method,
277
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
278
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
279
  false,  /* isInfallible. False in setters. */
280
  false,  /* isMovable.  Not relevant for setters. */
281
  false, /* isEliminatable.  Not relevant for setters. */
282
  false, /* isAlwaysInSlot.  Only relevant for getters. */
283
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
284
  false,  /* isTypedMethod.  Only relevant for methods. */
285
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
286
};
287
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
288
static_assert(0 < 1, "There is no slot for us");
289
290
MOZ_CAN_RUN_SCRIPT static bool
291
close(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, const JSJitMethodCallArgs& args)
292
0
{
293
0
  AUTO_PROFILER_LABEL_FAST("IDBDatabase.close", DOM, cx);
294
0
295
0
  self->Close();
296
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
297
0
  args.rval().setUndefined();
298
0
  return true;
299
0
}
300
301
static const JSJitInfo close_methodinfo = {
302
  { (JSJitGetterOp)close },
303
  { prototypes::id::IDBDatabase },
304
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
305
  JSJitInfo::Method,
306
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
307
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
308
  true,  /* isInfallible. False in setters. */
309
  false,  /* isMovable.  Not relevant for setters. */
310
  false, /* isEliminatable.  Not relevant for setters. */
311
  false, /* isAlwaysInSlot.  Only relevant for getters. */
312
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
313
  false,  /* isTypedMethod.  Only relevant for methods. */
314
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
315
};
316
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
317
static_assert(0 < 1, "There is no slot for us");
318
319
MOZ_CAN_RUN_SCRIPT static bool
320
get_onabort(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, JSJitGetterCallArgs args)
321
0
{
322
0
  AUTO_PROFILER_LABEL_FAST("get IDBDatabase.onabort", DOM, cx);
323
0
324
0
  RefPtr<EventHandlerNonNull> result(self->GetOnabort());
325
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
326
0
  if (result) {
327
0
    args.rval().setObjectOrNull(GetCallbackFromCallbackObject(cx, result));
328
0
    if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
329
0
      return false;
330
0
    }
331
0
    return true;
332
0
  } else {
333
0
    args.rval().setNull();
334
0
    return true;
335
0
  }
336
0
}
337
338
MOZ_CAN_RUN_SCRIPT static bool
339
set_onabort(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, JSJitSetterCallArgs args)
340
0
{
341
0
  AUTO_PROFILER_LABEL_FAST("set IDBDatabase.onabort", DOM, cx);
342
0
343
0
  RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
344
0
  if (args[0].isObject()) {
345
0
    { // scope for tempRoot and tempGlobalRoot if needed
346
0
      arg0 = new binding_detail::FastEventHandlerNonNull(&args[0].toObject(), JS::CurrentGlobalOrNull(cx));
347
0
    }
348
0
  } else {
349
0
    arg0 = nullptr;
350
0
  }
351
0
  self->SetOnabort(Constify(arg0));
352
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
353
0
354
0
  return true;
355
0
}
356
357
static const JSJitInfo onabort_getterinfo = {
358
  { (JSJitGetterOp)get_onabort },
359
  { prototypes::id::IDBDatabase },
360
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
361
  JSJitInfo::Getter,
362
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
363
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
364
  false,  /* isInfallible. False in setters. */
365
  false,  /* isMovable.  Not relevant for setters. */
366
  false, /* isEliminatable.  Not relevant for setters. */
367
  false, /* isAlwaysInSlot.  Only relevant for getters. */
368
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
369
  false,  /* isTypedMethod.  Only relevant for methods. */
370
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
371
};
372
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
373
static_assert(0 < 1, "There is no slot for us");
374
static const JSJitInfo onabort_setterinfo = {
375
  { (JSJitGetterOp)set_onabort },
376
  { prototypes::id::IDBDatabase },
377
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
378
  JSJitInfo::Setter,
379
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
380
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
381
  false,  /* isInfallible. False in setters. */
382
  false,  /* isMovable.  Not relevant for setters. */
383
  false, /* isEliminatable.  Not relevant for setters. */
384
  false, /* isAlwaysInSlot.  Only relevant for getters. */
385
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
386
  false,  /* isTypedMethod.  Only relevant for methods. */
387
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
388
};
389
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
390
static_assert(0 < 1, "There is no slot for us");
391
392
MOZ_CAN_RUN_SCRIPT static bool
393
get_onclose(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, JSJitGetterCallArgs args)
394
0
{
395
0
  AUTO_PROFILER_LABEL_FAST("get IDBDatabase.onclose", DOM, cx);
396
0
397
0
  RefPtr<EventHandlerNonNull> result(self->GetOnclose());
398
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
399
0
  if (result) {
400
0
    args.rval().setObjectOrNull(GetCallbackFromCallbackObject(cx, result));
401
0
    if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
402
0
      return false;
403
0
    }
404
0
    return true;
405
0
  } else {
406
0
    args.rval().setNull();
407
0
    return true;
408
0
  }
409
0
}
410
411
MOZ_CAN_RUN_SCRIPT static bool
412
set_onclose(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, JSJitSetterCallArgs args)
413
0
{
414
0
  AUTO_PROFILER_LABEL_FAST("set IDBDatabase.onclose", DOM, cx);
415
0
416
0
  RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
417
0
  if (args[0].isObject()) {
418
0
    { // scope for tempRoot and tempGlobalRoot if needed
419
0
      arg0 = new binding_detail::FastEventHandlerNonNull(&args[0].toObject(), JS::CurrentGlobalOrNull(cx));
420
0
    }
421
0
  } else {
422
0
    arg0 = nullptr;
423
0
  }
424
0
  self->SetOnclose(Constify(arg0));
425
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
426
0
427
0
  return true;
428
0
}
429
430
static const JSJitInfo onclose_getterinfo = {
431
  { (JSJitGetterOp)get_onclose },
432
  { prototypes::id::IDBDatabase },
433
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
434
  JSJitInfo::Getter,
435
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
436
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
437
  false,  /* isInfallible. False in setters. */
438
  false,  /* isMovable.  Not relevant for setters. */
439
  false, /* isEliminatable.  Not relevant for setters. */
440
  false, /* isAlwaysInSlot.  Only relevant for getters. */
441
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
442
  false,  /* isTypedMethod.  Only relevant for methods. */
443
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
444
};
445
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
446
static_assert(0 < 1, "There is no slot for us");
447
static const JSJitInfo onclose_setterinfo = {
448
  { (JSJitGetterOp)set_onclose },
449
  { prototypes::id::IDBDatabase },
450
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
451
  JSJitInfo::Setter,
452
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
453
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
454
  false,  /* isInfallible. False in setters. */
455
  false,  /* isMovable.  Not relevant for setters. */
456
  false, /* isEliminatable.  Not relevant for setters. */
457
  false, /* isAlwaysInSlot.  Only relevant for getters. */
458
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
459
  false,  /* isTypedMethod.  Only relevant for methods. */
460
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
461
};
462
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
463
static_assert(0 < 1, "There is no slot for us");
464
465
MOZ_CAN_RUN_SCRIPT static bool
466
get_onerror(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, JSJitGetterCallArgs args)
467
0
{
468
0
  AUTO_PROFILER_LABEL_FAST("get IDBDatabase.onerror", DOM, cx);
469
0
470
0
  RefPtr<EventHandlerNonNull> result(self->GetOnerror());
471
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
472
0
  if (result) {
473
0
    args.rval().setObjectOrNull(GetCallbackFromCallbackObject(cx, result));
474
0
    if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
475
0
      return false;
476
0
    }
477
0
    return true;
478
0
  } else {
479
0
    args.rval().setNull();
480
0
    return true;
481
0
  }
482
0
}
483
484
MOZ_CAN_RUN_SCRIPT static bool
485
set_onerror(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, JSJitSetterCallArgs args)
486
0
{
487
0
  AUTO_PROFILER_LABEL_FAST("set IDBDatabase.onerror", DOM, cx);
488
0
489
0
  RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
490
0
  if (args[0].isObject()) {
491
0
    { // scope for tempRoot and tempGlobalRoot if needed
492
0
      arg0 = new binding_detail::FastEventHandlerNonNull(&args[0].toObject(), JS::CurrentGlobalOrNull(cx));
493
0
    }
494
0
  } else {
495
0
    arg0 = nullptr;
496
0
  }
497
0
  self->SetOnerror(Constify(arg0));
498
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
499
0
500
0
  return true;
501
0
}
502
503
static const JSJitInfo onerror_getterinfo = {
504
  { (JSJitGetterOp)get_onerror },
505
  { prototypes::id::IDBDatabase },
506
  { PrototypeTraits<prototypes::id::IDBDatabase>::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 < 1, "There is no slot for us");
520
static const JSJitInfo onerror_setterinfo = {
521
  { (JSJitGetterOp)set_onerror },
522
  { prototypes::id::IDBDatabase },
523
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
524
  JSJitInfo::Setter,
525
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
526
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
527
  false,  /* isInfallible. False in setters. */
528
  false,  /* isMovable.  Not relevant for setters. */
529
  false, /* isEliminatable.  Not relevant for setters. */
530
  false, /* isAlwaysInSlot.  Only relevant for getters. */
531
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
532
  false,  /* isTypedMethod.  Only relevant for methods. */
533
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
534
};
535
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
536
static_assert(0 < 1, "There is no slot for us");
537
538
MOZ_CAN_RUN_SCRIPT static bool
539
get_onversionchange(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, JSJitGetterCallArgs args)
540
0
{
541
0
  AUTO_PROFILER_LABEL_FAST("get IDBDatabase.onversionchange", DOM, cx);
542
0
543
0
  RefPtr<EventHandlerNonNull> result(self->GetOnversionchange());
544
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
545
0
  if (result) {
546
0
    args.rval().setObjectOrNull(GetCallbackFromCallbackObject(cx, result));
547
0
    if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
548
0
      return false;
549
0
    }
550
0
    return true;
551
0
  } else {
552
0
    args.rval().setNull();
553
0
    return true;
554
0
  }
555
0
}
556
557
MOZ_CAN_RUN_SCRIPT static bool
558
set_onversionchange(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, JSJitSetterCallArgs args)
559
0
{
560
0
  AUTO_PROFILER_LABEL_FAST("set IDBDatabase.onversionchange", DOM, cx);
561
0
562
0
  RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
563
0
  if (args[0].isObject()) {
564
0
    { // scope for tempRoot and tempGlobalRoot if needed
565
0
      arg0 = new binding_detail::FastEventHandlerNonNull(&args[0].toObject(), JS::CurrentGlobalOrNull(cx));
566
0
    }
567
0
  } else {
568
0
    arg0 = nullptr;
569
0
  }
570
0
  self->SetOnversionchange(Constify(arg0));
571
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
572
0
573
0
  return true;
574
0
}
575
576
static const JSJitInfo onversionchange_getterinfo = {
577
  { (JSJitGetterOp)get_onversionchange },
578
  { prototypes::id::IDBDatabase },
579
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
580
  JSJitInfo::Getter,
581
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
582
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
583
  false,  /* isInfallible. False in setters. */
584
  false,  /* isMovable.  Not relevant for setters. */
585
  false, /* isEliminatable.  Not relevant for setters. */
586
  false, /* isAlwaysInSlot.  Only relevant for getters. */
587
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
588
  false,  /* isTypedMethod.  Only relevant for methods. */
589
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
590
};
591
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
592
static_assert(0 < 1, "There is no slot for us");
593
static const JSJitInfo onversionchange_setterinfo = {
594
  { (JSJitGetterOp)set_onversionchange },
595
  { prototypes::id::IDBDatabase },
596
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
597
  JSJitInfo::Setter,
598
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
599
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
600
  false,  /* isInfallible. False in setters. */
601
  false,  /* isMovable.  Not relevant for setters. */
602
  false, /* isEliminatable.  Not relevant for setters. */
603
  false, /* isAlwaysInSlot.  Only relevant for getters. */
604
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
605
  false,  /* isTypedMethod.  Only relevant for methods. */
606
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
607
};
608
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
609
static_assert(0 < 1, "There is no slot for us");
610
611
MOZ_CAN_RUN_SCRIPT static bool
612
get_storage(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, JSJitGetterCallArgs args)
613
0
{
614
0
  AUTO_PROFILER_LABEL_FAST("get IDBDatabase.storage", DOM, cx);
615
0
616
0
  StorageType result(self->Storage());
617
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
618
0
  if (!ToJSValue(cx, result, args.rval())) {
619
0
    return false;
620
0
  }
621
0
  return true;
622
0
}
623
624
static const JSJitInfo storage_getterinfo = {
625
  { (JSJitGetterOp)get_storage },
626
  { prototypes::id::IDBDatabase },
627
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
628
  JSJitInfo::Getter,
629
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
630
  JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
631
  false,  /* isInfallible. False in setters. */
632
  false,  /* isMovable.  Not relevant for setters. */
633
  false, /* isEliminatable.  Not relevant for setters. */
634
  false, /* isAlwaysInSlot.  Only relevant for getters. */
635
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
636
  false,  /* isTypedMethod.  Only relevant for methods. */
637
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
638
};
639
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
640
static_assert(0 < 1, "There is no slot for us");
641
642
MOZ_CAN_RUN_SCRIPT static bool
643
createMutableFile(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, const JSJitMethodCallArgs& args)
644
0
{
645
0
  AUTO_PROFILER_LABEL_FAST("IDBDatabase.createMutableFile", DOM, cx);
646
0
647
0
  if (MOZ_UNLIKELY(args.length() < 1)) {
648
0
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "IDBDatabase.createMutableFile");
649
0
  }
650
0
  binding_detail::FakeString arg0;
651
0
  if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
652
0
    return false;
653
0
  }
654
0
  Optional<nsAString> arg1;
655
0
  binding_detail::FakeString arg1_holder;
656
0
  if (args.hasDefined(1)) {
657
0
    if (!ConvertJSValueToString(cx, args[1], eStringify, eStringify, arg1_holder)) {
658
0
      return false;
659
0
    }
660
0
    arg1 = &arg1_holder;
661
0
  }
662
0
  FastErrorResult rv;
663
0
  auto result(StrongOrRawPtr<mozilla::dom::IDBRequest>(self->CreateMutableFile(cx, NonNullHelper(Constify(arg0)), NonNullHelper(Constify(arg1)), rv)));
664
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
665
0
    return false;
666
0
  }
667
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
668
0
  SetDocumentAndPageUseCounter(obj, eUseCounter_IDBDatabase_createMutableFile);
669
0
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
670
0
    MOZ_ASSERT(JS_IsExceptionPending(cx));
671
0
    return false;
672
0
  }
673
0
  return true;
674
0
}
675
676
static const JSJitInfo createMutableFile_methodinfo = {
677
  { (JSJitGetterOp)createMutableFile },
678
  { prototypes::id::IDBDatabase },
679
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
680
  JSJitInfo::Method,
681
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
682
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
683
  false,  /* isInfallible. False in setters. */
684
  false,  /* isMovable.  Not relevant for setters. */
685
  false, /* isEliminatable.  Not relevant for setters. */
686
  false, /* isAlwaysInSlot.  Only relevant for getters. */
687
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
688
  false,  /* isTypedMethod.  Only relevant for methods. */
689
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
690
};
691
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
692
static_assert(0 < 1, "There is no slot for us");
693
694
MOZ_CAN_RUN_SCRIPT static bool
695
mozCreateFileHandle(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBDatabase* self, const JSJitMethodCallArgs& args)
696
0
{
697
0
  AUTO_PROFILER_LABEL_FAST("IDBDatabase.mozCreateFileHandle", DOM, cx);
698
0
699
0
  if (MOZ_UNLIKELY(args.length() < 1)) {
700
0
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "IDBDatabase.mozCreateFileHandle");
701
0
  }
702
0
  binding_detail::FakeString arg0;
703
0
  if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
704
0
    return false;
705
0
  }
706
0
  Optional<nsAString> arg1;
707
0
  binding_detail::FakeString arg1_holder;
708
0
  if (args.hasDefined(1)) {
709
0
    if (!ConvertJSValueToString(cx, args[1], eStringify, eStringify, arg1_holder)) {
710
0
      return false;
711
0
    }
712
0
    arg1 = &arg1_holder;
713
0
  }
714
0
  FastErrorResult rv;
715
0
  auto result(StrongOrRawPtr<mozilla::dom::IDBRequest>(self->MozCreateFileHandle(cx, NonNullHelper(Constify(arg0)), NonNullHelper(Constify(arg1)), rv)));
716
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
717
0
    return false;
718
0
  }
719
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
720
0
  SetDocumentAndPageUseCounter(obj, eUseCounter_IDBDatabase_mozCreateFileHandle);
721
0
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
722
0
    MOZ_ASSERT(JS_IsExceptionPending(cx));
723
0
    return false;
724
0
  }
725
0
  return true;
726
0
}
727
728
static const JSJitInfo mozCreateFileHandle_methodinfo = {
729
  { (JSJitGetterOp)mozCreateFileHandle },
730
  { prototypes::id::IDBDatabase },
731
  { PrototypeTraits<prototypes::id::IDBDatabase>::Depth },
732
  JSJitInfo::Method,
733
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
734
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
735
  false,  /* isInfallible. False in setters. */
736
  false,  /* isMovable.  Not relevant for setters. */
737
  false, /* isEliminatable.  Not relevant for setters. */
738
  false, /* isAlwaysInSlot.  Only relevant for getters. */
739
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
740
  false,  /* isTypedMethod.  Only relevant for methods. */
741
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
742
};
743
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
744
static_assert(0 < 1, "There is no slot for us");
745
746
static bool
747
_addProperty(JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JS::Handle<JS::Value> val)
748
0
{
749
0
  mozilla::dom::IDBDatabase* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::IDBDatabase>(obj);
750
0
  // We don't want to preserve if we don't have a wrapper, and we
751
0
  // obviously can't preserve if we're not initialized.
752
0
  if (self && self->GetWrapperPreserveColor()) {
753
0
    PreserveWrapper(self);
754
0
  }
755
0
  return true;
756
0
}
757
758
static void
759
_finalize(js::FreeOp* fop, JSObject* obj)
760
0
{
761
0
  mozilla::dom::IDBDatabase* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::IDBDatabase>(obj);
762
0
  if (self) {
763
0
    ClearWrapper(self, self, obj);
764
0
    AddForDeferredFinalization<mozilla::dom::IDBDatabase>(self);
765
0
  }
766
0
}
767
768
static size_t
769
_objectMoved(JSObject* obj, JSObject* old)
770
0
{
771
0
  mozilla::dom::IDBDatabase* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::IDBDatabase>(obj);
772
0
  if (self) {
773
0
    UpdateWrapper(self, self, obj, old);
774
0
  }
775
0
776
0
  return 0;
777
0
}
778
779
// We deliberately use brace-elision to make Visual Studio produce better initalization code.
780
#if defined(__clang__)
781
#pragma clang diagnostic push
782
#pragma clang diagnostic ignored "-Wmissing-braces"
783
#endif
784
static const JSFunctionSpec sMethods_specs[] = {
785
  JS_FNSPEC("createObjectStore", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&createObjectStore_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
786
  JS_FNSPEC("deleteObjectStore", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&deleteObjectStore_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
787
  JS_FNSPEC("transaction", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&transaction_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
788
  JS_FNSPEC("close", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&close_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
789
  JS_FS_END,
790
  JS_FNSPEC("createMutableFile", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&createMutableFile_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
791
  JS_FNSPEC("mozCreateFileHandle", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&mozCreateFileHandle_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
792
  JS_FS_END
793
};
794
#if defined(__clang__)
795
#pragma clang diagnostic pop
796
#endif
797
798
// Can't be const because the pref-enabled boolean needs to be writable
799
static PrefableDisablers sMethods_disablers5 = {
800
  true, false, GlobalNames::BackstagePass | GlobalNames::DedicatedWorkerGlobalScope | GlobalNames::ServiceWorkerGlobalScope | GlobalNames::SharedWorkerGlobalScope, nullptr
801
};
802
803
static const Prefable<const JSFunctionSpec> sMethods[] = {
804
  { nullptr, &sMethods_specs[0] },
805
  { &sMethods_disablers5, &sMethods_specs[5] },
806
  { nullptr, nullptr }
807
};
808
809
static_assert(2 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
810
    "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
811
static_assert(4 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
812
    "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
813
814
// We deliberately use brace-elision to make Visual Studio produce better initalization code.
815
#if defined(__clang__)
816
#pragma clang diagnostic push
817
#pragma clang diagnostic ignored "-Wmissing-braces"
818
#endif
819
static const JSPropertySpec sAttributes_specs[] = {
820
  { "name", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &name_getterinfo, nullptr, nullptr },
821
  { "version", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &version_getterinfo, nullptr, nullptr },
822
  { "objectStoreNames", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &objectStoreNames_getterinfo, nullptr, nullptr },
823
  { "onabort", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &onabort_getterinfo, GenericSetter<NormalThisPolicy>, &onabort_setterinfo },
824
  { "onclose", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &onclose_getterinfo, GenericSetter<NormalThisPolicy>, &onclose_setterinfo },
825
  { "onerror", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &onerror_getterinfo, GenericSetter<NormalThisPolicy>, &onerror_setterinfo },
826
  { "onversionchange", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &onversionchange_getterinfo, GenericSetter<NormalThisPolicy>, &onversionchange_setterinfo },
827
  { nullptr, 0, nullptr, nullptr, nullptr, nullptr },
828
  { "storage", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &storage_getterinfo, nullptr, nullptr },
829
  { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
830
};
831
#if defined(__clang__)
832
#pragma clang diagnostic pop
833
#endif
834
835
// Can't be const because the pref-enabled boolean needs to be writable
836
static PrefableDisablers sAttributes_disablers8 = {
837
  true, false, 0, &mozilla::dom::IndexedDatabaseManager::ExperimentalFeaturesEnabled
838
};
839
840
static const Prefable<const JSPropertySpec> sAttributes[] = {
841
  { nullptr, &sAttributes_specs[0] },
842
  { &sAttributes_disablers8, &sAttributes_specs[8] },
843
  { nullptr, nullptr }
844
};
845
846
static_assert(2 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
847
    "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
848
static_assert(7 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
849
    "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
850
851
852
static uint16_t sNativeProperties_sortedPropertyIndices[14];
853
static PropertyInfo sNativeProperties_propertyInfos[14];
854
855
static const NativePropertiesN<2> sNativeProperties = {
856
  false, 0,
857
  false, 0,
858
  true,  0 /* sMethods */,
859
  true,  1 /* sAttributes */,
860
  false, 0,
861
  false, 0,
862
  false, 0,
863
  -1,
864
  14,
865
  sNativeProperties_sortedPropertyIndices,
866
  {
867
    { sMethods, &sNativeProperties_propertyInfos[0] },
868
    { sAttributes, &sNativeProperties_propertyInfos[6] }
869
  }
870
};
871
static_assert(14 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
872
    "We have a property info count that is oversized");
873
874
static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
875
  {
876
    "Function",
877
    JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
878
    &sBoringInterfaceObjectClassClassOps,
879
    JS_NULL_CLASS_SPEC,
880
    JS_NULL_CLASS_EXT,
881
    &sInterfaceObjectClassObjectOps
882
  },
883
  eInterface,
884
  true,
885
  prototypes::id::IDBDatabase,
886
  PrototypeTraits<prototypes::id::IDBDatabase>::Depth,
887
  sNativePropertyHooks,
888
  "function IDBDatabase() {\n    [native code]\n}",
889
  EventTarget_Binding::GetConstructorObject
890
};
891
892
static const DOMIfaceAndProtoJSClass sPrototypeClass = {
893
  {
894
    "IDBDatabasePrototype",
895
    JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
896
    JS_NULL_CLASS_OPS,
897
    JS_NULL_CLASS_SPEC,
898
    JS_NULL_CLASS_EXT,
899
    JS_NULL_OBJECT_OPS
900
  },
901
  eInterfacePrototype,
902
  false,
903
  prototypes::id::IDBDatabase,
904
  PrototypeTraits<prototypes::id::IDBDatabase>::Depth,
905
  sNativePropertyHooks,
906
  "[object IDBDatabasePrototype]",
907
  EventTarget_Binding::GetProtoObject
908
};
909
910
static const js::ClassOps sClassOps = {
911
  _addProperty, /* addProperty */
912
  nullptr,               /* delProperty */
913
  nullptr,               /* enumerate */
914
  nullptr, /* newEnumerate */
915
  nullptr, /* resolve */
916
  nullptr, /* mayResolve */
917
  _finalize, /* finalize */
918
  nullptr, /* call */
919
  nullptr,               /* hasInstance */
920
  nullptr,               /* construct */
921
  nullptr, /* trace */
922
};
923
924
static const js::ClassExtension sClassExtension = {
925
  nullptr, /* weakmapKeyDelegateOp */
926
  _objectMoved /* objectMovedOp */
927
};
928
929
static const DOMJSClass sClass = {
930
  { "IDBDatabase",
931
    JSCLASS_IS_DOMJSCLASS | JSCLASS_FOREGROUND_FINALIZE | JSCLASS_HAS_RESERVED_SLOTS(1),
932
    &sClassOps,
933
    JS_NULL_CLASS_SPEC,
934
    &sClassExtension,
935
    JS_NULL_OBJECT_OPS
936
  },
937
  { prototypes::id::EventTarget, prototypes::id::IDBDatabase, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count },
938
  IsBaseOf<nsISupports, mozilla::dom::IDBDatabase >::value,
939
  sNativePropertyHooks,
940
  FindAssociatedGlobalForNative<mozilla::dom::IDBDatabase>::Get,
941
  GetProtoObjectHandle,
942
  GetCCParticipant<mozilla::dom::IDBDatabase>::Get()
943
};
944
static_assert(1 == DOM_INSTANCE_RESERVED_SLOTS,
945
              "Must have the right minimal number of reserved slots.");
946
static_assert(1 >= 1,
947
              "Must have enough reserved slots.");
948
949
const JSClass*
950
GetJSClass()
951
0
{
952
0
  return sClass.ToJSClass();
953
0
}
954
955
bool
956
Wrap(JSContext* aCx, mozilla::dom::IDBDatabase* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector)
957
0
{
958
0
  static_assert(!IsBaseOf<NonRefcountedDOMObject, mozilla::dom::IDBDatabase>::value,
959
0
                "Shouldn't have wrappercached things that are not refcounted.");
960
0
  MOZ_ASSERT(static_cast<mozilla::dom::IDBDatabase*>(aObject) ==
961
0
             reinterpret_cast<mozilla::dom::IDBDatabase*>(aObject),
962
0
             "Multiple inheritance for mozilla::dom::IDBDatabase is broken.");
963
0
  MOZ_ASSERT(static_cast<mozilla::dom::EventTarget*>(aObject) ==
964
0
             reinterpret_cast<mozilla::dom::EventTarget*>(aObject),
965
0
             "Multiple inheritance for mozilla::dom::EventTarget is broken.");
966
0
  MOZ_ASSERT(ToSupportsIsCorrect(aObject));
967
0
  MOZ_ASSERT_IF(aGivenProto, js::IsObjectInContextCompartment(aGivenProto, aCx));
968
0
  MOZ_ASSERT(!aCache->GetWrapper(),
969
0
             "You should probably not be using Wrap() directly; use "
970
0
             "GetOrCreateDOMReflector instead");
971
0
972
0
  MOZ_ASSERT(ToSupportsIsOnPrimaryInheritanceChain(aObject, aCache),
973
0
             "nsISupports must be on our primary inheritance chain");
974
0
975
0
  JS::Rooted<JSObject*> global(aCx, FindAssociatedGlobal(aCx, aObject->GetParentObject()));
976
0
  if (!global) {
977
0
    return false;
978
0
  }
979
0
  MOZ_ASSERT(JS_IsGlobalObject(global));
980
0
  MOZ_ASSERT(JS::ObjectIsNotGray(global));
981
0
982
0
  // That might have ended up wrapping us already, due to the wonders
983
0
  // of XBL.  Check for that, and bail out as needed.
984
0
  aReflector.set(aCache->GetWrapper());
985
0
  if (aReflector) {
986
#ifdef DEBUG
987
    AssertReflectorHasGivenProto(aCx, aReflector, aGivenProto);
988
#endif // DEBUG
989
    return true;
990
0
  }
991
0
992
0
  JSAutoRealm ar(aCx, global);
993
0
  JS::Handle<JSObject*> canonicalProto = GetProtoObjectHandle(aCx);
994
0
  if (!canonicalProto) {
995
0
    return false;
996
0
  }
997
0
  JS::Rooted<JSObject*> proto(aCx);
998
0
  if (aGivenProto) {
999
0
    proto = aGivenProto;
1000
0
    // Unfortunately, while aGivenProto was in the compartment of aCx
1001
0
    // coming in, we changed compartments to that of "parent" so may need
1002
0
    // to wrap the proto here.
1003
0
    if (js::GetContextCompartment(aCx) != js::GetObjectCompartment(proto)) {
1004
0
      if (!JS_WrapObject(aCx, &proto)) {
1005
0
        return false;
1006
0
      }
1007
0
    }
1008
0
  } else {
1009
0
    proto = canonicalProto;
1010
0
  }
1011
0
1012
0
  BindingJSObjectCreator<mozilla::dom::IDBDatabase> creator(aCx);
1013
0
  creator.CreateObject(aCx, sClass.ToJSClass(), proto, aObject, aReflector);
1014
0
  if (!aReflector) {
1015
0
    return false;
1016
0
  }
1017
0
1018
0
  aCache->SetWrapper(aReflector);
1019
0
  creator.InitializationSucceeded();
1020
0
1021
0
  MOZ_ASSERT(aCache->GetWrapperPreserveColor() &&
1022
0
             aCache->GetWrapperPreserveColor() == aReflector);
1023
0
  // If proto != canonicalProto, we have to preserve our wrapper;
1024
0
  // otherwise we won't be able to properly recreate it later, since
1025
0
  // we won't know what proto to use.  Note that we don't check
1026
0
  // aGivenProto here, since it's entirely possible (and even
1027
0
  // somewhat common) to have a non-null aGivenProto which is the
1028
0
  // same as canonicalProto.
1029
0
  if (proto != canonicalProto) {
1030
0
    PreserveWrapper(aObject);
1031
0
  }
1032
0
1033
0
  return true;
1034
0
}
1035
1036
const NativePropertyHooks sNativePropertyHooks[] = { {
1037
  nullptr,
1038
  nullptr,
1039
  nullptr,
1040
  { sNativeProperties.Upcast(), nullptr },
1041
  prototypes::id::IDBDatabase,
1042
  constructors::id::IDBDatabase,
1043
  EventTarget_Binding::sNativePropertyHooks,
1044
  &DefaultXrayExpandoObjectClass
1045
} };
1046
1047
void
1048
CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
1049
0
{
1050
0
  JS::Handle<JSObject*> parentProto(EventTarget_Binding::GetProtoObjectHandle(aCx));
1051
0
  if (!parentProto) {
1052
0
    return;
1053
0
  }
1054
0
1055
0
  JS::Handle<JSObject*> constructorProto(EventTarget_Binding::GetConstructorObjectHandle(aCx));
1056
0
  if (!constructorProto) {
1057
0
    return;
1058
0
  }
1059
0
1060
0
  static bool sIdsInited = false;
1061
0
  if (!sIdsInited && NS_IsMainThread()) {
1062
0
    if (!InitIds(aCx, sNativeProperties.Upcast())) {
1063
0
      return;
1064
0
    }
1065
0
    sIdsInited = true;
1066
0
  }
1067
0
1068
0
  JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::IDBDatabase);
1069
0
  JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::IDBDatabase);
1070
0
  dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
1071
0
                              &sPrototypeClass.mBase, protoCache,
1072
0
                              nullptr,
1073
0
                              constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
1074
0
                              interfaceCache,
1075
0
                              sNativeProperties.Upcast(),
1076
0
                              nullptr,
1077
0
                              "IDBDatabase", aDefineOnGlobal,
1078
0
                              nullptr,
1079
0
                              false);
1080
0
}
1081
1082
JSObject*
1083
GetConstructorObject(JSContext* aCx)
1084
0
{
1085
0
  return GetConstructorObjectHandle(aCx);
1086
0
}
1087
1088
} // namespace IDBDatabase_Binding
1089
1090
1091
1092
} // namespace dom
1093
} // namespace mozilla