LCOV - code coverage report
Current view: top level - obj-x86_64-pc-linux-gnu/dom/bindings - XULTemplateBuilderBinding.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 0 1452 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 95 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* THIS FILE IS AUTOGENERATED FROM XULTemplateBuilder.webidl BY Codegen.py - DO NOT EDIT */
       2             : 
       3             : #include "AtomList.h"
       4             : #include "WrapperFactory.h"
       5             : #include "XULTemplateBuilderBinding.h"
       6             : #include "mozilla/OwningNonNull.h"
       7             : #include "mozilla/dom/BindingUtils.h"
       8             : #include "mozilla/dom/DOMJSClass.h"
       9             : #include "mozilla/dom/DataTransfer.h"
      10             : #include "mozilla/dom/Element.h"
      11             : #include "mozilla/dom/NonRefcountedDOMObject.h"
      12             : #include "mozilla/dom/Nullable.h"
      13             : #include "mozilla/dom/PrimitiveConversions.h"
      14             : #include "mozilla/dom/TreeBoxObject.h"
      15             : #include "mozilla/dom/XrayExpandoClass.h"
      16             : #include "nsINode.h"
      17             : #include "nsIRDFCompositeDataSource.h"
      18             : #include "nsIRDFResource.h"
      19             : #include "nsISupports.h"
      20             : #include "nsITreeSelection.h"
      21             : #include "nsIXULTemplateResult.h"
      22             : #include "nsIXULTemplateRuleFilter.h"
      23             : #include "nsTreeColumns.h"
      24             : #include "nsXULTemplateBuilder.h"
      25             : #include "nsXULTreeBuilder.h"
      26             : #include "xpcjsid.h"
      27             : 
      28             : namespace mozilla {
      29             : namespace dom {
      30             : 
      31             : namespace XULTemplateBuilderBinding {
      32             : 
      33             : static bool
      34           0 : get_root(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, JSJitGetterCallArgs args)
      35             : {
      36           0 :   auto result(StrongOrRawPtr<mozilla::dom::Element>(self->GetRoot()));
      37           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
      38           0 :   if (!result) {
      39           0 :     args.rval().setNull();
      40           0 :     return true;
      41             :   }
      42           0 :   if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
      43           0 :     MOZ_ASSERT(true || JS_IsExceptionPending(cx));
      44           0 :     return false;
      45             :   }
      46           0 :   return true;
      47             : }
      48             : 
      49             : static const JSJitInfo root_getterinfo = {
      50             :   { (JSJitGetterOp)get_root },
      51             :   { prototypes::id::XULTemplateBuilder },
      52             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
      53             :   JSJitInfo::Getter,
      54             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
      55             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
      56             :   false,  /* isInfallible. False in setters. */
      57             :   false,  /* isMovable.  Not relevant for setters. */
      58             :   false, /* isEliminatable.  Not relevant for setters. */
      59             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
      60             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
      61             :   false,  /* isTypedMethod.  Only relevant for methods. */
      62             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
      63             : };
      64             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
      65             : static_assert(0 < 1, "There is no slot for us");
      66             : 
      67             : static bool
      68           0 : get_datasource(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, JSJitGetterCallArgs args)
      69             : {
      70           0 :   auto result(StrongOrRawPtr<nsISupports>(self->GetDatasource()));
      71           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
      72           0 :   if (!result) {
      73           0 :     args.rval().setNull();
      74           0 :     return true;
      75             :   }
      76           0 :   if (!WrapObject(cx, result, args.rval())) {
      77           0 :     return false;
      78             :   }
      79           0 :   return true;
      80             : }
      81             : 
      82             : static bool
      83           0 : set_datasource(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, JSJitSetterCallArgs args)
      84             : {
      85             :   nsISupports* arg0;
      86           0 :   RefPtr<nsISupports> arg0_holder;
      87           0 :   if (args[0].isObject()) {
      88           0 :     JS::Rooted<JSObject*> source(cx, &args[0].toObject());
      89           0 :     if (NS_FAILED(UnwrapArg<nsISupports>(cx, source, getter_AddRefs(arg0_holder)))) {
      90           0 :       ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Value being assigned to XULTemplateBuilder.datasource", "nsISupports");
      91           0 :       return false;
      92             :     }
      93           0 :     MOZ_ASSERT(arg0_holder);
      94           0 :     arg0 = arg0_holder;
      95           0 :   } else if (args[0].isNullOrUndefined()) {
      96           0 :     arg0 = nullptr;
      97             :   } else {
      98           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Value being assigned to XULTemplateBuilder.datasource");
      99           0 :     return false;
     100             :   }
     101           0 :   binding_detail::FastErrorResult rv;
     102           0 :   self->SetDatasource(Constify(arg0), rv);
     103           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     104           0 :     return false;
     105             :   }
     106           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     107             : 
     108           0 :   return true;
     109             : }
     110             : 
     111             : static const JSJitInfo datasource_getterinfo = {
     112             :   { (JSJitGetterOp)get_datasource },
     113             :   { prototypes::id::XULTemplateBuilder },
     114             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     115             :   JSJitInfo::Getter,
     116             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     117             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     118             :   false,  /* isInfallible. False in setters. */
     119             :   false,  /* isMovable.  Not relevant for setters. */
     120             :   false, /* isEliminatable.  Not relevant for setters. */
     121             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     122             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     123             :   false,  /* isTypedMethod.  Only relevant for methods. */
     124             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     125             : };
     126             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     127             : static_assert(0 < 1, "There is no slot for us");
     128             : static const JSJitInfo datasource_setterinfo = {
     129             :   { (JSJitGetterOp)set_datasource },
     130             :   { prototypes::id::XULTemplateBuilder },
     131             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     132             :   JSJitInfo::Setter,
     133             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     134             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     135             :   false,  /* isInfallible. False in setters. */
     136             :   false,  /* isMovable.  Not relevant for setters. */
     137             :   false, /* isEliminatable.  Not relevant for setters. */
     138             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     139             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     140             :   false,  /* isTypedMethod.  Only relevant for methods. */
     141             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     142             : };
     143             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     144             : static_assert(0 < 1, "There is no slot for us");
     145             : 
     146             : static bool
     147           0 : get_database(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, JSJitGetterCallArgs args)
     148             : {
     149           0 :   auto result(StrongOrRawPtr<nsIRDFCompositeDataSource>(self->GetDatabase()));
     150           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     151           0 :   if (!result) {
     152           0 :     args.rval().setNull();
     153           0 :     return true;
     154             :   }
     155           0 :   if (!WrapObject(cx, result, &NS_GET_IID(nsIRDFCompositeDataSource), args.rval())) {
     156           0 :     return false;
     157             :   }
     158           0 :   return true;
     159             : }
     160             : 
     161             : static const JSJitInfo database_getterinfo = {
     162             :   { (JSJitGetterOp)get_database },
     163             :   { prototypes::id::XULTemplateBuilder },
     164             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     165             :   JSJitInfo::Getter,
     166             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     167             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     168             :   false,  /* isInfallible. False in setters. */
     169             :   false,  /* isMovable.  Not relevant for setters. */
     170             :   false, /* isEliminatable.  Not relevant for setters. */
     171             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     172             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     173             :   false,  /* isTypedMethod.  Only relevant for methods. */
     174             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     175             : };
     176             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     177             : static_assert(0 < 1, "There is no slot for us");
     178             : 
     179             : static bool
     180           0 : get_rootResult(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, JSJitGetterCallArgs args)
     181             : {
     182           0 :   auto result(StrongOrRawPtr<nsIXULTemplateResult>(self->GetRootResult()));
     183           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     184           0 :   if (!result) {
     185           0 :     args.rval().setNull();
     186           0 :     return true;
     187             :   }
     188           0 :   if (!WrapObject(cx, result, &NS_GET_IID(nsIXULTemplateResult), args.rval())) {
     189           0 :     return false;
     190             :   }
     191           0 :   return true;
     192             : }
     193             : 
     194             : static const JSJitInfo rootResult_getterinfo = {
     195             :   { (JSJitGetterOp)get_rootResult },
     196             :   { prototypes::id::XULTemplateBuilder },
     197             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     198             :   JSJitInfo::Getter,
     199             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     200             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     201             :   false,  /* isInfallible. False in setters. */
     202             :   false,  /* isMovable.  Not relevant for setters. */
     203             :   false, /* 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 : rebuild(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, const JSJitMethodCallArgs& args)
     214             : {
     215           0 :   binding_detail::FastErrorResult rv;
     216           0 :   self->Rebuild(rv);
     217           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     218           0 :     return false;
     219             :   }
     220           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     221           0 :   args.rval().setUndefined();
     222           0 :   return true;
     223             : }
     224             : 
     225             : static const JSJitInfo rebuild_methodinfo = {
     226             :   { (JSJitGetterOp)rebuild },
     227             :   { prototypes::id::XULTemplateBuilder },
     228             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     229             :   JSJitInfo::Method,
     230             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     231             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     232             :   false,  /* isInfallible. False in setters. */
     233             :   false,  /* isMovable.  Not relevant for setters. */
     234             :   false, /* isEliminatable.  Not relevant for setters. */
     235             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     236             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     237             :   false,  /* isTypedMethod.  Only relevant for methods. */
     238             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     239             : };
     240             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     241             : static_assert(0 < 1, "There is no slot for us");
     242             : 
     243             : static bool
     244           0 : refresh(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, const JSJitMethodCallArgs& args)
     245             : {
     246           0 :   binding_detail::FastErrorResult rv;
     247           0 :   self->Refresh(rv);
     248           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     249           0 :     return false;
     250             :   }
     251           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     252           0 :   args.rval().setUndefined();
     253           0 :   return true;
     254             : }
     255             : 
     256             : static const JSJitInfo refresh_methodinfo = {
     257             :   { (JSJitGetterOp)refresh },
     258             :   { prototypes::id::XULTemplateBuilder },
     259             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     260             :   JSJitInfo::Method,
     261             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     262             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     263             :   false,  /* isInfallible. False in setters. */
     264             :   false,  /* isMovable.  Not relevant for setters. */
     265             :   false, /* isEliminatable.  Not relevant for setters. */
     266             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     267             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     268             :   false,  /* isTypedMethod.  Only relevant for methods. */
     269             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     270             : };
     271             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     272             : static_assert(0 < 1, "There is no slot for us");
     273             : 
     274             : static bool
     275           0 : addResult(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, const JSJitMethodCallArgs& args)
     276             : {
     277           0 :   if (MOZ_UNLIKELY(args.length() < 2)) {
     278           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTemplateBuilder.addResult");
     279             :   }
     280             :   nsIXULTemplateResult* arg0;
     281           0 :   RefPtr<nsIXULTemplateResult> arg0_holder;
     282           0 :   if (args[0].isObject()) {
     283           0 :     JS::Rooted<JSObject*> source(cx, &args[0].toObject());
     284           0 :     if (NS_FAILED(UnwrapArg<nsIXULTemplateResult>(cx, source, getter_AddRefs(arg0_holder)))) {
     285           0 :       ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of XULTemplateBuilder.addResult", "XULTemplateResult");
     286           0 :       return false;
     287             :     }
     288           0 :     MOZ_ASSERT(arg0_holder);
     289           0 :     arg0 = arg0_holder;
     290             :   } else {
     291           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTemplateBuilder.addResult");
     292           0 :     return false;
     293             :   }
     294           0 :   NonNull<nsINode> arg1;
     295           0 :   if (args[1].isObject()) {
     296             :     {
     297           0 :       nsresult rv = UnwrapObject<prototypes::id::Node, nsINode>(args[1], arg1);
     298           0 :       if (NS_FAILED(rv)) {
     299           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of XULTemplateBuilder.addResult", "Node");
     300           0 :         return false;
     301             :       }
     302             :     }
     303             :   } else {
     304           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of XULTemplateBuilder.addResult");
     305           0 :     return false;
     306             :   }
     307           0 :   binding_detail::FastErrorResult rv;
     308           0 :   self->AddResult(NonNullHelper(arg0), NonNullHelper(arg1), rv);
     309           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     310           0 :     return false;
     311             :   }
     312           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     313           0 :   args.rval().setUndefined();
     314           0 :   return true;
     315             : }
     316             : 
     317             : static const JSJitInfo addResult_methodinfo = {
     318             :   { (JSJitGetterOp)addResult },
     319             :   { prototypes::id::XULTemplateBuilder },
     320             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     321             :   JSJitInfo::Method,
     322             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     323             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     324             :   false,  /* isInfallible. False in setters. */
     325             :   false,  /* isMovable.  Not relevant for setters. */
     326             :   false, /* isEliminatable.  Not relevant for setters. */
     327             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     328             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     329             :   false,  /* isTypedMethod.  Only relevant for methods. */
     330             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     331             : };
     332             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     333             : static_assert(0 < 1, "There is no slot for us");
     334             : 
     335             : static bool
     336           0 : removeResult(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, const JSJitMethodCallArgs& args)
     337             : {
     338           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
     339           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTemplateBuilder.removeResult");
     340             :   }
     341             :   nsIXULTemplateResult* arg0;
     342           0 :   RefPtr<nsIXULTemplateResult> arg0_holder;
     343           0 :   if (args[0].isObject()) {
     344           0 :     JS::Rooted<JSObject*> source(cx, &args[0].toObject());
     345           0 :     if (NS_FAILED(UnwrapArg<nsIXULTemplateResult>(cx, source, getter_AddRefs(arg0_holder)))) {
     346           0 :       ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of XULTemplateBuilder.removeResult", "XULTemplateResult");
     347           0 :       return false;
     348             :     }
     349           0 :     MOZ_ASSERT(arg0_holder);
     350           0 :     arg0 = arg0_holder;
     351             :   } else {
     352           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTemplateBuilder.removeResult");
     353           0 :     return false;
     354             :   }
     355           0 :   binding_detail::FastErrorResult rv;
     356           0 :   self->RemoveResult(NonNullHelper(arg0), rv);
     357           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     358           0 :     return false;
     359             :   }
     360           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     361           0 :   args.rval().setUndefined();
     362           0 :   return true;
     363             : }
     364             : 
     365             : static const JSJitInfo removeResult_methodinfo = {
     366             :   { (JSJitGetterOp)removeResult },
     367             :   { prototypes::id::XULTemplateBuilder },
     368             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     369             :   JSJitInfo::Method,
     370             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     371             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     372             :   false,  /* isInfallible. False in setters. */
     373             :   false,  /* isMovable.  Not relevant for setters. */
     374             :   false, /* isEliminatable.  Not relevant for setters. */
     375             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     376             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     377             :   false,  /* isTypedMethod.  Only relevant for methods. */
     378             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     379             : };
     380             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     381             : static_assert(0 < 1, "There is no slot for us");
     382             : 
     383             : static bool
     384           0 : replaceResult(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, const JSJitMethodCallArgs& args)
     385             : {
     386           0 :   if (MOZ_UNLIKELY(args.length() < 3)) {
     387           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTemplateBuilder.replaceResult");
     388             :   }
     389             :   nsIXULTemplateResult* arg0;
     390           0 :   RefPtr<nsIXULTemplateResult> arg0_holder;
     391           0 :   if (args[0].isObject()) {
     392           0 :     JS::Rooted<JSObject*> source(cx, &args[0].toObject());
     393           0 :     if (NS_FAILED(UnwrapArg<nsIXULTemplateResult>(cx, source, getter_AddRefs(arg0_holder)))) {
     394           0 :       ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of XULTemplateBuilder.replaceResult", "XULTemplateResult");
     395           0 :       return false;
     396             :     }
     397           0 :     MOZ_ASSERT(arg0_holder);
     398           0 :     arg0 = arg0_holder;
     399             :   } else {
     400           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTemplateBuilder.replaceResult");
     401           0 :     return false;
     402             :   }
     403             :   nsIXULTemplateResult* arg1;
     404           0 :   RefPtr<nsIXULTemplateResult> arg1_holder;
     405           0 :   if (args[1].isObject()) {
     406           0 :     JS::Rooted<JSObject*> source(cx, &args[1].toObject());
     407           0 :     if (NS_FAILED(UnwrapArg<nsIXULTemplateResult>(cx, source, getter_AddRefs(arg1_holder)))) {
     408           0 :       ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of XULTemplateBuilder.replaceResult", "XULTemplateResult");
     409           0 :       return false;
     410             :     }
     411           0 :     MOZ_ASSERT(arg1_holder);
     412           0 :     arg1 = arg1_holder;
     413             :   } else {
     414           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of XULTemplateBuilder.replaceResult");
     415           0 :     return false;
     416             :   }
     417           0 :   NonNull<nsINode> arg2;
     418           0 :   if (args[2].isObject()) {
     419             :     {
     420           0 :       nsresult rv = UnwrapObject<prototypes::id::Node, nsINode>(args[2], arg2);
     421           0 :       if (NS_FAILED(rv)) {
     422           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 3 of XULTemplateBuilder.replaceResult", "Node");
     423           0 :         return false;
     424             :       }
     425             :     }
     426             :   } else {
     427           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 3 of XULTemplateBuilder.replaceResult");
     428           0 :     return false;
     429             :   }
     430           0 :   binding_detail::FastErrorResult rv;
     431           0 :   self->ReplaceResult(NonNullHelper(arg0), NonNullHelper(arg1), NonNullHelper(arg2), rv);
     432           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     433           0 :     return false;
     434             :   }
     435           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     436           0 :   args.rval().setUndefined();
     437           0 :   return true;
     438             : }
     439             : 
     440             : static const JSJitInfo replaceResult_methodinfo = {
     441             :   { (JSJitGetterOp)replaceResult },
     442             :   { prototypes::id::XULTemplateBuilder },
     443             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     444             :   JSJitInfo::Method,
     445             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     446             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     447             :   false,  /* isInfallible. False in setters. */
     448             :   false,  /* isMovable.  Not relevant for setters. */
     449             :   false, /* isEliminatable.  Not relevant for setters. */
     450             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     451             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     452             :   false,  /* isTypedMethod.  Only relevant for methods. */
     453             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     454             : };
     455             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     456             : static_assert(0 < 1, "There is no slot for us");
     457             : 
     458             : static bool
     459           0 : resultBindingChanged(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, const JSJitMethodCallArgs& args)
     460             : {
     461           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
     462           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTemplateBuilder.resultBindingChanged");
     463             :   }
     464             :   nsIXULTemplateResult* arg0;
     465           0 :   RefPtr<nsIXULTemplateResult> arg0_holder;
     466           0 :   if (args[0].isObject()) {
     467           0 :     JS::Rooted<JSObject*> source(cx, &args[0].toObject());
     468           0 :     if (NS_FAILED(UnwrapArg<nsIXULTemplateResult>(cx, source, getter_AddRefs(arg0_holder)))) {
     469           0 :       ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of XULTemplateBuilder.resultBindingChanged", "XULTemplateResult");
     470           0 :       return false;
     471             :     }
     472           0 :     MOZ_ASSERT(arg0_holder);
     473           0 :     arg0 = arg0_holder;
     474             :   } else {
     475           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTemplateBuilder.resultBindingChanged");
     476           0 :     return false;
     477             :   }
     478           0 :   binding_detail::FastErrorResult rv;
     479           0 :   self->ResultBindingChanged(NonNullHelper(arg0), rv);
     480           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     481           0 :     return false;
     482             :   }
     483           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     484           0 :   args.rval().setUndefined();
     485           0 :   return true;
     486             : }
     487             : 
     488             : static const JSJitInfo resultBindingChanged_methodinfo = {
     489             :   { (JSJitGetterOp)resultBindingChanged },
     490             :   { prototypes::id::XULTemplateBuilder },
     491             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     492             :   JSJitInfo::Method,
     493             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     494             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     495             :   false,  /* isInfallible. False in setters. */
     496             :   false,  /* isMovable.  Not relevant for setters. */
     497             :   false, /* isEliminatable.  Not relevant for setters. */
     498             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     499             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     500             :   false,  /* isTypedMethod.  Only relevant for methods. */
     501             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     502             : };
     503             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     504             : static_assert(0 < 1, "There is no slot for us");
     505             : 
     506             : static bool
     507           0 : getResultForId(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, const JSJitMethodCallArgs& args)
     508             : {
     509           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
     510           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTemplateBuilder.getResultForId");
     511             :   }
     512           0 :   binding_detail::FakeString arg0;
     513           0 :   if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
     514           0 :     return false;
     515             :   }
     516           0 :   binding_detail::FastErrorResult rv;
     517           0 :   auto result(StrongOrRawPtr<nsIXULTemplateResult>(self->GetResultForId(NonNullHelper(Constify(arg0)), rv)));
     518           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     519           0 :     return false;
     520             :   }
     521           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     522           0 :   if (!result) {
     523           0 :     args.rval().setNull();
     524           0 :     return true;
     525             :   }
     526           0 :   if (!WrapObject(cx, result, &NS_GET_IID(nsIXULTemplateResult), args.rval())) {
     527           0 :     return false;
     528             :   }
     529           0 :   return true;
     530             : }
     531             : 
     532             : static const JSJitInfo getResultForId_methodinfo = {
     533             :   { (JSJitGetterOp)getResultForId },
     534             :   { prototypes::id::XULTemplateBuilder },
     535             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     536             :   JSJitInfo::Method,
     537             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     538             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     539             :   false,  /* isInfallible. False in setters. */
     540             :   false,  /* isMovable.  Not relevant for setters. */
     541             :   false, /* isEliminatable.  Not relevant for setters. */
     542             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     543             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     544             :   false,  /* isTypedMethod.  Only relevant for methods. */
     545             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     546             : };
     547             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     548             : static_assert(0 < 1, "There is no slot for us");
     549             : 
     550             : static bool
     551           0 : getResultForContent(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, const JSJitMethodCallArgs& args)
     552             : {
     553           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
     554           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTemplateBuilder.getResultForContent");
     555             :   }
     556           0 :   NonNull<mozilla::dom::Element> arg0;
     557           0 :   if (args[0].isObject()) {
     558             :     {
     559           0 :       nsresult rv = UnwrapObject<prototypes::id::Element, mozilla::dom::Element>(args[0], arg0);
     560           0 :       if (NS_FAILED(rv)) {
     561           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of XULTemplateBuilder.getResultForContent", "Element");
     562           0 :         return false;
     563             :       }
     564             :     }
     565             :   } else {
     566           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTemplateBuilder.getResultForContent");
     567           0 :     return false;
     568             :   }
     569           0 :   auto result(StrongOrRawPtr<nsIXULTemplateResult>(self->GetResultForContent(NonNullHelper(arg0))));
     570           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     571           0 :   if (!result) {
     572           0 :     args.rval().setNull();
     573           0 :     return true;
     574             :   }
     575           0 :   if (!WrapObject(cx, result, &NS_GET_IID(nsIXULTemplateResult), args.rval())) {
     576           0 :     return false;
     577             :   }
     578           0 :   return true;
     579             : }
     580             : 
     581             : static const JSJitInfo getResultForContent_methodinfo = {
     582             :   { (JSJitGetterOp)getResultForContent },
     583             :   { prototypes::id::XULTemplateBuilder },
     584             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     585             :   JSJitInfo::Method,
     586             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     587             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
     588             :   false,  /* isInfallible. False in setters. */
     589             :   false,  /* isMovable.  Not relevant for setters. */
     590             :   false, /* isEliminatable.  Not relevant for setters. */
     591             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     592             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     593             :   false,  /* isTypedMethod.  Only relevant for methods. */
     594             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     595             : };
     596             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     597             : static_assert(0 < 1, "There is no slot for us");
     598             : 
     599             : static bool
     600           0 : hasGeneratedContent(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, const JSJitMethodCallArgs& args)
     601             : {
     602           0 :   if (MOZ_UNLIKELY(args.length() < 2)) {
     603           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTemplateBuilder.hasGeneratedContent");
     604             :   }
     605             :   nsIRDFResource* arg0;
     606           0 :   RefPtr<nsIRDFResource> arg0_holder;
     607           0 :   if (args[0].isObject()) {
     608           0 :     JS::Rooted<JSObject*> source(cx, &args[0].toObject());
     609           0 :     if (NS_FAILED(UnwrapArg<nsIRDFResource>(cx, source, getter_AddRefs(arg0_holder)))) {
     610           0 :       ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of XULTemplateBuilder.hasGeneratedContent", "MozRDFResource");
     611           0 :       return false;
     612             :     }
     613           0 :     MOZ_ASSERT(arg0_holder);
     614           0 :     arg0 = arg0_holder;
     615             :   } else {
     616           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTemplateBuilder.hasGeneratedContent");
     617           0 :     return false;
     618             :   }
     619           0 :   binding_detail::FakeString arg1;
     620           0 :   if (!ConvertJSValueToString(cx, args[1], eNull, eNull, arg1)) {
     621           0 :     return false;
     622             :   }
     623           0 :   binding_detail::FastErrorResult rv;
     624           0 :   bool result(self->HasGeneratedContent(NonNullHelper(arg0), NonNullHelper(Constify(arg1)), rv));
     625           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     626           0 :     return false;
     627             :   }
     628           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     629           0 :   args.rval().setBoolean(result);
     630           0 :   return true;
     631             : }
     632             : 
     633             : static const JSJitInfo hasGeneratedContent_methodinfo = {
     634             :   { (JSJitGetterOp)hasGeneratedContent },
     635             :   { prototypes::id::XULTemplateBuilder },
     636             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     637             :   JSJitInfo::Method,
     638             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     639             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
     640             :   false,  /* isInfallible. False in setters. */
     641             :   false,  /* isMovable.  Not relevant for setters. */
     642             :   false, /* isEliminatable.  Not relevant for setters. */
     643             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     644             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     645             :   false,  /* isTypedMethod.  Only relevant for methods. */
     646             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     647             : };
     648             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     649             : static_assert(0 < 1, "There is no slot for us");
     650             : 
     651             : static bool
     652           0 : addRuleFilter(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, const JSJitMethodCallArgs& args)
     653             : {
     654           0 :   if (MOZ_UNLIKELY(args.length() < 2)) {
     655           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTemplateBuilder.addRuleFilter");
     656             :   }
     657           0 :   NonNull<nsINode> arg0;
     658           0 :   if (args[0].isObject()) {
     659             :     {
     660           0 :       nsresult rv = UnwrapObject<prototypes::id::Node, nsINode>(args[0], arg0);
     661           0 :       if (NS_FAILED(rv)) {
     662           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of XULTemplateBuilder.addRuleFilter", "Node");
     663           0 :         return false;
     664             :       }
     665             :     }
     666             :   } else {
     667           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTemplateBuilder.addRuleFilter");
     668           0 :     return false;
     669             :   }
     670             :   nsIXULTemplateRuleFilter* arg1;
     671           0 :   RefPtr<nsIXULTemplateRuleFilter> arg1_holder;
     672           0 :   if (args[1].isObject()) {
     673           0 :     JS::Rooted<JSObject*> source(cx, &args[1].toObject());
     674           0 :     if (NS_FAILED(UnwrapArg<nsIXULTemplateRuleFilter>(cx, source, getter_AddRefs(arg1_holder)))) {
     675           0 :       ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of XULTemplateBuilder.addRuleFilter", "XULTemplateRuleFilter");
     676           0 :       return false;
     677             :     }
     678           0 :     MOZ_ASSERT(arg1_holder);
     679           0 :     arg1 = arg1_holder;
     680             :   } else {
     681           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of XULTemplateBuilder.addRuleFilter");
     682           0 :     return false;
     683             :   }
     684           0 :   binding_detail::FastErrorResult rv;
     685           0 :   self->AddRuleFilter(NonNullHelper(arg0), NonNullHelper(arg1), rv);
     686           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
     687           0 :     return false;
     688             :   }
     689           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     690           0 :   args.rval().setUndefined();
     691           0 :   return true;
     692             : }
     693             : 
     694             : static const JSJitInfo addRuleFilter_methodinfo = {
     695             :   { (JSJitGetterOp)addRuleFilter },
     696             :   { prototypes::id::XULTemplateBuilder },
     697             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     698             :   JSJitInfo::Method,
     699             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     700             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     701             :   false,  /* isInfallible. False in setters. */
     702             :   false,  /* isMovable.  Not relevant for setters. */
     703             :   false, /* isEliminatable.  Not relevant for setters. */
     704             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     705             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     706             :   false,  /* isTypedMethod.  Only relevant for methods. */
     707             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     708             : };
     709             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     710             : static_assert(0 < 1, "There is no slot for us");
     711             : 
     712             : static bool
     713           0 : addListener(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, const JSJitMethodCallArgs& args)
     714             : {
     715           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
     716           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTemplateBuilder.addListener");
     717             :   }
     718           0 :   RootedCallback<OwningNonNull<binding_detail::FastXULBuilderListener>> arg0(cx);
     719           0 :   if (args[0].isObject()) {
     720             :     { // scope for tempRoot
     721           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
     722           0 :       arg0 = new binding_detail::FastXULBuilderListener(tempRoot);
     723             :     }
     724             :   } else {
     725           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTemplateBuilder.addListener");
     726           0 :     return false;
     727             :   }
     728           0 :   self->AddListener(NonNullHelper(arg0));
     729           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     730           0 :   args.rval().setUndefined();
     731           0 :   return true;
     732             : }
     733             : 
     734             : static const JSJitInfo addListener_methodinfo = {
     735             :   { (JSJitGetterOp)addListener },
     736             :   { prototypes::id::XULTemplateBuilder },
     737             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     738             :   JSJitInfo::Method,
     739             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     740             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     741             :   false,  /* isInfallible. False in setters. */
     742             :   false,  /* isMovable.  Not relevant for setters. */
     743             :   false, /* isEliminatable.  Not relevant for setters. */
     744             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     745             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     746             :   false,  /* isTypedMethod.  Only relevant for methods. */
     747             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     748             : };
     749             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     750             : static_assert(0 < 1, "There is no slot for us");
     751             : 
     752             : static bool
     753           0 : removeListener(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTemplateBuilder* self, const JSJitMethodCallArgs& args)
     754             : {
     755           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
     756           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTemplateBuilder.removeListener");
     757             :   }
     758           0 :   RootedCallback<OwningNonNull<binding_detail::FastXULBuilderListener>> arg0(cx);
     759           0 :   if (args[0].isObject()) {
     760             :     { // scope for tempRoot
     761           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
     762           0 :       arg0 = new binding_detail::FastXULBuilderListener(tempRoot);
     763             :     }
     764             :   } else {
     765           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTemplateBuilder.removeListener");
     766           0 :     return false;
     767             :   }
     768           0 :   self->RemoveListener(NonNullHelper(arg0));
     769           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
     770           0 :   args.rval().setUndefined();
     771           0 :   return true;
     772             : }
     773             : 
     774             : static const JSJitInfo removeListener_methodinfo = {
     775             :   { (JSJitGetterOp)removeListener },
     776             :   { prototypes::id::XULTemplateBuilder },
     777             :   { PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth },
     778             :   JSJitInfo::Method,
     779             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
     780             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
     781             :   false,  /* isInfallible. False in setters. */
     782             :   false,  /* isMovable.  Not relevant for setters. */
     783             :   false, /* isEliminatable.  Not relevant for setters. */
     784             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
     785             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
     786             :   false,  /* isTypedMethod.  Only relevant for methods. */
     787             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
     788             : };
     789             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
     790             : static_assert(0 < 1, "There is no slot for us");
     791             : 
     792             : static bool
     793           0 : _addProperty(JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JS::Handle<JS::Value> val)
     794             : {
     795           0 :   nsXULTemplateBuilder* self = UnwrapPossiblyNotInitializedDOMObject<nsXULTemplateBuilder>(obj);
     796             :   // We don't want to preserve if we don't have a wrapper, and we
     797             :   // obviously can't preserve if we're not initialized.
     798           0 :   if (self && self->GetWrapperPreserveColor()) {
     799           0 :     PreserveWrapper(self);
     800             :   }
     801           0 :   return true;
     802             : }
     803             : 
     804             : static void
     805           0 : _finalize(js::FreeOp* fop, JSObject* obj)
     806             : {
     807           0 :   nsXULTemplateBuilder* self = UnwrapPossiblyNotInitializedDOMObject<nsXULTemplateBuilder>(obj);
     808           0 :   if (self) {
     809           0 :     ClearWrapper(self, self, obj);
     810           0 :     AddForDeferredFinalization<nsXULTemplateBuilder>(self);
     811             :   }
     812           0 : }
     813             : 
     814             : static void
     815           0 : _objectMoved(JSObject* obj, const JSObject* old)
     816             : {
     817           0 :   nsXULTemplateBuilder* self = UnwrapPossiblyNotInitializedDOMObject<nsXULTemplateBuilder>(obj);
     818           0 :   if (self) {
     819           0 :     UpdateWrapper(self, self, obj, old);
     820             :   }
     821           0 : }
     822             : 
     823             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
     824             : #if defined(__clang__)
     825             : #pragma clang diagnostic push
     826             : #pragma clang diagnostic ignored "-Wmissing-braces"
     827             : #endif
     828             : static const JSFunctionSpec sMethods_specs[] = {
     829             :   JS_FNSPEC("rebuild", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&rebuild_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
     830             :   JS_FNSPEC("refresh", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&refresh_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
     831             :   JS_FNSPEC("addResult", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&addResult_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
     832             :   JS_FNSPEC("removeResult", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&removeResult_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
     833             :   JS_FNSPEC("replaceResult", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&replaceResult_methodinfo), 3, JSPROP_ENUMERATE, nullptr),
     834             :   JS_FNSPEC("resultBindingChanged", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&resultBindingChanged_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
     835             :   JS_FNSPEC("getResultForId", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getResultForId_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
     836             :   JS_FNSPEC("getResultForContent", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getResultForContent_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
     837             :   JS_FNSPEC("hasGeneratedContent", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&hasGeneratedContent_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
     838             :   JS_FNSPEC("addRuleFilter", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&addRuleFilter_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
     839             :   JS_FNSPEC("addListener", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&addListener_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
     840             :   JS_FNSPEC("removeListener", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&removeListener_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
     841             :   JS_FS_END,
     842             :   JS_FNSPEC("QueryInterface", QueryInterface, nullptr, 1, 0, nullptr),
     843             :   JS_FS_END
     844             : };
     845             : #if defined(__clang__)
     846             : #pragma clang diagnostic pop
     847             : #endif
     848             : 
     849             : static PrefableDisablers sMethods_disablers13 = {
     850             :   true, false, 0, &WantsQueryInterface<nsXULTemplateBuilder>::Enabled
     851             : };
     852             : 
     853             : // Can't be const because the pref-enabled boolean needs to be writable
     854             : static Prefable<const JSFunctionSpec> sMethods[] = {
     855             :   { nullptr, &sMethods_specs[0] },
     856             :   { &sMethods_disablers13, &sMethods_specs[13] },
     857             :   { nullptr, nullptr }
     858             : };
     859             : 
     860             : static_assert(2 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
     861             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
     862             : static_assert(12 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
     863             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
     864             : 
     865             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
     866             : #if defined(__clang__)
     867             : #pragma clang diagnostic push
     868             : #pragma clang diagnostic ignored "-Wmissing-braces"
     869             : #endif
     870             : static const JSPropertySpec sAttributes_specs[] = {
     871             :   { "root", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &root_getterinfo, nullptr, nullptr },
     872             :   { "datasource", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &datasource_getterinfo, GenericBindingSetter, &datasource_setterinfo },
     873             :   { "database", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &database_getterinfo, nullptr, nullptr },
     874             :   { "rootResult", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &rootResult_getterinfo, nullptr, nullptr },
     875             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
     876             : };
     877             : #if defined(__clang__)
     878             : #pragma clang diagnostic pop
     879             : #endif
     880             : 
     881             : 
     882             : // Can't be const because the pref-enabled boolean needs to be writable
     883             : static Prefable<const JSPropertySpec> sAttributes[] = {
     884             :   { nullptr, &sAttributes_specs[0] },
     885             :   { nullptr, nullptr }
     886             : };
     887             : 
     888             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
     889             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
     890             : static_assert(4 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
     891             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
     892             : 
     893             : 
     894             : static uint16_t sNativeProperties_sortedPropertyIndices[17];
     895             : static PropertyInfo sNativeProperties_propertyInfos[17];
     896             : 
     897             : static const NativePropertiesN<2> sNativeProperties = {
     898             :   false, 0,
     899             :   false, 0,
     900             :   true,  0 /* sMethods */,
     901             :   true,  1 /* sAttributes */,
     902             :   false, 0,
     903             :   false, 0,
     904             :   false, 0,
     905             :   -1,
     906             :   17,
     907             :   sNativeProperties_sortedPropertyIndices,
     908             :   {
     909             :     { sMethods, &sNativeProperties_propertyInfos[0] },
     910             :     { sAttributes, &sNativeProperties_propertyInfos[13] }
     911             :   }
     912             : };
     913             : static_assert(17 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
     914             :     "We have a property info count that is oversized");
     915             : 
     916             : static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
     917             :   {
     918             :     "Function",
     919             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
     920             :     &sBoringInterfaceObjectClassClassOps,
     921             :     JS_NULL_CLASS_SPEC,
     922             :     JS_NULL_CLASS_EXT,
     923             :     &sInterfaceObjectClassObjectOps
     924             :   },
     925             :   eInterface,
     926             :   true,
     927             :   prototypes::id::XULTemplateBuilder,
     928             :   PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth,
     929             :   sNativePropertyHooks,
     930             :   "function XULTemplateBuilder() {\n    [native code]\n}",
     931             :   JS::GetRealmFunctionPrototype
     932             : };
     933             : 
     934             : static const DOMIfaceAndProtoJSClass sPrototypeClass = {
     935             :   {
     936             :     "XULTemplateBuilderPrototype",
     937             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
     938             :     JS_NULL_CLASS_OPS,
     939             :     JS_NULL_CLASS_SPEC,
     940             :     JS_NULL_CLASS_EXT,
     941             :     JS_NULL_OBJECT_OPS
     942             :   },
     943             :   eInterfacePrototype,
     944             :   false,
     945             :   prototypes::id::XULTemplateBuilder,
     946             :   PrototypeTraits<prototypes::id::XULTemplateBuilder>::Depth,
     947             :   sNativePropertyHooks,
     948             :   "[object XULTemplateBuilderPrototype]",
     949             :   JS::GetRealmObjectPrototype
     950             : };
     951             : 
     952             : bool
     953           0 : ConstructorEnabled(JSContext* aCx, JS::Handle<JSObject*> aObj)
     954             : {
     955           0 :   return IsChromeOrXBL(aCx, aObj);
     956             : }
     957             : 
     958             : JSObject*
     959           0 : DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
     960             : {
     961           0 :   return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
     962             : }
     963             : 
     964             : static const js::ClassOps sClassOps = {
     965             :   _addProperty, /* addProperty */
     966             :   nullptr,               /* delProperty */
     967             :   nullptr,               /* getProperty */
     968             :   nullptr,               /* setProperty */
     969             :   nullptr,               /* enumerate */
     970             :   nullptr, /* newEnumerate */
     971             :   nullptr, /* resolve */
     972             :   nullptr, /* mayResolve */
     973             :   _finalize, /* finalize */
     974             :   nullptr, /* call */
     975             :   nullptr,               /* hasInstance */
     976             :   nullptr,               /* construct */
     977             :   nullptr, /* trace */
     978             : };
     979             : 
     980             : static const js::ClassExtension sClassExtension = {
     981             :   nullptr, /* weakmapKeyDelegateOp */
     982             :   _objectMoved /* objectMovedOp */
     983             : };
     984             : 
     985             : static const DOMJSClass sClass = {
     986             :   { "XULTemplateBuilder",
     987             :     JSCLASS_IS_DOMJSCLASS | JSCLASS_FOREGROUND_FINALIZE | JSCLASS_HAS_RESERVED_SLOTS(1),
     988             :     &sClassOps,
     989             :     JS_NULL_CLASS_SPEC,
     990             :     &sClassExtension,
     991             :     JS_NULL_OBJECT_OPS
     992             :   },
     993             :   { prototypes::id::XULTemplateBuilder, 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 },
     994             :   IsBaseOf<nsISupports, nsXULTemplateBuilder >::value,
     995             :   sNativePropertyHooks,
     996             :   FindAssociatedGlobalForNative<nsXULTemplateBuilder>::Get,
     997             :   GetProtoObjectHandle,
     998             :   GetCCParticipant<nsXULTemplateBuilder>::Get()
     999             : };
    1000             : static_assert(1 == DOM_INSTANCE_RESERVED_SLOTS,
    1001             :               "Must have the right minimal number of reserved slots.");
    1002             : static_assert(1 >= 1,
    1003             :               "Must have enough reserved slots.");
    1004             : 
    1005             : const JSClass*
    1006           0 : GetJSClass()
    1007             : {
    1008           0 :   return sClass.ToJSClass();
    1009             : }
    1010             : 
    1011             : bool
    1012           0 : Wrap(JSContext* aCx, nsXULTemplateBuilder* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector)
    1013             : {
    1014             :   MOZ_ASSERT(static_cast<nsXULTemplateBuilder*>(aObject) ==
    1015             :              reinterpret_cast<nsXULTemplateBuilder*>(aObject),
    1016             :              "Multiple inheritance for nsXULTemplateBuilder is broken.");
    1017           0 :   MOZ_ASSERT(ToSupportsIsCorrect(aObject));
    1018           0 :   MOZ_ASSERT_IF(aGivenProto, js::IsObjectInContextCompartment(aGivenProto, aCx));
    1019           0 :   MOZ_ASSERT(!aCache->GetWrapper(),
    1020             :              "You should probably not be using Wrap() directly; use "
    1021             :              "GetOrCreateDOMReflector instead");
    1022             : 
    1023           0 :   MOZ_ASSERT(ToSupportsIsOnPrimaryInheritanceChain(aObject, aCache),
    1024             :              "nsISupports must be on our primary inheritance chain");
    1025             : 
    1026           0 :   JS::Rooted<JSObject*> global(aCx, FindAssociatedGlobal(aCx, aObject->GetParentObject()));
    1027           0 :   if (!global) {
    1028           0 :     return false;
    1029             :   }
    1030           0 :   MOZ_ASSERT(JS_IsGlobalObject(global));
    1031           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(global));
    1032             : 
    1033             :   // That might have ended up wrapping us already, due to the wonders
    1034             :   // of XBL.  Check for that, and bail out as needed.
    1035           0 :   aReflector.set(aCache->GetWrapper());
    1036           0 :   if (aReflector) {
    1037             : #ifdef DEBUG
    1038           0 :     binding_detail::AssertReflectorHasGivenProto(aCx, aReflector, aGivenProto);
    1039             : #endif // DEBUG
    1040           0 :     return true;
    1041             :   }
    1042             : 
    1043           0 :   JSAutoCompartment ac(aCx, global);
    1044           0 :   JS::Handle<JSObject*> canonicalProto = GetProtoObjectHandle(aCx);
    1045           0 :   if (!canonicalProto) {
    1046           0 :     return false;
    1047             :   }
    1048           0 :   JS::Rooted<JSObject*> proto(aCx);
    1049           0 :   if (aGivenProto) {
    1050           0 :     proto = aGivenProto;
    1051             :     // Unfortunately, while aGivenProto was in the compartment of aCx
    1052             :     // coming in, we changed compartments to that of "parent" so may need
    1053             :     // to wrap the proto here.
    1054           0 :     if (js::GetContextCompartment(aCx) != js::GetObjectCompartment(proto)) {
    1055           0 :       if (!JS_WrapObject(aCx, &proto)) {
    1056           0 :         return false;
    1057             :       }
    1058             :     }
    1059             :   } else {
    1060           0 :     proto = canonicalProto;
    1061             :   }
    1062             : 
    1063           0 :   BindingJSObjectCreator<nsXULTemplateBuilder> creator(aCx);
    1064           0 :   creator.CreateObject(aCx, sClass.ToJSClass(), proto, aObject, aReflector);
    1065           0 :   if (!aReflector) {
    1066           0 :     return false;
    1067             :   }
    1068             : 
    1069           0 :   aCache->SetWrapper(aReflector);
    1070           0 :   creator.InitializationSucceeded();
    1071             : 
    1072           0 :   MOZ_ASSERT(aCache->GetWrapperPreserveColor() &&
    1073             :              aCache->GetWrapperPreserveColor() == aReflector);
    1074             :   // If proto != canonicalProto, we have to preserve our wrapper;
    1075             :   // otherwise we won't be able to properly recreate it later, since
    1076             :   // we won't know what proto to use.  Note that we don't check
    1077             :   // aGivenProto here, since it's entirely possible (and even
    1078             :   // somewhat common) to have a non-null aGivenProto which is the
    1079             :   // same as canonicalProto.
    1080           0 :   if (proto != canonicalProto) {
    1081           0 :     PreserveWrapper(aObject);
    1082             :   }
    1083             : 
    1084           0 :   return true;
    1085             : }
    1086             : 
    1087             : const NativePropertyHooks sNativePropertyHooks[] = { {
    1088             :   nullptr,
    1089             :   nullptr,
    1090             :   nullptr,
    1091             :   { sNativeProperties.Upcast(), nullptr },
    1092             :   prototypes::id::XULTemplateBuilder,
    1093             :   constructors::id::XULTemplateBuilder,
    1094             :   nullptr,
    1095             :   &DefaultXrayExpandoObjectClass
    1096             : } };
    1097             : 
    1098             : void
    1099           0 : CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
    1100             : {
    1101           0 :   JS::Rooted<JSObject*> parentProto(aCx, JS::GetRealmObjectPrototype(aCx));
    1102           0 :   if (!parentProto) {
    1103           0 :     return;
    1104             :   }
    1105             : 
    1106           0 :   JS::Rooted<JSObject*> constructorProto(aCx, JS::GetRealmFunctionPrototype(aCx));
    1107           0 :   if (!constructorProto) {
    1108           0 :     return;
    1109             :   }
    1110             : 
    1111             :   static bool sIdsInited = false;
    1112           0 :   if (!sIdsInited && NS_IsMainThread()) {
    1113           0 :     if (!InitIds(aCx, sNativeProperties.Upcast())) {
    1114           0 :       return;
    1115             :     }
    1116           0 :     sIdsInited = true;
    1117             :   }
    1118             : 
    1119           0 :   JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::XULTemplateBuilder);
    1120           0 :   JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::XULTemplateBuilder);
    1121           0 :   dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
    1122             :                               &sPrototypeClass.mBase, protoCache,
    1123             :                               constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
    1124             :                               interfaceCache,
    1125             :                               sNativeProperties.Upcast(),
    1126             :                               nullptr,
    1127             :                               "XULTemplateBuilder", aDefineOnGlobal,
    1128             :                               nullptr,
    1129           0 :                               false);
    1130             : }
    1131             : 
    1132             : JS::Handle<JSObject*>
    1133           0 : GetProtoObjectHandle(JSContext* aCx)
    1134             : {
    1135             :   /* Get the interface prototype object for this class.  This will create the
    1136             :      object as needed. */
    1137           0 :   bool aDefineOnGlobal = true;
    1138             : 
    1139             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    1140           0 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    1141           0 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    1142           0 :     return nullptr;
    1143             :   }
    1144             : 
    1145             :   /* Check to see whether the interface objects are already installed */
    1146           0 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    1147           0 :   if (!protoAndIfaceCache.HasEntryInSlot(prototypes::id::XULTemplateBuilder)) {
    1148           0 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    1149           0 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    1150             :   }
    1151             : 
    1152             :   /*
    1153             :    * The object might _still_ be null, but that's OK.
    1154             :    *
    1155             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    1156             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    1157             :    * changed after they have been set.
    1158             :    *
    1159             :    * Calling address() avoids the read read barrier that does gray
    1160             :    * unmarking, but it's not possible for the object to be gray here.
    1161             :    */
    1162             : 
    1163           0 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(prototypes::id::XULTemplateBuilder);
    1164           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    1165           0 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    1166             : }
    1167             : 
    1168             : JSObject*
    1169           0 : GetProtoObject(JSContext* aCx)
    1170             : {
    1171           0 :   return GetProtoObjectHandle(aCx);
    1172             : }
    1173             : 
    1174             : JS::Handle<JSObject*>
    1175           0 : GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
    1176             : {
    1177             :   /* Get the interface object for this class.  This will create the object as
    1178             :      needed. */
    1179             : 
    1180             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    1181           0 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    1182           0 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    1183           0 :     return nullptr;
    1184             :   }
    1185             : 
    1186             :   /* Check to see whether the interface objects are already installed */
    1187           0 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    1188           0 :   if (!protoAndIfaceCache.HasEntryInSlot(constructors::id::XULTemplateBuilder)) {
    1189           0 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    1190           0 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    1191             :   }
    1192             : 
    1193             :   /*
    1194             :    * The object might _still_ be null, but that's OK.
    1195             :    *
    1196             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    1197             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    1198             :    * changed after they have been set.
    1199             :    *
    1200             :    * Calling address() avoids the read read barrier that does gray
    1201             :    * unmarking, but it's not possible for the object to be gray here.
    1202             :    */
    1203             : 
    1204           0 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::XULTemplateBuilder);
    1205           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    1206           0 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    1207             : }
    1208             : 
    1209             : JSObject*
    1210           0 : GetConstructorObject(JSContext* aCx)
    1211             : {
    1212           0 :   return GetConstructorObjectHandle(aCx);
    1213             : }
    1214             : 
    1215             : } // namespace XULTemplateBuilderBinding
    1216             : 
    1217             : 
    1218             : 
    1219             : namespace XULTreeBuilderBinding {
    1220             : 
    1221             : static_assert(IsRefcounted<NativeType>::value == IsRefcounted<XULTemplateBuilderBinding::NativeType>::value,
    1222             :               "Can't inherit from an interface with a different ownership model.");
    1223             : 
    1224             : static bool
    1225           0 : getResourceAtIndex(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1226             : {
    1227           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    1228           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.getResourceAtIndex");
    1229             :   }
    1230             :   int32_t arg0;
    1231           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    1232           0 :     return false;
    1233             :   }
    1234           0 :   binding_detail::FastErrorResult rv;
    1235           0 :   auto result(StrongOrRawPtr<nsIRDFResource>(self->GetResourceAtIndex(arg0, rv)));
    1236           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1237           0 :     return false;
    1238             :   }
    1239           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1240           0 :   if (!result) {
    1241           0 :     args.rval().setNull();
    1242           0 :     return true;
    1243             :   }
    1244           0 :   if (!WrapObject(cx, result, &NS_GET_IID(nsIRDFResource), args.rval())) {
    1245           0 :     return false;
    1246             :   }
    1247           0 :   return true;
    1248             : }
    1249             : 
    1250             : static const JSJitInfo getResourceAtIndex_methodinfo = {
    1251             :   { (JSJitGetterOp)getResourceAtIndex },
    1252             :   { prototypes::id::XULTreeBuilder },
    1253             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1254             :   JSJitInfo::Method,
    1255             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1256             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
    1257             :   false,  /* isInfallible. False in setters. */
    1258             :   false,  /* isMovable.  Not relevant for setters. */
    1259             :   false, /* isEliminatable.  Not relevant for setters. */
    1260             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1261             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1262             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1263             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1264             : };
    1265             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1266             : static_assert(0 < 1, "There is no slot for us");
    1267             : 
    1268             : static bool
    1269           0 : getIndexOfResource(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1270             : {
    1271           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    1272           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.getIndexOfResource");
    1273             :   }
    1274             :   nsIRDFResource* arg0;
    1275           0 :   RefPtr<nsIRDFResource> arg0_holder;
    1276           0 :   if (args[0].isObject()) {
    1277           0 :     JS::Rooted<JSObject*> source(cx, &args[0].toObject());
    1278           0 :     if (NS_FAILED(UnwrapArg<nsIRDFResource>(cx, source, getter_AddRefs(arg0_holder)))) {
    1279           0 :       ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of XULTreeBuilder.getIndexOfResource", "MozRDFResource");
    1280           0 :       return false;
    1281             :     }
    1282           0 :     MOZ_ASSERT(arg0_holder);
    1283           0 :     arg0 = arg0_holder;
    1284             :   } else {
    1285           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTreeBuilder.getIndexOfResource");
    1286           0 :     return false;
    1287             :   }
    1288           0 :   binding_detail::FastErrorResult rv;
    1289           0 :   int32_t result(self->GetIndexOfResource(NonNullHelper(arg0), rv));
    1290           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1291           0 :     return false;
    1292             :   }
    1293           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1294           0 :   args.rval().setInt32(int32_t(result));
    1295           0 :   return true;
    1296             : }
    1297             : 
    1298             : static const JSJitInfo getIndexOfResource_methodinfo = {
    1299             :   { (JSJitGetterOp)getIndexOfResource },
    1300             :   { prototypes::id::XULTreeBuilder },
    1301             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1302             :   JSJitInfo::Method,
    1303             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1304             :   JSVAL_TYPE_INT32,  /* returnType.  Not relevant for setters. */
    1305             :   false,  /* isInfallible. False in setters. */
    1306             :   false,  /* isMovable.  Not relevant for setters. */
    1307             :   false, /* isEliminatable.  Not relevant for setters. */
    1308             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1309             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1310             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1311             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1312             : };
    1313             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1314             : static_assert(0 < 1, "There is no slot for us");
    1315             : 
    1316             : static bool
    1317           0 : addObserver(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1318             : {
    1319           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    1320           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.addObserver");
    1321             :   }
    1322           0 :   RootedCallback<OwningNonNull<binding_detail::FastXULTreeBuilderObserver>> arg0(cx);
    1323           0 :   if (args[0].isObject()) {
    1324             :     { // scope for tempRoot
    1325           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
    1326           0 :       arg0 = new binding_detail::FastXULTreeBuilderObserver(tempRoot);
    1327             :     }
    1328             :   } else {
    1329           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTreeBuilder.addObserver");
    1330           0 :     return false;
    1331             :   }
    1332           0 :   self->AddObserver(NonNullHelper(arg0));
    1333           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1334           0 :   args.rval().setUndefined();
    1335           0 :   return true;
    1336             : }
    1337             : 
    1338             : static const JSJitInfo addObserver_methodinfo = {
    1339             :   { (JSJitGetterOp)addObserver },
    1340             :   { prototypes::id::XULTreeBuilder },
    1341             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1342             :   JSJitInfo::Method,
    1343             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1344             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1345             :   false,  /* isInfallible. False in setters. */
    1346             :   false,  /* isMovable.  Not relevant for setters. */
    1347             :   false, /* isEliminatable.  Not relevant for setters. */
    1348             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1349             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1350             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1351             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1352             : };
    1353             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1354             : static_assert(0 < 1, "There is no slot for us");
    1355             : 
    1356             : static bool
    1357           0 : removeObserver(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1358             : {
    1359           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    1360           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.removeObserver");
    1361             :   }
    1362           0 :   RootedCallback<OwningNonNull<binding_detail::FastXULTreeBuilderObserver>> arg0(cx);
    1363           0 :   if (args[0].isObject()) {
    1364             :     { // scope for tempRoot
    1365           0 :       JS::Rooted<JSObject*> tempRoot(cx, &args[0].toObject());
    1366           0 :       arg0 = new binding_detail::FastXULTreeBuilderObserver(tempRoot);
    1367             :     }
    1368             :   } else {
    1369           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTreeBuilder.removeObserver");
    1370           0 :     return false;
    1371             :   }
    1372           0 :   self->RemoveObserver(NonNullHelper(arg0));
    1373           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1374           0 :   args.rval().setUndefined();
    1375           0 :   return true;
    1376             : }
    1377             : 
    1378             : static const JSJitInfo removeObserver_methodinfo = {
    1379             :   { (JSJitGetterOp)removeObserver },
    1380             :   { prototypes::id::XULTreeBuilder },
    1381             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1382             :   JSJitInfo::Method,
    1383             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1384             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1385             :   false,  /* isInfallible. False in setters. */
    1386             :   false,  /* isMovable.  Not relevant for setters. */
    1387             :   false, /* isEliminatable.  Not relevant for setters. */
    1388             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1389             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1390             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1391             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1392             : };
    1393             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1394             : static_assert(0 < 1, "There is no slot for us");
    1395             : 
    1396             : static bool
    1397           0 : sort(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1398             : {
    1399           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    1400           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.sort");
    1401             :   }
    1402           0 :   NonNull<mozilla::dom::Element> arg0;
    1403           0 :   if (args[0].isObject()) {
    1404             :     {
    1405           0 :       nsresult rv = UnwrapObject<prototypes::id::Element, mozilla::dom::Element>(args[0], arg0);
    1406           0 :       if (NS_FAILED(rv)) {
    1407           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of XULTreeBuilder.sort", "Element");
    1408           0 :         return false;
    1409             :       }
    1410             :     }
    1411             :   } else {
    1412           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTreeBuilder.sort");
    1413           0 :     return false;
    1414             :   }
    1415           0 :   self->Sort(NonNullHelper(arg0));
    1416           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1417           0 :   args.rval().setUndefined();
    1418           0 :   return true;
    1419             : }
    1420             : 
    1421             : static const JSJitInfo sort_methodinfo = {
    1422             :   { (JSJitGetterOp)sort },
    1423             :   { prototypes::id::XULTreeBuilder },
    1424             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1425             :   JSJitInfo::Method,
    1426             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1427             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1428             :   false,  /* isInfallible. False in setters. */
    1429             :   false,  /* isMovable.  Not relevant for setters. */
    1430             :   false, /* isEliminatable.  Not relevant for setters. */
    1431             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1432             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1433             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1434             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1435             : };
    1436             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1437             : static_assert(0 < 1, "There is no slot for us");
    1438             : 
    1439             : static bool
    1440           0 : get_rowCount(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, JSJitGetterCallArgs args)
    1441             : {
    1442           0 :   int32_t result(self->RowCount());
    1443           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1444           0 :   args.rval().setInt32(int32_t(result));
    1445           0 :   return true;
    1446             : }
    1447             : 
    1448             : static const JSJitInfo rowCount_getterinfo = {
    1449             :   { (JSJitGetterOp)get_rowCount },
    1450             :   { prototypes::id::XULTreeBuilder },
    1451             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1452             :   JSJitInfo::Getter,
    1453             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1454             :   JSVAL_TYPE_INT32,  /* returnType.  Not relevant for setters. */
    1455             :   true,  /* isInfallible. False in setters. */
    1456             :   false,  /* isMovable.  Not relevant for setters. */
    1457             :   false, /* isEliminatable.  Not relevant for setters. */
    1458             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1459             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1460             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1461             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1462             : };
    1463             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1464             : static_assert(0 < 1, "There is no slot for us");
    1465             : 
    1466             : static bool
    1467           0 : get_selection(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, JSJitGetterCallArgs args)
    1468             : {
    1469           0 :   auto result(StrongOrRawPtr<nsITreeSelection>(self->GetSelection()));
    1470           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1471           0 :   if (!result) {
    1472           0 :     args.rval().setNull();
    1473           0 :     return true;
    1474             :   }
    1475           0 :   if (!WrapObject(cx, result, &NS_GET_IID(nsITreeSelection), args.rval())) {
    1476           0 :     return false;
    1477             :   }
    1478           0 :   return true;
    1479             : }
    1480             : 
    1481             : static bool
    1482           0 : set_selection(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, JSJitSetterCallArgs args)
    1483             : {
    1484             :   nsITreeSelection* arg0;
    1485           0 :   RefPtr<nsITreeSelection> arg0_holder;
    1486           0 :   if (args[0].isObject()) {
    1487           0 :     JS::Rooted<JSObject*> source(cx, &args[0].toObject());
    1488           0 :     if (NS_FAILED(UnwrapArg<nsITreeSelection>(cx, source, getter_AddRefs(arg0_holder)))) {
    1489           0 :       ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Value being assigned to XULTreeBuilder.selection", "nsITreeSelection");
    1490           0 :       return false;
    1491             :     }
    1492           0 :     MOZ_ASSERT(arg0_holder);
    1493           0 :     arg0 = arg0_holder;
    1494           0 :   } else if (args[0].isNullOrUndefined()) {
    1495           0 :     arg0 = nullptr;
    1496             :   } else {
    1497           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Value being assigned to XULTreeBuilder.selection");
    1498           0 :     return false;
    1499             :   }
    1500           0 :   binding_detail::FastErrorResult rv;
    1501           0 :   self->SetSelection(Constify(arg0), rv);
    1502           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1503           0 :     return false;
    1504             :   }
    1505           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1506             : 
    1507           0 :   return true;
    1508             : }
    1509             : 
    1510             : static const JSJitInfo selection_getterinfo = {
    1511             :   { (JSJitGetterOp)get_selection },
    1512             :   { prototypes::id::XULTreeBuilder },
    1513             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1514             :   JSJitInfo::Getter,
    1515             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1516             :   JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
    1517             :   false,  /* isInfallible. False in setters. */
    1518             :   false,  /* isMovable.  Not relevant for setters. */
    1519             :   false, /* isEliminatable.  Not relevant for setters. */
    1520             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1521             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1522             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1523             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1524             : };
    1525             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1526             : static_assert(0 < 1, "There is no slot for us");
    1527             : static const JSJitInfo selection_setterinfo = {
    1528             :   { (JSJitGetterOp)set_selection },
    1529             :   { prototypes::id::XULTreeBuilder },
    1530             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1531             :   JSJitInfo::Setter,
    1532             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1533             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1534             :   false,  /* isInfallible. False in setters. */
    1535             :   false,  /* isMovable.  Not relevant for setters. */
    1536             :   false, /* isEliminatable.  Not relevant for setters. */
    1537             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1538             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1539             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1540             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1541             : };
    1542             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1543             : static_assert(0 < 1, "There is no slot for us");
    1544             : 
    1545             : static bool
    1546           0 : getRowProperties(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1547             : {
    1548           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    1549           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.getRowProperties");
    1550             :   }
    1551             :   int32_t arg0;
    1552           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    1553           0 :     return false;
    1554             :   }
    1555           0 :   binding_detail::FastErrorResult rv;
    1556           0 :   DOMString result;
    1557           0 :   self->GetRowProperties(arg0, result, rv);
    1558           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1559           0 :     return false;
    1560             :   }
    1561           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1562           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    1563           0 :     return false;
    1564             :   }
    1565           0 :   return true;
    1566             : }
    1567             : 
    1568             : static const JSJitInfo getRowProperties_methodinfo = {
    1569             :   { (JSJitGetterOp)getRowProperties },
    1570             :   { prototypes::id::XULTreeBuilder },
    1571             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1572             :   JSJitInfo::Method,
    1573             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1574             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
    1575             :   false,  /* isInfallible. False in setters. */
    1576             :   false,  /* isMovable.  Not relevant for setters. */
    1577             :   false, /* isEliminatable.  Not relevant for setters. */
    1578             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1579             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1580             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1581             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1582             : };
    1583             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1584             : static_assert(0 < 1, "There is no slot for us");
    1585             : 
    1586             : static bool
    1587           0 : getCellProperties(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1588             : {
    1589           0 :   if (MOZ_UNLIKELY(args.length() < 2)) {
    1590           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.getCellProperties");
    1591             :   }
    1592             :   int32_t arg0;
    1593           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    1594           0 :     return false;
    1595             :   }
    1596           0 :   NonNull<nsTreeColumn> arg1;
    1597           0 :   if (args[1].isObject()) {
    1598             :     {
    1599           0 :       nsresult rv = UnwrapObject<prototypes::id::TreeColumn, nsTreeColumn>(args[1], arg1);
    1600           0 :       if (NS_FAILED(rv)) {
    1601           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of XULTreeBuilder.getCellProperties", "TreeColumn");
    1602           0 :         return false;
    1603             :       }
    1604             :     }
    1605             :   } else {
    1606           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of XULTreeBuilder.getCellProperties");
    1607           0 :     return false;
    1608             :   }
    1609           0 :   binding_detail::FastErrorResult rv;
    1610           0 :   DOMString result;
    1611           0 :   self->GetCellProperties(arg0, NonNullHelper(arg1), result, rv);
    1612           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1613           0 :     return false;
    1614             :   }
    1615           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1616           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    1617           0 :     return false;
    1618             :   }
    1619           0 :   return true;
    1620             : }
    1621             : 
    1622             : static const JSJitInfo getCellProperties_methodinfo = {
    1623             :   { (JSJitGetterOp)getCellProperties },
    1624             :   { prototypes::id::XULTreeBuilder },
    1625             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1626             :   JSJitInfo::Method,
    1627             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1628             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
    1629             :   false,  /* isInfallible. False in setters. */
    1630             :   false,  /* isMovable.  Not relevant for setters. */
    1631             :   false, /* isEliminatable.  Not relevant for setters. */
    1632             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1633             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1634             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1635             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1636             : };
    1637             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1638             : static_assert(0 < 1, "There is no slot for us");
    1639             : 
    1640             : static bool
    1641           0 : getColumnProperties(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1642             : {
    1643           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    1644           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.getColumnProperties");
    1645             :   }
    1646           0 :   NonNull<nsTreeColumn> arg0;
    1647           0 :   if (args[0].isObject()) {
    1648             :     {
    1649           0 :       nsresult rv = UnwrapObject<prototypes::id::TreeColumn, nsTreeColumn>(args[0], arg0);
    1650           0 :       if (NS_FAILED(rv)) {
    1651           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of XULTreeBuilder.getColumnProperties", "TreeColumn");
    1652           0 :         return false;
    1653             :       }
    1654             :     }
    1655             :   } else {
    1656           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTreeBuilder.getColumnProperties");
    1657           0 :     return false;
    1658             :   }
    1659           0 :   DOMString result;
    1660           0 :   self->GetColumnProperties(NonNullHelper(arg0), result);
    1661           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1662           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    1663           0 :     return false;
    1664             :   }
    1665           0 :   return true;
    1666             : }
    1667             : 
    1668             : static const JSJitInfo getColumnProperties_methodinfo = {
    1669             :   { (JSJitGetterOp)getColumnProperties },
    1670             :   { prototypes::id::XULTreeBuilder },
    1671             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1672             :   JSJitInfo::Method,
    1673             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1674             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
    1675             :   false,  /* isInfallible. False in setters. */
    1676             :   false,  /* isMovable.  Not relevant for setters. */
    1677             :   false, /* isEliminatable.  Not relevant for setters. */
    1678             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1679             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1680             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1681             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1682             : };
    1683             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1684             : static_assert(0 < 1, "There is no slot for us");
    1685             : 
    1686             : static bool
    1687           0 : isContainer(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1688             : {
    1689           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    1690           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.isContainer");
    1691             :   }
    1692             :   int32_t arg0;
    1693           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    1694           0 :     return false;
    1695             :   }
    1696           0 :   binding_detail::FastErrorResult rv;
    1697           0 :   bool result(self->IsContainer(arg0, rv));
    1698           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1699           0 :     return false;
    1700             :   }
    1701           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1702           0 :   args.rval().setBoolean(result);
    1703           0 :   return true;
    1704             : }
    1705             : 
    1706             : static const JSJitInfo isContainer_methodinfo = {
    1707             :   { (JSJitGetterOp)isContainer },
    1708             :   { prototypes::id::XULTreeBuilder },
    1709             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1710             :   JSJitInfo::Method,
    1711             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1712             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    1713             :   false,  /* isInfallible. False in setters. */
    1714             :   false,  /* isMovable.  Not relevant for setters. */
    1715             :   false, /* isEliminatable.  Not relevant for setters. */
    1716             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1717             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1718             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1719             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1720             : };
    1721             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1722             : static_assert(0 < 1, "There is no slot for us");
    1723             : 
    1724             : static bool
    1725           0 : isContainerOpen(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1726             : {
    1727           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    1728           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.isContainerOpen");
    1729             :   }
    1730             :   int32_t arg0;
    1731           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    1732           0 :     return false;
    1733             :   }
    1734           0 :   binding_detail::FastErrorResult rv;
    1735           0 :   bool result(self->IsContainerOpen(arg0, rv));
    1736           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1737           0 :     return false;
    1738             :   }
    1739           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1740           0 :   args.rval().setBoolean(result);
    1741           0 :   return true;
    1742             : }
    1743             : 
    1744             : static const JSJitInfo isContainerOpen_methodinfo = {
    1745             :   { (JSJitGetterOp)isContainerOpen },
    1746             :   { prototypes::id::XULTreeBuilder },
    1747             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1748             :   JSJitInfo::Method,
    1749             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1750             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    1751             :   false,  /* isInfallible. False in setters. */
    1752             :   false,  /* isMovable.  Not relevant for setters. */
    1753             :   false, /* isEliminatable.  Not relevant for setters. */
    1754             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1755             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1756             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1757             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1758             : };
    1759             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1760             : static_assert(0 < 1, "There is no slot for us");
    1761             : 
    1762             : static bool
    1763           0 : isContainerEmpty(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1764             : {
    1765           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    1766           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.isContainerEmpty");
    1767             :   }
    1768             :   int32_t arg0;
    1769           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    1770           0 :     return false;
    1771             :   }
    1772           0 :   binding_detail::FastErrorResult rv;
    1773           0 :   bool result(self->IsContainerEmpty(arg0, rv));
    1774           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1775           0 :     return false;
    1776             :   }
    1777           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1778           0 :   args.rval().setBoolean(result);
    1779           0 :   return true;
    1780             : }
    1781             : 
    1782             : static const JSJitInfo isContainerEmpty_methodinfo = {
    1783             :   { (JSJitGetterOp)isContainerEmpty },
    1784             :   { prototypes::id::XULTreeBuilder },
    1785             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1786             :   JSJitInfo::Method,
    1787             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1788             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    1789             :   false,  /* isInfallible. False in setters. */
    1790             :   false,  /* isMovable.  Not relevant for setters. */
    1791             :   false, /* isEliminatable.  Not relevant for setters. */
    1792             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1793             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1794             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1795             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1796             : };
    1797             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1798             : static_assert(0 < 1, "There is no slot for us");
    1799             : 
    1800             : static bool
    1801           0 : isSeparator(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1802             : {
    1803           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    1804           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.isSeparator");
    1805             :   }
    1806             :   int32_t arg0;
    1807           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    1808           0 :     return false;
    1809             :   }
    1810           0 :   binding_detail::FastErrorResult rv;
    1811           0 :   bool result(self->IsSeparator(arg0, rv));
    1812           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1813           0 :     return false;
    1814             :   }
    1815           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1816           0 :   args.rval().setBoolean(result);
    1817           0 :   return true;
    1818             : }
    1819             : 
    1820             : static const JSJitInfo isSeparator_methodinfo = {
    1821             :   { (JSJitGetterOp)isSeparator },
    1822             :   { prototypes::id::XULTreeBuilder },
    1823             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1824             :   JSJitInfo::Method,
    1825             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1826             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    1827             :   false,  /* isInfallible. False in setters. */
    1828             :   false,  /* isMovable.  Not relevant for setters. */
    1829             :   false, /* isEliminatable.  Not relevant for setters. */
    1830             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1831             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1832             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1833             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1834             : };
    1835             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1836             : static_assert(0 < 1, "There is no slot for us");
    1837             : 
    1838             : static bool
    1839           0 : isSorted(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1840             : {
    1841           0 :   bool result(self->IsSorted());
    1842           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1843           0 :   args.rval().setBoolean(result);
    1844           0 :   return true;
    1845             : }
    1846             : 
    1847             : static const JSJitInfo isSorted_methodinfo = {
    1848             :   { (JSJitGetterOp)isSorted },
    1849             :   { prototypes::id::XULTreeBuilder },
    1850             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1851             :   JSJitInfo::Method,
    1852             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1853             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    1854             :   true,  /* isInfallible. False in setters. */
    1855             :   false,  /* isMovable.  Not relevant for setters. */
    1856             :   false, /* isEliminatable.  Not relevant for setters. */
    1857             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1858             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1859             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1860             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1861             : };
    1862             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1863             : static_assert(0 < 1, "There is no slot for us");
    1864             : 
    1865             : static bool
    1866           0 : canDrop(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1867             : {
    1868           0 :   if (MOZ_UNLIKELY(args.length() < 3)) {
    1869           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.canDrop");
    1870             :   }
    1871             :   int32_t arg0;
    1872           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    1873           0 :     return false;
    1874             :   }
    1875             :   int32_t arg1;
    1876           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[1], &arg1)) {
    1877           0 :     return false;
    1878             :   }
    1879             :   mozilla::dom::DataTransfer* arg2;
    1880           0 :   if (args[2].isObject()) {
    1881             :     {
    1882           0 :       nsresult rv = UnwrapObject<prototypes::id::DataTransfer, mozilla::dom::DataTransfer>(args[2], arg2);
    1883           0 :       if (NS_FAILED(rv)) {
    1884           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 3 of XULTreeBuilder.canDrop", "DataTransfer");
    1885           0 :         return false;
    1886             :       }
    1887             :     }
    1888           0 :   } else if (args[2].isNullOrUndefined()) {
    1889           0 :     arg2 = nullptr;
    1890             :   } else {
    1891           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 3 of XULTreeBuilder.canDrop");
    1892           0 :     return false;
    1893             :   }
    1894           0 :   binding_detail::FastErrorResult rv;
    1895           0 :   bool result(self->CanDrop(arg0, arg1, Constify(arg2), rv));
    1896           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1897           0 :     return false;
    1898             :   }
    1899           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1900           0 :   args.rval().setBoolean(result);
    1901           0 :   return true;
    1902             : }
    1903             : 
    1904             : static const JSJitInfo canDrop_methodinfo = {
    1905             :   { (JSJitGetterOp)canDrop },
    1906             :   { prototypes::id::XULTreeBuilder },
    1907             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1908             :   JSJitInfo::Method,
    1909             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1910             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    1911             :   false,  /* isInfallible. False in setters. */
    1912             :   false,  /* isMovable.  Not relevant for setters. */
    1913             :   false, /* isEliminatable.  Not relevant for setters. */
    1914             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1915             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1916             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1917             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1918             : };
    1919             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1920             : static_assert(0 < 1, "There is no slot for us");
    1921             : 
    1922             : static bool
    1923           0 : drop(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1924             : {
    1925           0 :   if (MOZ_UNLIKELY(args.length() < 3)) {
    1926           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.drop");
    1927             :   }
    1928             :   int32_t arg0;
    1929           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    1930           0 :     return false;
    1931             :   }
    1932             :   int32_t arg1;
    1933           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[1], &arg1)) {
    1934           0 :     return false;
    1935             :   }
    1936             :   mozilla::dom::DataTransfer* arg2;
    1937           0 :   if (args[2].isObject()) {
    1938             :     {
    1939           0 :       nsresult rv = UnwrapObject<prototypes::id::DataTransfer, mozilla::dom::DataTransfer>(args[2], arg2);
    1940           0 :       if (NS_FAILED(rv)) {
    1941           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 3 of XULTreeBuilder.drop", "DataTransfer");
    1942           0 :         return false;
    1943             :       }
    1944             :     }
    1945           0 :   } else if (args[2].isNullOrUndefined()) {
    1946           0 :     arg2 = nullptr;
    1947             :   } else {
    1948           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 3 of XULTreeBuilder.drop");
    1949           0 :     return false;
    1950             :   }
    1951           0 :   binding_detail::FastErrorResult rv;
    1952           0 :   self->Drop(arg0, arg1, Constify(arg2), rv);
    1953           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1954           0 :     return false;
    1955             :   }
    1956           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1957           0 :   args.rval().setUndefined();
    1958           0 :   return true;
    1959             : }
    1960             : 
    1961             : static const JSJitInfo drop_methodinfo = {
    1962             :   { (JSJitGetterOp)drop },
    1963             :   { prototypes::id::XULTreeBuilder },
    1964             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    1965             :   JSJitInfo::Method,
    1966             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    1967             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    1968             :   false,  /* isInfallible. False in setters. */
    1969             :   false,  /* isMovable.  Not relevant for setters. */
    1970             :   false, /* isEliminatable.  Not relevant for setters. */
    1971             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    1972             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    1973             :   false,  /* isTypedMethod.  Only relevant for methods. */
    1974             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    1975             : };
    1976             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    1977             : static_assert(0 < 1, "There is no slot for us");
    1978             : 
    1979             : static bool
    1980           0 : getParentIndex(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    1981             : {
    1982           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    1983           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.getParentIndex");
    1984             :   }
    1985             :   int32_t arg0;
    1986           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    1987           0 :     return false;
    1988             :   }
    1989           0 :   binding_detail::FastErrorResult rv;
    1990           0 :   int32_t result(self->GetParentIndex(arg0, rv));
    1991           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    1992           0 :     return false;
    1993             :   }
    1994           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    1995           0 :   args.rval().setInt32(int32_t(result));
    1996           0 :   return true;
    1997             : }
    1998             : 
    1999             : static const JSJitInfo getParentIndex_methodinfo = {
    2000             :   { (JSJitGetterOp)getParentIndex },
    2001             :   { prototypes::id::XULTreeBuilder },
    2002             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2003             :   JSJitInfo::Method,
    2004             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2005             :   JSVAL_TYPE_INT32,  /* returnType.  Not relevant for setters. */
    2006             :   false,  /* isInfallible. False in setters. */
    2007             :   false,  /* isMovable.  Not relevant for setters. */
    2008             :   false, /* isEliminatable.  Not relevant for setters. */
    2009             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2010             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2011             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2012             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2013             : };
    2014             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2015             : static_assert(0 < 1, "There is no slot for us");
    2016             : 
    2017             : static bool
    2018           0 : hasNextSibling(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2019             : {
    2020           0 :   if (MOZ_UNLIKELY(args.length() < 2)) {
    2021           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.hasNextSibling");
    2022             :   }
    2023             :   int32_t arg0;
    2024           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    2025           0 :     return false;
    2026             :   }
    2027             :   int32_t arg1;
    2028           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[1], &arg1)) {
    2029           0 :     return false;
    2030             :   }
    2031           0 :   binding_detail::FastErrorResult rv;
    2032           0 :   bool result(self->HasNextSibling(arg0, arg1, rv));
    2033           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2034           0 :     return false;
    2035             :   }
    2036           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2037           0 :   args.rval().setBoolean(result);
    2038           0 :   return true;
    2039             : }
    2040             : 
    2041             : static const JSJitInfo hasNextSibling_methodinfo = {
    2042             :   { (JSJitGetterOp)hasNextSibling },
    2043             :   { prototypes::id::XULTreeBuilder },
    2044             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2045             :   JSJitInfo::Method,
    2046             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2047             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    2048             :   false,  /* isInfallible. False in setters. */
    2049             :   false,  /* isMovable.  Not relevant for setters. */
    2050             :   false, /* isEliminatable.  Not relevant for setters. */
    2051             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2052             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2053             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2054             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2055             : };
    2056             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2057             : static_assert(0 < 1, "There is no slot for us");
    2058             : 
    2059             : static bool
    2060           0 : getLevel(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2061             : {
    2062           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    2063           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.getLevel");
    2064             :   }
    2065             :   int32_t arg0;
    2066           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    2067           0 :     return false;
    2068             :   }
    2069           0 :   binding_detail::FastErrorResult rv;
    2070           0 :   int32_t result(self->GetLevel(arg0, rv));
    2071           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2072           0 :     return false;
    2073             :   }
    2074           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2075           0 :   args.rval().setInt32(int32_t(result));
    2076           0 :   return true;
    2077             : }
    2078             : 
    2079             : static const JSJitInfo getLevel_methodinfo = {
    2080             :   { (JSJitGetterOp)getLevel },
    2081             :   { prototypes::id::XULTreeBuilder },
    2082             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2083             :   JSJitInfo::Method,
    2084             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2085             :   JSVAL_TYPE_INT32,  /* returnType.  Not relevant for setters. */
    2086             :   false,  /* isInfallible. False in setters. */
    2087             :   false,  /* isMovable.  Not relevant for setters. */
    2088             :   false, /* isEliminatable.  Not relevant for setters. */
    2089             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2090             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2091             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2092             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2093             : };
    2094             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2095             : static_assert(0 < 1, "There is no slot for us");
    2096             : 
    2097             : static bool
    2098           0 : getImageSrc(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2099             : {
    2100           0 :   if (MOZ_UNLIKELY(args.length() < 2)) {
    2101           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.getImageSrc");
    2102             :   }
    2103             :   int32_t arg0;
    2104           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    2105           0 :     return false;
    2106             :   }
    2107           0 :   NonNull<nsTreeColumn> arg1;
    2108           0 :   if (args[1].isObject()) {
    2109             :     {
    2110           0 :       nsresult rv = UnwrapObject<prototypes::id::TreeColumn, nsTreeColumn>(args[1], arg1);
    2111           0 :       if (NS_FAILED(rv)) {
    2112           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of XULTreeBuilder.getImageSrc", "TreeColumn");
    2113           0 :         return false;
    2114             :       }
    2115             :     }
    2116             :   } else {
    2117           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of XULTreeBuilder.getImageSrc");
    2118           0 :     return false;
    2119             :   }
    2120           0 :   binding_detail::FastErrorResult rv;
    2121           0 :   DOMString result;
    2122           0 :   self->GetImageSrc(arg0, NonNullHelper(arg1), result, rv);
    2123           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2124           0 :     return false;
    2125             :   }
    2126           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2127           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    2128           0 :     return false;
    2129             :   }
    2130           0 :   return true;
    2131             : }
    2132             : 
    2133             : static const JSJitInfo getImageSrc_methodinfo = {
    2134             :   { (JSJitGetterOp)getImageSrc },
    2135             :   { prototypes::id::XULTreeBuilder },
    2136             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2137             :   JSJitInfo::Method,
    2138             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2139             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
    2140             :   false,  /* isInfallible. False in setters. */
    2141             :   false,  /* isMovable.  Not relevant for setters. */
    2142             :   false, /* isEliminatable.  Not relevant for setters. */
    2143             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2144             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2145             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2146             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2147             : };
    2148             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2149             : static_assert(0 < 1, "There is no slot for us");
    2150             : 
    2151             : static bool
    2152           0 : getProgressMode(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2153             : {
    2154           0 :   if (MOZ_UNLIKELY(args.length() < 2)) {
    2155           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.getProgressMode");
    2156             :   }
    2157             :   int32_t arg0;
    2158           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    2159           0 :     return false;
    2160             :   }
    2161           0 :   NonNull<nsTreeColumn> arg1;
    2162           0 :   if (args[1].isObject()) {
    2163             :     {
    2164           0 :       nsresult rv = UnwrapObject<prototypes::id::TreeColumn, nsTreeColumn>(args[1], arg1);
    2165           0 :       if (NS_FAILED(rv)) {
    2166           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of XULTreeBuilder.getProgressMode", "TreeColumn");
    2167           0 :         return false;
    2168             :       }
    2169             :     }
    2170             :   } else {
    2171           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of XULTreeBuilder.getProgressMode");
    2172           0 :     return false;
    2173             :   }
    2174           0 :   binding_detail::FastErrorResult rv;
    2175           0 :   int32_t result(self->GetProgressMode(arg0, NonNullHelper(arg1), rv));
    2176           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2177           0 :     return false;
    2178             :   }
    2179           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2180           0 :   args.rval().setInt32(int32_t(result));
    2181           0 :   return true;
    2182             : }
    2183             : 
    2184             : static const JSJitInfo getProgressMode_methodinfo = {
    2185             :   { (JSJitGetterOp)getProgressMode },
    2186             :   { prototypes::id::XULTreeBuilder },
    2187             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2188             :   JSJitInfo::Method,
    2189             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2190             :   JSVAL_TYPE_INT32,  /* returnType.  Not relevant for setters. */
    2191             :   false,  /* isInfallible. False in setters. */
    2192             :   false,  /* isMovable.  Not relevant for setters. */
    2193             :   false, /* isEliminatable.  Not relevant for setters. */
    2194             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2195             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2196             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2197             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2198             : };
    2199             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2200             : static_assert(0 < 1, "There is no slot for us");
    2201             : 
    2202             : static bool
    2203           0 : getCellValue(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2204             : {
    2205           0 :   if (MOZ_UNLIKELY(args.length() < 2)) {
    2206           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.getCellValue");
    2207             :   }
    2208             :   int32_t arg0;
    2209           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    2210           0 :     return false;
    2211             :   }
    2212           0 :   NonNull<nsTreeColumn> arg1;
    2213           0 :   if (args[1].isObject()) {
    2214             :     {
    2215           0 :       nsresult rv = UnwrapObject<prototypes::id::TreeColumn, nsTreeColumn>(args[1], arg1);
    2216           0 :       if (NS_FAILED(rv)) {
    2217           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of XULTreeBuilder.getCellValue", "TreeColumn");
    2218           0 :         return false;
    2219             :       }
    2220             :     }
    2221             :   } else {
    2222           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of XULTreeBuilder.getCellValue");
    2223           0 :     return false;
    2224             :   }
    2225           0 :   binding_detail::FastErrorResult rv;
    2226           0 :   DOMString result;
    2227           0 :   self->GetCellValue(arg0, NonNullHelper(arg1), result, rv);
    2228           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2229           0 :     return false;
    2230             :   }
    2231           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2232           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    2233           0 :     return false;
    2234             :   }
    2235           0 :   return true;
    2236             : }
    2237             : 
    2238             : static const JSJitInfo getCellValue_methodinfo = {
    2239             :   { (JSJitGetterOp)getCellValue },
    2240             :   { prototypes::id::XULTreeBuilder },
    2241             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2242             :   JSJitInfo::Method,
    2243             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2244             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
    2245             :   false,  /* isInfallible. False in setters. */
    2246             :   false,  /* isMovable.  Not relevant for setters. */
    2247             :   false, /* isEliminatable.  Not relevant for setters. */
    2248             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2249             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2250             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2251             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2252             : };
    2253             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2254             : static_assert(0 < 1, "There is no slot for us");
    2255             : 
    2256             : static bool
    2257           0 : getCellText(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2258             : {
    2259           0 :   if (MOZ_UNLIKELY(args.length() < 2)) {
    2260           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.getCellText");
    2261             :   }
    2262             :   int32_t arg0;
    2263           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    2264           0 :     return false;
    2265             :   }
    2266           0 :   NonNull<nsTreeColumn> arg1;
    2267           0 :   if (args[1].isObject()) {
    2268             :     {
    2269           0 :       nsresult rv = UnwrapObject<prototypes::id::TreeColumn, nsTreeColumn>(args[1], arg1);
    2270           0 :       if (NS_FAILED(rv)) {
    2271           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of XULTreeBuilder.getCellText", "TreeColumn");
    2272           0 :         return false;
    2273             :       }
    2274             :     }
    2275             :   } else {
    2276           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of XULTreeBuilder.getCellText");
    2277           0 :     return false;
    2278             :   }
    2279           0 :   binding_detail::FastErrorResult rv;
    2280           0 :   DOMString result;
    2281           0 :   self->GetCellText(arg0, NonNullHelper(arg1), result, rv);
    2282           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2283           0 :     return false;
    2284             :   }
    2285           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2286           0 :   if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
    2287           0 :     return false;
    2288             :   }
    2289           0 :   return true;
    2290             : }
    2291             : 
    2292             : static const JSJitInfo getCellText_methodinfo = {
    2293             :   { (JSJitGetterOp)getCellText },
    2294             :   { prototypes::id::XULTreeBuilder },
    2295             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2296             :   JSJitInfo::Method,
    2297             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2298             :   JSVAL_TYPE_STRING,  /* returnType.  Not relevant for setters. */
    2299             :   false,  /* isInfallible. False in setters. */
    2300             :   false,  /* isMovable.  Not relevant for setters. */
    2301             :   false, /* isEliminatable.  Not relevant for setters. */
    2302             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2303             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2304             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2305             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2306             : };
    2307             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2308             : static_assert(0 < 1, "There is no slot for us");
    2309             : 
    2310             : static bool
    2311           0 : setTree(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2312             : {
    2313           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    2314           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.setTree");
    2315             :   }
    2316             :   mozilla::dom::TreeBoxObject* arg0;
    2317           0 :   if (args[0].isObject()) {
    2318             :     {
    2319           0 :       nsresult rv = UnwrapObject<prototypes::id::TreeBoxObject, mozilla::dom::TreeBoxObject>(args[0], arg0);
    2320           0 :       if (NS_FAILED(rv)) {
    2321           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of XULTreeBuilder.setTree", "TreeBoxObject");
    2322           0 :         return false;
    2323             :       }
    2324             :     }
    2325           0 :   } else if (args[0].isNullOrUndefined()) {
    2326           0 :     arg0 = nullptr;
    2327             :   } else {
    2328           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTreeBuilder.setTree");
    2329           0 :     return false;
    2330             :   }
    2331           0 :   binding_detail::FastErrorResult rv;
    2332           0 :   self->SetTree(Constify(arg0), rv);
    2333           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2334           0 :     return false;
    2335             :   }
    2336           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2337           0 :   args.rval().setUndefined();
    2338           0 :   return true;
    2339             : }
    2340             : 
    2341             : static const JSJitInfo setTree_methodinfo = {
    2342             :   { (JSJitGetterOp)setTree },
    2343             :   { prototypes::id::XULTreeBuilder },
    2344             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2345             :   JSJitInfo::Method,
    2346             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2347             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2348             :   false,  /* isInfallible. False in setters. */
    2349             :   false,  /* isMovable.  Not relevant for setters. */
    2350             :   false, /* isEliminatable.  Not relevant for setters. */
    2351             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2352             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2353             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2354             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2355             : };
    2356             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2357             : static_assert(0 < 1, "There is no slot for us");
    2358             : 
    2359             : static bool
    2360           0 : toggleOpenState(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2361             : {
    2362           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    2363           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.toggleOpenState");
    2364             :   }
    2365             :   int32_t arg0;
    2366           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    2367           0 :     return false;
    2368             :   }
    2369           0 :   binding_detail::FastErrorResult rv;
    2370           0 :   self->ToggleOpenState(arg0, rv);
    2371           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2372           0 :     return false;
    2373             :   }
    2374           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2375           0 :   args.rval().setUndefined();
    2376           0 :   return true;
    2377             : }
    2378             : 
    2379             : static const JSJitInfo toggleOpenState_methodinfo = {
    2380             :   { (JSJitGetterOp)toggleOpenState },
    2381             :   { prototypes::id::XULTreeBuilder },
    2382             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2383             :   JSJitInfo::Method,
    2384             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2385             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2386             :   false,  /* isInfallible. False in setters. */
    2387             :   false,  /* isMovable.  Not relevant for setters. */
    2388             :   false, /* isEliminatable.  Not relevant for setters. */
    2389             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2390             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2391             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2392             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2393             : };
    2394             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2395             : static_assert(0 < 1, "There is no slot for us");
    2396             : 
    2397             : static bool
    2398           0 : cycleHeader(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2399             : {
    2400           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    2401           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.cycleHeader");
    2402             :   }
    2403           0 :   NonNull<nsTreeColumn> arg0;
    2404           0 :   if (args[0].isObject()) {
    2405             :     {
    2406           0 :       nsresult rv = UnwrapObject<prototypes::id::TreeColumn, nsTreeColumn>(args[0], arg0);
    2407           0 :       if (NS_FAILED(rv)) {
    2408           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 1 of XULTreeBuilder.cycleHeader", "TreeColumn");
    2409           0 :         return false;
    2410             :       }
    2411             :     }
    2412             :   } else {
    2413           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 1 of XULTreeBuilder.cycleHeader");
    2414           0 :     return false;
    2415             :   }
    2416           0 :   binding_detail::FastErrorResult rv;
    2417           0 :   self->CycleHeader(NonNullHelper(arg0), rv);
    2418           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2419           0 :     return false;
    2420             :   }
    2421           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2422           0 :   args.rval().setUndefined();
    2423           0 :   return true;
    2424             : }
    2425             : 
    2426             : static const JSJitInfo cycleHeader_methodinfo = {
    2427             :   { (JSJitGetterOp)cycleHeader },
    2428             :   { prototypes::id::XULTreeBuilder },
    2429             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2430             :   JSJitInfo::Method,
    2431             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2432             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2433             :   false,  /* isInfallible. False in setters. */
    2434             :   false,  /* isMovable.  Not relevant for setters. */
    2435             :   false, /* isEliminatable.  Not relevant for setters. */
    2436             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2437             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2438             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2439             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2440             : };
    2441             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2442             : static_assert(0 < 1, "There is no slot for us");
    2443             : 
    2444             : static bool
    2445           0 : selectionChanged(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2446             : {
    2447           0 :   self->SelectionChanged();
    2448           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2449           0 :   args.rval().setUndefined();
    2450           0 :   return true;
    2451             : }
    2452             : 
    2453             : static const JSJitInfo selectionChanged_methodinfo = {
    2454             :   { (JSJitGetterOp)selectionChanged },
    2455             :   { prototypes::id::XULTreeBuilder },
    2456             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2457             :   JSJitInfo::Method,
    2458             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2459             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2460             :   true,  /* isInfallible. False in setters. */
    2461             :   false,  /* isMovable.  Not relevant for setters. */
    2462             :   false, /* isEliminatable.  Not relevant for setters. */
    2463             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2464             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2465             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2466             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2467             : };
    2468             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2469             : static_assert(0 < 1, "There is no slot for us");
    2470             : 
    2471             : static bool
    2472           0 : cycleCell(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2473             : {
    2474           0 :   if (MOZ_UNLIKELY(args.length() < 2)) {
    2475           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.cycleCell");
    2476             :   }
    2477             :   int32_t arg0;
    2478           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    2479           0 :     return false;
    2480             :   }
    2481           0 :   NonNull<nsTreeColumn> arg1;
    2482           0 :   if (args[1].isObject()) {
    2483             :     {
    2484           0 :       nsresult rv = UnwrapObject<prototypes::id::TreeColumn, nsTreeColumn>(args[1], arg1);
    2485           0 :       if (NS_FAILED(rv)) {
    2486           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of XULTreeBuilder.cycleCell", "TreeColumn");
    2487           0 :         return false;
    2488             :       }
    2489             :     }
    2490             :   } else {
    2491           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of XULTreeBuilder.cycleCell");
    2492           0 :     return false;
    2493             :   }
    2494           0 :   self->CycleCell(arg0, NonNullHelper(arg1));
    2495           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2496           0 :   args.rval().setUndefined();
    2497           0 :   return true;
    2498             : }
    2499             : 
    2500             : static const JSJitInfo cycleCell_methodinfo = {
    2501             :   { (JSJitGetterOp)cycleCell },
    2502             :   { prototypes::id::XULTreeBuilder },
    2503             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2504             :   JSJitInfo::Method,
    2505             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2506             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2507             :   false,  /* isInfallible. False in setters. */
    2508             :   false,  /* isMovable.  Not relevant for setters. */
    2509             :   false, /* isEliminatable.  Not relevant for setters. */
    2510             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2511             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2512             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2513             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2514             : };
    2515             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2516             : static_assert(0 < 1, "There is no slot for us");
    2517             : 
    2518             : static bool
    2519           0 : isEditable(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2520             : {
    2521           0 :   if (MOZ_UNLIKELY(args.length() < 2)) {
    2522           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.isEditable");
    2523             :   }
    2524             :   int32_t arg0;
    2525           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    2526           0 :     return false;
    2527             :   }
    2528           0 :   NonNull<nsTreeColumn> arg1;
    2529           0 :   if (args[1].isObject()) {
    2530             :     {
    2531           0 :       nsresult rv = UnwrapObject<prototypes::id::TreeColumn, nsTreeColumn>(args[1], arg1);
    2532           0 :       if (NS_FAILED(rv)) {
    2533           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of XULTreeBuilder.isEditable", "TreeColumn");
    2534           0 :         return false;
    2535             :       }
    2536             :     }
    2537             :   } else {
    2538           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of XULTreeBuilder.isEditable");
    2539           0 :     return false;
    2540             :   }
    2541           0 :   binding_detail::FastErrorResult rv;
    2542           0 :   bool result(self->IsEditable(arg0, NonNullHelper(arg1), rv));
    2543           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2544           0 :     return false;
    2545             :   }
    2546           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2547           0 :   args.rval().setBoolean(result);
    2548           0 :   return true;
    2549             : }
    2550             : 
    2551             : static const JSJitInfo isEditable_methodinfo = {
    2552             :   { (JSJitGetterOp)isEditable },
    2553             :   { prototypes::id::XULTreeBuilder },
    2554             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2555             :   JSJitInfo::Method,
    2556             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2557             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    2558             :   false,  /* isInfallible. False in setters. */
    2559             :   false,  /* isMovable.  Not relevant for setters. */
    2560             :   false, /* isEliminatable.  Not relevant for setters. */
    2561             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2562             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2563             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2564             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2565             : };
    2566             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2567             : static_assert(0 < 1, "There is no slot for us");
    2568             : 
    2569             : static bool
    2570           0 : isSelectable(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2571             : {
    2572           0 :   if (MOZ_UNLIKELY(args.length() < 2)) {
    2573           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.isSelectable");
    2574             :   }
    2575             :   int32_t arg0;
    2576           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    2577           0 :     return false;
    2578             :   }
    2579           0 :   NonNull<nsTreeColumn> arg1;
    2580           0 :   if (args[1].isObject()) {
    2581             :     {
    2582           0 :       nsresult rv = UnwrapObject<prototypes::id::TreeColumn, nsTreeColumn>(args[1], arg1);
    2583           0 :       if (NS_FAILED(rv)) {
    2584           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of XULTreeBuilder.isSelectable", "TreeColumn");
    2585           0 :         return false;
    2586             :       }
    2587             :     }
    2588             :   } else {
    2589           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of XULTreeBuilder.isSelectable");
    2590           0 :     return false;
    2591             :   }
    2592           0 :   binding_detail::FastErrorResult rv;
    2593           0 :   bool result(self->IsSelectable(arg0, NonNullHelper(arg1), rv));
    2594           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2595           0 :     return false;
    2596             :   }
    2597           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2598           0 :   args.rval().setBoolean(result);
    2599           0 :   return true;
    2600             : }
    2601             : 
    2602             : static const JSJitInfo isSelectable_methodinfo = {
    2603             :   { (JSJitGetterOp)isSelectable },
    2604             :   { prototypes::id::XULTreeBuilder },
    2605             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2606             :   JSJitInfo::Method,
    2607             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2608             :   JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
    2609             :   false,  /* isInfallible. False in setters. */
    2610             :   false,  /* isMovable.  Not relevant for setters. */
    2611             :   false, /* isEliminatable.  Not relevant for setters. */
    2612             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2613             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2614             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2615             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2616             : };
    2617             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2618             : static_assert(0 < 1, "There is no slot for us");
    2619             : 
    2620             : static bool
    2621           0 : setCellValue(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2622             : {
    2623           0 :   if (MOZ_UNLIKELY(args.length() < 3)) {
    2624           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.setCellValue");
    2625             :   }
    2626             :   int32_t arg0;
    2627           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    2628           0 :     return false;
    2629             :   }
    2630           0 :   NonNull<nsTreeColumn> arg1;
    2631           0 :   if (args[1].isObject()) {
    2632             :     {
    2633           0 :       nsresult rv = UnwrapObject<prototypes::id::TreeColumn, nsTreeColumn>(args[1], arg1);
    2634           0 :       if (NS_FAILED(rv)) {
    2635           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of XULTreeBuilder.setCellValue", "TreeColumn");
    2636           0 :         return false;
    2637             :       }
    2638             :     }
    2639             :   } else {
    2640           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of XULTreeBuilder.setCellValue");
    2641           0 :     return false;
    2642             :   }
    2643           0 :   binding_detail::FakeString arg2;
    2644           0 :   if (!ConvertJSValueToString(cx, args[2], eStringify, eStringify, arg2)) {
    2645           0 :     return false;
    2646             :   }
    2647           0 :   binding_detail::FastErrorResult rv;
    2648           0 :   self->SetCellValue(arg0, NonNullHelper(arg1), NonNullHelper(Constify(arg2)), rv);
    2649           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2650           0 :     return false;
    2651             :   }
    2652           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2653           0 :   args.rval().setUndefined();
    2654           0 :   return true;
    2655             : }
    2656             : 
    2657             : static const JSJitInfo setCellValue_methodinfo = {
    2658             :   { (JSJitGetterOp)setCellValue },
    2659             :   { prototypes::id::XULTreeBuilder },
    2660             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2661             :   JSJitInfo::Method,
    2662             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2663             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2664             :   false,  /* isInfallible. False in setters. */
    2665             :   false,  /* isMovable.  Not relevant for setters. */
    2666             :   false, /* isEliminatable.  Not relevant for setters. */
    2667             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2668             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2669             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2670             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2671             : };
    2672             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2673             : static_assert(0 < 1, "There is no slot for us");
    2674             : 
    2675             : static bool
    2676           0 : setCellText(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2677             : {
    2678           0 :   if (MOZ_UNLIKELY(args.length() < 3)) {
    2679           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.setCellText");
    2680             :   }
    2681             :   int32_t arg0;
    2682           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[0], &arg0)) {
    2683           0 :     return false;
    2684             :   }
    2685           0 :   NonNull<nsTreeColumn> arg1;
    2686           0 :   if (args[1].isObject()) {
    2687             :     {
    2688           0 :       nsresult rv = UnwrapObject<prototypes::id::TreeColumn, nsTreeColumn>(args[1], arg1);
    2689           0 :       if (NS_FAILED(rv)) {
    2690           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of XULTreeBuilder.setCellText", "TreeColumn");
    2691           0 :         return false;
    2692             :       }
    2693             :     }
    2694             :   } else {
    2695           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of XULTreeBuilder.setCellText");
    2696           0 :     return false;
    2697             :   }
    2698           0 :   binding_detail::FakeString arg2;
    2699           0 :   if (!ConvertJSValueToString(cx, args[2], eStringify, eStringify, arg2)) {
    2700           0 :     return false;
    2701             :   }
    2702           0 :   binding_detail::FastErrorResult rv;
    2703           0 :   self->SetCellText(arg0, NonNullHelper(arg1), NonNullHelper(Constify(arg2)), rv);
    2704           0 :   if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
    2705           0 :     return false;
    2706             :   }
    2707           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2708           0 :   args.rval().setUndefined();
    2709           0 :   return true;
    2710             : }
    2711             : 
    2712             : static const JSJitInfo setCellText_methodinfo = {
    2713             :   { (JSJitGetterOp)setCellText },
    2714             :   { prototypes::id::XULTreeBuilder },
    2715             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2716             :   JSJitInfo::Method,
    2717             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2718             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2719             :   false,  /* isInfallible. False in setters. */
    2720             :   false,  /* isMovable.  Not relevant for setters. */
    2721             :   false, /* isEliminatable.  Not relevant for setters. */
    2722             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2723             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2724             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2725             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2726             : };
    2727             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2728             : static_assert(0 < 1, "There is no slot for us");
    2729             : 
    2730             : static bool
    2731           0 : performAction(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2732             : {
    2733           0 :   if (MOZ_UNLIKELY(args.length() < 1)) {
    2734           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.performAction");
    2735             :   }
    2736           0 :   binding_detail::FakeString arg0;
    2737           0 :   if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
    2738           0 :     return false;
    2739             :   }
    2740           0 :   self->PerformAction(NonNullHelper(Constify(arg0)));
    2741           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2742           0 :   args.rval().setUndefined();
    2743           0 :   return true;
    2744             : }
    2745             : 
    2746             : static const JSJitInfo performAction_methodinfo = {
    2747             :   { (JSJitGetterOp)performAction },
    2748             :   { prototypes::id::XULTreeBuilder },
    2749             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2750             :   JSJitInfo::Method,
    2751             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2752             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2753             :   false,  /* isInfallible. False in setters. */
    2754             :   false,  /* isMovable.  Not relevant for setters. */
    2755             :   false, /* isEliminatable.  Not relevant for setters. */
    2756             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2757             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2758             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2759             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2760             : };
    2761             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2762             : static_assert(0 < 1, "There is no slot for us");
    2763             : 
    2764             : static bool
    2765           0 : performActionOnRow(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2766             : {
    2767           0 :   if (MOZ_UNLIKELY(args.length() < 2)) {
    2768           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.performActionOnRow");
    2769             :   }
    2770           0 :   binding_detail::FakeString arg0;
    2771           0 :   if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
    2772           0 :     return false;
    2773             :   }
    2774             :   int32_t arg1;
    2775           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[1], &arg1)) {
    2776           0 :     return false;
    2777             :   }
    2778           0 :   self->PerformActionOnRow(NonNullHelper(Constify(arg0)), arg1);
    2779           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2780           0 :   args.rval().setUndefined();
    2781           0 :   return true;
    2782             : }
    2783             : 
    2784             : static const JSJitInfo performActionOnRow_methodinfo = {
    2785             :   { (JSJitGetterOp)performActionOnRow },
    2786             :   { prototypes::id::XULTreeBuilder },
    2787             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2788             :   JSJitInfo::Method,
    2789             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2790             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2791             :   false,  /* isInfallible. False in setters. */
    2792             :   false,  /* isMovable.  Not relevant for setters. */
    2793             :   false, /* isEliminatable.  Not relevant for setters. */
    2794             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2795             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2796             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2797             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2798             : };
    2799             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2800             : static_assert(0 < 1, "There is no slot for us");
    2801             : 
    2802             : static bool
    2803           0 : performActionOnCell(JSContext* cx, JS::Handle<JSObject*> obj, nsXULTreeBuilder* self, const JSJitMethodCallArgs& args)
    2804             : {
    2805           0 :   if (MOZ_UNLIKELY(args.length() < 3)) {
    2806           0 :     return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "XULTreeBuilder.performActionOnCell");
    2807             :   }
    2808           0 :   binding_detail::FakeString arg0;
    2809           0 :   if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
    2810           0 :     return false;
    2811             :   }
    2812             :   int32_t arg1;
    2813           0 :   if (!ValueToPrimitive<int32_t, eDefault>(cx, args[1], &arg1)) {
    2814           0 :     return false;
    2815             :   }
    2816           0 :   NonNull<nsTreeColumn> arg2;
    2817           0 :   if (args[2].isObject()) {
    2818             :     {
    2819           0 :       nsresult rv = UnwrapObject<prototypes::id::TreeColumn, nsTreeColumn>(args[2], arg2);
    2820           0 :       if (NS_FAILED(rv)) {
    2821           0 :         ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 3 of XULTreeBuilder.performActionOnCell", "TreeColumn");
    2822           0 :         return false;
    2823             :       }
    2824             :     }
    2825             :   } else {
    2826           0 :     ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 3 of XULTreeBuilder.performActionOnCell");
    2827           0 :     return false;
    2828             :   }
    2829           0 :   self->PerformActionOnCell(NonNullHelper(Constify(arg0)), arg1, NonNullHelper(arg2));
    2830           0 :   MOZ_ASSERT(!JS_IsExceptionPending(cx));
    2831           0 :   args.rval().setUndefined();
    2832           0 :   return true;
    2833             : }
    2834             : 
    2835             : static const JSJitInfo performActionOnCell_methodinfo = {
    2836             :   { (JSJitGetterOp)performActionOnCell },
    2837             :   { prototypes::id::XULTreeBuilder },
    2838             :   { PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth },
    2839             :   JSJitInfo::Method,
    2840             :   JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
    2841             :   JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
    2842             :   false,  /* isInfallible. False in setters. */
    2843             :   false,  /* isMovable.  Not relevant for setters. */
    2844             :   false, /* isEliminatable.  Not relevant for setters. */
    2845             :   false, /* isAlwaysInSlot.  Only relevant for getters. */
    2846             :   false, /* isLazilyCachedInSlot.  Only relevant for getters. */
    2847             :   false,  /* isTypedMethod.  Only relevant for methods. */
    2848             :   0   /* Reserved slot index, if we're stored in a slot, else 0. */
    2849             : };
    2850             : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
    2851             : static_assert(0 < 1, "There is no slot for us");
    2852             : 
    2853             : static bool
    2854           0 : _addProperty(JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JS::Handle<JS::Value> val)
    2855             : {
    2856           0 :   nsXULTreeBuilder* self = UnwrapPossiblyNotInitializedDOMObject<nsXULTreeBuilder>(obj);
    2857             :   // We don't want to preserve if we don't have a wrapper, and we
    2858             :   // obviously can't preserve if we're not initialized.
    2859           0 :   if (self && self->GetWrapperPreserveColor()) {
    2860           0 :     PreserveWrapper(self);
    2861             :   }
    2862           0 :   return true;
    2863             : }
    2864             : 
    2865             : static void
    2866           0 : _finalize(js::FreeOp* fop, JSObject* obj)
    2867             : {
    2868           0 :   nsXULTreeBuilder* self = UnwrapPossiblyNotInitializedDOMObject<nsXULTreeBuilder>(obj);
    2869           0 :   if (self) {
    2870           0 :     ClearWrapper(self, self, obj);
    2871           0 :     AddForDeferredFinalization<nsXULTreeBuilder>(self);
    2872             :   }
    2873           0 : }
    2874             : 
    2875             : static void
    2876           0 : _objectMoved(JSObject* obj, const JSObject* old)
    2877             : {
    2878           0 :   nsXULTreeBuilder* self = UnwrapPossiblyNotInitializedDOMObject<nsXULTreeBuilder>(obj);
    2879           0 :   if (self) {
    2880           0 :     UpdateWrapper(self, self, obj, old);
    2881             :   }
    2882           0 : }
    2883             : 
    2884             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
    2885             : #if defined(__clang__)
    2886             : #pragma clang diagnostic push
    2887             : #pragma clang diagnostic ignored "-Wmissing-braces"
    2888             : #endif
    2889             : static const JSFunctionSpec sMethods_specs[] = {
    2890             :   JS_FNSPEC("getResourceAtIndex", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getResourceAtIndex_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2891             :   JS_FNSPEC("getIndexOfResource", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getIndexOfResource_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2892             :   JS_FNSPEC("addObserver", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&addObserver_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2893             :   JS_FNSPEC("removeObserver", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&removeObserver_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2894             :   JS_FNSPEC("sort", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&sort_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2895             :   JS_FNSPEC("getRowProperties", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getRowProperties_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2896             :   JS_FNSPEC("getCellProperties", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getCellProperties_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
    2897             :   JS_FNSPEC("getColumnProperties", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getColumnProperties_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2898             :   JS_FNSPEC("isContainer", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&isContainer_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2899             :   JS_FNSPEC("isContainerOpen", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&isContainerOpen_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2900             :   JS_FNSPEC("isContainerEmpty", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&isContainerEmpty_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2901             :   JS_FNSPEC("isSeparator", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&isSeparator_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2902             :   JS_FNSPEC("isSorted", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&isSorted_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2903             :   JS_FNSPEC("canDrop", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&canDrop_methodinfo), 3, JSPROP_ENUMERATE, nullptr),
    2904             :   JS_FNSPEC("drop", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&drop_methodinfo), 3, JSPROP_ENUMERATE, nullptr),
    2905             :   JS_FNSPEC("getParentIndex", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getParentIndex_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2906             :   JS_FNSPEC("hasNextSibling", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&hasNextSibling_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
    2907             :   JS_FNSPEC("getLevel", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getLevel_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2908             :   JS_FNSPEC("getImageSrc", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getImageSrc_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
    2909             :   JS_FNSPEC("getProgressMode", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getProgressMode_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
    2910             :   JS_FNSPEC("getCellValue", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getCellValue_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
    2911             :   JS_FNSPEC("getCellText", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&getCellText_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
    2912             :   JS_FNSPEC("setTree", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&setTree_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2913             :   JS_FNSPEC("toggleOpenState", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&toggleOpenState_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2914             :   JS_FNSPEC("cycleHeader", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&cycleHeader_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2915             :   JS_FNSPEC("selectionChanged", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&selectionChanged_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
    2916             :   JS_FNSPEC("cycleCell", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&cycleCell_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
    2917             :   JS_FNSPEC("isEditable", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&isEditable_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
    2918             :   JS_FNSPEC("isSelectable", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&isSelectable_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
    2919             :   JS_FNSPEC("setCellValue", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&setCellValue_methodinfo), 3, JSPROP_ENUMERATE, nullptr),
    2920             :   JS_FNSPEC("setCellText", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&setCellText_methodinfo), 3, JSPROP_ENUMERATE, nullptr),
    2921             :   JS_FNSPEC("performAction", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&performAction_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
    2922             :   JS_FNSPEC("performActionOnRow", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&performActionOnRow_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
    2923             :   JS_FNSPEC("performActionOnCell", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&performActionOnCell_methodinfo), 3, JSPROP_ENUMERATE, nullptr),
    2924             :   JS_FS_END
    2925             : };
    2926             : #if defined(__clang__)
    2927             : #pragma clang diagnostic pop
    2928             : #endif
    2929             : 
    2930             : 
    2931             : // Can't be const because the pref-enabled boolean needs to be writable
    2932             : static Prefable<const JSFunctionSpec> sMethods[] = {
    2933             :   { nullptr, &sMethods_specs[0] },
    2934             :   { nullptr, nullptr }
    2935             : };
    2936             : 
    2937             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
    2938             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
    2939             : static_assert(34 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
    2940             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
    2941             : 
    2942             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
    2943             : #if defined(__clang__)
    2944             : #pragma clang diagnostic push
    2945             : #pragma clang diagnostic ignored "-Wmissing-braces"
    2946             : #endif
    2947             : static const JSPropertySpec sAttributes_specs[] = {
    2948             :   { "rowCount", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &rowCount_getterinfo, nullptr, nullptr },
    2949             :   { "selection", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &selection_getterinfo, GenericBindingSetter, &selection_setterinfo },
    2950             :   { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
    2951             : };
    2952             : #if defined(__clang__)
    2953             : #pragma clang diagnostic pop
    2954             : #endif
    2955             : 
    2956             : 
    2957             : // Can't be const because the pref-enabled boolean needs to be writable
    2958             : static Prefable<const JSPropertySpec> sAttributes[] = {
    2959             :   { nullptr, &sAttributes_specs[0] },
    2960             :   { nullptr, nullptr }
    2961             : };
    2962             : 
    2963             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
    2964             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
    2965             : static_assert(2 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
    2966             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
    2967             : 
    2968             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
    2969             : #if defined(__clang__)
    2970             : #pragma clang diagnostic push
    2971             : #pragma clang diagnostic ignored "-Wmissing-braces"
    2972             : #endif
    2973             : static const ConstantSpec sConstants_specs[] = {
    2974             :   { "DROP_BEFORE", JS::Int32Value(-1) },
    2975             :   { "DROP_ON", JS::Int32Value(0) },
    2976             :   { "DROP_AFTER", JS::Int32Value(1) },
    2977             :   { "PROGRESS_NORMAL", JS::Int32Value(1) },
    2978             :   { "PROGRESS_UNDETERMINED", JS::Int32Value(2) },
    2979             :   { "PROGRESS_NONE", JS::Int32Value(3) },
    2980             :   { 0, JS::UndefinedValue() }
    2981             : };
    2982             : #if defined(__clang__)
    2983             : #pragma clang diagnostic pop
    2984             : #endif
    2985             : 
    2986             : 
    2987             : // Can't be const because the pref-enabled boolean needs to be writable
    2988             : static Prefable<const ConstantSpec> sConstants[] = {
    2989             :   { nullptr, &sConstants_specs[0] },
    2990             :   { nullptr, nullptr }
    2991             : };
    2992             : 
    2993             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
    2994             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
    2995             : static_assert(6 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
    2996             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
    2997             : 
    2998             : 
    2999             : static uint16_t sNativeProperties_sortedPropertyIndices[42];
    3000             : static PropertyInfo sNativeProperties_propertyInfos[42];
    3001             : 
    3002             : static const NativePropertiesN<3> sNativeProperties = {
    3003             :   false, 0,
    3004             :   false, 0,
    3005             :   true,  0 /* sMethods */,
    3006             :   true,  1 /* sAttributes */,
    3007             :   false, 0,
    3008             :   false, 0,
    3009             :   true,  2 /* sConstants */,
    3010             :   -1,
    3011             :   42,
    3012             :   sNativeProperties_sortedPropertyIndices,
    3013             :   {
    3014             :     { sMethods, &sNativeProperties_propertyInfos[0] },
    3015             :     { sAttributes, &sNativeProperties_propertyInfos[34] },
    3016             :     { sConstants, &sNativeProperties_propertyInfos[36] }
    3017             :   }
    3018             : };
    3019             : static_assert(42 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
    3020             :     "We have a property info count that is oversized");
    3021             : 
    3022             : static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
    3023             :   {
    3024             :     "Function",
    3025             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
    3026             :     &sBoringInterfaceObjectClassClassOps,
    3027             :     JS_NULL_CLASS_SPEC,
    3028             :     JS_NULL_CLASS_EXT,
    3029             :     &sInterfaceObjectClassObjectOps
    3030             :   },
    3031             :   eInterface,
    3032             :   true,
    3033             :   prototypes::id::XULTreeBuilder,
    3034             :   PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth,
    3035             :   sNativePropertyHooks,
    3036             :   "function XULTreeBuilder() {\n    [native code]\n}",
    3037             :   XULTemplateBuilderBinding::GetConstructorObject
    3038             : };
    3039             : 
    3040             : static const DOMIfaceAndProtoJSClass sPrototypeClass = {
    3041             :   {
    3042             :     "XULTreeBuilderPrototype",
    3043             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
    3044             :     JS_NULL_CLASS_OPS,
    3045             :     JS_NULL_CLASS_SPEC,
    3046             :     JS_NULL_CLASS_EXT,
    3047             :     JS_NULL_OBJECT_OPS
    3048             :   },
    3049             :   eInterfacePrototype,
    3050             :   false,
    3051             :   prototypes::id::XULTreeBuilder,
    3052             :   PrototypeTraits<prototypes::id::XULTreeBuilder>::Depth,
    3053             :   sNativePropertyHooks,
    3054             :   "[object XULTreeBuilderPrototype]",
    3055             :   XULTemplateBuilderBinding::GetProtoObject
    3056             : };
    3057             : 
    3058             : bool
    3059           0 : ConstructorEnabled(JSContext* aCx, JS::Handle<JSObject*> aObj)
    3060             : {
    3061           0 :   return IsChromeOrXBL(aCx, aObj);
    3062             : }
    3063             : 
    3064             : JSObject*
    3065           0 : DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
    3066             : {
    3067           0 :   return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
    3068             : }
    3069             : 
    3070             : static const js::ClassOps sClassOps = {
    3071             :   _addProperty, /* addProperty */
    3072             :   nullptr,               /* delProperty */
    3073             :   nullptr,               /* getProperty */
    3074             :   nullptr,               /* setProperty */
    3075             :   nullptr,               /* enumerate */
    3076             :   nullptr, /* newEnumerate */
    3077             :   nullptr, /* resolve */
    3078             :   nullptr, /* mayResolve */
    3079             :   _finalize, /* finalize */
    3080             :   nullptr, /* call */
    3081             :   nullptr,               /* hasInstance */
    3082             :   nullptr,               /* construct */
    3083             :   nullptr, /* trace */
    3084             : };
    3085             : 
    3086             : static const js::ClassExtension sClassExtension = {
    3087             :   nullptr, /* weakmapKeyDelegateOp */
    3088             :   _objectMoved /* objectMovedOp */
    3089             : };
    3090             : 
    3091             : static const DOMJSClass sClass = {
    3092             :   { "XULTreeBuilder",
    3093             :     JSCLASS_IS_DOMJSCLASS | JSCLASS_FOREGROUND_FINALIZE | JSCLASS_HAS_RESERVED_SLOTS(1),
    3094             :     &sClassOps,
    3095             :     JS_NULL_CLASS_SPEC,
    3096             :     &sClassExtension,
    3097             :     JS_NULL_OBJECT_OPS
    3098             :   },
    3099             :   { prototypes::id::XULTemplateBuilder, prototypes::id::XULTreeBuilder, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count },
    3100             :   IsBaseOf<nsISupports, nsXULTreeBuilder >::value,
    3101             :   sNativePropertyHooks,
    3102             :   FindAssociatedGlobalForNative<nsXULTreeBuilder>::Get,
    3103             :   GetProtoObjectHandle,
    3104             :   GetCCParticipant<nsXULTreeBuilder>::Get()
    3105             : };
    3106             : static_assert(1 == DOM_INSTANCE_RESERVED_SLOTS,
    3107             :               "Must have the right minimal number of reserved slots.");
    3108             : static_assert(1 >= 1,
    3109             :               "Must have enough reserved slots.");
    3110             : 
    3111             : const JSClass*
    3112           0 : GetJSClass()
    3113             : {
    3114           0 :   return sClass.ToJSClass();
    3115             : }
    3116             : 
    3117             : bool
    3118           0 : Wrap(JSContext* aCx, nsXULTreeBuilder* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector)
    3119             : {
    3120             :   MOZ_ASSERT(static_cast<nsXULTreeBuilder*>(aObject) ==
    3121             :              reinterpret_cast<nsXULTreeBuilder*>(aObject),
    3122             :              "Multiple inheritance for nsXULTreeBuilder is broken.");
    3123             :   MOZ_ASSERT(static_cast<nsXULTemplateBuilder*>(aObject) ==
    3124             :              reinterpret_cast<nsXULTemplateBuilder*>(aObject),
    3125             :              "Multiple inheritance for nsXULTemplateBuilder is broken.");
    3126           0 :   MOZ_ASSERT(ToSupportsIsCorrect(aObject));
    3127           0 :   MOZ_ASSERT_IF(aGivenProto, js::IsObjectInContextCompartment(aGivenProto, aCx));
    3128           0 :   MOZ_ASSERT(!aCache->GetWrapper(),
    3129             :              "You should probably not be using Wrap() directly; use "
    3130             :              "GetOrCreateDOMReflector instead");
    3131             : 
    3132           0 :   MOZ_ASSERT(ToSupportsIsOnPrimaryInheritanceChain(aObject, aCache),
    3133             :              "nsISupports must be on our primary inheritance chain");
    3134             : 
    3135           0 :   JS::Rooted<JSObject*> global(aCx, FindAssociatedGlobal(aCx, aObject->GetParentObject()));
    3136           0 :   if (!global) {
    3137           0 :     return false;
    3138             :   }
    3139           0 :   MOZ_ASSERT(JS_IsGlobalObject(global));
    3140           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(global));
    3141             : 
    3142             :   // That might have ended up wrapping us already, due to the wonders
    3143             :   // of XBL.  Check for that, and bail out as needed.
    3144           0 :   aReflector.set(aCache->GetWrapper());
    3145           0 :   if (aReflector) {
    3146             : #ifdef DEBUG
    3147           0 :     binding_detail::AssertReflectorHasGivenProto(aCx, aReflector, aGivenProto);
    3148             : #endif // DEBUG
    3149           0 :     return true;
    3150             :   }
    3151             : 
    3152           0 :   JSAutoCompartment ac(aCx, global);
    3153           0 :   JS::Handle<JSObject*> canonicalProto = GetProtoObjectHandle(aCx);
    3154           0 :   if (!canonicalProto) {
    3155           0 :     return false;
    3156             :   }
    3157           0 :   JS::Rooted<JSObject*> proto(aCx);
    3158           0 :   if (aGivenProto) {
    3159           0 :     proto = aGivenProto;
    3160             :     // Unfortunately, while aGivenProto was in the compartment of aCx
    3161             :     // coming in, we changed compartments to that of "parent" so may need
    3162             :     // to wrap the proto here.
    3163           0 :     if (js::GetContextCompartment(aCx) != js::GetObjectCompartment(proto)) {
    3164           0 :       if (!JS_WrapObject(aCx, &proto)) {
    3165           0 :         return false;
    3166             :       }
    3167             :     }
    3168             :   } else {
    3169           0 :     proto = canonicalProto;
    3170             :   }
    3171             : 
    3172           0 :   BindingJSObjectCreator<nsXULTreeBuilder> creator(aCx);
    3173           0 :   creator.CreateObject(aCx, sClass.ToJSClass(), proto, aObject, aReflector);
    3174           0 :   if (!aReflector) {
    3175           0 :     return false;
    3176             :   }
    3177             : 
    3178           0 :   aCache->SetWrapper(aReflector);
    3179           0 :   creator.InitializationSucceeded();
    3180             : 
    3181           0 :   MOZ_ASSERT(aCache->GetWrapperPreserveColor() &&
    3182             :              aCache->GetWrapperPreserveColor() == aReflector);
    3183             :   // If proto != canonicalProto, we have to preserve our wrapper;
    3184             :   // otherwise we won't be able to properly recreate it later, since
    3185             :   // we won't know what proto to use.  Note that we don't check
    3186             :   // aGivenProto here, since it's entirely possible (and even
    3187             :   // somewhat common) to have a non-null aGivenProto which is the
    3188             :   // same as canonicalProto.
    3189           0 :   if (proto != canonicalProto) {
    3190           0 :     PreserveWrapper(aObject);
    3191             :   }
    3192             : 
    3193           0 :   return true;
    3194             : }
    3195             : 
    3196             : const NativePropertyHooks sNativePropertyHooks[] = { {
    3197             :   nullptr,
    3198             :   nullptr,
    3199             :   nullptr,
    3200             :   { sNativeProperties.Upcast(), nullptr },
    3201             :   prototypes::id::XULTreeBuilder,
    3202             :   constructors::id::XULTreeBuilder,
    3203             :   XULTemplateBuilderBinding::sNativePropertyHooks,
    3204             :   &DefaultXrayExpandoObjectClass
    3205             : } };
    3206             : 
    3207             : void
    3208           0 : CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
    3209             : {
    3210           0 :   JS::Handle<JSObject*> parentProto(XULTemplateBuilderBinding::GetProtoObjectHandle(aCx));
    3211           0 :   if (!parentProto) {
    3212           0 :     return;
    3213             :   }
    3214             : 
    3215           0 :   JS::Handle<JSObject*> constructorProto(XULTemplateBuilderBinding::GetConstructorObjectHandle(aCx));
    3216           0 :   if (!constructorProto) {
    3217           0 :     return;
    3218             :   }
    3219             : 
    3220             :   static bool sIdsInited = false;
    3221           0 :   if (!sIdsInited && NS_IsMainThread()) {
    3222           0 :     if (!InitIds(aCx, sNativeProperties.Upcast())) {
    3223           0 :       return;
    3224             :     }
    3225           0 :     sIdsInited = true;
    3226             :   }
    3227             : 
    3228           0 :   JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::XULTreeBuilder);
    3229           0 :   JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::XULTreeBuilder);
    3230           0 :   dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
    3231             :                               &sPrototypeClass.mBase, protoCache,
    3232             :                               constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
    3233             :                               interfaceCache,
    3234             :                               sNativeProperties.Upcast(),
    3235             :                               nullptr,
    3236             :                               "XULTreeBuilder", aDefineOnGlobal,
    3237             :                               nullptr,
    3238           0 :                               false);
    3239             : }
    3240             : 
    3241             : JS::Handle<JSObject*>
    3242           0 : GetProtoObjectHandle(JSContext* aCx)
    3243             : {
    3244             :   /* Get the interface prototype object for this class.  This will create the
    3245             :      object as needed. */
    3246           0 :   bool aDefineOnGlobal = true;
    3247             : 
    3248             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    3249           0 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    3250           0 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    3251           0 :     return nullptr;
    3252             :   }
    3253             : 
    3254             :   /* Check to see whether the interface objects are already installed */
    3255           0 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    3256           0 :   if (!protoAndIfaceCache.HasEntryInSlot(prototypes::id::XULTreeBuilder)) {
    3257           0 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    3258           0 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    3259             :   }
    3260             : 
    3261             :   /*
    3262             :    * The object might _still_ be null, but that's OK.
    3263             :    *
    3264             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    3265             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    3266             :    * changed after they have been set.
    3267             :    *
    3268             :    * Calling address() avoids the read read barrier that does gray
    3269             :    * unmarking, but it's not possible for the object to be gray here.
    3270             :    */
    3271             : 
    3272           0 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(prototypes::id::XULTreeBuilder);
    3273           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    3274           0 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    3275             : }
    3276             : 
    3277             : JS::Handle<JSObject*>
    3278           0 : GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
    3279             : {
    3280             :   /* Get the interface object for this class.  This will create the object as
    3281             :      needed. */
    3282             : 
    3283             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    3284           0 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    3285           0 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    3286           0 :     return nullptr;
    3287             :   }
    3288             : 
    3289             :   /* Check to see whether the interface objects are already installed */
    3290           0 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    3291           0 :   if (!protoAndIfaceCache.HasEntryInSlot(constructors::id::XULTreeBuilder)) {
    3292           0 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    3293           0 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    3294             :   }
    3295             : 
    3296             :   /*
    3297             :    * The object might _still_ be null, but that's OK.
    3298             :    *
    3299             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    3300             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    3301             :    * changed after they have been set.
    3302             :    *
    3303             :    * Calling address() avoids the read read barrier that does gray
    3304             :    * unmarking, but it's not possible for the object to be gray here.
    3305             :    */
    3306             : 
    3307           0 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::XULTreeBuilder);
    3308           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    3309           0 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    3310             : }
    3311             : 
    3312             : JSObject*
    3313           0 : GetConstructorObject(JSContext* aCx)
    3314             : {
    3315           0 :   return GetConstructorObjectHandle(aCx);
    3316             : }
    3317             : 
    3318             : } // namespace XULTreeBuilderBinding
    3319             : 
    3320             : 
    3321             : 
    3322             : namespace XULTreeBuilderObserverBinding {
    3323             : 
    3324             : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
    3325             : #if defined(__clang__)
    3326             : #pragma clang diagnostic push
    3327             : #pragma clang diagnostic ignored "-Wmissing-braces"
    3328             : #endif
    3329             : static const ConstantSpec sConstants_specs[] = {
    3330             :   { "DROP_BEFORE", JS::Int32Value(-1) },
    3331             :   { "DROP_ON", JS::Int32Value(0) },
    3332             :   { "DROP_AFTER", JS::Int32Value(1) },
    3333             :   { 0, JS::UndefinedValue() }
    3334             : };
    3335             : #if defined(__clang__)
    3336             : #pragma clang diagnostic pop
    3337             : #endif
    3338             : 
    3339             : 
    3340             : // Can't be const because the pref-enabled boolean needs to be writable
    3341             : static Prefable<const ConstantSpec> sConstants[] = {
    3342             :   { nullptr, &sConstants_specs[0] },
    3343             :   { nullptr, nullptr }
    3344             : };
    3345             : 
    3346             : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
    3347             :     "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
    3348             : static_assert(3 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
    3349             :     "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
    3350             : 
    3351             : 
    3352             : static uint16_t sNativeProperties_sortedPropertyIndices[3];
    3353             : static PropertyInfo sNativeProperties_propertyInfos[3];
    3354             : 
    3355             : static const NativePropertiesN<1> sNativeProperties = {
    3356             :   false, 0,
    3357             :   false, 0,
    3358             :   false, 0,
    3359             :   false, 0,
    3360             :   false, 0,
    3361             :   false, 0,
    3362             :   true,  0 /* sConstants */,
    3363             :   -1,
    3364             :   3,
    3365             :   sNativeProperties_sortedPropertyIndices,
    3366             :   {
    3367             :     { sConstants, &sNativeProperties_propertyInfos[0] }
    3368             :   }
    3369             : };
    3370             : static_assert(3 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
    3371             :     "We have a property info count that is oversized");
    3372             : 
    3373             : static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
    3374             :   {
    3375             :     "Function",
    3376             :     JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
    3377             :     &sBoringInterfaceObjectClassClassOps,
    3378             :     JS_NULL_CLASS_SPEC,
    3379             :     JS_NULL_CLASS_EXT,
    3380             :     &sInterfaceObjectClassObjectOps
    3381             :   },
    3382             :   eInterface,
    3383             :   false,
    3384             :   prototypes::id::_ID_Count,
    3385             :   0,
    3386             :   sNativePropertyHooks,
    3387             :   "function XULTreeBuilderObserver() {\n    [native code]\n}",
    3388             :   JS::GetRealmFunctionPrototype
    3389             : };
    3390             : 
    3391             : bool
    3392           0 : ConstructorEnabled(JSContext* aCx, JS::Handle<JSObject*> aObj)
    3393             : {
    3394           0 :   return IsChromeOrXBL(aCx, aObj);
    3395             : }
    3396             : 
    3397             : JSObject*
    3398           0 : DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
    3399             : {
    3400           0 :   return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
    3401             : }
    3402             : 
    3403             : const NativePropertyHooks sNativePropertyHooks[] = { {
    3404             :   nullptr,
    3405             :   nullptr,
    3406             :   nullptr,
    3407             :   { sNativeProperties.Upcast(), nullptr },
    3408             :   prototypes::id::_ID_Count,
    3409             :   constructors::id::XULTreeBuilderObserver,
    3410             :   nullptr,
    3411             :   &DefaultXrayExpandoObjectClass
    3412             : } };
    3413             : 
    3414             : void
    3415           0 : CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
    3416             : {
    3417           0 :   JS::Rooted<JSObject*> constructorProto(aCx, JS::GetRealmFunctionPrototype(aCx));
    3418           0 :   if (!constructorProto) {
    3419           0 :     return;
    3420             :   }
    3421             : 
    3422             :   static bool sIdsInited = false;
    3423           0 :   if (!sIdsInited && NS_IsMainThread()) {
    3424           0 :     if (!InitIds(aCx, sNativeProperties.Upcast())) {
    3425           0 :       return;
    3426             :     }
    3427           0 :     sIdsInited = true;
    3428             :   }
    3429             : 
    3430           0 :   JS::Heap<JSObject*>* protoCache = nullptr;
    3431           0 :   JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::XULTreeBuilderObserver);
    3432           0 :   dom::CreateInterfaceObjects(aCx, aGlobal, nullptr,
    3433             :                               nullptr, protoCache,
    3434             :                               constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
    3435             :                               interfaceCache,
    3436             :                               sNativeProperties.Upcast(),
    3437             :                               nullptr,
    3438             :                               "XULTreeBuilderObserver", aDefineOnGlobal,
    3439             :                               nullptr,
    3440           0 :                               false);
    3441             : }
    3442             : 
    3443             : JS::Handle<JSObject*>
    3444           0 : GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
    3445             : {
    3446             :   /* Get the interface object for this class.  This will create the object as
    3447             :      needed. */
    3448             : 
    3449             :   /* Make sure our global is sane.  Hopefully we can remove this sometime */
    3450           0 :   JSObject* global = JS::CurrentGlobalOrNull(aCx);
    3451           0 :   if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
    3452           0 :     return nullptr;
    3453             :   }
    3454             : 
    3455             :   /* Check to see whether the interface objects are already installed */
    3456           0 :   ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
    3457           0 :   if (!protoAndIfaceCache.HasEntryInSlot(constructors::id::XULTreeBuilderObserver)) {
    3458           0 :     JS::Rooted<JSObject*> rootedGlobal(aCx, global);
    3459           0 :     CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
    3460             :   }
    3461             : 
    3462             :   /*
    3463             :    * The object might _still_ be null, but that's OK.
    3464             :    *
    3465             :    * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
    3466             :    * traced by TraceProtoAndIfaceCache() and its contents are never
    3467             :    * changed after they have been set.
    3468             :    *
    3469             :    * Calling address() avoids the read read barrier that does gray
    3470             :    * unmarking, but it's not possible for the object to be gray here.
    3471             :    */
    3472             : 
    3473           0 :   const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::XULTreeBuilderObserver);
    3474           0 :   MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
    3475           0 :   return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
    3476             : }
    3477             : 
    3478             : JSObject*
    3479           0 : GetConstructorObject(JSContext* aCx)
    3480             : {
    3481           0 :   return GetConstructorObjectHandle(aCx);
    3482             : }
    3483             : 
    3484             : } // namespace XULTreeBuilderObserverBinding
    3485             : 
    3486             : 
    3487             : 
    3488             : void
    3489           0 : XULBuilderListener::WillRebuild(nsXULTemplateBuilder& aBuilder, ErrorResult& aRv, const char* aExecutionReason, ExceptionHandling aExceptionHandling, JSCompartment* aCompartment)
    3490             : {
    3491           0 :   CallSetup s(this, aRv, "XULBuilderListener.willRebuild", aExceptionHandling, aCompartment);
    3492           0 :   JSContext* cx = s.GetContext();
    3493           0 :   if (!cx) {
    3494           0 :     MOZ_ASSERT(aRv.Failed());
    3495           0 :     return;
    3496             :   }
    3497           0 :   JS::Rooted<JS::Value> rval(cx, JS::UndefinedValue());
    3498           0 :   JS::AutoValueVector argv(cx);
    3499           0 :   if (!argv.resize(1)) {
    3500           0 :     aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
    3501           0 :     return;
    3502             :   }
    3503           0 :   unsigned argc = 1;
    3504             : 
    3505             :   do {
    3506           0 :     if (!GetOrCreateDOMReflector(cx, aBuilder, argv[0])) {
    3507           0 :       MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    3508           0 :       aRv.Throw(NS_ERROR_UNEXPECTED);
    3509           0 :       return;
    3510             :     }
    3511           0 :     break;
    3512             :   } while (0);
    3513             : 
    3514           0 :   JS::Rooted<JS::Value> callable(cx);
    3515           0 :   XULBuilderListenerAtoms* atomsCache = GetAtomCache<XULBuilderListenerAtoms>(cx);
    3516           0 :   if ((!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) ||
    3517           0 :       !GetCallableProperty(cx, atomsCache->willRebuild_id, &callable)) {
    3518           0 :     aRv.Throw(NS_ERROR_UNEXPECTED);
    3519           0 :     return;
    3520             :   }
    3521           0 :   JS::Rooted<JS::Value> thisValue(cx, JS::ObjectValue(*mCallback));
    3522           0 :   if (!JS::Call(cx, thisValue, callable,
    3523           0 :                 JS::HandleValueArray::subarray(argv, 0, argc), &rval)) {
    3524           0 :     aRv.NoteJSContextException(cx);
    3525           0 :     return;
    3526             :   }
    3527             : }
    3528             : 
    3529             : void
    3530           0 : XULBuilderListener::DidRebuild(nsXULTemplateBuilder& aBuilder, ErrorResult& aRv, const char* aExecutionReason, ExceptionHandling aExceptionHandling, JSCompartment* aCompartment)
    3531             : {
    3532           0 :   CallSetup s(this, aRv, "XULBuilderListener.didRebuild", aExceptionHandling, aCompartment);
    3533           0 :   JSContext* cx = s.GetContext();
    3534           0 :   if (!cx) {
    3535           0 :     MOZ_ASSERT(aRv.Failed());
    3536           0 :     return;
    3537             :   }
    3538           0 :   JS::Rooted<JS::Value> rval(cx, JS::UndefinedValue());
    3539           0 :   JS::AutoValueVector argv(cx);
    3540           0 :   if (!argv.resize(1)) {
    3541           0 :     aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
    3542           0 :     return;
    3543             :   }
    3544           0 :   unsigned argc = 1;
    3545             : 
    3546             :   do {
    3547           0 :     if (!GetOrCreateDOMReflector(cx, aBuilder, argv[0])) {
    3548           0 :       MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    3549           0 :       aRv.Throw(NS_ERROR_UNEXPECTED);
    3550           0 :       return;
    3551             :     }
    3552           0 :     break;
    3553             :   } while (0);
    3554             : 
    3555           0 :   JS::Rooted<JS::Value> callable(cx);
    3556           0 :   XULBuilderListenerAtoms* atomsCache = GetAtomCache<XULBuilderListenerAtoms>(cx);
    3557           0 :   if ((!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) ||
    3558           0 :       !GetCallableProperty(cx, atomsCache->didRebuild_id, &callable)) {
    3559           0 :     aRv.Throw(NS_ERROR_UNEXPECTED);
    3560           0 :     return;
    3561             :   }
    3562           0 :   JS::Rooted<JS::Value> thisValue(cx, JS::ObjectValue(*mCallback));
    3563           0 :   if (!JS::Call(cx, thisValue, callable,
    3564           0 :                 JS::HandleValueArray::subarray(argv, 0, argc), &rval)) {
    3565           0 :     aRv.NoteJSContextException(cx);
    3566           0 :     return;
    3567             :   }
    3568             : }
    3569             : 
    3570             : bool
    3571           0 : XULBuilderListener::InitIds(JSContext* cx, XULBuilderListenerAtoms* atomsCache)
    3572             : {
    3573           0 :   MOZ_ASSERT(!*reinterpret_cast<jsid**>(atomsCache));
    3574             : 
    3575             :   // Initialize these in reverse order so that any failure leaves the first one
    3576             :   // uninitialized.
    3577           0 :   if (!atomsCache->didRebuild_id.init(cx, "didRebuild") ||
    3578           0 :       !atomsCache->willRebuild_id.init(cx, "willRebuild")) {
    3579           0 :     return false;
    3580             :   }
    3581           0 :   return true;
    3582             : }
    3583             : 
    3584             : 
    3585             : 
    3586             : bool
    3587           0 : XULTreeBuilderObserver::CanDrop(int32_t index, int32_t orientation, DataTransfer* dataTransfer, ErrorResult& aRv, const char* aExecutionReason, ExceptionHandling aExceptionHandling, JSCompartment* aCompartment)
    3588             : {
    3589           0 :   CallSetup s(this, aRv, "XULTreeBuilderObserver.canDrop", aExceptionHandling, aCompartment);
    3590           0 :   JSContext* cx = s.GetContext();
    3591           0 :   if (!cx) {
    3592           0 :     MOZ_ASSERT(aRv.Failed());
    3593           0 :     return bool(0);
    3594             :   }
    3595           0 :   JS::Rooted<JS::Value> rval(cx, JS::UndefinedValue());
    3596           0 :   JS::AutoValueVector argv(cx);
    3597           0 :   if (!argv.resize(3)) {
    3598           0 :     aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
    3599           0 :     return bool(0);
    3600             :   }
    3601           0 :   unsigned argc = 3;
    3602             : 
    3603             :   do {
    3604           0 :     if (!dataTransfer) {
    3605           0 :       argv[2].setNull();
    3606           0 :       break;
    3607             :     }
    3608           0 :     if (!GetOrCreateDOMReflector(cx, dataTransfer, argv[2])) {
    3609           0 :       MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    3610           0 :       aRv.Throw(NS_ERROR_UNEXPECTED);
    3611           0 :       return bool(0);
    3612             :     }
    3613           0 :     break;
    3614             :   } while (0);
    3615             : 
    3616             :   do {
    3617           0 :     argv[1].setInt32(int32_t(orientation));
    3618           0 :     break;
    3619             :   } while (0);
    3620             : 
    3621             :   do {
    3622           0 :     argv[0].setInt32(int32_t(index));
    3623           0 :     break;
    3624             :   } while (0);
    3625             : 
    3626           0 :   JS::Rooted<JS::Value> callable(cx);
    3627           0 :   XULTreeBuilderObserverAtoms* atomsCache = GetAtomCache<XULTreeBuilderObserverAtoms>(cx);
    3628           0 :   if ((!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) ||
    3629           0 :       !GetCallableProperty(cx, atomsCache->canDrop_id, &callable)) {
    3630           0 :     aRv.Throw(NS_ERROR_UNEXPECTED);
    3631           0 :     return bool(0);
    3632             :   }
    3633           0 :   JS::Rooted<JS::Value> thisValue(cx, JS::ObjectValue(*mCallback));
    3634           0 :   if (!JS::Call(cx, thisValue, callable,
    3635           0 :                 JS::HandleValueArray::subarray(argv, 0, argc), &rval)) {
    3636           0 :     aRv.NoteJSContextException(cx);
    3637           0 :     return bool(0);
    3638             :   }
    3639             :   bool rvalDecl;
    3640           0 :   if (!ValueToPrimitive<bool, eDefault>(cx, rval, &rvalDecl)) {
    3641           0 :     aRv.Throw(NS_ERROR_UNEXPECTED);
    3642           0 :     return bool(0);
    3643             :   }
    3644           0 :   return rvalDecl;
    3645             : }
    3646             : 
    3647             : void
    3648           0 : XULTreeBuilderObserver::OnDrop(int32_t row, int32_t orientation, DataTransfer* dataTransfer, ErrorResult& aRv, const char* aExecutionReason, ExceptionHandling aExceptionHandling, JSCompartment* aCompartment)
    3649             : {
    3650           0 :   CallSetup s(this, aRv, "XULTreeBuilderObserver.onDrop", aExceptionHandling, aCompartment);
    3651           0 :   JSContext* cx = s.GetContext();
    3652           0 :   if (!cx) {
    3653           0 :     MOZ_ASSERT(aRv.Failed());
    3654           0 :     return;
    3655             :   }
    3656           0 :   JS::Rooted<JS::Value> rval(cx, JS::UndefinedValue());
    3657           0 :   JS::AutoValueVector argv(cx);
    3658           0 :   if (!argv.resize(3)) {
    3659           0 :     aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
    3660           0 :     return;
    3661             :   }
    3662           0 :   unsigned argc = 3;
    3663             : 
    3664             :   do {
    3665           0 :     if (!dataTransfer) {
    3666           0 :       argv[2].setNull();
    3667           0 :       break;
    3668             :     }
    3669           0 :     if (!GetOrCreateDOMReflector(cx, dataTransfer, argv[2])) {
    3670           0 :       MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    3671           0 :       aRv.Throw(NS_ERROR_UNEXPECTED);
    3672           0 :       return;
    3673             :     }
    3674           0 :     break;
    3675             :   } while (0);
    3676             : 
    3677             :   do {
    3678           0 :     argv[1].setInt32(int32_t(orientation));
    3679           0 :     break;
    3680             :   } while (0);
    3681             : 
    3682             :   do {
    3683           0 :     argv[0].setInt32(int32_t(row));
    3684           0 :     break;
    3685             :   } while (0);
    3686             : 
    3687           0 :   JS::Rooted<JS::Value> callable(cx);
    3688           0 :   XULTreeBuilderObserverAtoms* atomsCache = GetAtomCache<XULTreeBuilderObserverAtoms>(cx);
    3689           0 :   if ((!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) ||
    3690           0 :       !GetCallableProperty(cx, atomsCache->onDrop_id, &callable)) {
    3691           0 :     aRv.Throw(NS_ERROR_UNEXPECTED);
    3692           0 :     return;
    3693             :   }
    3694           0 :   JS::Rooted<JS::Value> thisValue(cx, JS::ObjectValue(*mCallback));
    3695           0 :   if (!JS::Call(cx, thisValue, callable,
    3696           0 :                 JS::HandleValueArray::subarray(argv, 0, argc), &rval)) {
    3697           0 :     aRv.NoteJSContextException(cx);
    3698           0 :     return;
    3699             :   }
    3700             : }
    3701             : 
    3702             : void
    3703           0 : XULTreeBuilderObserver::OnToggleOpenState(int32_t index, ErrorResult& aRv, const char* aExecutionReason, ExceptionHandling aExceptionHandling, JSCompartment* aCompartment)
    3704             : {
    3705           0 :   CallSetup s(this, aRv, "XULTreeBuilderObserver.onToggleOpenState", aExceptionHandling, aCompartment);
    3706           0 :   JSContext* cx = s.GetContext();
    3707           0 :   if (!cx) {
    3708           0 :     MOZ_ASSERT(aRv.Failed());
    3709           0 :     return;
    3710             :   }
    3711           0 :   JS::Rooted<JS::Value> rval(cx, JS::UndefinedValue());
    3712           0 :   JS::AutoValueVector argv(cx);
    3713           0 :   if (!argv.resize(1)) {
    3714           0 :     aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
    3715           0 :     return;
    3716             :   }
    3717           0 :   unsigned argc = 1;
    3718             : 
    3719             :   do {
    3720           0 :     argv[0].setInt32(int32_t(index));
    3721           0 :     break;
    3722             :   } while (0);
    3723             : 
    3724           0 :   JS::Rooted<JS::Value> callable(cx);
    3725           0 :   XULTreeBuilderObserverAtoms* atomsCache = GetAtomCache<XULTreeBuilderObserverAtoms>(cx);
    3726           0 :   if ((!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) ||
    3727           0 :       !GetCallableProperty(cx, atomsCache->onToggleOpenState_id, &callable)) {
    3728           0 :     aRv.Throw(NS_ERROR_UNEXPECTED);
    3729           0 :     return;
    3730             :   }
    3731           0 :   JS::Rooted<JS::Value> thisValue(cx, JS::ObjectValue(*mCallback));
    3732           0 :   if (!JS::Call(cx, thisValue, callable,
    3733           0 :                 JS::HandleValueArray::subarray(argv, 0, argc), &rval)) {
    3734           0 :     aRv.NoteJSContextException(cx);
    3735           0 :     return;
    3736             :   }
    3737             : }
    3738             : 
    3739             : void
    3740           0 : XULTreeBuilderObserver::OnCycleHeader(const nsAString& colID, Element* elt, ErrorResult& aRv, const char* aExecutionReason, ExceptionHandling aExceptionHandling, JSCompartment* aCompartment)
    3741             : {
    3742           0 :   CallSetup s(this, aRv, "XULTreeBuilderObserver.onCycleHeader", aExceptionHandling, aCompartment);
    3743           0 :   JSContext* cx = s.GetContext();
    3744           0 :   if (!cx) {
    3745           0 :     MOZ_ASSERT(aRv.Failed());
    3746           0 :     return;
    3747             :   }
    3748           0 :   JS::Rooted<JS::Value> rval(cx, JS::UndefinedValue());
    3749           0 :   JS::AutoValueVector argv(cx);
    3750           0 :   if (!argv.resize(2)) {
    3751           0 :     aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
    3752           0 :     return;
    3753             :   }
    3754           0 :   unsigned argc = 2;
    3755             : 
    3756             :   do {
    3757           0 :     if (!elt) {
    3758           0 :       argv[1].setNull();
    3759           0 :       break;
    3760             :     }
    3761           0 :     if (!GetOrCreateDOMReflector(cx, elt, argv[1])) {
    3762           0 :       MOZ_ASSERT(true || JS_IsExceptionPending(cx));
    3763           0 :       aRv.Throw(NS_ERROR_UNEXPECTED);
    3764           0 :       return;
    3765             :     }
    3766           0 :     break;
    3767             :   } while (0);
    3768             : 
    3769             :   do {
    3770           0 :     nsString mutableStr(colID);
    3771           0 :     if (!xpc::NonVoidStringToJsval(cx, mutableStr, argv[0])) {
    3772           0 :       aRv.Throw(NS_ERROR_UNEXPECTED);
    3773           0 :       return;
    3774             :     }
    3775           0 :     break;
    3776             :   } while (0);
    3777             : 
    3778           0 :   JS::Rooted<JS::Value> callable(cx);
    3779           0 :   XULTreeBuilderObserverAtoms* atomsCache = GetAtomCache<XULTreeBuilderObserverAtoms>(cx);
    3780           0 :   if ((!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) ||
    3781           0 :       !GetCallableProperty(cx, atomsCache->onCycleHeader_id, &callable)) {
    3782           0 :     aRv.Throw(NS_ERROR_UNEXPECTED);
    3783           0 :     return;
    3784             :   }
    3785           0 :   JS::Rooted<JS::Value> thisValue(cx, JS::ObjectValue(*mCallback));
    3786           0 :   if (!JS::Call(cx, thisValue, callable,
    3787           0 :                 JS::HandleValueArray::subarray(argv, 0, argc), &rval)) {
    3788           0 :     aRv.NoteJSContextException(cx);
    3789           0 :     return;
    3790             :   }
    3791             : }
    3792             : 
    3793             : void
    3794           0 : XULTreeBuilderObserver::OnCycleCell(int32_t row, const nsAString& colID, ErrorResult& aRv, const char* aExecutionReason, ExceptionHandling aExceptionHandling, JSCompartment* aCompartment)
    3795             : {
    3796           0 :   CallSetup s(this, aRv, "XULTreeBuilderObserver.onCycleCell", aExceptionHandling, aCompartment);
    3797           0 :   JSContext* cx = s.GetContext();
    3798           0 :   if (!cx) {
    3799           0 :     MOZ_ASSERT(aRv.Failed());
    3800           0 :     return;
    3801             :   }
    3802           0 :   JS::Rooted<JS::Value> rval(cx, JS::UndefinedValue());
    3803           0 :   JS::AutoValueVector argv(cx);
    3804           0 :   if (!argv.resize(2)) {
    3805           0 :     aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
    3806           0 :     return;
    3807             :   }
    3808           0 :   unsigned argc = 2;
    3809             : 
    3810             :   do {
    3811           0 :     nsString mutableStr(colID);
    3812           0 :     if (!xpc::NonVoidStringToJsval(cx, mutableStr, argv[1])) {
    3813           0 :       aRv.Throw(NS_ERROR_UNEXPECTED);
    3814           0 :       return;
    3815             :     }
    3816           0 :     break;
    3817             :   } while (0);
    3818             : 
    3819             :   do {
    3820           0 :     argv[0].setInt32(int32_t(row));
    3821           0 :     break;
    3822             :   } while (0);
    3823             : 
    3824           0 :   JS::Rooted<JS::Value> callable(cx);
    3825           0 :   XULTreeBuilderObserverAtoms* atomsCache = GetAtomCache<XULTreeBuilderObserverAtoms>(cx);
    3826           0 :   if ((!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) ||
    3827           0 :       !GetCallableProperty(cx, atomsCache->onCycleCell_id, &callable)) {
    3828           0 :     aRv.Throw(NS_ERROR_UNEXPECTED);
    3829           0 :     return;
    3830             :   }
    3831           0 :   JS::Rooted<JS::Value> thisValue(cx, JS::ObjectValue(*mCallback));
    3832           0 :   if (!JS::Call(cx, thisValue, callable,
    3833           0 :                 JS::HandleValueArray::subarray(argv, 0, argc), &rval)) {
    3834           0 :     aRv.NoteJSContextException(cx);
    3835           0 :     return;
    3836             :   }
    3837             : }
    3838             : 
    3839             : void
    3840           0 : XULTreeBuilderObserver::OnSelectionChanged(ErrorResult& aRv, const char* aExecutionReason, ExceptionHandling aExceptionHandling, JSCompartment* aCompartment)
    3841             : {
    3842           0 :   CallSetup s(this, aRv, "XULTreeBuilderObserver.onSelectionChanged", aExceptionHandling, aCompartment);
    3843           0 :   JSContext* cx = s.GetContext();
    3844           0 :   if (!cx) {
    3845           0 :     MOZ_ASSERT(aRv.Failed());
    3846           0 :     return;
    3847             :   }
    3848           0 :   JS::Rooted<JS::Value> rval(cx, JS::UndefinedValue());
    3849             : 
    3850           0 :   JS::Rooted<JS::Value> callable(cx);
    3851           0 :   XULTreeBuilderObserverAtoms* atomsCache = GetAtomCache<XULTreeBuilderObserverAtoms>(cx);
    3852           0 :   if ((!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) ||
    3853           0 :       !GetCallableProperty(cx, atomsCache->onSelectionChanged_id, &callable)) {
    3854           0 :     aRv.Throw(NS_ERROR_UNEXPECTED);
    3855           0 :     return;
    3856             :   }
    3857           0 :   JS::Rooted<JS::Value> thisValue(cx, JS::ObjectValue(*mCallback));
    3858           0 :   if (!JS::Call(cx, thisValue, callable,
    3859           0 :                 JS::HandleValueArray::empty(), &rval)) {
    3860           0 :     aRv.NoteJSContextException(cx);
    3861           0 :     return;
    3862             :   }
    3863             : }
    3864             : 
    3865             : void
    3866           0 : XULTreeBuilderObserver::OnPerformAction(const nsAString& action, ErrorResult& aRv, const char* aExecutionReason, ExceptionHandling aExceptionHandling, JSCompartment* aCompartment)
    3867             : {
    3868           0 :   CallSetup s(this, aRv, "XULTreeBuilderObserver.onPerformAction", aExceptionHandling, aCompartment);
    3869           0 :   JSContext* cx = s.GetContext();
    3870           0 :   if (!cx) {
    3871           0 :     MOZ_ASSERT(aRv.Failed());
    3872           0 :     return;
    3873             :   }
    3874           0 :   JS::Rooted<JS::Value> rval(cx, JS::UndefinedValue());
    3875           0 :   JS::AutoValueVector argv(cx);
    3876           0 :   if (!argv.resize(1)) {
    3877           0 :     aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
    3878           0 :     return;
    3879             :   }
    3880           0 :   unsigned argc = 1;
    3881             : 
    3882             :   do {
    3883           0 :     nsString mutableStr(action);
    3884           0 :     if (!xpc::NonVoidStringToJsval(cx, mutableStr, argv[0])) {
    3885           0 :       aRv.Throw(NS_ERROR_UNEXPECTED);
    3886           0 :       return;
    3887             :     }
    3888           0 :     break;
    3889             :   } while (0);
    3890             : 
    3891           0 :   JS::Rooted<JS::Value> callable(cx);
    3892           0 :   XULTreeBuilderObserverAtoms* atomsCache = GetAtomCache<XULTreeBuilderObserverAtoms>(cx);
    3893           0 :   if ((!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) ||
    3894           0 :       !GetCallableProperty(cx, atomsCache->onPerformAction_id, &callable)) {
    3895           0 :     aRv.Throw(NS_ERROR_UNEXPECTED);
    3896           0 :     return;
    3897             :   }
    3898           0 :   JS::Rooted<JS::Value> thisValue(cx, JS::ObjectValue(*mCallback));
    3899           0 :   if (!JS::Call(cx, thisValue, callable,
    3900           0 :                 JS::HandleValueArray::subarray(argv, 0, argc), &rval)) {
    3901           0 :     aRv.NoteJSContextException(cx);
    3902           0 :     return;
    3903             :   }
    3904             : }
    3905             : 
    3906             : void
    3907           0 : XULTreeBuilderObserver::OnPerformActionOnRow(const nsAString& action, int32_t row, ErrorResult& aRv, const char* aExecutionReason, ExceptionHandling aExceptionHandling, JSCompartment* aCompartment)
    3908             : {
    3909           0 :   CallSetup s(this, aRv, "XULTreeBuilderObserver.onPerformActionOnRow", aExceptionHandling, aCompartment);
    3910           0 :   JSContext* cx = s.GetContext();
    3911           0 :   if (!cx) {
    3912           0 :     MOZ_ASSERT(aRv.Failed());
    3913           0 :     return;
    3914             :   }
    3915           0 :   JS::Rooted<JS::Value> rval(cx, JS::UndefinedValue());
    3916           0 :   JS::AutoValueVector argv(cx);
    3917           0 :   if (!argv.resize(2)) {
    3918           0 :     aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
    3919           0 :     return;
    3920             :   }
    3921           0 :   unsigned argc = 2;
    3922             : 
    3923             :   do {
    3924           0 :     argv[1].setInt32(int32_t(row));
    3925           0 :     break;
    3926             :   } while (0);
    3927             : 
    3928             :   do {
    3929           0 :     nsString mutableStr(action);
    3930           0 :     if (!xpc::NonVoidStringToJsval(cx, mutableStr, argv[0])) {
    3931           0 :       aRv.Throw(NS_ERROR_UNEXPECTED);
    3932           0 :       return;
    3933             :     }
    3934           0 :     break;
    3935             :   } while (0);
    3936             : 
    3937           0 :   JS::Rooted<JS::Value> callable(cx);
    3938           0 :   XULTreeBuilderObserverAtoms* atomsCache = GetAtomCache<XULTreeBuilderObserverAtoms>(cx);
    3939           0 :   if ((!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) ||
    3940           0 :       !GetCallableProperty(cx, atomsCache->onPerformActionOnRow_id, &callable)) {
    3941           0 :     aRv.Throw(NS_ERROR_UNEXPECTED);
    3942           0 :     return;
    3943             :   }
    3944           0 :   JS::Rooted<JS::Value> thisValue(cx, JS::ObjectValue(*mCallback));
    3945           0 :   if (!JS::Call(cx, thisValue, callable,
    3946           0 :                 JS::HandleValueArray::subarray(argv, 0, argc), &rval)) {
    3947           0 :     aRv.NoteJSContextException(cx);
    3948           0 :     return;
    3949             :   }
    3950             : }
    3951             : 
    3952             : void
    3953           0 : XULTreeBuilderObserver::OnPerformActionOnCell(const nsAString& action, int32_t row, const nsAString& colID, ErrorResult& aRv, const char* aExecutionReason, ExceptionHandling aExceptionHandling, JSCompartment* aCompartment)
    3954             : {
    3955           0 :   CallSetup s(this, aRv, "XULTreeBuilderObserver.onPerformActionOnCell", aExceptionHandling, aCompartment);
    3956           0 :   JSContext* cx = s.GetContext();
    3957           0 :   if (!cx) {
    3958           0 :     MOZ_ASSERT(aRv.Failed());
    3959           0 :     return;
    3960             :   }
    3961           0 :   JS::Rooted<JS::Value> rval(cx, JS::UndefinedValue());
    3962           0 :   JS::AutoValueVector argv(cx);
    3963           0 :   if (!argv.resize(3)) {
    3964           0 :     aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
    3965           0 :     return;
    3966             :   }
    3967           0 :   unsigned argc = 3;
    3968             : 
    3969             :   do {
    3970           0 :     nsString mutableStr(colID);
    3971           0 :     if (!xpc::NonVoidStringToJsval(cx, mutableStr, argv[2])) {
    3972           0 :       aRv.Throw(NS_ERROR_UNEXPECTED);
    3973           0 :       return;
    3974             :     }
    3975           0 :     break;
    3976             :   } while (0);
    3977             : 
    3978             :   do {
    3979           0 :     argv[1].setInt32(int32_t(row));
    3980           0 :     break;
    3981             :   } while (0);
    3982             : 
    3983             :   do {
    3984           0 :     nsString mutableStr(action);
    3985           0 :     if (!xpc::NonVoidStringToJsval(cx, mutableStr, argv[0])) {
    3986           0 :       aRv.Throw(NS_ERROR_UNEXPECTED);
    3987           0 :       return;
    3988             :     }
    3989           0 :     break;
    3990             :   } while (0);
    3991             : 
    3992           0 :   JS::Rooted<JS::Value> callable(cx);
    3993           0 :   XULTreeBuilderObserverAtoms* atomsCache = GetAtomCache<XULTreeBuilderObserverAtoms>(cx);
    3994           0 :   if ((!*reinterpret_cast<jsid**>(atomsCache) && !InitIds(cx, atomsCache)) ||
    3995           0 :       !GetCallableProperty(cx, atomsCache->onPerformActionOnCell_id, &callable)) {
    3996           0 :     aRv.Throw(NS_ERROR_UNEXPECTED);
    3997           0 :     return;
    3998             :   }
    3999           0 :   JS::Rooted<JS::Value> thisValue(cx, JS::ObjectValue(*mCallback));
    4000           0 :   if (!JS::Call(cx, thisValue, callable,
    4001           0 :                 JS::HandleValueArray::subarray(argv, 0, argc), &rval)) {
    4002           0 :     aRv.NoteJSContextException(cx);
    4003           0 :     return;
    4004             :   }
    4005             : }
    4006             : 
    4007             : bool
    4008           0 : XULTreeBuilderObserver::InitIds(JSContext* cx, XULTreeBuilderObserverAtoms* atomsCache)
    4009             : {
    4010           0 :   MOZ_ASSERT(!*reinterpret_cast<jsid**>(atomsCache));
    4011             : 
    4012             :   // Initialize these in reverse order so that any failure leaves the first one
    4013             :   // uninitialized.
    4014           0 :   if (!atomsCache->onPerformActionOnCell_id.init(cx, "onPerformActionOnCell") ||
    4015           0 :       !atomsCache->onPerformActionOnRow_id.init(cx, "onPerformActionOnRow") ||
    4016           0 :       !atomsCache->onPerformAction_id.init(cx, "onPerformAction") ||
    4017           0 :       !atomsCache->onSelectionChanged_id.init(cx, "onSelectionChanged") ||
    4018           0 :       !atomsCache->onCycleCell_id.init(cx, "onCycleCell") ||
    4019           0 :       !atomsCache->onCycleHeader_id.init(cx, "onCycleHeader") ||
    4020           0 :       !atomsCache->onToggleOpenState_id.init(cx, "onToggleOpenState") ||
    4021           0 :       !atomsCache->onDrop_id.init(cx, "onDrop") ||
    4022           0 :       !atomsCache->canDrop_id.init(cx, "canDrop")) {
    4023           0 :     return false;
    4024             :   }
    4025           0 :   return true;
    4026             : }
    4027             : 
    4028             : 
    4029             : 
    4030             : namespace binding_detail {
    4031             : } // namespace binding_detail
    4032             : 
    4033             : 
    4034             : namespace binding_detail {
    4035             : } // namespace binding_detail
    4036             : 
    4037             : 
    4038             : } // namespace dom
    4039             : } // namespace mozilla

Generated by: LCOV version 1.13