johnson 1.2.0 → 2.0.0.pre0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (782) hide show
  1. data/CHANGELOG.rdoc +8 -0
  2. data/Manifest.txt +762 -48
  3. data/README.rdoc +2 -1
  4. data/Rakefile +90 -18
  5. data/ext/spidermonkey/conversions.c +9 -2
  6. data/ext/spidermonkey/ruby_land_proxy.c +1 -1
  7. data/ext/spidermonkey/runtime.h +1 -1
  8. data/ext/tracemonkey/context.cc +125 -0
  9. data/ext/tracemonkey/context.h +19 -0
  10. data/ext/tracemonkey/conversions.cc +365 -0
  11. data/ext/tracemonkey/conversions.h +32 -0
  12. data/ext/tracemonkey/debugger.cc +234 -0
  13. data/ext/tracemonkey/debugger.h +10 -0
  14. data/ext/tracemonkey/extconf.rb +37 -0
  15. data/ext/tracemonkey/extensions.cc +37 -0
  16. data/ext/tracemonkey/extensions.h +12 -0
  17. data/ext/tracemonkey/global.cc +40 -0
  18. data/ext/tracemonkey/global.h +11 -0
  19. data/ext/tracemonkey/idhash.cc +16 -0
  20. data/ext/tracemonkey/idhash.h +8 -0
  21. data/ext/tracemonkey/immutable_node.cc +1199 -0
  22. data/ext/tracemonkey/immutable_node.cc.erb +559 -0
  23. data/ext/tracemonkey/immutable_node.h +22 -0
  24. data/ext/tracemonkey/jroot.h +215 -0
  25. data/ext/tracemonkey/js_land_proxy.cc +620 -0
  26. data/ext/tracemonkey/js_land_proxy.h +20 -0
  27. data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
  28. data/ext/tracemonkey/ruby_land_proxy.h +38 -0
  29. data/ext/tracemonkey/runtime.cc +454 -0
  30. data/ext/tracemonkey/runtime.h +27 -0
  31. data/ext/tracemonkey/split_global.cc +392 -0
  32. data/ext/tracemonkey/split_global.h +11 -0
  33. data/ext/tracemonkey/tracemonkey.cc +23 -0
  34. data/ext/tracemonkey/tracemonkey.h +32 -0
  35. data/lib/johnson.rb +12 -4
  36. data/lib/johnson/error.rb +5 -0
  37. data/lib/johnson/js/prelude.js +16 -1
  38. data/lib/johnson/parser.rb +2 -1
  39. data/lib/johnson/runtime.rb +87 -26
  40. data/lib/johnson/spidermonkey/runtime.rb +7 -16
  41. data/lib/johnson/tracemonkey.rb +13 -0
  42. data/lib/johnson/tracemonkey/context.rb +10 -0
  43. data/lib/johnson/tracemonkey/debugger.rb +67 -0
  44. data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
  45. data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
  46. data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
  47. data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
  48. data/lib/johnson/tracemonkey/runtime.rb +80 -0
  49. data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
  50. data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
  51. data/test/helper.rb +23 -4
  52. data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
  53. data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
  54. data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
  55. data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
  56. data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
  57. data/test/johnson/generic/conversions/helper.rb +1 -0
  58. data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
  59. data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
  60. data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
  61. data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
  62. data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
  63. data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
  64. data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
  65. data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
  66. data/test/johnson/generic/default_test.rb +12 -0
  67. data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
  68. data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
  69. data/test/johnson/generic/helper.rb +1 -0
  70. data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
  71. data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
  72. data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
  73. data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
  74. data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
  75. data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
  76. data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
  77. data/test/johnson/generic/nodes/export_test.rb +11 -0
  78. data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
  79. data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
  80. data/test/johnson/generic/nodes/helper.rb +1 -0
  81. data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
  82. data/test/johnson/generic/nodes/import_test.rb +15 -0
  83. data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
  84. data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
  85. data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
  86. data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
  87. data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
  88. data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
  89. data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
  90. data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
  91. data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
  92. data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
  93. data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
  94. data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
  95. data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
  96. data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
  97. data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
  98. data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
  99. data/test/johnson/generic/version_test.rb +13 -0
  100. data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
  101. data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
  102. data/test/johnson/generic/visitors/helper.rb +1 -0
  103. data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
  104. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
  105. data/test/johnson/tracemonkey/context_test.rb +21 -0
  106. data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
  107. data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
  108. data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
  109. data/test/johnson/tracemonkey/runtime_test.rb +41 -0
  110. data/test/johnson/tracemonkey/split_global_test.rb +32 -0
  111. data/vendor/spidermonkey/js.pkg +2 -0
  112. data/vendor/tracemonkey/Makefile.in +668 -0
  113. data/vendor/tracemonkey/Makefile.ref +483 -0
  114. data/vendor/tracemonkey/README.html +54 -0
  115. data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
  116. data/vendor/tracemonkey/Y.js +19 -0
  117. data/vendor/tracemonkey/aclocal.m4 +9 -0
  118. data/vendor/tracemonkey/bench.sh +5 -0
  119. data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
  120. data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
  121. data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
  122. data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
  123. data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
  124. data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
  125. data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
  126. data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
  127. data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
  128. data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
  129. data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
  130. data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
  131. data/vendor/tracemonkey/build/hcc +111 -0
  132. data/vendor/tracemonkey/build/hcpp +155 -0
  133. data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
  134. data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
  135. data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
  136. data/vendor/tracemonkey/builtins.tbl +91 -0
  137. data/vendor/tracemonkey/call.js +13 -0
  138. data/vendor/tracemonkey/config.mk +206 -0
  139. data/vendor/tracemonkey/config/Makefile.in +106 -0
  140. data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
  141. data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
  142. data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
  143. data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
  144. data/vendor/tracemonkey/config/config.mk +881 -0
  145. data/vendor/tracemonkey/config/fastcwd.pl +66 -0
  146. data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
  147. data/vendor/tracemonkey/config/insure.mk +53 -0
  148. data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
  149. data/vendor/tracemonkey/config/milestone.pl +112 -0
  150. data/vendor/tracemonkey/config/milestone.txt +13 -0
  151. data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
  152. data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
  153. data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
  154. data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
  155. data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
  156. data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
  157. data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
  158. data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
  159. data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
  160. data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
  161. data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
  162. data/vendor/tracemonkey/config/nfspwd.pl +50 -0
  163. data/vendor/tracemonkey/config/nsinstall.c +481 -0
  164. data/vendor/tracemonkey/config/nsinstall.py +155 -0
  165. data/vendor/tracemonkey/config/pathsub.c +247 -0
  166. data/vendor/tracemonkey/config/pathsub.h +74 -0
  167. data/vendor/tracemonkey/config/preprocessor.pl +671 -0
  168. data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
  169. data/vendor/tracemonkey/config/revdepth.pl +51 -0
  170. data/vendor/tracemonkey/config/rules.mk +2310 -0
  171. data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
  172. data/vendor/tracemonkey/config/static-checking.js +92 -0
  173. data/vendor/tracemonkey/config/string-format.js +61 -0
  174. data/vendor/tracemonkey/config/system-headers +1035 -0
  175. data/vendor/tracemonkey/config/version.mk +85 -0
  176. data/vendor/tracemonkey/config/version_win.pl +442 -0
  177. data/vendor/tracemonkey/configure +14183 -0
  178. data/vendor/tracemonkey/configure.in +5363 -0
  179. data/vendor/tracemonkey/correct.sh +23 -0
  180. data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
  181. data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
  182. data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
  183. data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
  184. data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
  185. data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
  186. data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
  187. data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
  188. data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
  189. data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
  190. data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
  191. data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
  192. data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
  193. data/vendor/tracemonkey/correct/check-mont.js +119 -0
  194. data/vendor/tracemonkey/dtoa.c +3335 -0
  195. data/vendor/tracemonkey/editline/Makefile.in +55 -0
  196. data/vendor/tracemonkey/editline/Makefile.ref +143 -0
  197. data/vendor/tracemonkey/editline/README +83 -0
  198. data/vendor/tracemonkey/editline/editline.3 +175 -0
  199. data/vendor/tracemonkey/editline/editline.c +1371 -0
  200. data/vendor/tracemonkey/editline/editline.h +135 -0
  201. data/vendor/tracemonkey/editline/sysunix.c +182 -0
  202. data/vendor/tracemonkey/editline/unix.h +82 -0
  203. data/vendor/tracemonkey/if.js +13 -0
  204. data/vendor/tracemonkey/imacro_asm.js.in +396 -0
  205. data/vendor/tracemonkey/imacros.c.out +1034 -0
  206. data/vendor/tracemonkey/imacros.jsasm +770 -0
  207. data/vendor/tracemonkey/javascript-trace.d +73 -0
  208. data/vendor/tracemonkey/jitstats.tbl +55 -0
  209. data/vendor/tracemonkey/js-config.h.in +82 -0
  210. data/vendor/tracemonkey/js-config.in +111 -0
  211. data/vendor/tracemonkey/js.mdp +0 -0
  212. data/vendor/tracemonkey/js.msg +312 -0
  213. data/vendor/tracemonkey/js3240.rc +79 -0
  214. data/vendor/tracemonkey/jsOS240.def +654 -0
  215. data/vendor/tracemonkey/jsapi.cpp +6005 -0
  216. data/vendor/tracemonkey/jsapi.h +2727 -0
  217. data/vendor/tracemonkey/jsarena.cpp +450 -0
  218. data/vendor/tracemonkey/jsarena.h +318 -0
  219. data/vendor/tracemonkey/jsarray.cpp +3664 -0
  220. data/vendor/tracemonkey/jsarray.h +238 -0
  221. data/vendor/tracemonkey/jsatom.cpp +1244 -0
  222. data/vendor/tracemonkey/jsatom.h +493 -0
  223. data/vendor/tracemonkey/jsbit.h +249 -0
  224. data/vendor/tracemonkey/jsbool.cpp +184 -0
  225. data/vendor/tracemonkey/jsbool.h +88 -0
  226. data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
  227. data/vendor/tracemonkey/jsbuiltins.h +456 -0
  228. data/vendor/tracemonkey/jsclist.h +139 -0
  229. data/vendor/tracemonkey/jscntxt.cpp +1816 -0
  230. data/vendor/tracemonkey/jscntxt.h +1541 -0
  231. data/vendor/tracemonkey/jscompat.h +57 -0
  232. data/vendor/tracemonkey/jsconfig.mk +181 -0
  233. data/vendor/tracemonkey/jscpucfg.cpp +194 -0
  234. data/vendor/tracemonkey/jscpucfg.h +91 -0
  235. data/vendor/tracemonkey/jsdate.cpp +2465 -0
  236. data/vendor/tracemonkey/jsdate.h +129 -0
  237. data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
  238. data/vendor/tracemonkey/jsdbgapi.h +500 -0
  239. data/vendor/tracemonkey/jsdhash.cpp +876 -0
  240. data/vendor/tracemonkey/jsdhash.h +588 -0
  241. data/vendor/tracemonkey/jsdtoa.cpp +572 -0
  242. data/vendor/tracemonkey/jsdtoa.h +131 -0
  243. data/vendor/tracemonkey/jsdtracef.c +318 -0
  244. data/vendor/tracemonkey/jsdtracef.h +81 -0
  245. data/vendor/tracemonkey/jsemit.cpp +7292 -0
  246. data/vendor/tracemonkey/jsemit.h +802 -0
  247. data/vendor/tracemonkey/jsexn.cpp +1337 -0
  248. data/vendor/tracemonkey/jsexn.h +96 -0
  249. data/vendor/tracemonkey/jsfile.cpp +2747 -0
  250. data/vendor/tracemonkey/jsfile.h +56 -0
  251. data/vendor/tracemonkey/jsfile.msg +90 -0
  252. data/vendor/tracemonkey/jsfun.cpp +3089 -0
  253. data/vendor/tracemonkey/jsfun.h +366 -0
  254. data/vendor/tracemonkey/jsgc.cpp +3816 -0
  255. data/vendor/tracemonkey/jsgc.h +429 -0
  256. data/vendor/tracemonkey/jshash.cpp +477 -0
  257. data/vendor/tracemonkey/jshash.h +151 -0
  258. data/vendor/tracemonkey/jsify.pl +483 -0
  259. data/vendor/tracemonkey/jsinterp.cpp +7441 -0
  260. data/vendor/tracemonkey/jsinterp.h +666 -0
  261. data/vendor/tracemonkey/jsinvoke.cpp +42 -0
  262. data/vendor/tracemonkey/jsiter.cpp +1040 -0
  263. data/vendor/tracemonkey/jsiter.h +140 -0
  264. data/vendor/tracemonkey/jskeyword.tbl +124 -0
  265. data/vendor/tracemonkey/jskwgen.cpp +460 -0
  266. data/vendor/tracemonkey/jslibmath.h +69 -0
  267. data/vendor/tracemonkey/jslock.cpp +1512 -0
  268. data/vendor/tracemonkey/jslock.h +325 -0
  269. data/vendor/tracemonkey/jslocko.asm +60 -0
  270. data/vendor/tracemonkey/jslog2.cpp +111 -0
  271. data/vendor/tracemonkey/jslong.h +167 -0
  272. data/vendor/tracemonkey/jsmath.cpp +806 -0
  273. data/vendor/tracemonkey/jsmath.h +63 -0
  274. data/vendor/tracemonkey/jsnum.cpp +1374 -0
  275. data/vendor/tracemonkey/jsnum.h +280 -0
  276. data/vendor/tracemonkey/jsobj.cpp +6165 -0
  277. data/vendor/tracemonkey/jsobj.h +870 -0
  278. data/vendor/tracemonkey/json.cpp +1338 -0
  279. data/vendor/tracemonkey/json.h +108 -0
  280. data/vendor/tracemonkey/jsopcode.cpp +5484 -0
  281. data/vendor/tracemonkey/jsopcode.h +434 -0
  282. data/vendor/tracemonkey/jsopcode.tbl +591 -0
  283. data/vendor/tracemonkey/jsoplengen.cpp +121 -0
  284. data/vendor/tracemonkey/jsotypes.h +202 -0
  285. data/vendor/tracemonkey/jsparse.cpp +9257 -0
  286. data/vendor/tracemonkey/jsparse.h +900 -0
  287. data/vendor/tracemonkey/jsprf.cpp +1262 -0
  288. data/vendor/tracemonkey/jsprf.h +150 -0
  289. data/vendor/tracemonkey/jsproto.tbl +117 -0
  290. data/vendor/tracemonkey/jsprvtd.h +366 -0
  291. data/vendor/tracemonkey/jspubtd.h +585 -0
  292. data/vendor/tracemonkey/jsregexp.cpp +5051 -0
  293. data/vendor/tracemonkey/jsregexp.h +199 -0
  294. data/vendor/tracemonkey/jsreops.tbl +145 -0
  295. data/vendor/tracemonkey/jsscan.cpp +2040 -0
  296. data/vendor/tracemonkey/jsscan.h +467 -0
  297. data/vendor/tracemonkey/jsscope.cpp +1966 -0
  298. data/vendor/tracemonkey/jsscope.h +487 -0
  299. data/vendor/tracemonkey/jsscript.cpp +1932 -0
  300. data/vendor/tracemonkey/jsscript.h +345 -0
  301. data/vendor/tracemonkey/jsshell.msg +54 -0
  302. data/vendor/tracemonkey/jsstack.js +167 -0
  303. data/vendor/tracemonkey/jsstaticcheck.h +69 -0
  304. data/vendor/tracemonkey/jsstddef.h +87 -0
  305. data/vendor/tracemonkey/jsstdint.h +96 -0
  306. data/vendor/tracemonkey/jsstr.cpp +5277 -0
  307. data/vendor/tracemonkey/jsstr.h +702 -0
  308. data/vendor/tracemonkey/jstracer.cpp +10991 -0
  309. data/vendor/tracemonkey/jstracer.h +794 -0
  310. data/vendor/tracemonkey/jstypes.h +481 -0
  311. data/vendor/tracemonkey/jsutil.cpp +361 -0
  312. data/vendor/tracemonkey/jsutil.h +178 -0
  313. data/vendor/tracemonkey/jsversion.h +243 -0
  314. data/vendor/tracemonkey/jswince.asm +44 -0
  315. data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
  316. data/vendor/tracemonkey/jsxdrapi.h +220 -0
  317. data/vendor/tracemonkey/jsxml.cpp +8327 -0
  318. data/vendor/tracemonkey/jsxml.h +305 -0
  319. data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
  320. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
  321. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
  322. data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
  323. data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
  324. data/vendor/tracemonkey/liveconnect/README.html +712 -0
  325. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
  326. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
  327. data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
  328. data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
  329. data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
  330. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
  331. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
  332. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
  333. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
  334. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
  335. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
  336. data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
  337. data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
  338. data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
  339. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
  340. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
  341. data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
  342. data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
  343. data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
  344. data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
  345. data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
  346. data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
  347. data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
  348. data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
  349. data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
  350. data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
  351. data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
  352. data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
  353. data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
  354. data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
  355. data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
  356. data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
  357. data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
  358. data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
  359. data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
  360. data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
  361. data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
  362. data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
  363. data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
  364. data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
  365. data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
  366. data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
  367. data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
  368. data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
  369. data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
  370. data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
  371. data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
  372. data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
  373. data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
  374. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
  375. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
  376. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
  377. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
  378. data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
  379. data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
  380. data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
  381. data/vendor/tracemonkey/lock_SunOS.s +119 -0
  382. data/vendor/tracemonkey/mandelbrot-results.js +3 -0
  383. data/vendor/tracemonkey/math-partial-sums.js +32 -0
  384. data/vendor/tracemonkey/math-trace-tests.js +507 -0
  385. data/vendor/tracemonkey/md5.js +289 -0
  386. data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
  387. data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
  388. data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
  389. data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
  390. data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
  391. data/vendor/tracemonkey/nanojit/LIR.h +879 -0
  392. data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
  393. data/vendor/tracemonkey/nanojit/Native.h +127 -0
  394. data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
  395. data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
  396. data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
  397. data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
  398. data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
  399. data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
  400. data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
  401. data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
  402. data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
  403. data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
  404. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
  405. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
  406. data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
  407. data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
  408. data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
  409. data/vendor/tracemonkey/perfect.js +39 -0
  410. data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
  411. data/vendor/tracemonkey/prmjtime.cpp +869 -0
  412. data/vendor/tracemonkey/prmjtime.h +103 -0
  413. data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
  414. data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
  415. data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
  416. data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
  417. data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
  418. data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
  419. data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
  420. data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
  421. data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
  422. data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
  423. data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
  424. data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
  425. data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
  426. data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
  427. data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
  428. data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
  429. data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
  430. data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
  431. data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
  432. data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
  433. data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
  434. data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
  435. data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
  436. data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
  437. data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
  438. data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
  439. data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
  440. data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
  441. data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
  442. data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
  443. data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
  444. data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
  445. data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
  446. data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
  447. data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
  448. data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
  449. data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
  450. data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
  451. data/vendor/tracemonkey/resource.h +15 -0
  452. data/vendor/tracemonkey/rules.mk +206 -0
  453. data/vendor/tracemonkey/shell/Makefile.in +72 -0
  454. data/vendor/tracemonkey/shell/js.cpp +4719 -0
  455. data/vendor/tracemonkey/t/3d-cube.js +337 -0
  456. data/vendor/tracemonkey/t/3d-morph.js +54 -0
  457. data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
  458. data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
  459. data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
  460. data/vendor/tracemonkey/t/access-nbody.js +169 -0
  461. data/vendor/tracemonkey/t/access-nsieve.js +38 -0
  462. data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
  463. data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
  464. data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
  465. data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
  466. data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
  467. data/vendor/tracemonkey/t/crypto-aes.js +422 -0
  468. data/vendor/tracemonkey/t/crypto-md5.js +286 -0
  469. data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
  470. data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
  471. data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
  472. data/vendor/tracemonkey/t/math-cordic.js +95 -0
  473. data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
  474. data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
  475. data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
  476. data/vendor/tracemonkey/t/string-base64.js +135 -0
  477. data/vendor/tracemonkey/t/string-fasta.js +85 -0
  478. data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
  479. data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
  480. data/vendor/tracemonkey/t/string-validate-input.js +89 -0
  481. data/vendor/tracemonkey/time.sh +13 -0
  482. data/vendor/tracemonkey/trace-test.js +5564 -0
  483. data/vendor/tracemonkey/v8/base.js +187 -0
  484. data/vendor/tracemonkey/v8/crypto.js +1689 -0
  485. data/vendor/tracemonkey/v8/deltablue.js +880 -0
  486. data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
  487. data/vendor/tracemonkey/v8/raytrace.js +3418 -0
  488. data/vendor/tracemonkey/v8/richards.js +539 -0
  489. data/vendor/tracemonkey/v8/run-crypto.js +44 -0
  490. data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
  491. data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
  492. data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
  493. data/vendor/tracemonkey/v8/run-richards.js +44 -0
  494. data/vendor/tracemonkey/v8/run.js +49 -0
  495. data/vendor/tracemonkey/vprof/readme.txt +93 -0
  496. data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
  497. data/vendor/tracemonkey/vprof/vprof.h +245 -0
  498. data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
  499. data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
  500. data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
  501. data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
  502. data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
  503. data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
  504. data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
  505. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
  506. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
  507. data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
  508. data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
  509. data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
  510. data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
  511. data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
  512. data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
  513. data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
  514. data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
  515. data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
  516. data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
  517. data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
  518. data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
  519. data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
  520. data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
  521. data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
  522. data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
  523. data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
  524. data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
  525. data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
  526. data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
  527. data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
  528. data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
  529. data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
  530. data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
  531. data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
  532. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
  533. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
  534. data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
  535. data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
  536. data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
  537. data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
  538. data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
  539. data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
  540. data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
  541. data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
  542. data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
  543. data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
  544. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
  545. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
  546. data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
  547. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
  548. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
  549. data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
  550. data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
  551. data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
  552. data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
  553. data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
  554. data/vendor/tracemonkey/xpconnect/sample/README +39 -0
  555. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
  556. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
  557. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
  558. data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
  559. data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
  560. data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
  561. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
  562. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
  563. data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
  564. data/vendor/tracemonkey/xpconnect/src/README +3 -0
  565. data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
  566. data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
  567. data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
  568. data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
  569. data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
  570. data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
  571. data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
  572. data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
  573. data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
  574. data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
  575. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
  576. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
  577. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
  578. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
  579. data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
  580. data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
  581. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
  582. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
  583. data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
  584. data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
  585. data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
  586. data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
  587. data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
  588. data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
  589. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
  590. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
  591. data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
  592. data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
  593. data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
  594. data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
  595. data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
  596. data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
  597. data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
  598. data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
  599. data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
  600. data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
  601. data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
  602. data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
  603. data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
  604. data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
  605. data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
  606. data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
  607. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
  608. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
  609. data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
  610. data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
  611. data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
  612. data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
  613. data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
  614. data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
  615. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
  616. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
  617. data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
  618. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
  619. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
  620. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
  621. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
  622. data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
  623. data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
  624. data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
  625. data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
  626. data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
  627. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
  628. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
  629. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
  630. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
  631. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
  632. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
  633. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
  634. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
  635. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
  636. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
  637. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
  638. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
  639. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
  640. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
  641. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
  642. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
  643. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
  644. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
  645. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
  646. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
  647. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
  648. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
  649. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
  650. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
  651. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
  652. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
  653. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
  654. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
  655. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
  656. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
  657. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
  658. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
  659. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
  660. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
  661. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
  662. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
  663. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
  664. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
  665. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
  666. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
  667. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
  668. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
  669. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
  670. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
  671. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
  672. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
  673. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
  674. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
  675. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
  676. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
  677. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
  678. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
  679. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
  680. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
  681. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
  682. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
  683. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
  684. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
  685. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
  686. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
  687. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
  688. data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
  689. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
  690. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
  691. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
  692. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
  693. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
  694. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
  695. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
  696. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
  697. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
  698. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
  699. data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
  700. data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
  701. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
  702. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
  703. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
  704. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
  705. data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
  706. data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
  707. data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
  708. data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
  709. data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
  710. data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
  711. data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
  712. data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
  713. data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
  714. data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
  715. data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
  716. data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
  717. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
  718. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
  719. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
  720. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
  721. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
  722. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
  723. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
  724. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
  725. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
  726. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
  727. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
  728. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
  729. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
  730. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
  731. data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
  732. data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
  733. data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
  734. data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
  735. data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
  736. data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
  737. data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
  738. data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
  739. data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
  740. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
  741. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
  742. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
  743. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
  744. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
  745. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
  746. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
  747. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
  748. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
  749. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
  750. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
  751. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
  752. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
  753. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
  754. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
  755. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
  756. data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
  757. data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
  758. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
  759. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
  760. data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
  761. data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
  762. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
  763. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
  764. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
  765. data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
  766. data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
  767. data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
  768. data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
  769. data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
  770. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
  771. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
  772. data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
  773. data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
  774. data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
  775. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
  776. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
  777. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
  778. data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
  779. metadata +782 -107
  780. data/test/johnson/nodes/export_test.rb +0 -9
  781. data/test/johnson/nodes/import_test.rb +0 -13
  782. data/test/johnson/version_test.rb +0 -13
