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