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