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