@@ -0,0 +1,88 @@
1
+ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
+ /* ***** BEGIN LICENSE BLOCK *****
3
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4
+ *
5
+ * The contents of this file are subject to the Mozilla Public License Version
6
+ * 1.1 (the "License"); you may not use this file except in compliance with
7
+ * the License. You may obtain a copy of the License at
8
+ * http://www.mozilla.org/MPL/
9
+ *
10
+ * Software distributed under the License is distributed on an "AS IS" basis,
11
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12
+ * for the specific language governing rights and limitations under the
13
+ * License.
14
+ *
15
+ * The Original Code is mozilla.org code.
16
+ *
17
+ * The Initial Developer of the Original Code is
18
+ * The Mozilla Foundation.
19
+ * Portions created by the Initial Developer are Copyright (C) 2005
20
+ * the Initial Developer. All Rights Reserved.
21
+ *
22
+ * Contributor(s):
23
+ * Johnny Stenback <jst@mozilla.org> (original author)
24
+ * Brendan Eich <brendan@mozilla.org>
25
+ *
26
+ * Alternatively, the contents of this file may be used under the terms of
27
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
28
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29
+ * in which case the provisions of the GPL or the LGPL are applicable instead
30
+ * of those above. If you wish to allow use of your version of this file only
31
+ * under the terms of either the GPL or the LGPL, and not to allow others to
32
+ * use your version of this file under the terms of the MPL, indicate your
33
+ * decision by deleting the provisions above and replace them with the notice
34
+ * and other provisions required by the GPL or the LGPL. If you do not delete
35
+ * the provisions above, a recipient may use your version of this file under
36
+ * the terms of any one of the MPL, the GPL or the LGPL.
37
+ *
38
+ * ***** END LICENSE BLOCK ***** */
39
+
40
+ #include "nscore.h"
41
+ #include "jsapi.h"
42
+
43
+ class nsIPrincipal;
44
+
45
+ class XPCNativeWrapper
46
+ {
47
+ public:
48
+ static PRBool AttachNewConstructorObject(XPCCallContext &ccx,
49
+ JSObject *aGlobalObject);
50
+
51
+ static JSObject *GetNewOrUsed(JSContext *cx, XPCWrappedNative *wrapper,
52
+ nsIPrincipal *aObjectPrincipal);
53
+
54
+ static PRBool IsNativeWrapperClass(JSClass *clazz)
55
+ {
56
+ return clazz == &sXPC_NW_JSClass.base;
57
+ }
58
+
59
+ static PRBool IsNativeWrapper(JSObject *obj)
60
+ {
61
+ return STOBJ_GET_CLASS(obj) == &sXPC_NW_JSClass.base;
62
+ }
63
+
64
+ static JSBool GetWrappedNative(JSContext *cx, JSObject *obj,
65
+ XPCWrappedNative **aWrappedNative);
66
+
67
+ // NB: Use the following carefully.
68
+ static XPCWrappedNative *SafeGetWrappedNative(JSObject *obj)
69
+ {
70
+ return static_cast<XPCWrappedNative *>(xpc_GetJSPrivate(obj));
71
+ }
72
+
73
+
74
+ static JSClass *GetJSClass()
75
+ {
76
+ return &sXPC_NW_JSClass.base;
77
+ }
78
+
79
+ static void ClearWrappedNativeScopes(JSContext* cx,
80
+ XPCWrappedNative* wrapper);
81
+
82
+ protected:
83
+ static JSExtendedClass sXPC_NW_JSClass;
84
+ };
85
+
86
+ JSBool
87
+ XPC_XOW_WrapObject(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
88
+ jsval *rval);
@@ -0,0 +1,1148 @@
1
+ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
+ /* vim: set ts=2 sw=2 et tw=78: */
3
+ /* ***** BEGIN LICENSE BLOCK *****
4
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5
+ *
6
+ * The contents of this file are subject to the Mozilla Public License Version
7
+ * 1.1 (the "License"); you may not use this file except in compliance with
8
+ * the License. You may obtain a copy of the License at
9
+ * http://www.mozilla.org/MPL/
10
+ *
11
+ * Software distributed under the License is distributed on an "AS IS" basis,
12
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13
+ * for the specific language governing rights and limitations under the
14
+ * License.
15
+ *
16
+ * The Original Code is mozilla.org code.
17
+ *
18
+ * The Initial Developer of the Original Code is
19
+ * The Mozilla Foundation.
20
+ * Portions created by the Initial Developer are Copyright (C) 2006
21
+ * the Initial Developer. All Rights Reserved.
22
+ *
23
+ * Contributor(s):
24
+ * Johnny Stenback <jst@mozilla.org> (original author)
25
+ *
26
+ * Alternatively, the contents of this file may be used under the terms of
27
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
28
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29
+ * in which case the provisions of the GPL or the LGPL are applicable instead
30
+ * of those above. If you wish to allow use of your version of this file only
31
+ * under the terms of either the GPL or the LGPL, and not to allow others to
32
+ * use your version of this file under the terms of the MPL, indicate your
33
+ * decision by deleting the provisions above and replace them with the notice
34
+ * and other provisions required by the GPL or the LGPL. If you do not delete
35
+ * the provisions above, a recipient may use your version of this file under
36
+ * the terms of any one of the MPL, the GPL or the LGPL.
37
+ *
38
+ * ***** END LICENSE BLOCK ***** */
39
+
40
+ #include "xpcprivate.h"
41
+ #include "jsdbgapi.h"
42
+ #include "jsscript.h" // for js_ScriptClass
43
+ #include "XPCWrapper.h"
44
+ #include "jsregexp.h"
45
+
46
+ static JSBool
47
+ XPC_SJOW_AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
48
+
49
+ static JSBool
50
+ XPC_SJOW_DelProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
51
+
52
+ static JSBool
53
+ XPC_SJOW_GetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
54
+
55
+ static JSBool
56
+ XPC_SJOW_SetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
57
+
58
+ static JSBool
59
+ XPC_SJOW_Enumerate(JSContext *cx, JSObject *obj);
60
+
61
+ static JSBool
62
+ XPC_SJOW_NewResolve(JSContext *cx, JSObject *obj, jsval id, uintN flags,
63
+ JSObject **objp);
64
+
65
+ static JSBool
66
+ XPC_SJOW_Convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp);
67
+
68
+ static void
69
+ XPC_SJOW_Finalize(JSContext *cx, JSObject *obj);
70
+
71
+ static JSBool
72
+ XPC_SJOW_CheckAccess(JSContext *cx, JSObject *obj, jsval id, JSAccessMode mode,
73
+ jsval *vp);
74
+
75
+ static JSBool
76
+ XPC_SJOW_Call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
77
+ jsval *rval);
78
+
79
+ JSBool
80
+ XPC_SJOW_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
81
+ jsval *rval);
82
+
83
+ static JSBool
84
+ XPC_SJOW_Create(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
85
+ jsval *rval);
86
+
87
+ static JSBool
88
+ XPC_SJOW_Equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp);
89
+
90
+ static JSObject *
91
+ XPC_SJOW_Iterator(JSContext *cx, JSObject *obj, JSBool keysonly);
92
+
93
+ static JSObject *
94
+ XPC_SJOW_WrappedObject(JSContext *cx, JSObject *obj);
95
+
96
+ static inline
97
+ JSBool
98
+ ThrowException(nsresult ex, JSContext *cx)
99
+ {
100
+ XPCThrower::Throw(ex, cx);
101
+
102
+ return JS_FALSE;
103
+ }
104
+
105
+ // Find the subject and object principal. The argument
106
+ // subjectPrincipal can be null if the caller doesn't care about the
107
+ // subject principal, and secMgr can also be null if the caller
108
+ // doesn't need the security manager.
109
+ static nsresult
110
+ FindPrincipals(JSContext *cx, JSObject *obj, nsIPrincipal **objectPrincipal,
111
+ nsIPrincipal **subjectPrincipal,
112
+ nsIScriptSecurityManager **secMgr)
113
+ {
114
+ XPCCallContext ccx(JS_CALLER, cx);
115
+
116
+ if (!ccx.IsValid()) {
117
+ return NS_ERROR_UNEXPECTED;
118
+ }
119
+
120
+ nsIScriptSecurityManager *ssm = XPCWrapper::GetSecurityManager();
121
+
122
+ if (subjectPrincipal) {
123
+ NS_IF_ADDREF(*subjectPrincipal = ssm->GetCxSubjectPrincipal(cx));
124
+ }
125
+
126
+ ssm->GetObjectPrincipal(cx, obj, objectPrincipal);
127
+
128
+ if (secMgr) {
129
+ NS_ADDREF(*secMgr = ssm);
130
+ }
131
+
132
+ return *objectPrincipal ? NS_OK : NS_ERROR_XPC_SECURITY_MANAGER_VETO;
133
+ }
134
+
135
+ static PRBool
136
+ CanCallerAccess(JSContext *cx, JSObject *unsafeObj)
137
+ {
138
+ nsCOMPtr<nsIPrincipal> subjPrincipal, objPrincipal;
139
+ nsCOMPtr<nsIScriptSecurityManager> ssm;
140
+ nsresult rv = FindPrincipals(cx, unsafeObj, getter_AddRefs(objPrincipal),
141
+ getter_AddRefs(subjPrincipal),
142
+ getter_AddRefs(ssm));
143
+ if (NS_FAILED(rv)) {
144
+ return ThrowException(rv, cx);
145
+ }
146
+
147
+ // Assume that we're trusted if there's no running code.
148
+ if (!subjPrincipal) {
149
+ return PR_TRUE;
150
+ }
151
+
152
+ PRBool subsumes;
153
+ rv = subjPrincipal->Subsumes(objPrincipal, &subsumes);
154
+
155
+ if (NS_FAILED(rv) || !subsumes) {
156
+ PRBool enabled = PR_FALSE;
157
+ rv = ssm->IsCapabilityEnabled("UniversalXPConnect", &enabled);
158
+ if (NS_FAILED(rv)) {
159
+ return ThrowException(rv, cx);
160
+ }
161
+
162
+ if (!enabled) {
163
+ return ThrowException(NS_ERROR_XPC_SECURITY_MANAGER_VETO, cx);
164
+ }
165
+ }
166
+
167
+ return PR_TRUE;
168
+ }
169
+
170
+ static JSPrincipals *
171
+ FindObjectPrincipals(JSContext *cx, JSObject *obj)
172
+ {
173
+ nsCOMPtr<nsIPrincipal> objPrincipal;
174
+ nsresult rv = FindPrincipals(cx, obj, getter_AddRefs(objPrincipal), nsnull,
175
+ nsnull);
176
+ if (NS_FAILED(rv)) {
177
+ return nsnull;
178
+ }
179
+
180
+ JSPrincipals *jsprin;
181
+ rv = objPrincipal->GetJSPrincipals(cx, &jsprin);
182
+ if (NS_FAILED(rv)) {
183
+ return nsnull;
184
+ }
185
+
186
+ return jsprin;
187
+ }
188
+
189
+
190
+ // JS class for XPCSafeJSObjectWrapper (and this doubles as the
191
+ // constructor for XPCSafeJSObjectWrapper for the moment too...)
192
+
193
+ JSExtendedClass sXPC_SJOW_JSClass = {
194
+ // JSClass (JSExtendedClass.base) initialization
195
+ { "XPCSafeJSObjectWrapper",
196
+ JSCLASS_NEW_RESOLVE | JSCLASS_IS_EXTENDED |
197
+ JSCLASS_HAS_RESERVED_SLOTS(XPCWrapper::sNumSlots + 3),
198
+ XPC_SJOW_AddProperty, XPC_SJOW_DelProperty,
199
+ XPC_SJOW_GetProperty, XPC_SJOW_SetProperty,
200
+ XPC_SJOW_Enumerate, (JSResolveOp)XPC_SJOW_NewResolve,
201
+ XPC_SJOW_Convert, XPC_SJOW_Finalize,
202
+ nsnull, XPC_SJOW_CheckAccess,
203
+ XPC_SJOW_Call, XPC_SJOW_Create,
204
+ nsnull, nsnull,
205
+ nsnull, nsnull
206
+ },
207
+ // JSExtendedClass initialization
208
+ XPC_SJOW_Equality,
209
+ nsnull, // outerObject
210
+ nsnull, // innerObject
211
+ XPC_SJOW_Iterator,
212
+ XPC_SJOW_WrappedObject,
213
+ JSCLASS_NO_RESERVED_MEMBERS
214
+ };
215
+
216
+ static JSBool
217
+ XPC_SJOW_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
218
+ jsval *rval);
219
+
220
+ // Reserved slot indexes on safe wrappers.
221
+
222
+ // Boolean value, initialized to false on object creation and true
223
+ // only while we're resolving a property on the object.
224
+ #define XPC_SJOW_SLOT_IS_RESOLVING 0
225
+
226
+ // Slot for caching a compiled scripted function for property
227
+ // get/set.
228
+ #define XPC_SJOW_SLOT_SCRIPTED_GETSET 1
229
+
230
+ // Slot for caching a compiled scripted function for function
231
+ // calling.
232
+ #define XPC_SJOW_SLOT_SCRIPTED_FUN 2
233
+
234
+ // Slot for caching a compiled scripted function for calling
235
+ // toString().
236
+ #define XPC_SJOW_SLOT_SCRIPTED_TOSTRING 3
237
+
238
+ // Slot for holding on to the principal to use if a principal other
239
+ // than that of the unsafe object is desired for this wrapper
240
+ // (nsIPrincipal, strong reference).
241
+ #define XPC_SJOW_SLOT_PRINCIPAL 4
242
+
243
+
244
+ // Wrap a JS value in a safe wrapper of a function wrapper if
245
+ // needed. Note that rval must point to something rooted when calling
246
+ // this function.
247
+ static JSBool
248
+ WrapJSValue(JSContext *cx, JSObject *obj, jsval val, jsval *rval)
249
+ {
250
+ JSBool ok = JS_TRUE;
251
+
252
+ if (JSVAL_IS_PRIMITIVE(val)) {
253
+ *rval = val;
254
+ } else {
255
+ // Construct a new safe wrapper. Note that it doesn't matter what
256
+ // parent we pass in here, the construct hook will ensure we get
257
+ // the right parent for the wrapper.
258
+ JSObject *safeObj =
259
+ ::JS_ConstructObjectWithArguments(cx, &sXPC_SJOW_JSClass.base, nsnull,
260
+ nsnull, 1, &val);
261
+ if (!safeObj) {
262
+ return JS_FALSE;
263
+ }
264
+
265
+ // Set *rval to safeObj here to ensure it doesn't get collected in
266
+ // any of the code below.
267
+ *rval = OBJECT_TO_JSVAL(safeObj);
268
+
269
+ // If obj and safeObj are from the same scope, propagate cached
270
+ // scripted functions to the new safe object.
271
+ if (JS_GetGlobalForObject(cx, obj) == JS_GetGlobalForObject(cx, safeObj)) {
272
+ jsval rsval;
273
+ if (!::JS_GetReservedSlot(cx, obj, XPC_SJOW_SLOT_SCRIPTED_GETSET,
274
+ &rsval) ||
275
+ !::JS_SetReservedSlot(cx, safeObj, XPC_SJOW_SLOT_SCRIPTED_GETSET,
276
+ rsval) ||
277
+ !::JS_GetReservedSlot(cx, obj, XPC_SJOW_SLOT_SCRIPTED_FUN,
278
+ &rsval) ||
279
+ !::JS_SetReservedSlot(cx, safeObj, XPC_SJOW_SLOT_SCRIPTED_FUN,
280
+ rsval)) {
281
+ return JS_FALSE;
282
+ }
283
+ } else {
284
+ // Check to see if the new object we just wrapped is accessible
285
+ // from the unsafe object we got the new object through. If not,
286
+ // force the new wrapper to use the principal of the unsafe
287
+ // object we got the new object from.
288
+ nsCOMPtr<nsIPrincipal> srcObjPrincipal;
289
+ nsCOMPtr<nsIPrincipal> subjPrincipal;
290
+ nsCOMPtr<nsIPrincipal> valObjPrincipal;
291
+
292
+ nsresult rv = FindPrincipals(cx, obj, getter_AddRefs(srcObjPrincipal),
293
+ getter_AddRefs(subjPrincipal), nsnull);
294
+ if (NS_FAILED(rv)) {
295
+ return ThrowException(rv, cx);
296
+ }
297
+
298
+ rv = FindPrincipals(cx, JSVAL_TO_OBJECT(val),
299
+ getter_AddRefs(valObjPrincipal), nsnull, nsnull);
300
+ if (NS_FAILED(rv)) {
301
+ return ThrowException(rv, cx);
302
+ }
303
+
304
+ PRBool subsumes = PR_FALSE;
305
+ rv = srcObjPrincipal->Subsumes(valObjPrincipal, &subsumes);
306
+ if (NS_FAILED(rv)) {
307
+ return ThrowException(rv, cx);
308
+ }
309
+
310
+ // If the subject can access both the source and object principals, then
311
+ // don't bother forcing the principal below.
312
+ if (!subsumes && subjPrincipal) {
313
+ PRBool subjSubsumes = PR_FALSE;
314
+ rv = subjPrincipal->Subsumes(srcObjPrincipal, &subjSubsumes);
315
+ if (NS_SUCCEEDED(rv) && subjSubsumes) {
316
+ rv = subjPrincipal->Subsumes(valObjPrincipal, &subjSubsumes);
317
+ if (NS_SUCCEEDED(rv) && subjSubsumes) {
318
+ subsumes = PR_TRUE;
319
+ }
320
+ }
321
+ }
322
+
323
+ if (!subsumes) {
324
+ // The unsafe object we got the new object from can not access
325
+ // the new object, force the wrapper we just created to use
326
+ // the principal of the unsafe object to prevent users of the
327
+ // new object wrapper from evaluating code through the new
328
+ // wrapper with the principal of the new object.
329
+ if (!::JS_SetReservedSlot(cx, safeObj, XPC_SJOW_SLOT_PRINCIPAL,
330
+ PRIVATE_TO_JSVAL(srcObjPrincipal.get()))) {
331
+ return JS_FALSE;
332
+ }
333
+
334
+ // Pass on ownership of the new object principal to the
335
+ // wrapper.
336
+ nsIPrincipal *tmp = nsnull;
337
+ srcObjPrincipal.swap(tmp);
338
+ }
339
+ }
340
+ }
341
+
342
+ return ok;
343
+ }
344
+
345
+ static inline JSObject *
346
+ FindSafeObject(JSObject *obj)
347
+ {
348
+ while (STOBJ_GET_CLASS(obj) != &sXPC_SJOW_JSClass.base) {
349
+ obj = STOBJ_GET_PROTO(obj);
350
+
351
+ if (!obj) {
352
+ break;
353
+ }
354
+ }
355
+
356
+ return obj;
357
+ }
358
+
359
+ PRBool
360
+ IsXPCSafeJSObjectWrapperClass(JSClass *clazz)
361
+ {
362
+ return clazz == &sXPC_SJOW_JSClass.base;
363
+ }
364
+
365
+ static inline JSObject *
366
+ GetUnsafeObject(JSObject *obj)
367
+ {
368
+ obj = FindSafeObject(obj);
369
+
370
+ if (!obj) {
371
+ return nsnull;
372
+ }
373
+
374
+ return STOBJ_GET_PARENT(obj);
375
+ }
376
+
377
+ JSObject *
378
+ XPC_SJOW_GetUnsafeObject(JSObject *obj)
379
+ {
380
+ return GetUnsafeObject(obj);
381
+ }
382
+
383
+ static jsval
384
+ UnwrapJSValue(jsval val)
385
+ {
386
+ if (JSVAL_IS_PRIMITIVE(val)) {
387
+ return val;
388
+ }
389
+
390
+ JSObject *unsafeObj = GetUnsafeObject(JSVAL_TO_OBJECT(val));
391
+ if (unsafeObj) {
392
+ return OBJECT_TO_JSVAL(unsafeObj);
393
+ }
394
+
395
+ return val;
396
+ }
397
+
398
+ // Get a scripted function for use with the safe wrapper (obj) when
399
+ // accessing an unsafe object (unsafeObj). If a scripted function
400
+ // already exists in the reserved slot slotIndex, use it, otherwise
401
+ // create a new one and cache it in that same slot. The source of the
402
+ // script is passed in funScript, and the resulting (new or cached)
403
+ // scripted function is returned through scriptedFunVal.
404
+ static JSBool
405
+ GetScriptedFunction(JSContext *cx, JSObject *obj, JSObject *unsafeObj,
406
+ uint32 slotIndex, const nsAFlatCString& funScript,
407
+ jsval *scriptedFunVal)
408
+ {
409
+ if (!::JS_GetReservedSlot(cx, obj, slotIndex, scriptedFunVal)) {
410
+ return JS_FALSE;
411
+ }
412
+
413
+ // If we either have no scripted function in the requested slot yet,
414
+ // or if the scope of the unsafeObj changed since we compiled the
415
+ // scripted function, re-compile to make sure the scripted function
416
+ // is properly scoped etc.
417
+ if (JSVAL_IS_VOID(*scriptedFunVal) ||
418
+ JS_GetGlobalForObject(cx, unsafeObj) !=
419
+ JS_GetGlobalForObject(cx, JSVAL_TO_OBJECT(*scriptedFunVal))) {
420
+ // Check whether we have a cached principal or not.
421
+ jsval pv;
422
+ if (!::JS_GetReservedSlot(cx, obj, XPC_SJOW_SLOT_PRINCIPAL, &pv)) {
423
+ return JS_FALSE;
424
+ }
425
+
426
+ JSPrincipals *jsprin = nsnull;
427
+
428
+ if (!JSVAL_IS_VOID(pv)) {
429
+ nsIPrincipal *principal = (nsIPrincipal *)JSVAL_TO_PRIVATE(pv);
430
+
431
+ // Found a cached principal, use it rather than looking up the
432
+ // principal of the unsafe object.
433
+ principal->GetJSPrincipals(cx, &jsprin);
434
+ } else {
435
+ // No cached principal found, look up the principal based on the
436
+ // unsafe object.
437
+ jsprin = FindObjectPrincipals(cx, unsafeObj);
438
+ }
439
+
440
+ if (!jsprin) {
441
+ return ThrowException(NS_ERROR_UNEXPECTED, cx);
442
+ }
443
+
444
+ JSFunction *scriptedFun =
445
+ ::JS_CompileFunctionForPrincipals(cx,
446
+ JS_GetGlobalForObject(cx, unsafeObj),
447
+ jsprin, nsnull, 0, nsnull,
448
+ funScript.get(), funScript.Length(),
449
+ "XPCSafeJSObjectWrapper.cpp",
450
+ __LINE__);
451
+
452
+ JSPRINCIPALS_DROP(cx, jsprin);
453
+
454
+ if (!scriptedFun) {
455
+ return ThrowException(NS_ERROR_FAILURE, cx);
456
+ }
457
+
458
+ *scriptedFunVal = OBJECT_TO_JSVAL(::JS_GetFunctionObject(scriptedFun));
459
+
460
+ if (*scriptedFunVal == JSVAL_NULL ||
461
+ !::JS_SetReservedSlot(cx, obj, slotIndex, *scriptedFunVal)) {
462
+ return JS_FALSE;
463
+ }
464
+ }
465
+
466
+ return JS_TRUE;
467
+ }
468
+
469
+
470
+ static JSBool
471
+ XPC_SJOW_AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
472
+ {
473
+ // The constructor and toString properties needs to live on the safe
474
+ // wrapper.
475
+ if (id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_CONSTRUCTOR) ||
476
+ id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_TO_STRING)) {
477
+ return JS_TRUE;
478
+ }
479
+
480
+ obj = FindSafeObject(obj);
481
+ NS_ASSERTION(obj != nsnull, "FindSafeObject() returned null in class hook!");
482
+
483
+ // Do nothing here if we're in the middle of resolving a property on
484
+ // this safe wrapper.
485
+ jsval isResolving;
486
+ JSBool ok = ::JS_GetReservedSlot(cx, obj, XPC_SJOW_SLOT_IS_RESOLVING,
487
+ &isResolving);
488
+ if (!ok || HAS_FLAGS(isResolving, FLAG_RESOLVING)) {
489
+ return ok;
490
+ }
491
+
492
+ JSObject *unsafeObj = GetUnsafeObject(obj);
493
+ if (!unsafeObj) {
494
+ return ThrowException(NS_ERROR_UNEXPECTED, cx);
495
+ }
496
+
497
+ // Check that the caller can access the unsafe object.
498
+ if (!CanCallerAccess(cx, unsafeObj)) {
499
+ // CanCallerAccess() already threw for us.
500
+ return JS_FALSE;
501
+ }
502
+
503
+ return XPCWrapper::AddProperty(cx, obj, JS_FALSE, unsafeObj, id, vp);
504
+ }
505
+
506
+ static JSBool
507
+ XPC_SJOW_DelProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
508
+ {
509
+ JSObject *unsafeObj = GetUnsafeObject(obj);
510
+ if (!unsafeObj) {
511
+ return ThrowException(NS_ERROR_UNEXPECTED, cx);
512
+ }
513
+
514
+ // Check that the caller can access the unsafe object.
515
+ if (!CanCallerAccess(cx, unsafeObj)) {
516
+ // CanCallerAccess() already threw for us.
517
+ return JS_FALSE;
518
+ }
519
+
520
+ return XPCWrapper::DelProperty(cx, unsafeObj, id, vp);
521
+ }
522
+
523
+ static inline JSBool
524
+ CallWithoutStatics(JSContext *cx, JSObject *obj, jsval fval, uintN argc,
525
+ jsval *argv, jsval *rval)
526
+ {
527
+ JSRegExpStatics statics;
528
+ JSTempValueRooter tvr;
529
+ js_SaveAndClearRegExpStatics(cx, &statics, &tvr);
530
+ JSBool ok = ::JS_CallFunctionValue(cx, obj, fval, argc, argv, rval);
531
+ js_RestoreRegExpStatics(cx, &statics, &tvr);
532
+ return ok;
533
+ }
534
+
535
+ // Call wrapper to help with wrapping calls to functions or callable
536
+ // objects in a scripted function (see XPC_SJOW_Call()). The first
537
+ // argument passed to this method is the unsafe function to call, the
538
+ // rest are the arguments to pass to the function we're calling.
539
+ static JSBool
540
+ XPC_SJOW_CallWrapper(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
541
+ jsval *rval)
542
+ {
543
+ // Make sure we've got at least one argument (which may not be the
544
+ // case if someone's monkeying with this function directly from JS).
545
+ if (argc < 1) {
546
+ return ThrowException(NS_ERROR_INVALID_ARG, cx);
547
+ }
548
+
549
+ return CallWithoutStatics(cx, obj, argv[0], argc - 1, argv + 1, rval);
550
+ }
551
+
552
+ static JSBool
553
+ XPC_SJOW_GetOrSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp,
554
+ JSBool aIsSet)
555
+ {
556
+ // We resolve toString to a function in our resolve hook.
557
+ if (id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_TO_STRING)) {
558
+ return JS_TRUE;
559
+ }
560
+
561
+ obj = FindSafeObject(obj);
562
+ NS_ASSERTION(obj != nsnull, "FindSafeObject() returned null in class hook!");
563
+
564
+ JSObject *unsafeObj = GetUnsafeObject(obj);
565
+ if (!unsafeObj) {
566
+ return ThrowException(NS_ERROR_UNEXPECTED, cx);
567
+ }
568
+
569
+ // Check that the caller can access the unsafe object.
570
+ if (!CanCallerAccess(cx, unsafeObj)) {
571
+ // CanCallerAccess() already threw for us.
572
+ return JS_FALSE;
573
+ }
574
+
575
+ // Function body for wrapping property get/set in a scripted
576
+ // caller. This scripted function's first argument is the property
577
+ // to get/set. If the operation is a get operation, the function is
578
+ // passed one argument. If the operation is a set operation, the
579
+ // function gets two arguments and the second argument will be the
580
+ // value to set the property to.
581
+ NS_NAMED_LITERAL_CSTRING(funScript,
582
+ "if (arguments.length == 1) return this[arguments[0]];"
583
+ "return this[arguments[0]] = arguments[1];");
584
+
585
+ jsval scriptedFunVal;
586
+ if (!GetScriptedFunction(cx, obj, unsafeObj, XPC_SJOW_SLOT_SCRIPTED_GETSET,
587
+ funScript, &scriptedFunVal)) {
588
+ return JS_FALSE;
589
+ }
590
+
591
+ // Build up our argument array per the comment above.
592
+ jsval args[2];
593
+
594
+ args[0] = id;
595
+
596
+ if (aIsSet) {
597
+ args[1] = UnwrapJSValue(*vp);
598
+ }
599
+
600
+ jsval val;
601
+ JSBool ok = CallWithoutStatics(cx, unsafeObj, scriptedFunVal,
602
+ aIsSet ? 2 : 1, args, &val);
603
+ return ok && WrapJSValue(cx, obj, val, vp);
604
+ }
605
+
606
+ static JSBool
607
+ XPC_SJOW_GetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
608
+ {
609
+ return XPC_SJOW_GetOrSetProperty(cx, obj, id, vp, PR_FALSE);
610
+ }
611
+
612
+ static JSBool
613
+ XPC_SJOW_SetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
614
+ {
615
+ return XPC_SJOW_GetOrSetProperty(cx, obj, id, vp, PR_TRUE);
616
+ }
617
+
618
+ static JSBool
619
+ XPC_SJOW_Enumerate(JSContext *cx, JSObject *obj)
620
+ {
621
+ obj = FindSafeObject(obj);
622
+ NS_ASSERTION(obj != nsnull, "FindSafeObject() returned null in class hook!");
623
+
624
+ // We are being notified of a for-in loop or similar operation on
625
+ // this XPCSafeJSObjectWrapper. Forward to the correct high-level
626
+ // object hook, OBJ_ENUMERATE on the unsafe object, called via the
627
+ // JS_Enumerate API. Then reflect properties named by the
628
+ // enumerated identifiers from the unsafe object to the safe
629
+ // wrapper.
630
+
631
+ JSObject *unsafeObj = GetUnsafeObject(obj);
632
+ if (!unsafeObj) {
633
+ return JS_TRUE;
634
+ }
635
+
636
+ // Check that the caller can access the unsafe object.
637
+ if (!CanCallerAccess(cx, unsafeObj)) {
638
+ // CanCallerAccess() already threw for us.
639
+ return JS_FALSE;
640
+ }
641
+
642
+ // Since we enumerate using JS_Enumerate() on the unsafe object here
643
+ // we don't need to do a security check since JS_Enumerate() will
644
+ // look up unsafeObj.__iterator__ and if we don't have permission to
645
+ // access that, it'll throw and we'll be safe.
646
+
647
+ return XPCWrapper::Enumerate(cx, obj, unsafeObj);
648
+ }
649
+
650
+ static JSBool
651
+ XPC_SJOW_NewResolve(JSContext *cx, JSObject *obj, jsval id, uintN flags,
652
+ JSObject **objp)
653
+ {
654
+ obj = FindSafeObject(obj);
655
+ NS_ASSERTION(obj != nsnull, "FindSafeObject() returned null in class hook!");
656
+
657
+ JSObject *unsafeObj = GetUnsafeObject(obj);
658
+ if (!unsafeObj) {
659
+ // No unsafe object, nothing to resolve here.
660
+
661
+ return JS_TRUE;
662
+ }
663
+
664
+ // Check that the caller can access the unsafe object.
665
+ if (!CanCallerAccess(cx, unsafeObj)) {
666
+ // CanCallerAccess() already threw for us.
667
+ return JS_FALSE;
668
+ }
669
+
670
+ // Resolve toString specially.
671
+ if (id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_TO_STRING)) {
672
+ *objp = obj;
673
+ return JS_DefineFunction(cx, obj, "toString",
674
+ XPC_SJOW_toString, 0, 0) != nsnull;
675
+ }
676
+
677
+ return XPCWrapper::NewResolve(cx, obj, JS_FALSE, unsafeObj, id, flags, objp);
678
+ }
679
+
680
+ static JSBool
681
+ XPC_SJOW_Convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
682
+ {
683
+ NS_ASSERTION(type != JSTYPE_STRING, "toString failed us");
684
+ return JS_TRUE;
685
+ }
686
+
687
+ static void
688
+ XPC_SJOW_Finalize(JSContext *cx, JSObject *obj)
689
+ {
690
+ // Release the reference to the cached principal if we have one.
691
+ jsval v;
692
+ if (::JS_GetReservedSlot(cx, obj, XPC_SJOW_SLOT_PRINCIPAL, &v) &&
693
+ !JSVAL_IS_VOID(v)) {
694
+ nsIPrincipal *principal = (nsIPrincipal *)JSVAL_TO_PRIVATE(v);
695
+
696
+ NS_RELEASE(principal);
697
+ }
698
+ }
699
+
700
+ static JSBool
701
+ XPC_SJOW_CheckAccess(JSContext *cx, JSObject *obj, jsval id,
702
+ JSAccessMode mode, jsval *vp)
703
+ {
704
+ // Prevent setting __proto__ on an XPCSafeJSObjectWrapper
705
+ if ((mode & JSACC_WATCH) == JSACC_PROTO && (mode & JSACC_WRITE)) {
706
+ return ThrowException(NS_ERROR_XPC_SECURITY_MANAGER_VETO, cx);
707
+ }
708
+
709
+ // Forward to the checkObjectAccess hook in the runtime, if any.
710
+ JSSecurityCallbacks *callbacks = JS_GetSecurityCallbacks(cx);
711
+ if (callbacks && callbacks->checkObjectAccess &&
712
+ !callbacks->checkObjectAccess(cx, obj, id, mode, vp)) {
713
+ return JS_FALSE;
714
+ }
715
+
716
+ JSObject *unsafeObj = GetUnsafeObject(obj);
717
+ if (!unsafeObj) {
718
+ return JS_TRUE;
719
+ }
720
+
721
+ // Forward the unsafe object to the checkObjectAccess hook in the
722
+ // runtime too, if any.
723
+ if (callbacks && callbacks->checkObjectAccess &&
724
+ !callbacks->checkObjectAccess(cx, unsafeObj, id, mode, vp)) {
725
+ return JS_FALSE;
726
+ }
727
+
728
+ JSClass *clazz = STOBJ_GET_CLASS(unsafeObj);
729
+ return !clazz->checkAccess ||
730
+ clazz->checkAccess(cx, unsafeObj, id, mode, vp);
731
+ }
732
+
733
+ static JSBool
734
+ XPC_SJOW_Call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
735
+ jsval *rval)
736
+ {
737
+ JSObject *tmp = FindSafeObject(obj);
738
+ JSObject *unsafeObj, *callThisObj = nsnull;
739
+
740
+ if (tmp) {
741
+ // A function wrapped in an XPCSafeJSObjectWrapper is being called
742
+ // directly (i.e. safeObj.fun()), set obj to be the safe object
743
+ // wrapper. In this case, the "this" object used when calling the
744
+ // function will be the unsafe object gotten off of the safe
745
+ // object.
746
+ obj = tmp;
747
+ } else {
748
+ // A function wrapped in an XPCSafeJSObjectWrapper is being called
749
+ // indirectly off of an object that's not a safe wrapper
750
+ // (i.e. foo.bar = safeObj.fun; foo.bar()), set obj to be the safe
751
+ // wrapper for the function, and use the object passed in as the
752
+ // "this" object when calling the function.
753
+ callThisObj = obj;
754
+
755
+ // Check that the caller can access the object we're about to pass
756
+ // in as "this" for the call we're about to make.
757
+ if (!CanCallerAccess(cx, callThisObj)) {
758
+ // CanCallerAccess() already threw for us.
759
+ return JS_FALSE;
760
+ }
761
+
762
+ obj = FindSafeObject(JSVAL_TO_OBJECT(argv[-2]));
763
+
764
+ if (!obj) {
765
+ return ThrowException(NS_ERROR_INVALID_ARG, cx);
766
+ }
767
+ }
768
+
769
+ unsafeObj = GetUnsafeObject(obj);
770
+ if (!unsafeObj) {
771
+ return ThrowException(NS_ERROR_UNEXPECTED, cx);
772
+ }
773
+
774
+ if (!callThisObj) {
775
+ callThisObj = unsafeObj;
776
+ }
777
+
778
+ JSObject *funToCall = GetUnsafeObject(JSVAL_TO_OBJECT(argv[-2]));
779
+
780
+ if (!funToCall) {
781
+ // Someone has called XPCSafeJSObjectWrapper.prototype() causing
782
+ // us to find a safe object wrapper without an unsafeObject as
783
+ // its parent. That call shouldn't do anything, so bail here.
784
+ return JS_TRUE;
785
+ }
786
+
787
+ // Check that the caller can access the unsafe object on which the
788
+ // call is being made, and the actual function we're about to call.
789
+ if (!CanCallerAccess(cx, unsafeObj) || !CanCallerAccess(cx, funToCall)) {
790
+ // CanCallerAccess() already threw for us.
791
+ return JS_FALSE;
792
+ }
793
+
794
+ // Function body for wrapping calls to functions or callable objects
795
+ // in a scripted caller. This scripted function's first argument is
796
+ // a native call wrapper, and the second argument is the unsafe
797
+ // function to call. All but the first argument are passed to the
798
+ // call wrapper.
799
+ NS_NAMED_LITERAL_CSTRING(funScript,
800
+ "var args = [];"
801
+ "for (var i = 1; i < arguments.length; i++)"
802
+ "args.push(arguments[i]);"
803
+ "return arguments[0].apply(this, args);");
804
+
805
+ // Get the scripted function.
806
+ jsval scriptedFunVal;
807
+ if (!GetScriptedFunction(cx, obj, unsafeObj, XPC_SJOW_SLOT_SCRIPTED_FUN,
808
+ funScript, &scriptedFunVal)) {
809
+ return JS_FALSE;
810
+ }
811
+
812
+ JSFunction *callWrapper;
813
+ jsval cwval;
814
+
815
+ // Check if we've cached the call wrapper on the scripted function
816
+ // already. If so, use the cached call wrapper.
817
+ if (!::JS_GetReservedSlot(cx, JSVAL_TO_OBJECT(scriptedFunVal), 0, &cwval)) {
818
+ return JS_FALSE;
819
+ }
820
+
821
+ if (JSVAL_IS_PRIMITIVE(cwval)) {
822
+ // No cached call wrapper found.
823
+ callWrapper =
824
+ ::JS_NewFunction(cx, XPC_SJOW_CallWrapper, 0, 0, callThisObj,
825
+ "XPC_SJOW_CallWrapper");
826
+ if (!callWrapper) {
827
+ return JS_FALSE;
828
+ }
829
+
830
+ // Cache the call wrapper function, this will also ensure it
831
+ // doesn't get collected early. We piggy-back on one of the
832
+ // reserved slots in JS functions here, and that's ok since we
833
+ // know the scripted function we're storing it on is a function
834
+ // compiled by the JS engine and the reserved slots are unused.
835
+ JSObject *callWrapperObj = ::JS_GetFunctionObject(callWrapper);
836
+ if (!::JS_SetReservedSlot(cx, JSVAL_TO_OBJECT(scriptedFunVal), 0,
837
+ OBJECT_TO_JSVAL(callWrapperObj))) {
838
+ return JS_FALSE;
839
+ }
840
+ } else {
841
+ // Found a cached call wrapper, extract the function.
842
+ callWrapper = ::JS_ValueToFunction(cx, cwval);
843
+
844
+ if (!callWrapper) {
845
+ return ThrowException(NS_ERROR_UNEXPECTED, cx);
846
+ }
847
+ }
848
+
849
+ // Build up our argument array per earlier comment.
850
+ jsval argsBuf[8];
851
+ jsval *args = argsBuf;
852
+
853
+ if (argc > 7) {
854
+ args = (jsval *)nsMemory::Alloc((argc + 2) * sizeof(jsval *));
855
+ if (!args) {
856
+ return ThrowException(NS_ERROR_OUT_OF_MEMORY, cx);
857
+ }
858
+ }
859
+
860
+ args[0] = OBJECT_TO_JSVAL(::JS_GetFunctionObject(callWrapper));
861
+ args[1] = OBJECT_TO_JSVAL(funToCall);
862
+
863
+ if (args[0] == JSVAL_NULL) {
864
+ return JS_FALSE;
865
+ }
866
+
867
+ for (uintN i = 0; i < argc; ++i) {
868
+ args[i + 2] = UnwrapJSValue(argv[i]);
869
+ }
870
+
871
+ jsval val;
872
+ JSBool ok = CallWithoutStatics(cx, callThisObj, scriptedFunVal, argc + 2,
873
+ args, &val);
874
+
875
+ if (args != argsBuf) {
876
+ nsMemory::Free(args);
877
+ }
878
+
879
+ return ok && WrapJSValue(cx, obj, val, rval);
880
+ }
881
+
882
+ JSBool
883
+ XPC_SJOW_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
884
+ jsval *rval)
885
+ {
886
+ if (argc < 1) {
887
+ return ThrowException(NS_ERROR_XPC_NOT_ENOUGH_ARGS, cx);
888
+ }
889
+
890
+ // |obj| almost always has the wrong proto and parent so we have to create
891
+ // our own object anyway. Set |obj| to null so we don't use it by accident.
892
+ obj = nsnull;
893
+
894
+ if (JSVAL_IS_PRIMITIVE(argv[0])) {
895
+ JSStackFrame *fp = nsnull;
896
+ if (JS_FrameIterator(cx, &fp) && JS_IsConstructorFrame(cx, fp)) {
897
+ return ThrowException(NS_ERROR_ILLEGAL_VALUE, cx);
898
+ }
899
+
900
+ *rval = argv[0];
901
+ return JS_TRUE;
902
+ }
903
+
904
+ JSObject *objToWrap = JSVAL_TO_OBJECT(argv[0]);
905
+
906
+ // Prevent script created Script objects from ever being wrapped
907
+ // with XPCSafeJSObjectWrapper, and never let the eval function
908
+ // object be directly wrapped.
909
+
910
+ if (STOBJ_GET_CLASS(objToWrap) == &js_ScriptClass ||
911
+ (::JS_ObjectIsFunction(cx, objToWrap) &&
912
+ ::JS_GetFunctionNative(cx, ::JS_ValueToFunction(cx, argv[0])) ==
913
+ XPCWrapper::sEvalNative)) {
914
+ return ThrowException(NS_ERROR_INVALID_ARG, cx);
915
+ }
916
+
917
+ if (STOBJ_GET_CLASS(objToWrap) == &sXPC_XOW_JSClass.base) {
918
+ // We're being asked to wrap a XOW. By using XPCWrapper::Unwrap,
919
+ // we guarantee that the wrapped object is same-origin to us. If
920
+ // it isn't, then just wrap the XOW for an added layer of wrapping.
921
+
922
+ JSObject *maybeInner = XPCWrapper::Unwrap(cx, objToWrap);
923
+ if (maybeInner) {
924
+ objToWrap = maybeInner;
925
+ }
926
+ }
927
+
928
+ // Check that the caller can access the unsafe object.
929
+ if (!CanCallerAccess(cx, objToWrap)) {
930
+ // CanCallerAccess() already threw for us.
931
+ return JS_FALSE;
932
+ }
933
+
934
+ JSObject *unsafeObj = GetUnsafeObject(objToWrap);
935
+
936
+ if (unsafeObj) {
937
+ // We're asked to wrap an already wrapped object. Re-wrap the
938
+ // object wrapped by the given wrapper.
939
+
940
+ objToWrap = unsafeObj;
941
+ }
942
+
943
+ // Don't use the object the JS engine created for us, it is in most
944
+ // cases incorectly parented and has a proto from the wrong scope.
945
+ JSObject *wrapperObj =
946
+ ::JS_NewObjectWithGivenProto(cx, &sXPC_SJOW_JSClass.base, nsnull,
947
+ objToWrap);
948
+
949
+ if (!wrapperObj) {
950
+ // JS_NewObjectWithGivenProto already threw.
951
+ return JS_FALSE;
952
+ }
953
+
954
+ if (!::JS_SetReservedSlot(cx, wrapperObj, XPC_SJOW_SLOT_IS_RESOLVING,
955
+ JSVAL_ZERO)) {
956
+ return JS_FALSE;
957
+ }
958
+
959
+ *rval = OBJECT_TO_JSVAL(wrapperObj);
960
+
961
+ return JS_TRUE;
962
+ }
963
+
964
+ static JSBool
965
+ XPC_SJOW_Create(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
966
+ jsval *rval)
967
+ {
968
+ JSObject *callee = JSVAL_TO_OBJECT(argv[-2]);
969
+ NS_ASSERTION(GetUnsafeObject(callee), "How'd we get here?");
970
+ JSObject *unsafeObj = GetUnsafeObject(callee);
971
+
972
+ // Check that the caller can access the unsafe object.
973
+ if (!CanCallerAccess(cx, unsafeObj)) {
974
+ // CanCallerAccess() already threw for us.
975
+ return JS_FALSE;
976
+ }
977
+
978
+ JSBool ok = CallWithoutStatics(cx, obj, OBJECT_TO_JSVAL(callee), argc, argv,
979
+ rval);
980
+ return ok && WrapJSValue(cx, callee, *rval, rval);
981
+ }
982
+
983
+ static JSBool
984
+ XPC_SJOW_Equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp)
985
+ {
986
+ if (JSVAL_IS_PRIMITIVE(v)) {
987
+ *bp = JS_FALSE;
988
+ } else {
989
+ JSObject *unsafeObj = GetUnsafeObject(obj);
990
+
991
+ JSObject *other = JSVAL_TO_OBJECT(v);
992
+ JSObject *otherUnsafe = GetUnsafeObject(other);
993
+
994
+ // An object is equal to a SJOW if:
995
+ // - The other object is the same SJOW.
996
+ // - The other object is the object that this SJOW is wrapping.
997
+ // - The other object is a SJOW wrapping the same object as this one.
998
+ // or
999
+ // - Both objects somehow wrap the same native object.
1000
+ if (obj == other || unsafeObj == other ||
1001
+ (unsafeObj && unsafeObj == otherUnsafe)) {
1002
+ *bp = JS_TRUE;
1003
+ } else {
1004
+ nsISupports *objIdentity = XPC_GetIdentityObject(cx, obj);
1005
+ nsISupports *otherIdentity = XPC_GetIdentityObject(cx, other);
1006
+
1007
+ *bp = objIdentity && objIdentity == otherIdentity;
1008
+ }
1009
+ }
1010
+
1011
+ return JS_TRUE;
1012
+ }
1013
+
1014
+ static JSObject *
1015
+ XPC_SJOW_Iterator(JSContext *cx, JSObject *obj, JSBool keysonly)
1016
+ {
1017
+ obj = FindSafeObject(obj);
1018
+ NS_ASSERTION(obj != nsnull, "FindSafeObject() returned null in class hook!");
1019
+
1020
+ JSObject *unsafeObj = GetUnsafeObject(obj);
1021
+ if (!unsafeObj) {
1022
+ ThrowException(NS_ERROR_INVALID_ARG, cx);
1023
+
1024
+ return nsnull;
1025
+ }
1026
+
1027
+ // Check that the caller can access the unsafe object.
1028
+ if (!CanCallerAccess(cx, unsafeObj)) {
1029
+ // CanCallerAccess() already threw for us.
1030
+ return nsnull;
1031
+ }
1032
+
1033
+ // Create our dummy SJOW.
1034
+ JSObject *wrapperIter =
1035
+ ::JS_NewObjectWithGivenProto(cx, &sXPC_SJOW_JSClass.base, nsnull,
1036
+ unsafeObj);
1037
+ if (!wrapperIter) {
1038
+ return nsnull;
1039
+ }
1040
+
1041
+ if (!::JS_SetReservedSlot(cx, wrapperIter, XPC_SJOW_SLOT_IS_RESOLVING,
1042
+ JSVAL_ZERO)) {
1043
+ return nsnull;
1044
+ }
1045
+
1046
+ JSAutoTempValueRooter tvr(cx, OBJECT_TO_JSVAL(wrapperIter));
1047
+
1048
+ // Initialize the wrapper.
1049
+ return XPCWrapper::CreateIteratorObj(cx, wrapperIter, obj, unsafeObj,
1050
+ keysonly);
1051
+ }
1052
+
1053
+ static JSObject *
1054
+ XPC_SJOW_WrappedObject(JSContext *cx, JSObject *obj)
1055
+ {
1056
+ return GetUnsafeObject(obj);
1057
+ }
1058
+
1059
+ static JSBool
1060
+ XPC_SJOW_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
1061
+ jsval *rval)
1062
+ {
1063
+ obj = FindSafeObject(obj);
1064
+ if (!obj) {
1065
+ return ThrowException(NS_ERROR_INVALID_ARG, cx);
1066
+ }
1067
+
1068
+ JSObject *unsafeObj = GetUnsafeObject(obj);
1069
+
1070
+ if (!unsafeObj) {
1071
+ // No unsafe object, nothing to stringify here, return "[object
1072
+ // XPCSafeJSObjectWrapper]" so callers know what they're looking
1073
+ // at.
1074
+
1075
+ JSString *str = JS_NewStringCopyZ(cx, "[object XPCSafeJSObjectWrapper]");
1076
+ if (!str) {
1077
+ return JS_FALSE;
1078
+ }
1079
+
1080
+ *rval = STRING_TO_JSVAL(str);
1081
+
1082
+ return JS_TRUE;
1083
+ }
1084
+
1085
+ // Check that the caller can access the unsafe object.
1086
+ if (!CanCallerAccess(cx, unsafeObj)) {
1087
+ // CanCallerAccess() already threw for us.
1088
+ return JS_FALSE;
1089
+ }
1090
+
1091
+ // Function body for wrapping toString() in a scripted caller.
1092
+ NS_NAMED_LITERAL_CSTRING(funScript, "return '' + this;");
1093
+
1094
+ jsval scriptedFunVal;
1095
+ if (!GetScriptedFunction(cx, obj, unsafeObj, XPC_SJOW_SLOT_SCRIPTED_TOSTRING,
1096
+ funScript, &scriptedFunVal)) {
1097
+ return JS_FALSE;
1098
+ }
1099
+
1100
+ jsval val;
1101
+ JSBool ok = CallWithoutStatics(cx, unsafeObj, scriptedFunVal, 0, nsnull,
1102
+ &val);
1103
+ return ok && WrapJSValue(cx, obj, val, rval);
1104
+ }
1105
+
1106
+ PRBool
1107
+ XPC_SJOW_AttachNewConstructorObject(XPCCallContext &ccx,
1108
+ JSObject *aGlobalObject)
1109
+ {
1110
+ // Initialize sEvalNative the first time we attach a constructor.
1111
+ // NB: This always happens before any cross origin wrappers are
1112
+ // created, so it's OK to do this here.
1113
+ if (!XPCWrapper::FindEval(ccx, aGlobalObject)) {
1114
+ return PR_FALSE;
1115
+ }
1116
+
1117
+ JSObject *class_obj =
1118
+ ::JS_InitClass(ccx, aGlobalObject, nsnull, &sXPC_SJOW_JSClass.base,
1119
+ XPC_SJOW_Construct, 0, nsnull, nsnull, nsnull, nsnull);
1120
+ if (!class_obj) {
1121
+ NS_WARNING("can't initialize the XPCSafeJSObjectWrapper class");
1122
+ return PR_FALSE;
1123
+ }
1124
+
1125
+ if (!::JS_DefineFunction(ccx, class_obj, "toString", XPC_SJOW_toString,
1126
+ 0, 0)) {
1127
+ return PR_FALSE;
1128
+ }
1129
+
1130
+ // Null out the class object's parent to prevent code in this class
1131
+ // from thinking the class object is a wrapper for the global
1132
+ // object.
1133
+ ::JS_SetParent(ccx, class_obj, nsnull);
1134
+
1135
+ // Make sure our prototype chain is empty and that people can't mess
1136
+ // with XPCSafeJSObjectWrapper.prototype.
1137
+ ::JS_SetPrototype(ccx, class_obj, nsnull);
1138
+ if (!::JS_SealObject(ccx, class_obj, JS_FALSE)) {
1139
+ NS_WARNING("Failed to seal XPCSafeJSObjectWrapper.prototype");
1140
+ return PR_FALSE;
1141
+ }
1142
+
1143
+ JSBool found;
1144
+ return ::JS_SetPropertyAttributes(ccx, aGlobalObject,
1145
+ sXPC_SJOW_JSClass.base.name,
1146
+ JSPROP_READONLY | JSPROP_PERMANENT,
1147
+ &found);
1148
+ }