Line data Source code
1 : /* THIS FILE IS AUTOGENERATED FROM Node.webidl BY Codegen.py - DO NOT EDIT */
2 :
3 : #include "AtomList.h"
4 : #include "EventTargetBinding.h"
5 : #include "NodeBinding.h"
6 : #include "WrapperFactory.h"
7 : #include "mozilla/OwningNonNull.h"
8 : #include "mozilla/Preferences.h"
9 : #include "mozilla/dom/AccessibleNode.h"
10 : #include "mozilla/dom/BindingUtils.h"
11 : #include "mozilla/dom/CustomElementRegistry.h"
12 : #include "mozilla/dom/DOMJSClass.h"
13 : #include "mozilla/dom/Element.h"
14 : #include "mozilla/dom/NonRefcountedDOMObject.h"
15 : #include "mozilla/dom/Nullable.h"
16 : #include "mozilla/dom/PrimitiveConversions.h"
17 : #include "mozilla/dom/ScriptSettings.h"
18 : #include "mozilla/dom/SimpleGlobalObject.h"
19 : #include "mozilla/dom/XrayExpandoClass.h"
20 : #include "nsContentUtils.h"
21 : #include "nsDOMMutationObserver.h"
22 : #include "nsIDocument.h"
23 : #include "nsINode.h"
24 : #include "nsINodeList.h"
25 : #include "nsIPrincipal.h"
26 : #include "nsIURI.h"
27 :
28 : namespace mozilla {
29 : namespace dom {
30 :
31 :
32 0 : GetRootNodeOptions::GetRootNodeOptions()
33 : {
34 : // Safe to pass a null context if we pass a null value
35 0 : Init(nullptr, JS::NullHandleValue);
36 0 : }
37 :
38 :
39 :
40 : bool
41 0 : GetRootNodeOptions::InitIds(JSContext* cx, GetRootNodeOptionsAtoms* atomsCache)
42 : {
43 0 : MOZ_ASSERT(!*reinterpret_cast<jsid**>(atomsCache));
44 :
45 : // Initialize these in reverse order so that any failure leaves the first one
46 : // uninitialized.
47 0 : if (!atomsCache->composed_id.init(cx, "composed")) {
48 0 : return false;
49 : }
50 0 : return true;
51 : }
52 :
53 : bool
54 0 : GetRootNodeOptions::Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription, bool passedToJSImpl)
55 : {
56 : // Passing a null JSContext is OK only if we're initing from null,
57 : // Since in that case we will not have to do any property gets
58 : // Also evaluate isNullOrUndefined in order to avoid false-positive
59 : // checkers by static analysis tools
60 0 : MOZ_ASSERT_IF(!cx, val.isNull() && val.isNullOrUndefined());
61 0 : GetRootNodeOptionsAtoms* atomsCache = nullptr;
62 0 : if (cx) {
63 0 : atomsCache = GetAtomCache<GetRootNodeOptionsAtoms>(cx);
64 0 : if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
65 0 : return false;
66 : }
67 : }
68 :
69 0 : if (!IsConvertibleToDictionary(val)) {
70 0 : return ThrowErrorMessage(cx, MSG_NOT_DICTIONARY, sourceDescription);
71 : }
72 :
73 0 : bool isNull = val.isNullOrUndefined();
74 : // We only need these if !isNull, in which case we have |cx|.
75 0 : Maybe<JS::Rooted<JSObject *> > object;
76 0 : Maybe<JS::Rooted<JS::Value> > temp;
77 0 : if (!isNull) {
78 0 : MOZ_ASSERT(cx);
79 0 : object.emplace(cx, &val.toObject());
80 0 : temp.emplace(cx);
81 : }
82 0 : if (!isNull) {
83 0 : if (!JS_GetPropertyById(cx, *object, atomsCache->composed_id, temp.ptr())) {
84 0 : return false;
85 : }
86 : }
87 0 : if (!isNull && !temp->isUndefined()) {
88 0 : if (!ValueToPrimitive<bool, eDefault>(cx, temp.ref(), &mComposed)) {
89 0 : return false;
90 : }
91 : } else {
92 0 : mComposed = false;
93 : }
94 0 : mIsAnyMemberPresent = true;
95 0 : return true;
96 : }
97 :
98 : bool
99 0 : GetRootNodeOptions::Init(const nsAString& aJSON)
100 : {
101 0 : AutoJSAPI jsapi;
102 0 : JSObject* cleanGlobal = SimpleGlobalObject::Create(SimpleGlobalObject::GlobalType::BindingDetail);
103 0 : if (!cleanGlobal) {
104 0 : return false;
105 : }
106 0 : if (!jsapi.Init(cleanGlobal)) {
107 0 : return false;
108 : }
109 0 : JSContext* cx = jsapi.cx();
110 0 : JS::Rooted<JS::Value> json(cx);
111 0 : bool ok = ParseJSON(cx, aJSON, &json);
112 0 : NS_ENSURE_TRUE(ok, false);
113 0 : return Init(cx, json);
114 : }
115 :
116 : bool
117 0 : GetRootNodeOptions::ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const
118 : {
119 0 : GetRootNodeOptionsAtoms* atomsCache = GetAtomCache<GetRootNodeOptionsAtoms>(cx);
120 0 : if (!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) {
121 0 : return false;
122 : }
123 :
124 0 : JS::Rooted<JSObject*> obj(cx, JS_NewPlainObject(cx));
125 0 : if (!obj) {
126 0 : return false;
127 : }
128 0 : rval.set(JS::ObjectValue(*obj));
129 :
130 : do {
131 : // block for our 'break' successCode and scope for 'temp' and 'currentValue'
132 0 : JS::Rooted<JS::Value> temp(cx);
133 0 : bool const & currentValue = mComposed;
134 0 : temp.setBoolean(currentValue);
135 0 : if (!JS_DefinePropertyById(cx, obj, atomsCache->composed_id, temp, JSPROP_ENUMERATE)) {
136 0 : return false;
137 : }
138 0 : break;
139 : } while(0);
140 :
141 0 : return true;
142 : }
143 :
144 : bool
145 0 : GetRootNodeOptions::ToJSON(nsAString& aJSON) const
146 : {
147 0 : AutoJSAPI jsapi;
148 0 : jsapi.Init();
149 0 : JSContext *cx = jsapi.cx();
150 : // It's safe to use UnprivilegedJunkScopeOrWorkerGlobal here
151 : // because we'll only be creating objects, in ways that have no
152 : // side-effects, followed by a call to JS::ToJSONMaybeSafely,
153 : // which likewise guarantees no side-effects for the sorts of
154 : // things we will pass it.
155 0 : JSAutoCompartment ac(cx, binding_detail::UnprivilegedJunkScopeOrWorkerGlobal());
156 0 : JS::Rooted<JS::Value> val(cx);
157 0 : if (!ToObjectInternal(cx, &val)) {
158 0 : return false;
159 : }
160 0 : JS::Rooted<JSObject*> obj(cx, &val.toObject());
161 0 : return StringifyToJSON(cx, obj, aJSON);
162 : }
163 :
164 : void
165 0 : GetRootNodeOptions::TraceDictionary(JSTracer* trc)
166 : {
167 0 : }
168 :
169 : GetRootNodeOptions&
170 0 : GetRootNodeOptions::operator=(const GetRootNodeOptions& aOther)
171 : {
172 0 : mComposed = aOther.mComposed;
173 0 : return *this;
174 : }
175 :
176 : namespace binding_detail {
177 : } // namespace binding_detail
178 :
179 :
180 : namespace NodeBinding {
181 :
182 : static_assert(IsRefcounted<NativeType>::value == IsRefcounted<EventTargetBinding::NativeType>::value,
183 : "Can't inherit from an interface with a different ownership model.");
184 :
185 : static bool
186 0 : get_nodeType(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
187 : {
188 0 : uint16_t result(self->NodeType());
189 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
190 0 : args.rval().setInt32(int32_t(result));
191 0 : return true;
192 : }
193 :
194 : static const JSJitInfo nodeType_getterinfo = {
195 : { (JSJitGetterOp)get_nodeType },
196 : { prototypes::id::Node },
197 : { PrototypeTraits<prototypes::id::Node>::Depth },
198 : JSJitInfo::Getter,
199 : JSJitInfo::AliasNone, /* aliasSet. Not relevant for setters. */
200 : JSVAL_TYPE_INT32, /* returnType. Not relevant for setters. */
201 : true, /* isInfallible. False in setters. */
202 : true, /* isMovable. Not relevant for setters. */
203 : true, /* isEliminatable. Not relevant for setters. */
204 : false, /* isAlwaysInSlot. Only relevant for getters. */
205 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
206 : false, /* isTypedMethod. Only relevant for methods. */
207 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
208 : };
209 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
210 : static_assert(0 < 1, "There is no slot for us");
211 :
212 : static bool
213 0 : get_nodeName(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
214 : {
215 0 : DOMString result;
216 0 : self->GetNodeName(result);
217 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
218 0 : if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
219 0 : return false;
220 : }
221 0 : return true;
222 : }
223 :
224 : static const JSJitInfo nodeName_getterinfo = {
225 : { (JSJitGetterOp)get_nodeName },
226 : { prototypes::id::Node },
227 : { PrototypeTraits<prototypes::id::Node>::Depth },
228 : JSJitInfo::Getter,
229 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
230 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
231 : false, /* isInfallible. False in setters. */
232 : true, /* isMovable. Not relevant for setters. */
233 : true, /* isEliminatable. Not relevant for setters. */
234 : false, /* isAlwaysInSlot. Only relevant for getters. */
235 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
236 : false, /* isTypedMethod. Only relevant for methods. */
237 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
238 : };
239 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
240 : static_assert(0 < 1, "There is no slot for us");
241 :
242 : static bool
243 0 : get_baseURI(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
244 : {
245 0 : binding_detail::FastErrorResult rv;
246 0 : DOMString result;
247 0 : self->GetBaseURIFromJS(result, nsContentUtils::IsSystemCaller(cx) ? CallerType::System : CallerType::NonSystem, rv);
248 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
249 0 : return false;
250 : }
251 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
252 0 : if (!xpc::StringToJsval(cx, result, args.rval())) {
253 0 : return false;
254 : }
255 0 : return true;
256 : }
257 :
258 : static const JSJitInfo baseURI_getterinfo = {
259 : { (JSJitGetterOp)get_baseURI },
260 : { prototypes::id::Node },
261 : { PrototypeTraits<prototypes::id::Node>::Depth },
262 : JSJitInfo::Getter,
263 : JSJitInfo::AliasDOMSets, /* 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 :
276 : static bool
277 0 : get_isConnected(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
278 : {
279 0 : bool result(self->GetComposedDoc());
280 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
281 0 : args.rval().setBoolean(result);
282 0 : return true;
283 : }
284 :
285 : static const JSJitInfo isConnected_getterinfo = {
286 : { (JSJitGetterOp)get_isConnected },
287 : { prototypes::id::Node },
288 : { PrototypeTraits<prototypes::id::Node>::Depth },
289 : JSJitInfo::Getter,
290 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
291 : JSVAL_TYPE_BOOLEAN, /* returnType. Not relevant for setters. */
292 : true, /* isInfallible. False in setters. */
293 : true, /* isMovable. Not relevant for setters. */
294 : true, /* isEliminatable. Not relevant for setters. */
295 : false, /* isAlwaysInSlot. Only relevant for getters. */
296 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
297 : false, /* isTypedMethod. Only relevant for methods. */
298 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
299 : };
300 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
301 : static_assert(0 < 1, "There is no slot for us");
302 :
303 : static bool
304 14 : get_ownerDocument(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
305 : {
306 14 : auto result(StrongOrRawPtr<nsIDocument>(self->GetOwnerDocument()));
307 14 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
308 14 : if (!result) {
309 0 : args.rval().setNull();
310 0 : return true;
311 : }
312 14 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
313 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
314 0 : return false;
315 : }
316 14 : return true;
317 : }
318 :
319 : static const JSJitInfo ownerDocument_getterinfo = {
320 : { (JSJitGetterOp)get_ownerDocument },
321 : { prototypes::id::Node },
322 : { PrototypeTraits<prototypes::id::Node>::Depth },
323 : JSJitInfo::Getter,
324 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
325 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
326 : false, /* isInfallible. False in setters. */
327 : true, /* isMovable. Not relevant for setters. */
328 : true, /* isEliminatable. Not relevant for setters. */
329 : false, /* isAlwaysInSlot. Only relevant for getters. */
330 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
331 : false, /* isTypedMethod. Only relevant for methods. */
332 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
333 : };
334 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
335 : static_assert(0 < 1, "There is no slot for us");
336 :
337 : static bool
338 0 : getRootNode(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
339 : {
340 0 : binding_detail::FastGetRootNodeOptions arg0;
341 0 : if (!arg0.Init(cx, (args.hasDefined(0)) ? args[0] : JS::NullHandleValue, "Argument 1 of Node.getRootNode", false)) {
342 0 : return false;
343 : }
344 0 : auto result(StrongOrRawPtr<nsINode>(self->GetRootNode(Constify(arg0))));
345 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
346 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
347 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
348 0 : return false;
349 : }
350 0 : return true;
351 : }
352 :
353 : static const JSJitInfo::ArgType getRootNode_methodinfo_argTypes[] = { JSJitInfo::Object, JSJitInfo::ArgTypeListEnd };
354 : static const JSTypedMethodJitInfo getRootNode_methodinfo = {
355 : {
356 : { (JSJitGetterOp)getRootNode },
357 : { prototypes::id::Node },
358 : { PrototypeTraits<prototypes::id::Node>::Depth },
359 : JSJitInfo::Method,
360 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
361 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
362 : false, /* isInfallible. False in setters. */
363 : true, /* isMovable. Not relevant for setters. */
364 : true, /* isEliminatable. Not relevant for setters. */
365 : false, /* isAlwaysInSlot. Only relevant for getters. */
366 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
367 : true, /* isTypedMethod. Only relevant for methods. */
368 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
369 : },
370 : getRootNode_methodinfo_argTypes
371 : };
372 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
373 : static_assert(0 < 1, "There is no slot for us");
374 :
375 : static bool
376 70 : get_parentNode(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
377 : {
378 70 : auto result(StrongOrRawPtr<nsINode>(self->GetParentNode()));
379 70 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
380 70 : if (!result) {
381 0 : args.rval().setNull();
382 0 : return true;
383 : }
384 70 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
385 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
386 0 : return false;
387 : }
388 70 : return true;
389 : }
390 :
391 : static const JSJitInfo parentNode_getterinfo = {
392 : { (JSJitGetterOp)get_parentNode },
393 : { prototypes::id::Node },
394 : { PrototypeTraits<prototypes::id::Node>::Depth },
395 : JSJitInfo::Getter,
396 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
397 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
398 : false, /* isInfallible. False in setters. */
399 : true, /* isMovable. Not relevant for setters. */
400 : true, /* isEliminatable. Not relevant for setters. */
401 : false, /* isAlwaysInSlot. Only relevant for getters. */
402 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
403 : false, /* isTypedMethod. Only relevant for methods. */
404 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
405 : };
406 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
407 : static_assert(0 < 1, "There is no slot for us");
408 :
409 : static bool
410 0 : get_parentElement(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
411 : {
412 0 : auto result(StrongOrRawPtr<mozilla::dom::Element>(self->GetParentElement()));
413 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
414 0 : if (!result) {
415 0 : args.rval().setNull();
416 0 : return true;
417 : }
418 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
419 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
420 0 : return false;
421 : }
422 0 : return true;
423 : }
424 :
425 : static const JSJitInfo parentElement_getterinfo = {
426 : { (JSJitGetterOp)get_parentElement },
427 : { prototypes::id::Node },
428 : { PrototypeTraits<prototypes::id::Node>::Depth },
429 : JSJitInfo::Getter,
430 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
431 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
432 : false, /* isInfallible. False in setters. */
433 : true, /* isMovable. Not relevant for setters. */
434 : true, /* isEliminatable. Not relevant for setters. */
435 : false, /* isAlwaysInSlot. Only relevant for getters. */
436 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
437 : false, /* isTypedMethod. Only relevant for methods. */
438 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
439 : };
440 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
441 : static_assert(0 < 1, "There is no slot for us");
442 :
443 : static bool
444 2 : hasChildNodes(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
445 : {
446 2 : bool result(self->HasChildNodes());
447 2 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
448 2 : args.rval().setBoolean(result);
449 2 : return true;
450 : }
451 :
452 : static const JSJitInfo::ArgType hasChildNodes_methodinfo_argTypes[] = { JSJitInfo::ArgTypeListEnd };
453 : static const JSTypedMethodJitInfo hasChildNodes_methodinfo = {
454 : {
455 : { (JSJitGetterOp)hasChildNodes },
456 : { prototypes::id::Node },
457 : { PrototypeTraits<prototypes::id::Node>::Depth },
458 : JSJitInfo::Method,
459 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
460 : JSVAL_TYPE_BOOLEAN, /* returnType. Not relevant for setters. */
461 : true, /* isInfallible. False in setters. */
462 : true, /* isMovable. Not relevant for setters. */
463 : true, /* isEliminatable. Not relevant for setters. */
464 : false, /* isAlwaysInSlot. Only relevant for getters. */
465 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
466 : true, /* isTypedMethod. Only relevant for methods. */
467 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
468 : },
469 : hasChildNodes_methodinfo_argTypes
470 : };
471 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
472 : static_assert(0 < 1, "There is no slot for us");
473 :
474 : static bool
475 24 : get_childNodes(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
476 : {
477 24 : auto result(StrongOrRawPtr<nsINodeList>(self->ChildNodes()));
478 24 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
479 24 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
480 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
481 0 : return false;
482 : }
483 24 : return true;
484 : }
485 :
486 : static const JSJitInfo childNodes_getterinfo = {
487 : { (JSJitGetterOp)get_childNodes },
488 : { prototypes::id::Node },
489 : { PrototypeTraits<prototypes::id::Node>::Depth },
490 : JSJitInfo::Getter,
491 : JSJitInfo::AliasNone, /* aliasSet. Not relevant for setters. */
492 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
493 : false, /* isInfallible. False in setters. */
494 : true, /* isMovable. Not relevant for setters. */
495 : true, /* isEliminatable. Not relevant for setters. */
496 : false, /* isAlwaysInSlot. Only relevant for getters. */
497 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
498 : false, /* isTypedMethod. Only relevant for methods. */
499 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
500 : };
501 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
502 : static_assert(0 < 1, "There is no slot for us");
503 :
504 : static bool
505 21 : get_firstChild(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
506 : {
507 21 : auto result(StrongOrRawPtr<nsINode>(self->GetFirstChild()));
508 21 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
509 21 : if (!result) {
510 5 : args.rval().setNull();
511 5 : return true;
512 : }
513 16 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
514 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
515 0 : return false;
516 : }
517 16 : return true;
518 : }
519 :
520 : static const JSJitInfo firstChild_getterinfo = {
521 : { (JSJitGetterOp)get_firstChild },
522 : { prototypes::id::Node },
523 : { PrototypeTraits<prototypes::id::Node>::Depth },
524 : JSJitInfo::Getter,
525 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
526 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
527 : false, /* isInfallible. False in setters. */
528 : true, /* isMovable. Not relevant for setters. */
529 : true, /* isEliminatable. Not relevant for setters. */
530 : false, /* isAlwaysInSlot. Only relevant for getters. */
531 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
532 : false, /* isTypedMethod. Only relevant for methods. */
533 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
534 : };
535 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
536 : static_assert(0 < 1, "There is no slot for us");
537 :
538 : static bool
539 2 : get_lastChild(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
540 : {
541 2 : auto result(StrongOrRawPtr<nsINode>(self->GetLastChild()));
542 2 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
543 2 : if (!result) {
544 0 : args.rval().setNull();
545 0 : return true;
546 : }
547 2 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
548 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
549 0 : return false;
550 : }
551 2 : return true;
552 : }
553 :
554 : static const JSJitInfo lastChild_getterinfo = {
555 : { (JSJitGetterOp)get_lastChild },
556 : { prototypes::id::Node },
557 : { PrototypeTraits<prototypes::id::Node>::Depth },
558 : JSJitInfo::Getter,
559 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
560 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
561 : false, /* isInfallible. False in setters. */
562 : true, /* isMovable. Not relevant for setters. */
563 : true, /* isEliminatable. Not relevant for setters. */
564 : false, /* isAlwaysInSlot. Only relevant for getters. */
565 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
566 : false, /* isTypedMethod. Only relevant for methods. */
567 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
568 : };
569 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
570 : static_assert(0 < 1, "There is no slot for us");
571 :
572 : static bool
573 4 : get_previousSibling(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
574 : {
575 4 : auto result(StrongOrRawPtr<nsINode>(self->GetPreviousSibling()));
576 4 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
577 4 : if (!result) {
578 2 : args.rval().setNull();
579 2 : return true;
580 : }
581 2 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
582 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
583 0 : return false;
584 : }
585 2 : return true;
586 : }
587 :
588 : static const JSJitInfo previousSibling_getterinfo = {
589 : { (JSJitGetterOp)get_previousSibling },
590 : { prototypes::id::Node },
591 : { PrototypeTraits<prototypes::id::Node>::Depth },
592 : JSJitInfo::Getter,
593 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
594 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
595 : false, /* isInfallible. False in setters. */
596 : true, /* isMovable. Not relevant for setters. */
597 : true, /* isEliminatable. Not relevant for setters. */
598 : false, /* isAlwaysInSlot. Only relevant for getters. */
599 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
600 : false, /* isTypedMethod. Only relevant for methods. */
601 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
602 : };
603 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
604 : static_assert(0 < 1, "There is no slot for us");
605 :
606 : static bool
607 32 : get_nextSibling(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
608 : {
609 32 : auto result(StrongOrRawPtr<nsINode>(self->GetNextSibling()));
610 32 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
611 32 : if (!result) {
612 7 : args.rval().setNull();
613 7 : return true;
614 : }
615 25 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
616 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
617 0 : return false;
618 : }
619 25 : return true;
620 : }
621 :
622 : static const JSJitInfo nextSibling_getterinfo = {
623 : { (JSJitGetterOp)get_nextSibling },
624 : { prototypes::id::Node },
625 : { PrototypeTraits<prototypes::id::Node>::Depth },
626 : JSJitInfo::Getter,
627 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
628 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
629 : false, /* isInfallible. False in setters. */
630 : true, /* isMovable. Not relevant for setters. */
631 : true, /* isEliminatable. Not relevant for setters. */
632 : false, /* isAlwaysInSlot. Only relevant for getters. */
633 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
634 : false, /* isTypedMethod. Only relevant for methods. */
635 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
636 : };
637 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
638 : static_assert(0 < 1, "There is no slot for us");
639 :
640 : static bool
641 0 : get_nodeValue(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
642 : {
643 0 : DOMString result;
644 0 : self->GetNodeValue(result);
645 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
646 0 : if (!xpc::StringToJsval(cx, result, args.rval())) {
647 0 : return false;
648 : }
649 0 : return true;
650 : }
651 :
652 : static bool
653 0 : set_nodeValue(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitSetterCallArgs args)
654 : {
655 0 : binding_detail::FakeString arg0;
656 0 : if (!ConvertJSValueToString(cx, args[0], eNull, eNull, arg0)) {
657 0 : return false;
658 : }
659 0 : CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
660 0 : Maybe<AutoCEReaction> ceReaction;
661 0 : if (reactionsStack) {
662 0 : ceReaction.emplace(reactionsStack);
663 : }
664 0 : binding_detail::FastErrorResult rv;
665 0 : self->SetNodeValue(NonNullHelper(Constify(arg0)), rv);
666 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
667 0 : return false;
668 : }
669 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
670 :
671 0 : return true;
672 : }
673 :
674 : static const JSJitInfo nodeValue_getterinfo = {
675 : { (JSJitGetterOp)get_nodeValue },
676 : { prototypes::id::Node },
677 : { PrototypeTraits<prototypes::id::Node>::Depth },
678 : JSJitInfo::Getter,
679 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
680 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
681 : false, /* isInfallible. False in setters. */
682 : true, /* isMovable. Not relevant for setters. */
683 : true, /* isEliminatable. Not relevant for setters. */
684 : false, /* isAlwaysInSlot. Only relevant for getters. */
685 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
686 : false, /* isTypedMethod. Only relevant for methods. */
687 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
688 : };
689 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
690 : static_assert(0 < 1, "There is no slot for us");
691 : static const JSJitInfo nodeValue_setterinfo = {
692 : { (JSJitGetterOp)set_nodeValue },
693 : { prototypes::id::Node },
694 : { PrototypeTraits<prototypes::id::Node>::Depth },
695 : JSJitInfo::Setter,
696 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
697 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
698 : false, /* isInfallible. False in setters. */
699 : false, /* isMovable. Not relevant for setters. */
700 : false, /* isEliminatable. Not relevant for setters. */
701 : false, /* isAlwaysInSlot. Only relevant for getters. */
702 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
703 : false, /* isTypedMethod. Only relevant for methods. */
704 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
705 : };
706 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
707 : static_assert(0 < 1, "There is no slot for us");
708 :
709 : static bool
710 4 : get_textContent(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
711 : {
712 8 : binding_danger::OOMReporterInstantiator rv;
713 8 : DOMString result;
714 4 : self->GetTextContent(result, rv);
715 4 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
716 0 : return false;
717 : }
718 4 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
719 4 : if (!xpc::StringToJsval(cx, result, args.rval())) {
720 0 : return false;
721 : }
722 4 : return true;
723 : }
724 :
725 : static bool
726 2 : set_textContent(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitSetterCallArgs args)
727 : {
728 4 : binding_detail::FakeString arg0;
729 2 : if (!ConvertJSValueToString(cx, args[0], eNull, eNull, arg0)) {
730 0 : return false;
731 : }
732 2 : CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
733 4 : Maybe<AutoCEReaction> ceReaction;
734 2 : if (reactionsStack) {
735 2 : ceReaction.emplace(reactionsStack);
736 : }
737 4 : binding_detail::FastErrorResult rv;
738 2 : self->SetTextContent(NonNullHelper(Constify(arg0)), rv);
739 2 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
740 0 : return false;
741 : }
742 2 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
743 :
744 2 : return true;
745 : }
746 :
747 : static const JSJitInfo textContent_getterinfo = {
748 : { (JSJitGetterOp)get_textContent },
749 : { prototypes::id::Node },
750 : { PrototypeTraits<prototypes::id::Node>::Depth },
751 : JSJitInfo::Getter,
752 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
753 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
754 : false, /* isInfallible. False in setters. */
755 : true, /* isMovable. Not relevant for setters. */
756 : true, /* isEliminatable. Not relevant for setters. */
757 : false, /* isAlwaysInSlot. Only relevant for getters. */
758 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
759 : false, /* isTypedMethod. Only relevant for methods. */
760 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
761 : };
762 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
763 : static_assert(0 < 1, "There is no slot for us");
764 : static const JSJitInfo textContent_setterinfo = {
765 : { (JSJitGetterOp)set_textContent },
766 : { prototypes::id::Node },
767 : { PrototypeTraits<prototypes::id::Node>::Depth },
768 : JSJitInfo::Setter,
769 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
770 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
771 : false, /* isInfallible. False in setters. */
772 : false, /* isMovable. Not relevant for setters. */
773 : false, /* isEliminatable. Not relevant for setters. */
774 : false, /* isAlwaysInSlot. Only relevant for getters. */
775 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
776 : false, /* isTypedMethod. Only relevant for methods. */
777 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
778 : };
779 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
780 : static_assert(0 < 1, "There is no slot for us");
781 :
782 : static bool
783 16 : insertBefore(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
784 : {
785 16 : if (MOZ_UNLIKELY(args.length() < 2)) {
786 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "Node.insertBefore");
787 : }
788 16 : NonNull<nsINode> arg0;
789 16 : if (args[0].isObject()) {
790 : {
791 16 : nsresult rv = UnwrapObject<prototypes::id::Node, nsINode>(args[0], arg0);
792 16 : if (NS_FAILED(rv)) {
793 0 : ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of Node.insertBefore", "Node");
794 0 : return false;
795 : }
796 : }
797 : } else {
798 0 : ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of Node.insertBefore");
799 0 : return false;
800 : }
801 : nsINode* arg1;
802 16 : if (args[1].isObject()) {
803 : {
804 13 : nsresult rv = UnwrapObject<prototypes::id::Node, nsINode>(args[1], arg1);
805 13 : if (NS_FAILED(rv)) {
806 0 : ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of Node.insertBefore", "Node");
807 0 : return false;
808 : }
809 : }
810 3 : } else if (args[1].isNullOrUndefined()) {
811 3 : arg1 = nullptr;
812 : } else {
813 0 : ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of Node.insertBefore");
814 0 : return false;
815 : }
816 16 : CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
817 32 : Maybe<AutoCEReaction> ceReaction;
818 16 : if (reactionsStack) {
819 16 : ceReaction.emplace(reactionsStack);
820 : }
821 32 : binding_detail::FastErrorResult rv;
822 16 : auto result(StrongOrRawPtr<nsINode>(self->InsertBefore(NonNullHelper(arg0), Constify(arg1), rv)));
823 16 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
824 0 : return false;
825 : }
826 16 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
827 16 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
828 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
829 0 : return false;
830 : }
831 16 : return true;
832 : }
833 :
834 : static const JSJitInfo insertBefore_methodinfo = {
835 : { (JSJitGetterOp)insertBefore },
836 : { prototypes::id::Node },
837 : { PrototypeTraits<prototypes::id::Node>::Depth },
838 : JSJitInfo::Method,
839 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
840 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
841 : false, /* isInfallible. False in setters. */
842 : false, /* isMovable. Not relevant for setters. */
843 : false, /* isEliminatable. Not relevant for setters. */
844 : false, /* isAlwaysInSlot. Only relevant for getters. */
845 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
846 : false, /* isTypedMethod. Only relevant for methods. */
847 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
848 : };
849 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
850 : static_assert(0 < 1, "There is no slot for us");
851 :
852 : static bool
853 50 : appendChild(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
854 : {
855 50 : if (MOZ_UNLIKELY(args.length() < 1)) {
856 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "Node.appendChild");
857 : }
858 50 : NonNull<nsINode> arg0;
859 50 : if (args[0].isObject()) {
860 : {
861 50 : nsresult rv = UnwrapObject<prototypes::id::Node, nsINode>(args[0], arg0);
862 50 : if (NS_FAILED(rv)) {
863 0 : ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of Node.appendChild", "Node");
864 0 : return false;
865 : }
866 : }
867 : } else {
868 0 : ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of Node.appendChild");
869 0 : return false;
870 : }
871 50 : CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
872 100 : Maybe<AutoCEReaction> ceReaction;
873 50 : if (reactionsStack) {
874 50 : ceReaction.emplace(reactionsStack);
875 : }
876 100 : binding_detail::FastErrorResult rv;
877 50 : auto result(StrongOrRawPtr<nsINode>(self->AppendChild(NonNullHelper(arg0), rv)));
878 50 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
879 0 : return false;
880 : }
881 50 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
882 50 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
883 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
884 0 : return false;
885 : }
886 50 : return true;
887 : }
888 :
889 : static const JSJitInfo appendChild_methodinfo = {
890 : { (JSJitGetterOp)appendChild },
891 : { prototypes::id::Node },
892 : { PrototypeTraits<prototypes::id::Node>::Depth },
893 : JSJitInfo::Method,
894 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
895 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
896 : false, /* isInfallible. False in setters. */
897 : false, /* isMovable. Not relevant for setters. */
898 : false, /* isEliminatable. Not relevant for setters. */
899 : false, /* isAlwaysInSlot. Only relevant for getters. */
900 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
901 : false, /* isTypedMethod. Only relevant for methods. */
902 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
903 : };
904 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
905 : static_assert(0 < 1, "There is no slot for us");
906 :
907 : static bool
908 0 : replaceChild(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
909 : {
910 0 : if (MOZ_UNLIKELY(args.length() < 2)) {
911 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "Node.replaceChild");
912 : }
913 0 : NonNull<nsINode> arg0;
914 0 : if (args[0].isObject()) {
915 : {
916 0 : nsresult rv = UnwrapObject<prototypes::id::Node, nsINode>(args[0], arg0);
917 0 : if (NS_FAILED(rv)) {
918 0 : ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of Node.replaceChild", "Node");
919 0 : return false;
920 : }
921 : }
922 : } else {
923 0 : ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of Node.replaceChild");
924 0 : return false;
925 : }
926 0 : NonNull<nsINode> arg1;
927 0 : if (args[1].isObject()) {
928 : {
929 0 : nsresult rv = UnwrapObject<prototypes::id::Node, nsINode>(args[1], arg1);
930 0 : if (NS_FAILED(rv)) {
931 0 : ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of Node.replaceChild", "Node");
932 0 : return false;
933 : }
934 : }
935 : } else {
936 0 : ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of Node.replaceChild");
937 0 : return false;
938 : }
939 0 : CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
940 0 : Maybe<AutoCEReaction> ceReaction;
941 0 : if (reactionsStack) {
942 0 : ceReaction.emplace(reactionsStack);
943 : }
944 0 : binding_detail::FastErrorResult rv;
945 0 : auto result(StrongOrRawPtr<nsINode>(self->ReplaceChild(NonNullHelper(arg0), NonNullHelper(arg1), rv)));
946 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
947 0 : return false;
948 : }
949 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
950 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
951 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
952 0 : return false;
953 : }
954 0 : return true;
955 : }
956 :
957 : static const JSJitInfo replaceChild_methodinfo = {
958 : { (JSJitGetterOp)replaceChild },
959 : { prototypes::id::Node },
960 : { PrototypeTraits<prototypes::id::Node>::Depth },
961 : JSJitInfo::Method,
962 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
963 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
964 : false, /* isInfallible. False in setters. */
965 : false, /* isMovable. Not relevant for setters. */
966 : false, /* isEliminatable. Not relevant for setters. */
967 : false, /* isAlwaysInSlot. Only relevant for getters. */
968 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
969 : false, /* isTypedMethod. Only relevant for methods. */
970 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
971 : };
972 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
973 : static_assert(0 < 1, "There is no slot for us");
974 :
975 : static bool
976 2 : removeChild(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
977 : {
978 2 : if (MOZ_UNLIKELY(args.length() < 1)) {
979 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "Node.removeChild");
980 : }
981 2 : NonNull<nsINode> arg0;
982 2 : if (args[0].isObject()) {
983 : {
984 2 : nsresult rv = UnwrapObject<prototypes::id::Node, nsINode>(args[0], arg0);
985 2 : if (NS_FAILED(rv)) {
986 0 : ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of Node.removeChild", "Node");
987 0 : return false;
988 : }
989 : }
990 : } else {
991 0 : ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of Node.removeChild");
992 0 : return false;
993 : }
994 2 : CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
995 4 : Maybe<AutoCEReaction> ceReaction;
996 2 : if (reactionsStack) {
997 2 : ceReaction.emplace(reactionsStack);
998 : }
999 4 : binding_detail::FastErrorResult rv;
1000 2 : auto result(StrongOrRawPtr<nsINode>(self->RemoveChild(NonNullHelper(arg0), rv)));
1001 2 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
1002 0 : return false;
1003 : }
1004 2 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1005 2 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
1006 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
1007 0 : return false;
1008 : }
1009 2 : return true;
1010 : }
1011 :
1012 : static const JSJitInfo removeChild_methodinfo = {
1013 : { (JSJitGetterOp)removeChild },
1014 : { prototypes::id::Node },
1015 : { PrototypeTraits<prototypes::id::Node>::Depth },
1016 : JSJitInfo::Method,
1017 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
1018 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
1019 : false, /* isInfallible. False in setters. */
1020 : false, /* isMovable. Not relevant for setters. */
1021 : false, /* isEliminatable. Not relevant for setters. */
1022 : false, /* isAlwaysInSlot. Only relevant for getters. */
1023 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1024 : false, /* isTypedMethod. Only relevant for methods. */
1025 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1026 : };
1027 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1028 : static_assert(0 < 1, "There is no slot for us");
1029 :
1030 : static bool
1031 0 : normalize(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
1032 : {
1033 0 : CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
1034 0 : Maybe<AutoCEReaction> ceReaction;
1035 0 : if (reactionsStack) {
1036 0 : ceReaction.emplace(reactionsStack);
1037 : }
1038 0 : self->Normalize();
1039 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1040 0 : args.rval().setUndefined();
1041 0 : return true;
1042 : }
1043 :
1044 : static const JSJitInfo normalize_methodinfo = {
1045 : { (JSJitGetterOp)normalize },
1046 : { prototypes::id::Node },
1047 : { PrototypeTraits<prototypes::id::Node>::Depth },
1048 : JSJitInfo::Method,
1049 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
1050 : JSVAL_TYPE_UNDEFINED, /* returnType. Not relevant for setters. */
1051 : true, /* isInfallible. False in setters. */
1052 : false, /* isMovable. Not relevant for setters. */
1053 : false, /* isEliminatable. Not relevant for setters. */
1054 : false, /* isAlwaysInSlot. Only relevant for getters. */
1055 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1056 : false, /* isTypedMethod. Only relevant for methods. */
1057 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1058 : };
1059 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1060 : static_assert(0 < 1, "There is no slot for us");
1061 :
1062 : static bool
1063 2 : cloneNode(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
1064 : {
1065 : bool arg0;
1066 2 : if (args.hasDefined(0)) {
1067 2 : if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
1068 0 : return false;
1069 : }
1070 : } else {
1071 0 : arg0 = false;
1072 : }
1073 2 : CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(obj);
1074 4 : Maybe<AutoCEReaction> ceReaction;
1075 2 : if (reactionsStack) {
1076 2 : ceReaction.emplace(reactionsStack);
1077 : }
1078 4 : binding_detail::FastErrorResult rv;
1079 4 : auto result(StrongOrRawPtr<nsINode>(self->CloneNode(arg0, rv)));
1080 2 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
1081 0 : return false;
1082 : }
1083 2 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1084 2 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
1085 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
1086 0 : return false;
1087 : }
1088 2 : return true;
1089 : }
1090 :
1091 : static const JSJitInfo cloneNode_methodinfo = {
1092 : { (JSJitGetterOp)cloneNode },
1093 : { prototypes::id::Node },
1094 : { PrototypeTraits<prototypes::id::Node>::Depth },
1095 : JSJitInfo::Method,
1096 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
1097 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
1098 : false, /* isInfallible. False in setters. */
1099 : false, /* isMovable. Not relevant for setters. */
1100 : false, /* isEliminatable. Not relevant for setters. */
1101 : false, /* isAlwaysInSlot. Only relevant for getters. */
1102 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1103 : false, /* isTypedMethod. Only relevant for methods. */
1104 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1105 : };
1106 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1107 : static_assert(0 < 1, "There is no slot for us");
1108 :
1109 : static bool
1110 0 : isSameNode(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
1111 : {
1112 0 : if (MOZ_UNLIKELY(args.length() < 1)) {
1113 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "Node.isSameNode");
1114 : }
1115 : nsINode* arg0;
1116 0 : if (args[0].isObject()) {
1117 : {
1118 0 : nsresult rv = UnwrapObject<prototypes::id::Node, nsINode>(args[0], arg0);
1119 0 : if (NS_FAILED(rv)) {
1120 0 : ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of Node.isSameNode", "Node");
1121 0 : return false;
1122 : }
1123 : }
1124 0 : } else if (args[0].isNullOrUndefined()) {
1125 0 : arg0 = nullptr;
1126 : } else {
1127 0 : ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of Node.isSameNode");
1128 0 : return false;
1129 : }
1130 0 : bool result(self->IsSameNode(Constify(arg0)));
1131 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1132 0 : args.rval().setBoolean(result);
1133 0 : return true;
1134 : }
1135 :
1136 : static const JSJitInfo::ArgType isSameNode_methodinfo_argTypes[] = { JSJitInfo::ArgType(JSJitInfo::Null | JSJitInfo::Object), JSJitInfo::ArgTypeListEnd };
1137 : static const JSTypedMethodJitInfo isSameNode_methodinfo = {
1138 : {
1139 : { (JSJitGetterOp)isSameNode },
1140 : { prototypes::id::Node },
1141 : { PrototypeTraits<prototypes::id::Node>::Depth },
1142 : JSJitInfo::Method,
1143 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
1144 : JSVAL_TYPE_BOOLEAN, /* returnType. Not relevant for setters. */
1145 : false, /* isInfallible. False in setters. */
1146 : true, /* isMovable. Not relevant for setters. */
1147 : true, /* isEliminatable. Not relevant for setters. */
1148 : false, /* isAlwaysInSlot. Only relevant for getters. */
1149 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1150 : true, /* isTypedMethod. Only relevant for methods. */
1151 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1152 : },
1153 : isSameNode_methodinfo_argTypes
1154 : };
1155 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1156 : static_assert(0 < 1, "There is no slot for us");
1157 :
1158 : static bool
1159 0 : isEqualNode(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
1160 : {
1161 0 : if (MOZ_UNLIKELY(args.length() < 1)) {
1162 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "Node.isEqualNode");
1163 : }
1164 : nsINode* arg0;
1165 0 : if (args[0].isObject()) {
1166 : {
1167 0 : nsresult rv = UnwrapObject<prototypes::id::Node, nsINode>(args[0], arg0);
1168 0 : if (NS_FAILED(rv)) {
1169 0 : ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of Node.isEqualNode", "Node");
1170 0 : return false;
1171 : }
1172 : }
1173 0 : } else if (args[0].isNullOrUndefined()) {
1174 0 : arg0 = nullptr;
1175 : } else {
1176 0 : ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of Node.isEqualNode");
1177 0 : return false;
1178 : }
1179 0 : bool result(self->IsEqualNode(Constify(arg0)));
1180 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1181 0 : args.rval().setBoolean(result);
1182 0 : return true;
1183 : }
1184 :
1185 : static const JSJitInfo::ArgType isEqualNode_methodinfo_argTypes[] = { JSJitInfo::ArgType(JSJitInfo::Null | JSJitInfo::Object), JSJitInfo::ArgTypeListEnd };
1186 : static const JSTypedMethodJitInfo isEqualNode_methodinfo = {
1187 : {
1188 : { (JSJitGetterOp)isEqualNode },
1189 : { prototypes::id::Node },
1190 : { PrototypeTraits<prototypes::id::Node>::Depth },
1191 : JSJitInfo::Method,
1192 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
1193 : JSVAL_TYPE_BOOLEAN, /* returnType. Not relevant for setters. */
1194 : false, /* isInfallible. False in setters. */
1195 : true, /* isMovable. Not relevant for setters. */
1196 : true, /* isEliminatable. Not relevant for setters. */
1197 : false, /* isAlwaysInSlot. Only relevant for getters. */
1198 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1199 : true, /* isTypedMethod. Only relevant for methods. */
1200 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1201 : },
1202 : isEqualNode_methodinfo_argTypes
1203 : };
1204 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1205 : static_assert(0 < 1, "There is no slot for us");
1206 :
1207 : static bool
1208 0 : compareDocumentPosition(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
1209 : {
1210 0 : if (MOZ_UNLIKELY(args.length() < 1)) {
1211 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "Node.compareDocumentPosition");
1212 : }
1213 0 : NonNull<nsINode> arg0;
1214 0 : if (args[0].isObject()) {
1215 : {
1216 0 : nsresult rv = UnwrapObject<prototypes::id::Node, nsINode>(args[0], arg0);
1217 0 : if (NS_FAILED(rv)) {
1218 0 : ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of Node.compareDocumentPosition", "Node");
1219 0 : return false;
1220 : }
1221 : }
1222 : } else {
1223 0 : ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of Node.compareDocumentPosition");
1224 0 : return false;
1225 : }
1226 0 : uint16_t result(self->CompareDocumentPosition(NonNullHelper(arg0)));
1227 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1228 0 : args.rval().setInt32(int32_t(result));
1229 0 : return true;
1230 : }
1231 :
1232 : static const JSJitInfo::ArgType compareDocumentPosition_methodinfo_argTypes[] = { JSJitInfo::Object, JSJitInfo::ArgTypeListEnd };
1233 : static const JSTypedMethodJitInfo compareDocumentPosition_methodinfo = {
1234 : {
1235 : { (JSJitGetterOp)compareDocumentPosition },
1236 : { prototypes::id::Node },
1237 : { PrototypeTraits<prototypes::id::Node>::Depth },
1238 : JSJitInfo::Method,
1239 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
1240 : JSVAL_TYPE_INT32, /* returnType. Not relevant for setters. */
1241 : false, /* isInfallible. False in setters. */
1242 : true, /* isMovable. Not relevant for setters. */
1243 : true, /* isEliminatable. Not relevant for setters. */
1244 : false, /* isAlwaysInSlot. Only relevant for getters. */
1245 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1246 : true, /* isTypedMethod. Only relevant for methods. */
1247 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1248 : },
1249 : compareDocumentPosition_methodinfo_argTypes
1250 : };
1251 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1252 : static_assert(0 < 1, "There is no slot for us");
1253 :
1254 : static bool
1255 0 : contains(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
1256 : {
1257 0 : if (MOZ_UNLIKELY(args.length() < 1)) {
1258 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "Node.contains");
1259 : }
1260 : nsINode* arg0;
1261 0 : if (args[0].isObject()) {
1262 : {
1263 0 : nsresult rv = UnwrapObject<prototypes::id::Node, nsINode>(args[0], arg0);
1264 0 : if (NS_FAILED(rv)) {
1265 0 : ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of Node.contains", "Node");
1266 0 : return false;
1267 : }
1268 : }
1269 0 : } else if (args[0].isNullOrUndefined()) {
1270 0 : arg0 = nullptr;
1271 : } else {
1272 0 : ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of Node.contains");
1273 0 : return false;
1274 : }
1275 0 : bool result(self->Contains(Constify(arg0)));
1276 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1277 0 : args.rval().setBoolean(result);
1278 0 : return true;
1279 : }
1280 :
1281 : static const JSJitInfo::ArgType contains_methodinfo_argTypes[] = { JSJitInfo::ArgType(JSJitInfo::Null | JSJitInfo::Object), JSJitInfo::ArgTypeListEnd };
1282 : static const JSTypedMethodJitInfo contains_methodinfo = {
1283 : {
1284 : { (JSJitGetterOp)contains },
1285 : { prototypes::id::Node },
1286 : { PrototypeTraits<prototypes::id::Node>::Depth },
1287 : JSJitInfo::Method,
1288 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
1289 : JSVAL_TYPE_BOOLEAN, /* returnType. Not relevant for setters. */
1290 : false, /* isInfallible. False in setters. */
1291 : true, /* isMovable. Not relevant for setters. */
1292 : true, /* isEliminatable. Not relevant for setters. */
1293 : false, /* isAlwaysInSlot. Only relevant for getters. */
1294 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1295 : true, /* isTypedMethod. Only relevant for methods. */
1296 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1297 : },
1298 : contains_methodinfo_argTypes
1299 : };
1300 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1301 : static_assert(0 < 1, "There is no slot for us");
1302 :
1303 : static bool
1304 0 : lookupPrefix(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
1305 : {
1306 0 : if (MOZ_UNLIKELY(args.length() < 1)) {
1307 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "Node.lookupPrefix");
1308 : }
1309 0 : binding_detail::FakeString arg0;
1310 0 : if (!ConvertJSValueToString(cx, args[0], eNull, eNull, arg0)) {
1311 0 : return false;
1312 : }
1313 0 : DOMString result;
1314 0 : self->LookupPrefix(NonNullHelper(Constify(arg0)), result);
1315 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1316 0 : if (!xpc::StringToJsval(cx, result, args.rval())) {
1317 0 : return false;
1318 : }
1319 0 : return true;
1320 : }
1321 :
1322 : static const JSJitInfo::ArgType lookupPrefix_methodinfo_argTypes[] = { JSJitInfo::ArgType(JSJitInfo::Null | JSJitInfo::String), JSJitInfo::ArgTypeListEnd };
1323 : static const JSTypedMethodJitInfo lookupPrefix_methodinfo = {
1324 : {
1325 : { (JSJitGetterOp)lookupPrefix },
1326 : { prototypes::id::Node },
1327 : { PrototypeTraits<prototypes::id::Node>::Depth },
1328 : JSJitInfo::Method,
1329 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
1330 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
1331 : false, /* isInfallible. False in setters. */
1332 : true, /* isMovable. Not relevant for setters. */
1333 : true, /* isEliminatable. Not relevant for setters. */
1334 : false, /* isAlwaysInSlot. Only relevant for getters. */
1335 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1336 : true, /* isTypedMethod. Only relevant for methods. */
1337 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1338 : },
1339 : lookupPrefix_methodinfo_argTypes
1340 : };
1341 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1342 : static_assert(0 < 1, "There is no slot for us");
1343 :
1344 : static bool
1345 0 : lookupNamespaceURI(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
1346 : {
1347 0 : if (MOZ_UNLIKELY(args.length() < 1)) {
1348 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "Node.lookupNamespaceURI");
1349 : }
1350 0 : binding_detail::FakeString arg0;
1351 0 : if (!ConvertJSValueToString(cx, args[0], eNull, eNull, arg0)) {
1352 0 : return false;
1353 : }
1354 0 : DOMString result;
1355 0 : self->LookupNamespaceURI(NonNullHelper(Constify(arg0)), result);
1356 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1357 0 : if (!xpc::StringToJsval(cx, result, args.rval())) {
1358 0 : return false;
1359 : }
1360 0 : return true;
1361 : }
1362 :
1363 : static const JSJitInfo::ArgType lookupNamespaceURI_methodinfo_argTypes[] = { JSJitInfo::ArgType(JSJitInfo::Null | JSJitInfo::String), JSJitInfo::ArgTypeListEnd };
1364 : static const JSTypedMethodJitInfo lookupNamespaceURI_methodinfo = {
1365 : {
1366 : { (JSJitGetterOp)lookupNamespaceURI },
1367 : { prototypes::id::Node },
1368 : { PrototypeTraits<prototypes::id::Node>::Depth },
1369 : JSJitInfo::Method,
1370 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
1371 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
1372 : false, /* isInfallible. False in setters. */
1373 : true, /* isMovable. Not relevant for setters. */
1374 : true, /* isEliminatable. Not relevant for setters. */
1375 : false, /* isAlwaysInSlot. Only relevant for getters. */
1376 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1377 : true, /* isTypedMethod. Only relevant for methods. */
1378 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1379 : },
1380 : lookupNamespaceURI_methodinfo_argTypes
1381 : };
1382 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1383 : static_assert(0 < 1, "There is no slot for us");
1384 :
1385 : static bool
1386 0 : isDefaultNamespace(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
1387 : {
1388 0 : if (MOZ_UNLIKELY(args.length() < 1)) {
1389 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "Node.isDefaultNamespace");
1390 : }
1391 0 : binding_detail::FakeString arg0;
1392 0 : if (!ConvertJSValueToString(cx, args[0], eNull, eNull, arg0)) {
1393 0 : return false;
1394 : }
1395 0 : bool result(self->IsDefaultNamespace(NonNullHelper(Constify(arg0))));
1396 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1397 0 : args.rval().setBoolean(result);
1398 0 : return true;
1399 : }
1400 :
1401 : static const JSJitInfo::ArgType isDefaultNamespace_methodinfo_argTypes[] = { JSJitInfo::ArgType(JSJitInfo::Null | JSJitInfo::String), JSJitInfo::ArgTypeListEnd };
1402 : static const JSTypedMethodJitInfo isDefaultNamespace_methodinfo = {
1403 : {
1404 : { (JSJitGetterOp)isDefaultNamespace },
1405 : { prototypes::id::Node },
1406 : { PrototypeTraits<prototypes::id::Node>::Depth },
1407 : JSJitInfo::Method,
1408 : JSJitInfo::AliasDOMSets, /* aliasSet. Not relevant for setters. */
1409 : JSVAL_TYPE_BOOLEAN, /* returnType. Not relevant for setters. */
1410 : false, /* isInfallible. False in setters. */
1411 : true, /* isMovable. Not relevant for setters. */
1412 : true, /* isEliminatable. Not relevant for setters. */
1413 : false, /* isAlwaysInSlot. Only relevant for getters. */
1414 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1415 : true, /* isTypedMethod. Only relevant for methods. */
1416 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1417 : },
1418 : isDefaultNamespace_methodinfo_argTypes
1419 : };
1420 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1421 : static_assert(0 < 1, "There is no slot for us");
1422 :
1423 : static bool
1424 0 : setUserData(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
1425 : {
1426 0 : if (MOZ_UNLIKELY(args.length() < 2)) {
1427 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "Node.setUserData");
1428 : }
1429 0 : binding_detail::FakeString arg0;
1430 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
1431 0 : return false;
1432 : }
1433 0 : JS::Rooted<JS::Value> arg1(cx);
1434 0 : arg1 = args[1];
1435 0 : binding_detail::FastErrorResult rv;
1436 0 : JS::Rooted<JS::Value> result(cx);
1437 0 : self->SetUserData(cx, NonNullHelper(Constify(arg0)), arg1, &result, rv);
1438 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
1439 0 : return false;
1440 : }
1441 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1442 0 : JS::ExposeValueToActiveJS(result);
1443 0 : args.rval().set(result);
1444 0 : if (!MaybeWrapValue(cx, args.rval())) {
1445 0 : return false;
1446 : }
1447 0 : return true;
1448 : }
1449 :
1450 : static const JSJitInfo setUserData_methodinfo = {
1451 : { (JSJitGetterOp)setUserData },
1452 : { prototypes::id::Node },
1453 : { PrototypeTraits<prototypes::id::Node>::Depth },
1454 : JSJitInfo::Method,
1455 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
1456 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
1457 : false, /* isInfallible. False in setters. */
1458 : false, /* isMovable. Not relevant for setters. */
1459 : false, /* isEliminatable. Not relevant for setters. */
1460 : false, /* isAlwaysInSlot. Only relevant for getters. */
1461 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1462 : false, /* isTypedMethod. Only relevant for methods. */
1463 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1464 : };
1465 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1466 : static_assert(0 < 1, "There is no slot for us");
1467 :
1468 : static bool
1469 0 : getUserData(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
1470 : {
1471 0 : if (MOZ_UNLIKELY(args.length() < 1)) {
1472 0 : return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "Node.getUserData");
1473 : }
1474 0 : binding_detail::FakeString arg0;
1475 0 : if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
1476 0 : return false;
1477 : }
1478 0 : binding_detail::FastErrorResult rv;
1479 0 : JS::Rooted<JS::Value> result(cx);
1480 0 : self->GetUserData(cx, NonNullHelper(Constify(arg0)), &result, rv);
1481 0 : if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
1482 0 : return false;
1483 : }
1484 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1485 0 : JS::ExposeValueToActiveJS(result);
1486 0 : args.rval().set(result);
1487 0 : if (!MaybeWrapValue(cx, args.rval())) {
1488 0 : return false;
1489 : }
1490 0 : return true;
1491 : }
1492 :
1493 : static const JSJitInfo getUserData_methodinfo = {
1494 : { (JSJitGetterOp)getUserData },
1495 : { prototypes::id::Node },
1496 : { PrototypeTraits<prototypes::id::Node>::Depth },
1497 : JSJitInfo::Method,
1498 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
1499 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
1500 : false, /* isInfallible. False in setters. */
1501 : false, /* isMovable. Not relevant for setters. */
1502 : false, /* isEliminatable. Not relevant for setters. */
1503 : false, /* isAlwaysInSlot. Only relevant for getters. */
1504 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1505 : false, /* isTypedMethod. Only relevant for methods. */
1506 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1507 : };
1508 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1509 : static_assert(0 < 1, "There is no slot for us");
1510 :
1511 : static bool
1512 1 : get_nodePrincipal(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
1513 : {
1514 1 : auto result(StrongOrRawPtr<nsIPrincipal>(self->NodePrincipal()));
1515 1 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1516 1 : if (!WrapObject(cx, result, &NS_GET_IID(nsIPrincipal), args.rval())) {
1517 0 : return false;
1518 : }
1519 1 : return true;
1520 : }
1521 :
1522 : static const JSJitInfo nodePrincipal_getterinfo = {
1523 : { (JSJitGetterOp)get_nodePrincipal },
1524 : { prototypes::id::Node },
1525 : { PrototypeTraits<prototypes::id::Node>::Depth },
1526 : JSJitInfo::Getter,
1527 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
1528 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
1529 : false, /* isInfallible. False in setters. */
1530 : false, /* isMovable. Not relevant for setters. */
1531 : false, /* isEliminatable. Not relevant for setters. */
1532 : false, /* isAlwaysInSlot. Only relevant for getters. */
1533 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1534 : false, /* isTypedMethod. Only relevant for methods. */
1535 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1536 : };
1537 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1538 : static_assert(0 < 1, "There is no slot for us");
1539 :
1540 : static bool
1541 0 : get_baseURIObject(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
1542 : {
1543 0 : auto result(StrongOrRawPtr<nsIURI>(self->GetBaseURIObject()));
1544 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1545 0 : if (!result) {
1546 0 : args.rval().setNull();
1547 0 : return true;
1548 : }
1549 0 : if (!WrapObject(cx, result, &NS_GET_IID(nsIURI), args.rval())) {
1550 0 : return false;
1551 : }
1552 0 : return true;
1553 : }
1554 :
1555 : static const JSJitInfo baseURIObject_getterinfo = {
1556 : { (JSJitGetterOp)get_baseURIObject },
1557 : { prototypes::id::Node },
1558 : { PrototypeTraits<prototypes::id::Node>::Depth },
1559 : JSJitInfo::Getter,
1560 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
1561 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
1562 : false, /* isInfallible. False in setters. */
1563 : false, /* isMovable. Not relevant for setters. */
1564 : false, /* isEliminatable. Not relevant for setters. */
1565 : false, /* isAlwaysInSlot. Only relevant for getters. */
1566 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1567 : false, /* isTypedMethod. Only relevant for methods. */
1568 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1569 : };
1570 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1571 : static_assert(0 < 1, "There is no slot for us");
1572 :
1573 : static bool
1574 0 : getBoundMutationObservers(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
1575 : {
1576 0 : nsTArray<StrongPtrForMember<nsDOMMutationObserver>::Type> result;
1577 0 : self->GetBoundMutationObservers(result);
1578 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1579 :
1580 0 : uint32_t length = result.Length();
1581 0 : JS::Rooted<JSObject*> returnArray(cx, JS_NewArrayObject(cx, length));
1582 0 : if (!returnArray) {
1583 0 : return false;
1584 : }
1585 : // Scope for 'tmp'
1586 : {
1587 0 : JS::Rooted<JS::Value> tmp(cx);
1588 0 : for (uint32_t sequenceIdx0 = 0; sequenceIdx0 < length; ++sequenceIdx0) {
1589 : // Control block to let us common up the JS_DefineElement calls when there
1590 : // are different ways to succeed at wrapping the object.
1591 : do {
1592 0 : if (!GetOrCreateDOMReflector(cx, result[sequenceIdx0], &tmp)) {
1593 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
1594 0 : return false;
1595 : }
1596 0 : break;
1597 : } while (0);
1598 0 : if (!JS_DefineElement(cx, returnArray, sequenceIdx0, tmp,
1599 : JSPROP_ENUMERATE)) {
1600 0 : return false;
1601 : }
1602 : }
1603 : }
1604 0 : args.rval().setObject(*returnArray);
1605 0 : return true;
1606 : }
1607 :
1608 : static const JSJitInfo getBoundMutationObservers_methodinfo = {
1609 : { (JSJitGetterOp)getBoundMutationObservers },
1610 : { prototypes::id::Node },
1611 : { PrototypeTraits<prototypes::id::Node>::Depth },
1612 : JSJitInfo::Method,
1613 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
1614 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
1615 : false, /* isInfallible. False in setters. */
1616 : false, /* isMovable. Not relevant for setters. */
1617 : false, /* isEliminatable. Not relevant for setters. */
1618 : false, /* isAlwaysInSlot. Only relevant for getters. */
1619 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1620 : false, /* isTypedMethod. Only relevant for methods. */
1621 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1622 : };
1623 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1624 : static_assert(0 < 1, "There is no slot for us");
1625 :
1626 : static bool
1627 0 : generateXPath(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, const JSJitMethodCallArgs& args)
1628 : {
1629 0 : DOMString result;
1630 0 : self->GenerateXPath(result);
1631 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1632 0 : if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
1633 0 : return false;
1634 : }
1635 0 : return true;
1636 : }
1637 :
1638 : static const JSJitInfo generateXPath_methodinfo = {
1639 : { (JSJitGetterOp)generateXPath },
1640 : { prototypes::id::Node },
1641 : { PrototypeTraits<prototypes::id::Node>::Depth },
1642 : JSJitInfo::Method,
1643 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
1644 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
1645 : false, /* isInfallible. False in setters. */
1646 : false, /* isMovable. Not relevant for setters. */
1647 : false, /* isEliminatable. Not relevant for setters. */
1648 : false, /* isAlwaysInSlot. Only relevant for getters. */
1649 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1650 : false, /* isTypedMethod. Only relevant for methods. */
1651 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1652 : };
1653 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1654 : static_assert(0 < 1, "There is no slot for us");
1655 :
1656 : static bool
1657 0 : get_accessibleNode(JSContext* cx, JS::Handle<JSObject*> obj, nsINode* self, JSJitGetterCallArgs args)
1658 : {
1659 0 : auto result(StrongOrRawPtr<mozilla::dom::AccessibleNode>(self->GetAccessibleNode()));
1660 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
1661 0 : if (!result) {
1662 0 : args.rval().setNull();
1663 0 : return true;
1664 : }
1665 0 : if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
1666 0 : MOZ_ASSERT(true || JS_IsExceptionPending(cx));
1667 0 : return false;
1668 : }
1669 0 : return true;
1670 : }
1671 :
1672 : static const JSJitInfo accessibleNode_getterinfo = {
1673 : { (JSJitGetterOp)get_accessibleNode },
1674 : { prototypes::id::Node },
1675 : { PrototypeTraits<prototypes::id::Node>::Depth },
1676 : JSJitInfo::Getter,
1677 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
1678 : JSVAL_TYPE_UNKNOWN, /* returnType. Not relevant for setters. */
1679 : false, /* isInfallible. False in setters. */
1680 : false, /* isMovable. Not relevant for setters. */
1681 : false, /* isEliminatable. Not relevant for setters. */
1682 : false, /* isAlwaysInSlot. Only relevant for getters. */
1683 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
1684 : false, /* isTypedMethod. Only relevant for methods. */
1685 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
1686 : };
1687 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1688 : static_assert(0 < 1, "There is no slot for us");
1689 :
1690 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
1691 : #if defined(__clang__)
1692 : #pragma clang diagnostic push
1693 : #pragma clang diagnostic ignored "-Wmissing-braces"
1694 : #endif
1695 : static const JSFunctionSpec sMethods_specs[] = {
1696 : JS_FNSPEC("getRootNode", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getRootNode_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1697 : JS_FNSPEC("hasChildNodes", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&hasChildNodes_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1698 : JS_FNSPEC("insertBefore", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&insertBefore_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
1699 : JS_FNSPEC("appendChild", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&appendChild_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1700 : JS_FNSPEC("replaceChild", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&replaceChild_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
1701 : JS_FNSPEC("removeChild", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&removeChild_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1702 : JS_FNSPEC("normalize", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&normalize_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1703 : JS_FNSPEC("cloneNode", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&cloneNode_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1704 : JS_FNSPEC("isSameNode", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&isSameNode_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1705 : JS_FNSPEC("isEqualNode", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&isEqualNode_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1706 : JS_FNSPEC("compareDocumentPosition", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&compareDocumentPosition_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1707 : JS_FNSPEC("contains", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&contains_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1708 : JS_FNSPEC("lookupPrefix", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&lookupPrefix_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1709 : JS_FNSPEC("lookupNamespaceURI", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&lookupNamespaceURI_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1710 : JS_FNSPEC("isDefaultNamespace", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&isDefaultNamespace_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1711 : JS_FS_END,
1712 : JS_FNSPEC("setUserData", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&setUserData_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
1713 : JS_FNSPEC("getUserData", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getUserData_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1714 : JS_FS_END
1715 : };
1716 : #if defined(__clang__)
1717 : #pragma clang diagnostic pop
1718 : #endif
1719 :
1720 : static PrefableDisablers sMethods_disablers16 = {
1721 : true, false, 0, &IsChromeOrXBL
1722 : };
1723 :
1724 : // Can't be const because the pref-enabled boolean needs to be writable
1725 : static Prefable<const JSFunctionSpec> sMethods[] = {
1726 : { nullptr, &sMethods_specs[0] },
1727 : { &sMethods_disablers16, &sMethods_specs[16] },
1728 : { nullptr, nullptr }
1729 : };
1730 :
1731 : static_assert(2 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
1732 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
1733 : static_assert(15 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
1734 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
1735 :
1736 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
1737 : #if defined(__clang__)
1738 : #pragma clang diagnostic push
1739 : #pragma clang diagnostic ignored "-Wmissing-braces"
1740 : #endif
1741 : static const JSFunctionSpec sChromeMethods_specs[] = {
1742 : JS_FNSPEC("getBoundMutationObservers", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getBoundMutationObservers_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1743 : JS_FNSPEC("generateXPath", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&generateXPath_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1744 : JS_FS_END
1745 : };
1746 : #if defined(__clang__)
1747 : #pragma clang diagnostic pop
1748 : #endif
1749 :
1750 :
1751 : // Can't be const because the pref-enabled boolean needs to be writable
1752 : static Prefable<const JSFunctionSpec> sChromeMethods[] = {
1753 : { nullptr, &sChromeMethods_specs[0] },
1754 : { nullptr, nullptr }
1755 : };
1756 :
1757 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
1758 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
1759 : static_assert(2 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
1760 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
1761 :
1762 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
1763 : #if defined(__clang__)
1764 : #pragma clang diagnostic push
1765 : #pragma clang diagnostic ignored "-Wmissing-braces"
1766 : #endif
1767 : static const JSPropertySpec sAttributes_specs[] = {
1768 : { "nodeType", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &nodeType_getterinfo, nullptr, nullptr },
1769 : { "nodeName", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &nodeName_getterinfo, nullptr, nullptr },
1770 : { "baseURI", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &baseURI_getterinfo, nullptr, nullptr },
1771 : { "isConnected", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &isConnected_getterinfo, nullptr, nullptr },
1772 : { "ownerDocument", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &ownerDocument_getterinfo, nullptr, nullptr },
1773 : { "parentNode", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &parentNode_getterinfo, nullptr, nullptr },
1774 : { "parentElement", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &parentElement_getterinfo, nullptr, nullptr },
1775 : { "childNodes", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &childNodes_getterinfo, nullptr, nullptr },
1776 : { "firstChild", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &firstChild_getterinfo, nullptr, nullptr },
1777 : { "lastChild", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &lastChild_getterinfo, nullptr, nullptr },
1778 : { "previousSibling", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &previousSibling_getterinfo, nullptr, nullptr },
1779 : { "nextSibling", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &nextSibling_getterinfo, nullptr, nullptr },
1780 : { "nodeValue", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &nodeValue_getterinfo, GenericBindingSetter, &nodeValue_setterinfo },
1781 : { "textContent", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &textContent_getterinfo, GenericBindingSetter, &textContent_setterinfo },
1782 : { nullptr, 0, nullptr, nullptr, nullptr, nullptr },
1783 : { "accessibleNode", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &accessibleNode_getterinfo, nullptr, nullptr },
1784 : { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
1785 : };
1786 : #if defined(__clang__)
1787 : #pragma clang diagnostic pop
1788 : #endif
1789 :
1790 : static PrefableDisablers sAttributes_disablers15 = {
1791 : true, false, 0, nullptr
1792 : };
1793 :
1794 : // Can't be const because the pref-enabled boolean needs to be writable
1795 : static Prefable<const JSPropertySpec> sAttributes[] = {
1796 : { nullptr, &sAttributes_specs[0] },
1797 : { &sAttributes_disablers15, &sAttributes_specs[15] },
1798 : { nullptr, nullptr }
1799 : };
1800 :
1801 : static_assert(2 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
1802 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
1803 : static_assert(14 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
1804 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
1805 :
1806 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
1807 : #if defined(__clang__)
1808 : #pragma clang diagnostic push
1809 : #pragma clang diagnostic ignored "-Wmissing-braces"
1810 : #endif
1811 : static const JSPropertySpec sChromeAttributes_specs[] = {
1812 : { "nodePrincipal", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &nodePrincipal_getterinfo, nullptr, nullptr },
1813 : { "baseURIObject", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &baseURIObject_getterinfo, nullptr, nullptr },
1814 : { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
1815 : };
1816 : #if defined(__clang__)
1817 : #pragma clang diagnostic pop
1818 : #endif
1819 :
1820 :
1821 : // Can't be const because the pref-enabled boolean needs to be writable
1822 : static Prefable<const JSPropertySpec> sChromeAttributes[] = {
1823 : { nullptr, &sChromeAttributes_specs[0] },
1824 : { nullptr, nullptr }
1825 : };
1826 :
1827 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
1828 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
1829 : static_assert(2 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
1830 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
1831 :
1832 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
1833 : #if defined(__clang__)
1834 : #pragma clang diagnostic push
1835 : #pragma clang diagnostic ignored "-Wmissing-braces"
1836 : #endif
1837 : static const ConstantSpec sConstants_specs[] = {
1838 : { "ELEMENT_NODE", JS::Int32Value(1) },
1839 : { "ATTRIBUTE_NODE", JS::Int32Value(2) },
1840 : { "TEXT_NODE", JS::Int32Value(3) },
1841 : { "CDATA_SECTION_NODE", JS::Int32Value(4) },
1842 : { "ENTITY_REFERENCE_NODE", JS::Int32Value(5) },
1843 : { "ENTITY_NODE", JS::Int32Value(6) },
1844 : { "PROCESSING_INSTRUCTION_NODE", JS::Int32Value(7) },
1845 : { "COMMENT_NODE", JS::Int32Value(8) },
1846 : { "DOCUMENT_NODE", JS::Int32Value(9) },
1847 : { "DOCUMENT_TYPE_NODE", JS::Int32Value(10) },
1848 : { "DOCUMENT_FRAGMENT_NODE", JS::Int32Value(11) },
1849 : { "NOTATION_NODE", JS::Int32Value(12) },
1850 : { "DOCUMENT_POSITION_DISCONNECTED", JS::Int32Value(1) },
1851 : { "DOCUMENT_POSITION_PRECEDING", JS::Int32Value(2) },
1852 : { "DOCUMENT_POSITION_FOLLOWING", JS::Int32Value(4) },
1853 : { "DOCUMENT_POSITION_CONTAINS", JS::Int32Value(8) },
1854 : { "DOCUMENT_POSITION_CONTAINED_BY", JS::Int32Value(16) },
1855 : { "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC", JS::Int32Value(32) },
1856 : { 0, JS::UndefinedValue() }
1857 : };
1858 : #if defined(__clang__)
1859 : #pragma clang diagnostic pop
1860 : #endif
1861 :
1862 :
1863 : // Can't be const because the pref-enabled boolean needs to be writable
1864 : static Prefable<const ConstantSpec> sConstants[] = {
1865 : { nullptr, &sConstants_specs[0] },
1866 : { nullptr, nullptr }
1867 : };
1868 :
1869 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
1870 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
1871 : static_assert(18 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
1872 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
1873 :
1874 :
1875 : static uint16_t sNativeProperties_sortedPropertyIndices[50];
1876 : static PropertyInfo sNativeProperties_propertyInfos[50];
1877 :
1878 : static const NativePropertiesN<3> sNativeProperties = {
1879 : false, 0,
1880 : false, 0,
1881 : true, 0 /* sMethods */,
1882 : true, 1 /* sAttributes */,
1883 : false, 0,
1884 : false, 0,
1885 : true, 2 /* sConstants */,
1886 : -1,
1887 : 50,
1888 : sNativeProperties_sortedPropertyIndices,
1889 : {
1890 : { sMethods, &sNativeProperties_propertyInfos[0] },
1891 : { sAttributes, &sNativeProperties_propertyInfos[17] },
1892 : { sConstants, &sNativeProperties_propertyInfos[32] }
1893 : }
1894 : };
1895 : static_assert(50 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
1896 : "We have a property info count that is oversized");
1897 :
1898 : static uint16_t sChromeOnlyNativeProperties_sortedPropertyIndices[4];
1899 : static PropertyInfo sChromeOnlyNativeProperties_propertyInfos[4];
1900 :
1901 : static const NativePropertiesN<2> sChromeOnlyNativeProperties = {
1902 : false, 0,
1903 : false, 0,
1904 : true, 0 /* sChromeMethods */,
1905 : true, 1 /* sChromeAttributes */,
1906 : false, 0,
1907 : false, 0,
1908 : false, 0,
1909 : -1,
1910 : 4,
1911 : sChromeOnlyNativeProperties_sortedPropertyIndices,
1912 : {
1913 : { sChromeMethods, &sChromeOnlyNativeProperties_propertyInfos[0] },
1914 : { sChromeAttributes, &sChromeOnlyNativeProperties_propertyInfos[2] }
1915 : }
1916 : };
1917 : static_assert(4 < 1ull << CHAR_BIT * sizeof(sChromeOnlyNativeProperties.propertyInfoCount),
1918 : "We have a property info count that is oversized");
1919 :
1920 : static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
1921 : {
1922 : "Function",
1923 : JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
1924 : &sBoringInterfaceObjectClassClassOps,
1925 : JS_NULL_CLASS_SPEC,
1926 : JS_NULL_CLASS_EXT,
1927 : &sInterfaceObjectClassObjectOps
1928 : },
1929 : eInterface,
1930 : true,
1931 : prototypes::id::Node,
1932 : PrototypeTraits<prototypes::id::Node>::Depth,
1933 : sNativePropertyHooks,
1934 : "function Node() {\n [native code]\n}",
1935 : EventTargetBinding::GetConstructorObject
1936 : };
1937 :
1938 : static const DOMIfaceAndProtoJSClass sPrototypeClass = {
1939 : {
1940 : "NodePrototype",
1941 : JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
1942 : JS_NULL_CLASS_OPS,
1943 : JS_NULL_CLASS_SPEC,
1944 : JS_NULL_CLASS_EXT,
1945 : JS_NULL_OBJECT_OPS
1946 : },
1947 : eInterfacePrototype,
1948 : false,
1949 : prototypes::id::Node,
1950 : PrototypeTraits<prototypes::id::Node>::Depth,
1951 : sNativePropertyHooks,
1952 : "[object NodePrototype]",
1953 : EventTargetBinding::GetProtoObject
1954 : };
1955 :
1956 : JSObject*
1957 0 : DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
1958 : {
1959 0 : return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
1960 : }
1961 :
1962 : const NativePropertyHooks sNativePropertyHooks[] = { {
1963 : nullptr,
1964 : nullptr,
1965 : nullptr,
1966 : { sNativeProperties.Upcast(), sChromeOnlyNativeProperties.Upcast() },
1967 : prototypes::id::Node,
1968 : constructors::id::Node,
1969 : EventTargetBinding::sNativePropertyHooks,
1970 : &DefaultXrayExpandoObjectClass
1971 : } };
1972 :
1973 : void
1974 7 : CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
1975 : {
1976 7 : JS::Handle<JSObject*> parentProto(EventTargetBinding::GetProtoObjectHandle(aCx));
1977 7 : if (!parentProto) {
1978 0 : return;
1979 : }
1980 :
1981 7 : JS::Handle<JSObject*> constructorProto(EventTargetBinding::GetConstructorObjectHandle(aCx));
1982 7 : if (!constructorProto) {
1983 0 : return;
1984 : }
1985 :
1986 : static bool sIdsInited = false;
1987 7 : if (!sIdsInited && NS_IsMainThread()) {
1988 2 : if (!InitIds(aCx, sNativeProperties.Upcast())) {
1989 0 : return;
1990 : }
1991 2 : if (!InitIds(aCx, sChromeOnlyNativeProperties.Upcast())) {
1992 0 : return;
1993 : }
1994 2 : sIdsInited = true;
1995 : }
1996 :
1997 : static bool sPrefCachesInited = false;
1998 7 : if (!sPrefCachesInited && NS_IsMainThread()) {
1999 2 : sPrefCachesInited = true;
2000 2 : Preferences::AddBoolVarCache(&sAttributes[1].disablers->enabled, "accessibility.AOM.enabled");
2001 : }
2002 :
2003 7 : JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::Node);
2004 7 : JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::Node);
2005 14 : dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
2006 : &sPrototypeClass.mBase, protoCache,
2007 : constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
2008 : interfaceCache,
2009 : sNativeProperties.Upcast(),
2010 7 : nsContentUtils::ThreadsafeIsSystemCaller(aCx) ? sChromeOnlyNativeProperties.Upcast() : nullptr,
2011 : "Node", aDefineOnGlobal,
2012 : nullptr,
2013 7 : false);
2014 : }
2015 :
2016 : JS::Handle<JSObject*>
2017 12 : GetProtoObjectHandle(JSContext* aCx)
2018 : {
2019 : /* Get the interface prototype object for this class. This will create the
2020 : object as needed. */
2021 12 : bool aDefineOnGlobal = true;
2022 :
2023 : /* Make sure our global is sane. Hopefully we can remove this sometime */
2024 12 : JSObject* global = JS::CurrentGlobalOrNull(aCx);
2025 12 : if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
2026 0 : return nullptr;
2027 : }
2028 :
2029 : /* Check to see whether the interface objects are already installed */
2030 12 : ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
2031 12 : if (!protoAndIfaceCache.HasEntryInSlot(prototypes::id::Node)) {
2032 14 : JS::Rooted<JSObject*> rootedGlobal(aCx, global);
2033 7 : CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
2034 : }
2035 :
2036 : /*
2037 : * The object might _still_ be null, but that's OK.
2038 : *
2039 : * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
2040 : * traced by TraceProtoAndIfaceCache() and its contents are never
2041 : * changed after they have been set.
2042 : *
2043 : * Calling address() avoids the read read barrier that does gray
2044 : * unmarking, but it's not possible for the object to be gray here.
2045 : */
2046 :
2047 12 : const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(prototypes::id::Node);
2048 12 : MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
2049 12 : return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
2050 : }
2051 :
2052 : JSObject*
2053 1 : GetProtoObject(JSContext* aCx)
2054 : {
2055 1 : return GetProtoObjectHandle(aCx);
2056 : }
2057 :
2058 : JS::Handle<JSObject*>
2059 11 : GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
2060 : {
2061 : /* Get the interface object for this class. This will create the object as
2062 : needed. */
2063 :
2064 : /* Make sure our global is sane. Hopefully we can remove this sometime */
2065 11 : JSObject* global = JS::CurrentGlobalOrNull(aCx);
2066 11 : if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
2067 0 : return nullptr;
2068 : }
2069 :
2070 : /* Check to see whether the interface objects are already installed */
2071 11 : ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
2072 11 : if (!protoAndIfaceCache.HasEntryInSlot(constructors::id::Node)) {
2073 0 : JS::Rooted<JSObject*> rootedGlobal(aCx, global);
2074 0 : CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
2075 : }
2076 :
2077 : /*
2078 : * The object might _still_ be null, but that's OK.
2079 : *
2080 : * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
2081 : * traced by TraceProtoAndIfaceCache() and its contents are never
2082 : * changed after they have been set.
2083 : *
2084 : * Calling address() avoids the read read barrier that does gray
2085 : * unmarking, but it's not possible for the object to be gray here.
2086 : */
2087 :
2088 11 : const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::Node);
2089 11 : MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
2090 11 : return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
2091 : }
2092 :
2093 : JSObject*
2094 0 : GetConstructorObject(JSContext* aCx)
2095 : {
2096 0 : return GetConstructorObjectHandle(aCx);
2097 : }
2098 :
2099 : } // namespace NodeBinding
2100 :
2101 :
2102 :
2103 : } // namespace dom
2104 : } // namespace mozilla
|