Line data Source code
1 : /* THIS FILE IS AUTOGENERATED FROM IDBTransaction.webidl BY Codegen.py - DO NOT EDIT */
2 :
3 : #include "EventHandlerBinding.h"
4 : #include "EventTargetBinding.h"
5 : #include "IDBTransactionBinding.h"
6 : #include "WrapperFactory.h"
7 : #include "jsapi.h"
8 : #include "mozilla/OwningNonNull.h"
9 : #include "mozilla/dom/BindingUtils.h"
10 : #include "mozilla/dom/DOMError.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/IDBTransaction.h"
16 : #include "mozilla/dom/NonRefcountedDOMObject.h"
17 : #include "mozilla/dom/Nullable.h"
18 : #include "mozilla/dom/XrayExpandoClass.h"
19 :
20 : namespace mozilla {
21 : namespace dom {
22 :
23 : namespace IDBTransactionModeValues {
24 : extern const EnumEntry strings[6] = {
25 : {"readonly", 8},
26 : {"readwrite", 9},
27 : {"readwriteflush", 14},
28 : {"cleanup", 7},
29 : {"versionchange", 13},
30 : { nullptr, 0 }
31 : };
32 : } // namespace IDBTransactionModeValues
33 :
34 : bool
35 0 : ToJSValue(JSContext* aCx, IDBTransactionMode aArgument, JS::MutableHandle<JS::Value> aValue)
36 : {
37 0 : MOZ_ASSERT(uint32_t(aArgument) < ArrayLength(IDBTransactionModeValues::strings));
38 : JSString* resultStr =
39 0 : JS_NewStringCopyN(aCx, IDBTransactionModeValues::strings[uint32_t(aArgument)].value,
40 0 : IDBTransactionModeValues::strings[uint32_t(aArgument)].length);
41 0 : if (!resultStr) {
42 0 : return false;
43 : }
44 0 : aValue.setString(resultStr);
45 0 : return true;
46 : }
47 :
48 :
49 : namespace IDBTransactionBinding {
50 :
51 : static_assert(IsRefcounted<NativeType>::value == IsRefcounted<EventTargetBinding::NativeType>::value,
52 : "Can't inherit from an interface with a different ownership model.");
53 :
54 : static bool
55 0 : get_mode(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBTransaction* self, JSJitGetterCallArgs args)
56 : {
57 0 : binding_detail::FastErrorResult rv;
58 0 : IDBTransactionMode result(self->GetMode(rv));
59 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
60 0 : return false;
61 : }
62 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
63 0 : if (!ToJSValue(cx, result, args.rval())) {
64 0 : return false;
65 : }
66 0 : return true;
67 : }
68 :
69 : static const JSJitInfo mode_getterinfo = {
70 : { (JSJitGetterOp)get_mode },
71 : { prototypes::id::IDBTransaction },
72 : { PrototypeTraits<prototypes::id::IDBTransaction>::Depth },
73 : JSJitInfo::Getter,
74 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
75 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
76 : false, /* isInfallible. False in setters. */
77 : false, /* isMovable. Not relevant for setters. */
78 : false, /* isEliminatable. Not relevant for setters. */
79 : false, /* isAlwaysInSlot. Only relevant for getters. */
80 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
81 : false, /* isTypedMethod. Only relevant for methods. */
82 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
83 : };
84 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
85 : static_assert(0 < 1, "There is no slot for us");
86 :
87 : static bool
88 0 : get_db(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBTransaction* self, JSJitGetterCallArgs args)
89 : {
90 0 : auto result(StrongOrRawPtr<mozilla::dom::IDBDatabase>(self->Db()));
91 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
92 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
93 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
94 0 : return false;
95 : }
96 0 : return true;
97 : }
98 :
99 : static const JSJitInfo db_getterinfo = {
100 : { (JSJitGetterOp)get_db },
101 : { prototypes::id::IDBTransaction },
102 : { PrototypeTraits<prototypes::id::IDBTransaction>::Depth },
103 : JSJitInfo::Getter,
104 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
105 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
106 : false, /* isInfallible. False in setters. */
107 : false, /* isMovable. Not relevant for setters. */
108 : false, /* isEliminatable. Not relevant for setters. */
109 : false, /* isAlwaysInSlot. Only relevant for getters. */
110 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
111 : false, /* isTypedMethod. Only relevant for methods. */
112 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
113 : };
114 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
115 : static_assert(0 < 1, "There is no slot for us");
116 :
117 : static bool
118 0 : get_error(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBTransaction* self, JSJitGetterCallArgs args)
119 : {
120 0 : auto result(StrongOrRawPtr<mozilla::dom::DOMError>(self->GetError()));
121 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
122 0 : if (!result) {
123 0 : args.rval().setNull();
124 0 : return true;
125 : }
126 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
127 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
128 0 : return false;
129 : }
130 0 : return true;
131 : }
132 :
133 : static const JSJitInfo error_getterinfo = {
134 : { (JSJitGetterOp)get_error },
135 : { prototypes::id::IDBTransaction },
136 : { PrototypeTraits<prototypes::id::IDBTransaction>::Depth },
137 : JSJitInfo::Getter,
138 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
139 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
140 : false, /* isInfallible. False in setters. */
141 : false, /* isMovable. Not relevant for setters. */
142 : false, /* isEliminatable. Not relevant for setters. */
143 : false, /* isAlwaysInSlot. Only relevant for getters. */
144 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
145 : false, /* isTypedMethod. Only relevant for methods. */
146 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
147 : };
148 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
149 : static_assert(0 < 1, "There is no slot for us");
150 :
151 : static bool
152 0 : objectStore(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBTransaction* self, const JSJitMethodCallArgs& args)
153 : {
154 0 : if (MOZ_UNLIKELY(args.length() < 1)) {
155 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "IDBTransaction.objectStore");
156 : }
157 0 : binding_detail::FakeString arg0;
158 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
159 0 : return false;
160 : }
161 0 : binding_detail::FastErrorResult rv;
162 0 : auto result(StrongOrRawPtr<mozilla::dom::IDBObjectStore>(self->ObjectStore(NonNullHelper(Constify(arg0)), rv)));
163 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
164 0 : return false;
165 : }
166 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
167 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
168 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
169 0 : return false;
170 : }
171 0 : return true;
172 : }
173 :
174 : static const JSJitInfo objectStore_methodinfo = {
175 : { (JSJitGetterOp)objectStore },
176 : { prototypes::id::IDBTransaction },
177 : { PrototypeTraits<prototypes::id::IDBTransaction>::Depth },
178 : JSJitInfo::Method,
179 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
180 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
181 : false, /* isInfallible. False in setters. */
182 : false, /* isMovable. Not relevant for setters. */
183 : false, /* isEliminatable. Not relevant for setters. */
184 : false, /* isAlwaysInSlot. Only relevant for getters. */
185 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
186 : false, /* isTypedMethod. Only relevant for methods. */
187 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
188 : };
189 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
190 : static_assert(0 < 1, "There is no slot for us");
191 :
192 : static bool
193 0 : abort(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBTransaction* self, const JSJitMethodCallArgs& args)
194 : {
195 0 : binding_detail::FastErrorResult rv;
196 0 : self->Abort(rv);
197 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
198 0 : return false;
199 : }
200 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
201 0 : args.rval().setUndefined();
202 0 : return true;
203 : }
204 :
205 : static const JSJitInfo abort_methodinfo = {
206 : { (JSJitGetterOp)abort },
207 : { prototypes::id::IDBTransaction },
208 : { PrototypeTraits<prototypes::id::IDBTransaction>::Depth },
209 : JSJitInfo::Method,
210 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
211 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
212 : false, /* isInfallible. False in setters. */
213 : false, /* isMovable. Not relevant for setters. */
214 : false, /* isEliminatable. Not relevant for setters. */
215 : false, /* isAlwaysInSlot. Only relevant for getters. */
216 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
217 : false, /* isTypedMethod. Only relevant for methods. */
218 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
219 : };
220 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
221 : static_assert(0 < 1, "There is no slot for us");
222 :
223 : static bool
224 0 : get_onabort(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBTransaction* self, JSJitGetterCallArgs args)
225 : {
226 0 : RefPtr<EventHandlerNonNull> result(self->GetOnabort());
227 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
228 0 : if (result) {
229 0 : args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
230 0 : if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
231 0 : return false;
232 : }
233 0 : return true;
234 : } else {
235 0 : args.rval().setNull();
236 0 : return true;
237 : }
238 : }
239 :
240 : static bool
241 0 : set_onabort(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBTransaction* self, JSJitSetterCallArgs args)
242 : {
243 0 : RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
244 0 : if (args[0].isObject()) {
245 : { // scope for tempRoot
246 0 : JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
247 0 : arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
248 : }
249 : } else {
250 0 : arg0 = nullptr;
251 : }
252 0 : self->SetOnabort(Constify(arg0));
253 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
254 :
255 0 : return true;
256 : }
257 :
258 : static const JSJitInfo onabort_getterinfo = {
259 : { (JSJitGetterOp)get_onabort },
260 : { prototypes::id::IDBTransaction },
261 : { PrototypeTraits<prototypes::id::IDBTransaction>::Depth },
262 : JSJitInfo::Getter,
263 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
264 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
265 : false, /* isInfallible. False in setters. */
266 : false, /* isMovable. Not relevant for setters. */
267 : false, /* isEliminatable. Not relevant for setters. */
268 : false, /* isAlwaysInSlot. Only relevant for getters. */
269 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
270 : false, /* isTypedMethod. Only relevant for methods. */
271 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
272 : };
273 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
274 : static_assert(0 < 1, "There is no slot for us");
275 : static const JSJitInfo onabort_setterinfo = {
276 : { (JSJitGetterOp)set_onabort },
277 : { prototypes::id::IDBTransaction },
278 : { PrototypeTraits<prototypes::id::IDBTransaction>::Depth },
279 : JSJitInfo::Setter,
280 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
281 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
282 : false, /* isInfallible. False in setters. */
283 : false, /* isMovable. Not relevant for setters. */
284 : false, /* isEliminatable. Not relevant for setters. */
285 : false, /* isAlwaysInSlot. Only relevant for getters. */
286 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
287 : false, /* isTypedMethod. Only relevant for methods. */
288 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
289 : };
290 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
291 : static_assert(0 < 1, "There is no slot for us");
292 :
293 : static bool
294 0 : get_oncomplete(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBTransaction* self, JSJitGetterCallArgs args)
295 : {
296 0 : RefPtr<EventHandlerNonNull> result(self->GetOncomplete());
297 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
298 0 : if (result) {
299 0 : args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
300 0 : if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
301 0 : return false;
302 : }
303 0 : return true;
304 : } else {
305 0 : args.rval().setNull();
306 0 : return true;
307 : }
308 : }
309 :
310 : static bool
311 0 : set_oncomplete(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBTransaction* self, JSJitSetterCallArgs args)
312 : {
313 0 : RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
314 0 : if (args[0].isObject()) {
315 : { // scope for tempRoot
316 0 : JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
317 0 : arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
318 : }
319 : } else {
320 0 : arg0 = nullptr;
321 : }
322 0 : self->SetOncomplete(Constify(arg0));
323 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
324 :
325 0 : return true;
326 : }
327 :
328 : static const JSJitInfo oncomplete_getterinfo = {
329 : { (JSJitGetterOp)get_oncomplete },
330 : { prototypes::id::IDBTransaction },
331 : { PrototypeTraits<prototypes::id::IDBTransaction>::Depth },
332 : JSJitInfo::Getter,
333 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
334 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
335 : false, /* isInfallible. False in setters. */
336 : false, /* isMovable. Not relevant for setters. */
337 : false, /* isEliminatable. Not relevant for setters. */
338 : false, /* isAlwaysInSlot. Only relevant for getters. */
339 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
340 : false, /* isTypedMethod. Only relevant for methods. */
341 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
342 : };
343 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
344 : static_assert(0 < 1, "There is no slot for us");
345 : static const JSJitInfo oncomplete_setterinfo = {
346 : { (JSJitGetterOp)set_oncomplete },
347 : { prototypes::id::IDBTransaction },
348 : { PrototypeTraits<prototypes::id::IDBTransaction>::Depth },
349 : JSJitInfo::Setter,
350 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
351 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
352 : false, /* isInfallible. False in setters. */
353 : false, /* isMovable. Not relevant for setters. */
354 : false, /* isEliminatable. Not relevant for setters. */
355 : false, /* isAlwaysInSlot. Only relevant for getters. */
356 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
357 : false, /* isTypedMethod. Only relevant for methods. */
358 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
359 : };
360 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
361 : static_assert(0 < 1, "There is no slot for us");
362 :
363 : static bool
364 0 : get_onerror(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBTransaction* self, JSJitGetterCallArgs args)
365 : {
366 0 : RefPtr<EventHandlerNonNull> result(self->GetOnerror());
367 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
368 0 : if (result) {
369 0 : args.rval().setObjectOrNull(GetCallbackFromCallbackObject(result));
370 0 : if (!MaybeWrapObjectOrNullValue(cx, args.rval())) {
371 0 : return false;
372 : }
373 0 : return true;
374 : } else {
375 0 : args.rval().setNull();
376 0 : return true;
377 : }
378 : }
379 :
380 : static bool
381 0 : set_onerror(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBTransaction* self, JSJitSetterCallArgs args)
382 : {
383 0 : RootedCallback<RefPtr<binding_detail::FastEventHandlerNonNull>> arg0(cx);
384 0 : if (args[0].isObject()) {
385 : { // scope for tempRoot
386 0 : JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
387 0 : arg0 = new binding_detail::FastEventHandlerNonNull(tempRoot);
388 : }
389 : } else {
390 0 : arg0 = nullptr;
391 : }
392 0 : self->SetOnerror(Constify(arg0));
393 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
394 :
395 0 : return true;
396 : }
397 :
398 : static const JSJitInfo onerror_getterinfo = {
399 : { (JSJitGetterOp)get_onerror },
400 : { prototypes::id::IDBTransaction },
401 : { PrototypeTraits<prototypes::id::IDBTransaction>::Depth },
402 : JSJitInfo::Getter,
403 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
404 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
405 : false, /* isInfallible. False in setters. */
406 : false, /* isMovable. Not relevant for setters. */
407 : false, /* isEliminatable. Not relevant for setters. */
408 : false, /* isAlwaysInSlot. Only relevant for getters. */
409 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
410 : false, /* isTypedMethod. Only relevant for methods. */
411 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
412 : };
413 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
414 : static_assert(0 < 1, "There is no slot for us");
415 : static const JSJitInfo onerror_setterinfo = {
416 : { (JSJitGetterOp)set_onerror },
417 : { prototypes::id::IDBTransaction },
418 : { PrototypeTraits<prototypes::id::IDBTransaction>::Depth },
419 : JSJitInfo::Setter,
420 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
421 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
422 : false, /* isInfallible. False in setters. */
423 : false, /* isMovable. Not relevant for setters. */
424 : false, /* isEliminatable. Not relevant for setters. */
425 : false, /* isAlwaysInSlot. Only relevant for getters. */
426 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
427 : false, /* isTypedMethod. Only relevant for methods. */
428 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
429 : };
430 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
431 : static_assert(0 < 1, "There is no slot for us");
432 :
433 : static bool
434 0 : get_objectStoreNames(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::IDBTransaction* self, JSJitGetterCallArgs args)
435 : {
436 0 : auto result(StrongOrRawPtr<mozilla::dom::DOMStringList>(self->ObjectStoreNames()));
437 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
438 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
439 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
440 0 : return false;
441 : }
442 0 : return true;
443 : }
444 :
445 : static const JSJitInfo objectStoreNames_getterinfo = {
446 : { (JSJitGetterOp)get_objectStoreNames },
447 : { prototypes::id::IDBTransaction },
448 : { PrototypeTraits<prototypes::id::IDBTransaction>::Depth },
449 : JSJitInfo::Getter,
450 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
451 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
452 : false, /* isInfallible. False in setters. */
453 : false, /* isMovable. Not relevant for setters. */
454 : false, /* isEliminatable. Not relevant for setters. */
455 : false, /* isAlwaysInSlot. Only relevant for getters. */
456 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
457 : false, /* isTypedMethod. Only relevant for methods. */
458 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
459 : };
460 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
461 : static_assert(0 < 1, "There is no slot for us");
462 :
463 : static bool
464 0 : _addProperty(JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JS::Handle<JS::Value> val)
465 : {
466 0 : mozilla::dom::IDBTransaction* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::IDBTransaction>(obj);
467 : // We don't want to preserve if we don't have a wrapper, and we
468 : // obviously can't preserve if we're not initialized.
469 0 : if (self && self->GetWrapperPreserveColor()) {
470 0 : PreserveWrapper(self);
471 : }
472 0 : return true;
473 : }
474 :
475 : static void
476 0 : _finalize(js::FreeOp* fop, JSObject* obj)
477 : {
478 0 : mozilla::dom::IDBTransaction* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::IDBTransaction>(obj);
479 0 : if (self) {
480 0 : ClearWrapper(self, self, obj);
481 0 : AddForDeferredFinalization<mozilla::dom::IDBTransaction>(self);
482 : }
483 0 : }
484 :
485 : static void
486 0 : _objectMoved(JSObject* obj, const JSObject* old)
487 : {
488 0 : mozilla::dom::IDBTransaction* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::IDBTransaction>(obj);
489 0 : if (self) {
490 0 : UpdateWrapper(self, self, obj, old);
491 : }
492 0 : }
493 :
494 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
495 : #if defined(__clang__)
496 : #pragma clang diagnostic push
497 : #pragma clang diagnostic ignored "-Wmissing-braces"
498 : #endif
499 : static const JSFunctionSpec sMethods_specs[] = {
500 : JS_FNSPEC("objectStore", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&objectStore_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
501 : JS_FNSPEC("abort", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&abort_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
502 : JS_FS_END
503 : };
504 : #if defined(__clang__)
505 : #pragma clang diagnostic pop
506 : #endif
507 :
508 :
509 : // Can't be const because the pref-enabled boolean needs to be writable
510 : static Prefable<const JSFunctionSpec> sMethods[] = {
511 : { nullptr, &sMethods_specs[0] },
512 : { nullptr, nullptr }
513 : };
514 :
515 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
516 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
517 : static_assert(2 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
518 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
519 :
520 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
521 : #if defined(__clang__)
522 : #pragma clang diagnostic push
523 : #pragma clang diagnostic ignored "-Wmissing-braces"
524 : #endif
525 : static const JSPropertySpec sAttributes_specs[] = {
526 : { "mode", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &mode_getterinfo, nullptr, nullptr },
527 : { "db", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &db_getterinfo, nullptr, nullptr },
528 : { "error", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &error_getterinfo, nullptr, nullptr },
529 : { "onabort", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onabort_getterinfo, GenericBindingSetter, &onabort_setterinfo },
530 : { "oncomplete", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &oncomplete_getterinfo, GenericBindingSetter, &oncomplete_setterinfo },
531 : { "onerror", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &onerror_getterinfo, GenericBindingSetter, &onerror_setterinfo },
532 : { "objectStoreNames", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &objectStoreNames_getterinfo, nullptr, nullptr },
533 : { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
534 : };
535 : #if defined(__clang__)
536 : #pragma clang diagnostic pop
537 : #endif
538 :
539 :
540 : // Can't be const because the pref-enabled boolean needs to be writable
541 : static Prefable<const JSPropertySpec> sAttributes[] = {
542 : { nullptr, &sAttributes_specs[0] },
543 : { nullptr, nullptr }
544 : };
545 :
546 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
547 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
548 : static_assert(7 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
549 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
550 :
551 :
552 : static uint16_t sNativeProperties_sortedPropertyIndices[9];
553 : static PropertyInfo sNativeProperties_propertyInfos[9];
554 :
555 : static const NativePropertiesN<2> sNativeProperties = {
556 : false, 0,
557 : false, 0,
558 : true, 0 /* sMethods */,
559 : true, 1 /* sAttributes */,
560 : false, 0,
561 : false, 0,
562 : false, 0,
563 : -1,
564 : 9,
565 : sNativeProperties_sortedPropertyIndices,
566 : {
567 : { sMethods, &sNativeProperties_propertyInfos[0] },
568 : { sAttributes, &sNativeProperties_propertyInfos[2] }
569 : }
570 : };
571 : static_assert(9 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
572 : "We have a property info count that is oversized");
573 :
574 : static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
575 : {
576 : "Function",
577 : JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
578 : &sBoringInterfaceObjectClassClassOps,
579 : JS_NULL_CLASS_SPEC,
580 : JS_NULL_CLASS_EXT,
581 : &sInterfaceObjectClassObjectOps
582 : },
583 : eInterface,
584 : true,
585 : prototypes::id::IDBTransaction,
586 : PrototypeTraits<prototypes::id::IDBTransaction>::Depth,
587 : sNativePropertyHooks,
588 : "function IDBTransaction() {\n [native code]\n}",
589 : EventTargetBinding::GetConstructorObject
590 : };
591 :
592 : static const DOMIfaceAndProtoJSClass sPrototypeClass = {
593 : {
594 : "IDBTransactionPrototype",
595 : JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
596 : JS_NULL_CLASS_OPS,
597 : JS_NULL_CLASS_SPEC,
598 : JS_NULL_CLASS_EXT,
599 : JS_NULL_OBJECT_OPS
600 : },
601 : eInterfacePrototype,
602 : false,
603 : prototypes::id::IDBTransaction,
604 : PrototypeTraits<prototypes::id::IDBTransaction>::Depth,
605 : sNativePropertyHooks,
606 : "[object IDBTransactionPrototype]",
607 : EventTargetBinding::GetProtoObject
608 : };
609 :
610 : JSObject*
611 0 : DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
612 : {
613 0 : return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
614 : }
615 :
616 : static const js::ClassOps sClassOps = {
617 : _addProperty, /* addProperty */
618 : nullptr, /* delProperty */
619 : nullptr, /* getProperty */
620 : nullptr, /* setProperty */
621 : nullptr, /* enumerate */
622 : nullptr, /* newEnumerate */
623 : nullptr, /* resolve */
624 : nullptr, /* mayResolve */
625 : _finalize, /* finalize */
626 : nullptr, /* call */
627 : nullptr, /* hasInstance */
628 : nullptr, /* construct */
629 : nullptr, /* trace */
630 : };
631 :
632 : static const js::ClassExtension sClassExtension = {
633 : nullptr, /* weakmapKeyDelegateOp */
634 : _objectMoved /* objectMovedOp */
635 : };
636 :
637 : static const DOMJSClass sClass = {
638 : { "IDBTransaction",
639 : JSCLASS_IS_DOMJSCLASS | JSCLASS_FOREGROUND_FINALIZE | JSCLASS_HAS_RESERVED_SLOTS(1),
640 : &sClassOps,
641 : JS_NULL_CLASS_SPEC,
642 : &sClassExtension,
643 : JS_NULL_OBJECT_OPS
644 : },
645 : { prototypes::id::EventTarget, prototypes::id::IDBTransaction, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count },
646 : IsBaseOf<nsISupports, mozilla::dom::IDBTransaction >::value,
647 : sNativePropertyHooks,
648 : FindAssociatedGlobalForNative<mozilla::dom::IDBTransaction>::Get,
649 : GetProtoObjectHandle,
650 : GetCCParticipant<mozilla::dom::IDBTransaction>::Get()
651 : };
652 : static_assert(1 == DOM_INSTANCE_RESERVED_SLOTS,
653 : "Must have the right minimal number of reserved slots.");
654 : static_assert(1 >= 1,
655 : "Must have enough reserved slots.");
656 :
657 : const JSClass*
658 0 : GetJSClass()
659 : {
660 0 : return sClass.ToJSClass();
661 : }
662 :
663 : bool
664 0 : Wrap(JSContext* aCx, mozilla::dom::IDBTransaction* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector)
665 : {
666 : MOZ_ASSERT(static_cast<mozilla::dom::IDBTransaction*>(aObject) ==
667 : reinterpret_cast<mozilla::dom::IDBTransaction*>(aObject),
668 : "Multiple inheritance for mozilla::dom::IDBTransaction is broken.");
669 : MOZ_ASSERT(static_cast<mozilla::dom::EventTarget*>(aObject) ==
670 : reinterpret_cast<mozilla::dom::EventTarget*>(aObject),
671 : "Multiple inheritance for mozilla::dom::EventTarget is broken.");
672 0 : MOZ_ASSERT(ToSupportsIsCorrect(aObject));
673 0 : MOZ_ASSERT_IF(aGivenProto, js::IsObjectInContextCompartment(aGivenProto, aCx));
674 0 : MOZ_ASSERT(!aCache->GetWrapper(),
675 : "You should probably not be using Wrap() directly; use "
676 : "GetOrCreateDOMReflector instead");
677 :
678 0 : MOZ_ASSERT(ToSupportsIsOnPrimaryInheritanceChain(aObject, aCache),
679 : "nsISupports must be on our primary inheritance chain");
680 :
681 0 : JS::Rooted<JSObject*> global(aCx, FindAssociatedGlobal(aCx, aObject->GetParentObject()));
682 0 : if (!global) {
683 0 : return false;
684 : }
685 0 : MOZ_ASSERT(JS_IsGlobalObject(global));
686 0 : MOZ_ASSERT(JS::ObjectIsNotGray(global));
687 :
688 : // That might have ended up wrapping us already, due to the wonders
689 : // of XBL. Check for that, and bail out as needed.
690 0 : aReflector.set(aCache->GetWrapper());
691 0 : if (aReflector) {
692 : #ifdef DEBUG
693 0 : binding_detail::AssertReflectorHasGivenProto(aCx, aReflector, aGivenProto);
694 : #endif // DEBUG
695 0 : return true;
696 : }
697 :
698 0 : JSAutoCompartment ac(aCx, global);
699 0 : JS::Handle<JSObject*> canonicalProto = GetProtoObjectHandle(aCx);
700 0 : if (!canonicalProto) {
701 0 : return false;
702 : }
703 0 : JS::Rooted<JSObject*> proto(aCx);
704 0 : if (aGivenProto) {
705 0 : proto = aGivenProto;
706 : // Unfortunately, while aGivenProto was in the compartment of aCx
707 : // coming in, we changed compartments to that of "parent" so may need
708 : // to wrap the proto here.
709 0 : if (js::GetContextCompartment(aCx) != js::GetObjectCompartment(proto)) {
710 0 : if (!JS_WrapObject(aCx, &proto)) {
711 0 : return false;
712 : }
713 : }
714 : } else {
715 0 : proto = canonicalProto;
716 : }
717 :
718 0 : BindingJSObjectCreator<mozilla::dom::IDBTransaction> creator(aCx);
719 0 : creator.CreateObject(aCx, sClass.ToJSClass(), proto, aObject, aReflector);
720 0 : if (!aReflector) {
721 0 : return false;
722 : }
723 :
724 0 : aCache->SetWrapper(aReflector);
725 0 : creator.InitializationSucceeded();
726 :
727 0 : MOZ_ASSERT(aCache->GetWrapperPreserveColor() &&
728 : aCache->GetWrapperPreserveColor() == aReflector);
729 : // If proto != canonicalProto, we have to preserve our wrapper;
730 : // otherwise we won't be able to properly recreate it later, since
731 : // we won't know what proto to use. Note that we don't check
732 : // aGivenProto here, since it's entirely possible (and even
733 : // somewhat common) to have a non-null aGivenProto which is the
734 : // same as canonicalProto.
735 0 : if (proto != canonicalProto) {
736 0 : PreserveWrapper(aObject);
737 : }
738 :
739 0 : return true;
740 : }
741 :
742 : const NativePropertyHooks sNativePropertyHooks[] = { {
743 : nullptr,
744 : nullptr,
745 : nullptr,
746 : { sNativeProperties.Upcast(), nullptr },
747 : prototypes::id::IDBTransaction,
748 : constructors::id::IDBTransaction,
749 : EventTargetBinding::sNativePropertyHooks,
750 : &DefaultXrayExpandoObjectClass
751 : } };
752 :
753 : void
754 15 : CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
755 : {
756 15 : JS::Handle<JSObject*> parentProto(EventTargetBinding::GetProtoObjectHandle(aCx));
757 15 : if (!parentProto) {
758 0 : return;
759 : }
760 :
761 15 : JS::Handle<JSObject*> constructorProto(EventTargetBinding::GetConstructorObjectHandle(aCx));
762 15 : if (!constructorProto) {
763 0 : return;
764 : }
765 :
766 : static bool sIdsInited = false;
767 15 : if (!sIdsInited && NS_IsMainThread()) {
768 1 : if (!InitIds(aCx, sNativeProperties.Upcast())) {
769 0 : return;
770 : }
771 1 : sIdsInited = true;
772 : }
773 :
774 15 : JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::IDBTransaction);
775 15 : JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::IDBTransaction);
776 15 : dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
777 : &sPrototypeClass.mBase, protoCache,
778 : constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
779 : interfaceCache,
780 : sNativeProperties.Upcast(),
781 : nullptr,
782 : "IDBTransaction", aDefineOnGlobal,
783 : nullptr,
784 15 : false);
785 : }
786 :
787 : JS::Handle<JSObject*>
788 0 : GetProtoObjectHandle(JSContext* aCx)
789 : {
790 : /* Get the interface prototype object for this class. This will create the
791 : object as needed. */
792 0 : bool aDefineOnGlobal = true;
793 :
794 : /* Make sure our global is sane. Hopefully we can remove this sometime */
795 0 : JSObject* global = JS::CurrentGlobalOrNull(aCx);
796 0 : if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
797 0 : return nullptr;
798 : }
799 :
800 : /* Check to see whether the interface objects are already installed */
801 0 : ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
802 0 : if (!protoAndIfaceCache.HasEntryInSlot(prototypes::id::IDBTransaction)) {
803 0 : JS::Rooted<JSObject*> rootedGlobal(aCx, global);
804 0 : CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
805 : }
806 :
807 : /*
808 : * The object might _still_ be null, but that's OK.
809 : *
810 : * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
811 : * traced by TraceProtoAndIfaceCache() and its contents are never
812 : * changed after they have been set.
813 : *
814 : * Calling address() avoids the read read barrier that does gray
815 : * unmarking, but it's not possible for the object to be gray here.
816 : */
817 :
818 0 : const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(prototypes::id::IDBTransaction);
819 0 : MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
820 0 : return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
821 : }
822 :
823 : JS::Handle<JSObject*>
824 15 : GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
825 : {
826 : /* Get the interface object for this class. This will create the object as
827 : needed. */
828 :
829 : /* Make sure our global is sane. Hopefully we can remove this sometime */
830 15 : JSObject* global = JS::CurrentGlobalOrNull(aCx);
831 15 : if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
832 0 : return nullptr;
833 : }
834 :
835 : /* Check to see whether the interface objects are already installed */
836 15 : ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
837 15 : if (!protoAndIfaceCache.HasEntryInSlot(constructors::id::IDBTransaction)) {
838 30 : JS::Rooted<JSObject*> rootedGlobal(aCx, global);
839 15 : CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
840 : }
841 :
842 : /*
843 : * The object might _still_ be null, but that's OK.
844 : *
845 : * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
846 : * traced by TraceProtoAndIfaceCache() and its contents are never
847 : * changed after they have been set.
848 : *
849 : * Calling address() avoids the read read barrier that does gray
850 : * unmarking, but it's not possible for the object to be gray here.
851 : */
852 :
853 15 : const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::IDBTransaction);
854 15 : MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
855 15 : return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
856 : }
857 :
858 : JSObject*
859 15 : GetConstructorObject(JSContext* aCx)
860 : {
861 15 : return GetConstructorObjectHandle(aCx);
862 : }
863 :
864 : } // namespace IDBTransactionBinding
865 :
866 :
867 :
868 : } // namespace dom
869 : } // namespace mozilla
|