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,1350 @@
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) 2005
21
+ * the Initial Developer. All Rights Reserved.
22
+ *
23
+ * Contributor(s):
24
+ * Johnny Stenback <jst@mozilla.org> (original author)
25
+ * Brendan Eich <brendan@mozilla.org>
26
+ *
27
+ * Alternatively, the contents of this file may be used under the terms of
28
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
29
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
30
+ * in which case the provisions of the GPL or the LGPL are applicable instead
31
+ * of those above. If you wish to allow use of your version of this file only
32
+ * under the terms of either the GPL or the LGPL, and not to allow others to
33
+ * use your version of this file under the terms of the MPL, indicate your
34
+ * decision by deleting the provisions above and replace them with the notice
35
+ * and other provisions required by the GPL or the LGPL. If you do not delete
36
+ * the provisions above, a recipient may use your version of this file under
37
+ * the terms of any one of the MPL, the GPL or the LGPL.
38
+ *
39
+ * ***** END LICENSE BLOCK ***** */
40
+
41
+ #include "xpcprivate.h"
42
+ #include "XPCNativeWrapper.h"
43
+ #include "XPCWrapper.h"
44
+ #include "jsdbgapi.h"
45
+
46
+ static JSBool
47
+ XPC_NW_AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
48
+
49
+ static JSBool
50
+ XPC_NW_DelProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
51
+
52
+ static JSBool
53
+ XPC_NW_GetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
54
+
55
+ static JSBool
56
+ XPC_NW_SetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
57
+
58
+ static JSBool
59
+ XPC_NW_Enumerate(JSContext *cx, JSObject *obj);
60
+
61
+ static JSBool
62
+ XPC_NW_NewResolve(JSContext *cx, JSObject *obj, jsval id, uintN flags,
63
+ JSObject **objp);
64
+
65
+ static JSBool
66
+ XPC_NW_Convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp);
67
+
68
+ static void
69
+ XPC_NW_Finalize(JSContext *cx, JSObject *obj);
70
+
71
+ static JSBool
72
+ XPC_NW_CheckAccess(JSContext *cx, JSObject *obj, jsval id,
73
+ JSAccessMode mode, jsval *vp);
74
+
75
+ static JSBool
76
+ XPC_NW_Call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
77
+ jsval *rval);
78
+
79
+ static JSBool
80
+ XPC_NW_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
81
+ jsval *rval);
82
+
83
+ static JSBool
84
+ XPC_NW_HasInstance(JSContext *cx, JSObject *obj, jsval v, JSBool *bp);
85
+
86
+ static void
87
+ XPC_NW_Trace(JSTracer *trc, JSObject *obj);
88
+
89
+ static JSBool
90
+ XPC_NW_Equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp);
91
+
92
+ static JSBool
93
+ XPC_NW_FunctionWrapper(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
94
+ jsval *rval);
95
+
96
+ // JS class for XPCNativeWrapper (and this doubles as the constructor
97
+ // for XPCNativeWrapper for the moment too...)
98
+
99
+ JSExtendedClass XPCNativeWrapper::sXPC_NW_JSClass = {
100
+ // JSClass (JSExtendedClass.base) initialization
101
+ { "XPCNativeWrapper",
102
+ JSCLASS_HAS_PRIVATE | JSCLASS_PRIVATE_IS_NSISUPPORTS |
103
+ // Our one reserved slot holds a jsint of flag bits
104
+ JSCLASS_NEW_RESOLVE | JSCLASS_HAS_RESERVED_SLOTS(1) |
105
+ JSCLASS_MARK_IS_TRACE | JSCLASS_IS_EXTENDED,
106
+ XPC_NW_AddProperty, XPC_NW_DelProperty,
107
+ XPC_NW_GetProperty, XPC_NW_SetProperty,
108
+ XPC_NW_Enumerate, (JSResolveOp)XPC_NW_NewResolve,
109
+ XPC_NW_Convert, XPC_NW_Finalize,
110
+ nsnull, XPC_NW_CheckAccess,
111
+ XPC_NW_Call, XPC_NW_Construct,
112
+ nsnull, XPC_NW_HasInstance,
113
+ JS_CLASS_TRACE(XPC_NW_Trace), nsnull
114
+ },
115
+ // JSExtendedClass initialization
116
+ XPC_NW_Equality
117
+ };
118
+
119
+ // If one of our class hooks is ever called from a non-system script, bypass
120
+ // the hook by calling the same hook on our wrapped native, with obj reset to
121
+ // the wrapped native's flat JSObject, so the hook and args macro parameters
122
+ // can be simply:
123
+ //
124
+ // convert, (cx, obj, type, vp)
125
+ //
126
+ // in the call from XPC_NW_Convert, for example.
127
+
128
+ #define XPC_NW_CALL_HOOK(obj, hook, args) \
129
+ return STOBJ_GET_CLASS(obj)->hook args;
130
+
131
+ #define XPC_NW_CAST_HOOK(obj, type, hook, args) \
132
+ return ((type) STOBJ_GET_CLASS(obj)->hook) args;
133
+
134
+ static JSBool
135
+ ShouldBypassNativeWrapper(JSContext *cx, JSObject *obj)
136
+ {
137
+ NS_ASSERTION(XPCNativeWrapper::IsNativeWrapper(obj),
138
+ "Unexpected object");
139
+ jsval flags;
140
+
141
+ ::JS_GetReservedSlot(cx, obj, 0, &flags);
142
+ if (HAS_FLAGS(flags, FLAG_EXPLICIT))
143
+ return JS_FALSE;
144
+
145
+ // Check what the script calling us looks like
146
+ JSStackFrame *fp = JS_GetScriptedCaller(cx, NULL);
147
+ JSScript *script = fp ? fp->script : NULL;
148
+
149
+ // If there's no script, bypass for now because that's what the old code did.
150
+ // XXX FIXME: bug 341477 covers figuring out what we _should_ do.
151
+ return !script || !(::JS_GetScriptFilenameFlags(script) & JSFILENAME_SYSTEM);
152
+ }
153
+
154
+ #define XPC_NW_BYPASS_BASE(cx, obj, code) \
155
+ JS_BEGIN_MACRO \
156
+ if (ShouldBypassNativeWrapper(cx, obj)) { \
157
+ /* Use SafeGetWrappedNative since obj can't be an explicit native \
158
+ wrapper. */ \
159
+ XPCWrappedNative *wn_ = XPCNativeWrapper::SafeGetWrappedNative(obj); \
160
+ if (!wn_) { \
161
+ return JS_TRUE; \
162
+ } \
163
+ obj = wn_->GetFlatJSObject(); \
164
+ code \
165
+ } \
166
+ JS_END_MACRO
167
+
168
+ #define XPC_NW_BYPASS(cx, obj, hook, args) \
169
+ XPC_NW_BYPASS_BASE(cx, obj, XPC_NW_CALL_HOOK(obj, hook, args))
170
+
171
+ #define XPC_NW_BYPASS_CAST(cx, obj, type, hook, args) \
172
+ XPC_NW_BYPASS_BASE(cx, obj, XPC_NW_CAST_HOOK(obj, type, hook, args))
173
+
174
+ #define XPC_NW_BYPASS_TEST(cx, obj, hook, args) \
175
+ XPC_NW_BYPASS_BASE(cx, obj, \
176
+ JSClass *clasp_ = STOBJ_GET_CLASS(obj); \
177
+ return !clasp_->hook || clasp_->hook args; \
178
+ )
179
+
180
+ static JSBool
181
+ XPC_NW_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
182
+ jsval *rval);
183
+
184
+ static inline
185
+ JSBool
186
+ ThrowException(nsresult ex, JSContext *cx)
187
+ {
188
+ XPCThrower::Throw(ex, cx);
189
+
190
+ return JS_FALSE;
191
+ }
192
+
193
+ static inline
194
+ JSBool
195
+ EnsureLegalActivity(JSContext *cx, JSObject *obj,
196
+ jsval id = JSVAL_VOID, PRUint32 accessType = 0)
197
+ {
198
+ nsIScriptSecurityManager *ssm = XPCWrapper::GetSecurityManager();
199
+ if (!ssm) {
200
+ // If there's no security manager, then we're not running in a browser
201
+ // context: allow access.
202
+ return JS_TRUE;
203
+ }
204
+
205
+ JSStackFrame *fp;
206
+ nsIPrincipal *subjectPrincipal = ssm->GetCxSubjectPrincipalAndFrame(cx, &fp);
207
+ if (!subjectPrincipal || !fp) {
208
+ // We must allow the access if there is no code running.
209
+ return JS_TRUE;
210
+ }
211
+
212
+ // This might be chrome code or content code with UniversalXPConnect.
213
+ void *annotation = JS_GetFrameAnnotation(cx, fp);
214
+ PRBool isPrivileged = PR_FALSE;
215
+ nsresult rv = subjectPrincipal->IsCapabilityEnabled("UniversalXPConnect",
216
+ annotation,
217
+ &isPrivileged);
218
+ if (NS_SUCCEEDED(rv) && isPrivileged) {
219
+ return JS_TRUE;
220
+ }
221
+
222
+ // We're in unprivileged code, ensure that we're allowed to access the
223
+ // underlying object.
224
+ XPCWrappedNative *wn = XPCNativeWrapper::SafeGetWrappedNative(obj);
225
+ if (wn) {
226
+ nsIPrincipal *objectPrincipal = wn->GetScope()->GetPrincipal();
227
+ PRBool subsumes;
228
+ if (NS_FAILED(subjectPrincipal->Subsumes(objectPrincipal, &subsumes)) ||
229
+ !subsumes) {
230
+
231
+ JSObject* flatObj;
232
+ if (!JSVAL_IS_VOID(id) &&
233
+ (accessType & (XPCWrapper::sSecMgrSetProp |
234
+ XPCWrapper::sSecMgrGetProp)) &&
235
+ (flatObj = wn->GetFlatJSObject())) {
236
+ rv = ssm->CheckPropertyAccess(cx, flatObj,
237
+ STOBJ_GET_CLASS(flatObj)->name,
238
+ id, accessType);
239
+ return NS_SUCCEEDED(rv);
240
+ }
241
+
242
+ return ThrowException(NS_ERROR_XPC_SECURITY_MANAGER_VETO, cx);
243
+ }
244
+ }
245
+
246
+ // The underlying object is accessible, but this might be the wrong
247
+ // type of wrapper to access it through.
248
+ // TODO This should just be an assertion now.
249
+ jsval flags;
250
+
251
+ ::JS_GetReservedSlot(cx, obj, 0, &flags);
252
+ if (HAS_FLAGS(flags, FLAG_EXPLICIT)) {
253
+ // Can't make any assertions about the owner of this wrapper.
254
+ return JS_TRUE;
255
+ }
256
+
257
+ JSScript *script = JS_GetFrameScript(cx, fp);
258
+ uint32 fileFlags = JS_GetScriptFilenameFlags(script);
259
+ if (fileFlags == JSFILENAME_NULL || (fileFlags & JSFILENAME_SYSTEM)) {
260
+ // We expect implicit native wrappers in system files.
261
+ return JS_TRUE;
262
+ }
263
+
264
+ // Otherwise, we're looking at a non-system file with a handle on an
265
+ // implicit wrapper. This is a bug! Deny access.
266
+ return ThrowException(NS_ERROR_XPC_SECURITY_MANAGER_VETO, cx);
267
+ }
268
+
269
+ // static
270
+ JSBool
271
+ XPCNativeWrapper::GetWrappedNative(JSContext *cx, JSObject *obj,
272
+ XPCWrappedNative **aWrappedNative)
273
+ {
274
+ XPCWrappedNative *wn = static_cast<XPCWrappedNative *>(xpc_GetJSPrivate(obj));
275
+ *aWrappedNative = wn;
276
+ if (!wn) {
277
+ return JS_TRUE;
278
+ }
279
+
280
+ nsIScriptSecurityManager *ssm = XPCWrapper::GetSecurityManager();
281
+ if (!ssm) {
282
+ return JS_TRUE;
283
+ }
284
+
285
+ JSStackFrame *fp;
286
+ nsIPrincipal *subjectPrincipal = ssm->GetCxSubjectPrincipalAndFrame(cx, &fp);
287
+ if (!subjectPrincipal) {
288
+ return JS_TRUE;
289
+ }
290
+
291
+ if (fp) {
292
+ void *annotation = JS_GetFrameAnnotation(cx, fp);
293
+
294
+ PRBool isPrivileged;
295
+ nsresult rv =
296
+ subjectPrincipal->IsCapabilityEnabled("UniversalXPConnect",
297
+ annotation,
298
+ &isPrivileged);
299
+ if (NS_SUCCEEDED(rv) && isPrivileged) {
300
+ return JS_TRUE;
301
+ }
302
+ }
303
+
304
+ XPCWrappedNativeScope *scope = wn->GetScope();
305
+ nsIPrincipal *objectPrincipal = scope->GetPrincipal();
306
+
307
+ PRBool subsumes;
308
+ nsresult rv = subjectPrincipal->Subsumes(objectPrincipal, &subsumes);
309
+ if (NS_FAILED(rv) || !subsumes) {
310
+ return JS_FALSE;
311
+ }
312
+
313
+ return JS_TRUE;
314
+ }
315
+
316
+ JSBool
317
+ XPC_NW_WrapFunction(JSContext* cx, JSObject* funobj, jsval *rval)
318
+ {
319
+ // If funobj is already a wrapped function, just return it.
320
+ if (JS_GetFunctionNative(cx,
321
+ JS_ValueToFunction(cx, OBJECT_TO_JSVAL(funobj))) ==
322
+ XPC_NW_FunctionWrapper) {
323
+ *rval = OBJECT_TO_JSVAL(funobj);
324
+ return JS_TRUE;
325
+ }
326
+
327
+ // Ensure that we've been called from JS. Native code should extract
328
+ // the wrapped native and deal with that directly.
329
+ // XXX Can we simply trust |cx| here?
330
+ JSStackFrame *iterator = nsnull;
331
+ if (!::JS_FrameIterator(cx, &iterator)) {
332
+ ::JS_ReportError(cx, "XPCNativeWrappers must be used from script");
333
+ return JS_FALSE;
334
+ }
335
+
336
+ // Create a new function that'll call our given function. This new
337
+ // function's parent will be the original function and that's how we
338
+ // get the right thing to call when this function is called.
339
+ // Note that we pass nsnull as the nominal parent so that we'll inherit
340
+ // our caller's Function.prototype.
341
+ JSFunction *funWrapper =
342
+ ::JS_NewFunction(cx, XPC_NW_FunctionWrapper, 0, 0, nsnull,
343
+ "XPCNativeWrapper function wrapper");
344
+ if (!funWrapper) {
345
+ return JS_FALSE;
346
+ }
347
+
348
+ JSObject* funWrapperObj = ::JS_GetFunctionObject(funWrapper);
349
+ ::JS_SetParent(cx, funWrapperObj, funobj);
350
+ *rval = OBJECT_TO_JSVAL(funWrapperObj);
351
+
352
+ JS_SetReservedSlot(cx, funWrapperObj, XPCWrapper::eAllAccessSlot, JSVAL_FALSE);
353
+
354
+ return JS_TRUE;
355
+ }
356
+
357
+ static JSBool
358
+ XPC_NW_AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
359
+ {
360
+ jsid idAsId;
361
+ JSPropertyDescriptor desc;
362
+
363
+ if (!JS_ValueToId(cx, id, &idAsId) ||
364
+ !JS_GetPropertyDescriptorById(cx, obj, idAsId, JSRESOLVE_QUALIFIED,
365
+ &desc)) {
366
+ return JS_FALSE;
367
+ }
368
+
369
+ if (desc.attrs & (JSPROP_GETTER | JSPROP_SETTER)) {
370
+ return ThrowException(NS_ERROR_ILLEGAL_VALUE, cx);
371
+ }
372
+
373
+ jsval flags = JSVAL_VOID;
374
+ JS_GetReservedSlot(cx, obj, 0, &flags);
375
+ // The purpose of XPC_NW_AddProperty is to wrap any object set on the
376
+ // XPCNativeWrapper by the wrapped object's scriptable helper, so bail
377
+ // here if the scriptable helper is not currently adding a property.
378
+ // See comment above #define FLAG_RESOLVING in XPCWrapper.h.
379
+ if (!HAS_FLAGS(flags, FLAG_RESOLVING)) {
380
+ return JS_TRUE;
381
+ }
382
+
383
+ // Note: no need to protect *vp from GC here, since it's already in the slot
384
+ // on |obj|.
385
+ return EnsureLegalActivity(cx, obj, id, XPCWrapper::sSecMgrSetProp) &&
386
+ XPC_NW_RewrapIfDeepWrapper(cx, obj, *vp, vp);
387
+ }
388
+
389
+ static JSBool
390
+ XPC_NW_DelProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
391
+ {
392
+ if (!EnsureLegalActivity(cx, obj)) {
393
+ return JS_FALSE;
394
+ }
395
+
396
+ XPC_NW_BYPASS_BASE(cx, obj,
397
+ // We're being notified of a delete operation on id in this
398
+ // XPCNativeWrapper, so forward to the right high-level hook,
399
+ // OBJ_DELETE_PROPERTY, on the XPCWrappedNative's object.
400
+ {
401
+ jsid interned_id;
402
+
403
+ if (!JS_ValueToId(cx, id, &interned_id)) {
404
+ return JS_FALSE;
405
+ }
406
+
407
+ return JS_DeletePropertyById(cx, obj, interned_id);
408
+ }
409
+ );
410
+
411
+ return ThrowException(NS_ERROR_XPC_SECURITY_MANAGER_VETO, cx);
412
+ }
413
+
414
+ JSBool
415
+ XPC_NW_RewrapIfDeepWrapper(JSContext *cx, JSObject *obj, jsval v, jsval *rval)
416
+ {
417
+ NS_ASSERTION(XPCNativeWrapper::IsNativeWrapper(obj),
418
+ "Unexpected object");
419
+
420
+ JSBool primitive = JSVAL_IS_PRIMITIVE(v);
421
+ JSObject* nativeObj = primitive ? nsnull : JSVAL_TO_OBJECT(v);
422
+
423
+ // We always want to wrap function objects, no matter whether we're deep.
424
+ if (!primitive && JS_ObjectIsFunction(cx, nativeObj)) {
425
+ return XPC_NW_WrapFunction(cx, nativeObj, rval);
426
+ }
427
+
428
+ jsval flags;
429
+ ::JS_GetReservedSlot(cx, obj, 0, &flags);
430
+
431
+ // Re-wrap non-primitive values if this is a deep wrapper, i.e.
432
+ // if (HAS_FLAGS(flags, FLAG_DEEP).
433
+ if (HAS_FLAGS(flags, FLAG_DEEP) && !primitive) {
434
+ // Unwrap a cross origin wrapper, since we're more restrictive.
435
+ if (STOBJ_GET_CLASS(nativeObj) == &sXPC_XOW_JSClass.base) {
436
+ if (!::JS_GetReservedSlot(cx, nativeObj, XPCWrapper::sWrappedObjSlot,
437
+ &v)) {
438
+ return JS_FALSE;
439
+ }
440
+
441
+ // If v is primitive, allow nativeObj to remain a cross origin wrapper,
442
+ // which will fail below (since it isn't a wrapped native).
443
+ if (!JSVAL_IS_PRIMITIVE(v)) {
444
+ nativeObj = JSVAL_TO_OBJECT(v);
445
+ }
446
+ }
447
+
448
+ XPCWrappedNative* wrappedNative =
449
+ XPCWrappedNative::GetWrappedNativeOfJSObject(cx, nativeObj);
450
+ if (!wrappedNative) {
451
+ // Not something we can protect... just make it JSVAL_NULL
452
+ *rval = JSVAL_NULL;
453
+ return JS_TRUE;
454
+ }
455
+
456
+ if (HAS_FLAGS(flags, FLAG_EXPLICIT)) {
457
+ #ifdef DEBUG_XPCNativeWrapper
458
+ printf("Rewrapping for deep explicit wrapper\n");
459
+ #endif
460
+ if (wrappedNative == XPCNativeWrapper::SafeGetWrappedNative(obj)) {
461
+ // Already wrapped, return the wrapper.
462
+ *rval = OBJECT_TO_JSVAL(obj);
463
+ return JS_TRUE;
464
+ }
465
+
466
+ // |obj| is an explicit deep wrapper. We want to construct another
467
+ // explicit deep wrapper for |v|. Just call XPCNativeWrapperCtor by hand
468
+ // (passing null as the pre-created object it doesn't use anyway) so we
469
+ // don't have to create an object we never use.
470
+
471
+ return XPCNativeWrapperCtor(cx, nsnull, 1, &v, rval);
472
+ }
473
+
474
+ #ifdef DEBUG_XPCNativeWrapper
475
+ printf("Rewrapping for deep implicit wrapper\n");
476
+ #endif
477
+ // Just using GetNewOrUsed on the return value of
478
+ // GetWrappedNativeOfJSObject will give the right thing -- the unique deep
479
+ // implicit wrapper associated with wrappedNative.
480
+ JSObject* wrapperObj = XPCNativeWrapper::GetNewOrUsed(cx, wrappedNative,
481
+ nsnull);
482
+ if (!wrapperObj) {
483
+ return JS_FALSE;
484
+ }
485
+
486
+ *rval = OBJECT_TO_JSVAL(wrapperObj);
487
+ } else {
488
+ *rval = v;
489
+ }
490
+
491
+ return JS_TRUE;
492
+ }
493
+
494
+ static JSBool
495
+ XPC_NW_FunctionWrapper(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
496
+ jsval *rval)
497
+ {
498
+ JSObject *funObj = JSVAL_TO_OBJECT(argv[-2]);
499
+ if (!::JS_ObjectIsFunction(cx, funObj)) {
500
+ obj = nsnull;
501
+ }
502
+
503
+ while (obj && !XPCNativeWrapper::IsNativeWrapper(obj)) {
504
+ obj = STOBJ_GET_PROTO(obj);
505
+ }
506
+
507
+ if (!obj) {
508
+ return ThrowException(NS_ERROR_UNEXPECTED, cx);
509
+ }
510
+
511
+ // The real method we're going to call is the parent of this
512
+ // function's JSObject.
513
+ JSObject *methodToCallObj = STOBJ_GET_PARENT(funObj);
514
+ XPCWrappedNative* wrappedNative = nsnull;
515
+
516
+ jsval isAllAccess;
517
+ if (::JS_GetReservedSlot(cx, funObj,
518
+ XPCWrapper::eAllAccessSlot,
519
+ &isAllAccess) &&
520
+ JSVAL_TO_BOOLEAN(isAllAccess)) {
521
+ wrappedNative = XPCNativeWrapper::SafeGetWrappedNative(obj);
522
+ } else if (!XPCNativeWrapper::GetWrappedNative(cx, obj, &wrappedNative)) {
523
+ wrappedNative = nsnull;
524
+ }
525
+
526
+ if (!wrappedNative || !::JS_ObjectIsFunction(cx, methodToCallObj)) {
527
+ return ThrowException(NS_ERROR_UNEXPECTED, cx);
528
+ }
529
+
530
+ jsval v;
531
+ if (!::JS_CallFunctionValue(cx, wrappedNative->GetFlatJSObject(),
532
+ OBJECT_TO_JSVAL(methodToCallObj), argc, argv,
533
+ &v)) {
534
+ return JS_FALSE;
535
+ }
536
+
537
+ XPCCallContext ccx(JS_CALLER, cx, obj);
538
+
539
+ // Make sure v doesn't get collected while we're re-wrapping it.
540
+ AUTO_MARK_JSVAL(ccx, v);
541
+
542
+ return XPC_NW_RewrapIfDeepWrapper(cx, obj, v, rval);
543
+ }
544
+
545
+ static JSBool
546
+ XPC_NW_GetOrSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp,
547
+ JSBool aIsSet)
548
+ {
549
+ // We don't deal with the following properties here.
550
+ if (id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_PROTOTYPE) ||
551
+ id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_TO_STRING)) {
552
+ return JS_TRUE;
553
+ }
554
+
555
+ while (!XPCNativeWrapper::IsNativeWrapper(obj)) {
556
+ obj = STOBJ_GET_PROTO(obj);
557
+ if (!obj) {
558
+ return ThrowException(NS_ERROR_UNEXPECTED, cx);
559
+ }
560
+ }
561
+
562
+ if (!EnsureLegalActivity(cx, obj, id,
563
+ aIsSet ? XPCWrapper::sSecMgrSetProp
564
+ : XPCWrapper::sSecMgrGetProp)) {
565
+ return JS_FALSE;
566
+ }
567
+
568
+ // Protected by EnsureLegalActivity.
569
+ XPCWrappedNative *wrappedNative = XPCNativeWrapper::SafeGetWrappedNative(obj);
570
+
571
+ if (!wrappedNative) {
572
+ return ThrowException(NS_ERROR_INVALID_ARG, cx);
573
+ }
574
+
575
+ JSObject *nativeObj = wrappedNative->GetFlatJSObject();
576
+
577
+ // We can't use XPC_NW_BYPASS here, because we need to do a full
578
+ // OBJ_SET_PROPERTY or OBJ_GET_PROPERTY on the wrapped native's
579
+ // object, in order to trigger reflection done by the underlying
580
+ // OBJ_LOOKUP_PROPERTY done by SET and GET.
581
+
582
+ if (ShouldBypassNativeWrapper(cx, obj)) {
583
+ jsid interned_id;
584
+
585
+ if (!::JS_ValueToId(cx, id, &interned_id)) {
586
+ return JS_FALSE;
587
+ }
588
+
589
+ return aIsSet
590
+ ? JS_SetPropertyById(cx, nativeObj, interned_id, vp)
591
+ : JS_GetPropertyById(cx, nativeObj, interned_id, vp);
592
+ }
593
+
594
+ if (!aIsSet &&
595
+ id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_WRAPPED_JSOBJECT)) {
596
+ // If we're wrapping an untrusted content wrapper, then we should
597
+ // return a safe wrapper for the underlying native object. Otherwise,
598
+ // such a wrapper would be superfluous.
599
+
600
+ jsval nativeVal = OBJECT_TO_JSVAL(nativeObj);
601
+
602
+ nsIScriptSecurityManager *ssm = XPCWrapper::GetSecurityManager();
603
+ nsCOMPtr<nsIPrincipal> prin;
604
+ nsresult rv = ssm->GetObjectPrincipal(cx, nativeObj,
605
+ getter_AddRefs(prin));
606
+ if (NS_FAILED(rv)) {
607
+ return ThrowException(rv, cx);
608
+ }
609
+
610
+ PRBool isSystem;
611
+ if (NS_SUCCEEDED(ssm->IsSystemPrincipal(prin, &isSystem)) && isSystem) {
612
+ *vp = nativeVal;
613
+ return JS_TRUE;
614
+ }
615
+
616
+ return XPC_SJOW_Construct(cx, nsnull, 1, &nativeVal, vp);
617
+ }
618
+
619
+ return XPCWrapper::GetOrSetNativeProperty(cx, obj, wrappedNative, id, vp,
620
+ aIsSet, JS_TRUE);
621
+ }
622
+
623
+ static JSBool
624
+ XPC_NW_GetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
625
+ {
626
+ return XPC_NW_GetOrSetProperty(cx, obj, id, vp, PR_FALSE);
627
+ }
628
+
629
+ static JSBool
630
+ XPC_NW_SetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
631
+ {
632
+ return XPC_NW_GetOrSetProperty(cx, obj, id, vp, PR_TRUE);
633
+ }
634
+
635
+ static JSBool
636
+ XPC_NW_Enumerate(JSContext *cx, JSObject *obj)
637
+ {
638
+ // We are being notified of a for-in loop or similar operation on this
639
+ // XPCNativeWrapper, so forward to the correct high-level object hook,
640
+ // OBJ_ENUMERATE on the XPCWrappedNative's object, called via the
641
+ // JS_Enumerate API. Then reflect properties named by the enumerated
642
+ // identifiers from the wrapped native to the native wrapper.
643
+
644
+ if (!EnsureLegalActivity(cx, obj)) {
645
+ return JS_FALSE;
646
+ }
647
+
648
+ // Protected by EnsureLegalActivity.
649
+ XPCWrappedNative *wn = XPCNativeWrapper::SafeGetWrappedNative(obj);
650
+ if (!wn) {
651
+ return JS_TRUE;
652
+ }
653
+
654
+ return XPCWrapper::Enumerate(cx, obj, wn->GetFlatJSObject());
655
+ }
656
+
657
+ static JSBool
658
+ XPC_NW_NewResolve(JSContext *cx, JSObject *obj, jsval id, uintN flags,
659
+ JSObject **objp)
660
+ {
661
+ // No need to preserve on sets of wrappedJSObject or toString, since callers
662
+ // couldn't get at those values anyway. Also, we always deal with
663
+ // wrappedJSObject and toString before looking at our scriptable hooks, so no
664
+ // need to mess with our flags yet.
665
+ if (id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_WRAPPED_JSOBJECT)) {
666
+ return JS_TRUE;
667
+ }
668
+
669
+ if (id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_TO_STRING)) {
670
+ *objp = obj;
671
+
672
+ // See the comment in XPC_NW_WrapFunction for why we create this function
673
+ // like this.
674
+ JSFunction *fun = JS_NewFunction(cx, XPC_NW_toString, 0, 0, nsnull,
675
+ "toString");
676
+ if (!fun) {
677
+ return JS_FALSE;
678
+ }
679
+
680
+ JSObject *funobj = JS_GetFunctionObject(fun);
681
+ STOBJ_SET_PARENT(funobj, obj);
682
+
683
+ return JS_DefineProperty(cx, obj, "toString", OBJECT_TO_JSVAL(funobj),
684
+ nsnull, nsnull, 0);
685
+ }
686
+
687
+ PRUint32 accessType =
688
+ (flags & JSRESOLVE_ASSIGNING) ? XPCWrapper::sSecMgrSetProp
689
+ : XPCWrapper::sSecMgrGetProp;
690
+ if (!EnsureLegalActivity(cx, obj, id, accessType)) {
691
+ return JS_FALSE;
692
+ }
693
+
694
+ // We can't use XPC_NW_BYPASS here, because we need to do a full
695
+ // OBJ_LOOKUP_PROPERTY on the wrapped native's object, in order to
696
+ // trigger reflection along the wrapped native prototype chain.
697
+ // All we need to do is define the property in obj if it exists in
698
+ // the wrapped native's object.
699
+
700
+ if (ShouldBypassNativeWrapper(cx, obj)) {
701
+ // Protected by EnsureLegalActivity.
702
+ XPCWrappedNative *wn = XPCNativeWrapper::SafeGetWrappedNative(obj);
703
+ if (!wn) {
704
+ return JS_TRUE;
705
+ }
706
+
707
+ JSAutoRequest ar(cx);
708
+
709
+ jsid interned_id;
710
+ JSObject *pobj;
711
+ jsval val;
712
+ if (!JS_ValueToId(cx, id, &interned_id) ||
713
+ !JS_LookupPropertyWithFlagsById(cx, wn->GetFlatJSObject(), interned_id,
714
+ JSRESOLVE_QUALIFIED, &pobj, &val)) {
715
+ return JS_FALSE;
716
+ }
717
+
718
+ if (pobj) {
719
+ if (!JS_DefinePropertyById(cx, obj, interned_id, JSVAL_VOID, nsnull,
720
+ nsnull, 0)) {
721
+ return JS_FALSE;
722
+ }
723
+
724
+ *objp = obj;
725
+ }
726
+ return JS_TRUE;
727
+ }
728
+
729
+ while (!XPCNativeWrapper::IsNativeWrapper(obj)) {
730
+ obj = STOBJ_GET_PROTO(obj);
731
+ if (!obj) {
732
+ return ThrowException(NS_ERROR_UNEXPECTED, cx);
733
+ }
734
+ }
735
+
736
+ // Protected by EnsureLegalActivity.
737
+ XPCWrappedNative *wrappedNative = XPCNativeWrapper::SafeGetWrappedNative(obj);
738
+
739
+ if (!wrappedNative) {
740
+ // No wrapped native, no properties.
741
+
742
+ return JS_TRUE;
743
+ }
744
+
745
+ return XPCWrapper::ResolveNativeProperty(cx, obj,
746
+ wrappedNative->GetFlatJSObject(),
747
+ wrappedNative, id, flags, objp,
748
+ JS_TRUE);
749
+ }
750
+
751
+ static JSBool
752
+ XPC_NW_Convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
753
+ {
754
+ if (!EnsureLegalActivity(cx, obj)) {
755
+ return JS_FALSE;
756
+ }
757
+
758
+ XPC_NW_BYPASS(cx, obj, convert, (cx, obj, type, vp));
759
+ return JS_TRUE;
760
+ }
761
+
762
+ static void
763
+ XPC_NW_Finalize(JSContext *cx, JSObject *obj)
764
+ {
765
+ // We must not use obj's private data here since it's likely that it
766
+ // has already been finalized.
767
+ XPCJSRuntime *rt = nsXPConnect::GetRuntimeInstance();
768
+
769
+ {
770
+ // scoped lock
771
+ XPCAutoLock lock(rt->GetMapLock());
772
+ rt->GetExplicitNativeWrapperMap()->Remove(obj);
773
+ }
774
+ }
775
+
776
+ static JSBool
777
+ XPC_NW_CheckAccess(JSContext *cx, JSObject *obj, jsval id,
778
+ JSAccessMode mode, jsval *vp)
779
+ {
780
+ // Prevent setting __proto__ on an XPCNativeWrapper
781
+ if ((mode & JSACC_WATCH) == JSACC_PROTO && (mode & JSACC_WRITE)) {
782
+ return ThrowException(NS_ERROR_XPC_SECURITY_MANAGER_VETO, cx);
783
+ }
784
+
785
+ // Forward to the checkObjectAccess hook in the JSContext, if any.
786
+ JSSecurityCallbacks *callbacks = JS_GetSecurityCallbacks(cx);
787
+ if (callbacks && callbacks->checkObjectAccess &&
788
+ !callbacks->checkObjectAccess(cx, obj, id, mode, vp)) {
789
+ return JS_FALSE;
790
+ }
791
+
792
+ // This function does its own security checks.
793
+ XPCWrappedNative *wrappedNative = XPCNativeWrapper::SafeGetWrappedNative(obj);
794
+ if (!wrappedNative) {
795
+ return JS_TRUE;
796
+ }
797
+
798
+ JSObject *wrapperJSObject = wrappedNative->GetFlatJSObject();
799
+
800
+ JSClass *clazz = STOBJ_GET_CLASS(wrapperJSObject);
801
+ return !clazz->checkAccess ||
802
+ clazz->checkAccess(cx, wrapperJSObject, id, mode, vp);
803
+ }
804
+
805
+ static JSBool
806
+ XPC_NW_Call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
807
+ {
808
+ if (!XPCNativeWrapper::IsNativeWrapper(obj)) {
809
+ // If obj is not an XPCNativeWrapper, then someone's probably trying to call
810
+ // our prototype (i.e., XPCNativeWrapper.prototype()). In this case, it is
811
+ // safe to simply ignore the call, since that's what would happen anyway.
812
+
813
+ #ifdef DEBUG
814
+ if (!JS_ObjectIsFunction(cx, obj)) {
815
+ NS_WARNING("Ignoring a call for a weird object");
816
+ }
817
+ #endif
818
+ return JS_TRUE;
819
+ }
820
+
821
+ XPC_NW_BYPASS_TEST(cx, obj, call, (cx, obj, argc, argv, rval));
822
+
823
+ return JS_TRUE;
824
+ }
825
+
826
+ static JSBool
827
+ XPC_NW_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
828
+ jsval *rval)
829
+ {
830
+ // The object given to us by the JS engine is actually a stub object (the
831
+ // "new" object). This isn't any help to us, so instead use the function
832
+ // object of the constructor that we're calling (which is the native
833
+ // wrapper).
834
+ obj = JSVAL_TO_OBJECT(argv[-2]);
835
+
836
+ XPC_NW_BYPASS_TEST(cx, obj, construct, (cx, obj, argc, argv, rval));
837
+
838
+ if (!EnsureLegalActivity(cx, obj)) {
839
+ return JS_FALSE;
840
+ }
841
+
842
+ // Protected by EnsureLegalActivity.
843
+ XPCWrappedNative *wrappedNative = XPCNativeWrapper::SafeGetWrappedNative(obj);
844
+ if (!wrappedNative) {
845
+ return JS_TRUE;
846
+ }
847
+
848
+ JSBool retval = JS_TRUE;
849
+
850
+ if (!NATIVE_HAS_FLAG(wrappedNative, WantConstruct)) {
851
+ return ThrowException(NS_ERROR_INVALID_ARG, cx);
852
+ }
853
+
854
+ nsresult rv = wrappedNative->GetScriptableInfo()->
855
+ GetCallback()->Construct(wrappedNative, cx, obj, argc, argv, rval,
856
+ &retval);
857
+ if (NS_FAILED(rv)) {
858
+ return ThrowException(rv, cx);
859
+ }
860
+
861
+ if (!retval) {
862
+ return JS_FALSE;
863
+ }
864
+
865
+ if (JSVAL_IS_PRIMITIVE(*rval)) {
866
+ return ThrowException(NS_ERROR_ILLEGAL_VALUE, cx);
867
+ }
868
+
869
+ return XPC_NW_RewrapIfDeepWrapper(cx, obj, *rval, rval);
870
+ }
871
+
872
+ static JSBool
873
+ XPC_NW_HasInstance(JSContext *cx, JSObject *obj, jsval v, JSBool *bp)
874
+ {
875
+ XPC_NW_BYPASS_TEST(cx, obj, hasInstance, (cx, obj, v, bp));
876
+
877
+ return JS_TRUE;
878
+ }
879
+
880
+ static JSBool
881
+ MirrorWrappedNativeParent(JSContext *cx, XPCWrappedNative *wrapper,
882
+ JSObject **result NS_OUTPARAM)
883
+ {
884
+ JSObject *wn_parent = STOBJ_GET_PARENT(wrapper->GetFlatJSObject());
885
+ if (!wn_parent) {
886
+ *result = nsnull;
887
+ } else {
888
+ XPCWrappedNative *parent_wrapper =
889
+ XPCWrappedNative::GetWrappedNativeOfJSObject(cx, wn_parent);
890
+
891
+ // parent_wrapper can be null if we're in a Components.utils.evalInSandbox
892
+ // scope. In that case, the best we can do is just use the
893
+ // non-native-wrapped sandbox global object for our parent.
894
+ if (parent_wrapper) {
895
+ *result = XPCNativeWrapper::GetNewOrUsed(cx, parent_wrapper, nsnull);
896
+ if (!*result)
897
+ return JS_FALSE;
898
+ } else {
899
+ *result = nsnull;
900
+ }
901
+ }
902
+ return JS_TRUE;
903
+ }
904
+
905
+ JSBool
906
+ XPCNativeWrapperCtor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
907
+ jsval *rval)
908
+ {
909
+ if (argc < 1) {
910
+ return ThrowException(NS_ERROR_XPC_NOT_ENOUGH_ARGS, cx);
911
+ }
912
+
913
+ // |obj| almost always has the wrong proto and parent so we have to create
914
+ // our own object anyway. Set |obj| to null so we don't use it by accident.
915
+ obj = nsnull;
916
+
917
+ jsval native = argv[0];
918
+
919
+ if (JSVAL_IS_PRIMITIVE(native)) {
920
+ JSStackFrame *fp = nsnull;
921
+ if (JS_FrameIterator(cx, &fp) && JS_IsConstructorFrame(cx, fp)) {
922
+ return ThrowException(NS_ERROR_ILLEGAL_VALUE, cx);
923
+ }
924
+
925
+ *rval = native;
926
+ return JS_TRUE;
927
+ }
928
+
929
+ JSObject *nativeObj = JSVAL_TO_OBJECT(native);
930
+
931
+ // Unwrap a cross origin wrapper, since we're more restrictive than it is.
932
+ if (STOBJ_GET_CLASS(nativeObj) == &sXPC_XOW_JSClass.base) {
933
+ jsval v;
934
+ if (!::JS_GetReservedSlot(cx, nativeObj, XPCWrapper::sWrappedObjSlot, &v)) {
935
+ return JS_FALSE;
936
+ }
937
+ // If v is primitive, allow nativeObj to remain a cross origin wrapper,
938
+ // which will fail below (since it isn't a wrapped native).
939
+ if (!JSVAL_IS_PRIMITIVE(v)) {
940
+ nativeObj = JSVAL_TO_OBJECT(v);
941
+ }
942
+ } else if (STOBJ_GET_CLASS(nativeObj) == &sXPC_SJOW_JSClass.base) {
943
+ // Also unwrap SJOWs.
944
+ nativeObj = JS_GetParent(cx, nativeObj);
945
+ if (!nativeObj) {
946
+ return ThrowException(NS_ERROR_XPC_BAD_CONVERT_JS, cx);
947
+ }
948
+ }
949
+
950
+ XPCWrappedNative *wrappedNative;
951
+
952
+ if (XPCNativeWrapper::IsNativeWrapper(nativeObj)) {
953
+ // We're asked to wrap an already wrapped object. Re-wrap the
954
+ // object wrapped by the given wrapper.
955
+
956
+ #ifdef DEBUG_XPCNativeWrapper
957
+ printf("Wrapping already wrapped object\n");
958
+ #endif
959
+
960
+ wrappedNative = XPCNativeWrapper::SafeGetWrappedNative(nativeObj);
961
+
962
+ if (!wrappedNative) {
963
+ return ThrowException(NS_ERROR_INVALID_ARG, cx);
964
+ }
965
+
966
+ nativeObj = wrappedNative->GetFlatJSObject();
967
+ native = OBJECT_TO_JSVAL(nativeObj);
968
+ } else {
969
+ wrappedNative
970
+ = XPCWrappedNative::GetWrappedNativeOfJSObject(cx, nativeObj);
971
+
972
+ if (!wrappedNative) {
973
+ return ThrowException(NS_ERROR_INVALID_ARG, cx);
974
+ }
975
+
976
+ // Prevent wrapping a double-wrapped JS object in an
977
+ // XPCNativeWrapper!
978
+ nsCOMPtr<nsIXPConnectWrappedJS> xpcwrappedjs =
979
+ do_QueryWrappedNative(wrappedNative);
980
+
981
+ if (xpcwrappedjs) {
982
+ return ThrowException(NS_ERROR_INVALID_ARG, cx);
983
+ }
984
+ }
985
+
986
+ JSObject *wrapperObj;
987
+
988
+ // Don't use the object the JS engine created for us, it is in most
989
+ // cases incorectly parented and has a proto from the wrong scope.
990
+ #ifdef DEBUG_XPCNativeWrapper
991
+ printf("Creating new JSObject\n");
992
+ #endif
993
+ wrapperObj = ::JS_NewObjectWithGivenProto(cx, XPCNativeWrapper::GetJSClass(),
994
+ nsnull,
995
+ wrappedNative->GetScope()
996
+ ->GetGlobalJSObject());
997
+
998
+ if (!wrapperObj) {
999
+ // JS_NewObject already threw (or reported OOM).
1000
+ return JS_FALSE;
1001
+ }
1002
+
1003
+ PRBool hasStringArgs = PR_FALSE;
1004
+ for (uintN i = 1; i < argc; ++i) {
1005
+ if (!JSVAL_IS_STRING(argv[i])) {
1006
+ hasStringArgs = PR_FALSE;
1007
+
1008
+ break;
1009
+ }
1010
+
1011
+ if (i == 1) {
1012
+ #ifdef DEBUG_XPCNativeWrapper
1013
+ printf("Constructing XPCNativeWrapper() with string args\n");
1014
+ #endif
1015
+ }
1016
+
1017
+ #ifdef DEBUG_XPCNativeWrapper
1018
+ printf(" %s\n", ::JS_GetStringBytes(JSVAL_TO_STRING(argv[i])));
1019
+ #endif
1020
+
1021
+ hasStringArgs = PR_TRUE;
1022
+ }
1023
+
1024
+ JSBool isDeep = !hasStringArgs;
1025
+ jsuint flags = isDeep ? FLAG_DEEP | FLAG_EXPLICIT : FLAG_EXPLICIT;
1026
+ if (!::JS_SetReservedSlot(cx, wrapperObj, 0, INT_TO_JSVAL(flags))) {
1027
+ return JS_FALSE;
1028
+ }
1029
+
1030
+ JSObject *parent = nsnull;
1031
+
1032
+ if (isDeep) {
1033
+ // Make sure wrapperObj doesn't get collected while we're wrapping
1034
+ // parents for it.
1035
+ ::JS_LockGCThing(cx, wrapperObj);
1036
+
1037
+ // A deep XPCNativeWrapper has a __parent__ chain that mirrors its
1038
+ // XPCWrappedNative's chain.
1039
+ if (!MirrorWrappedNativeParent(cx, wrappedNative, &parent))
1040
+ return JS_FALSE;
1041
+
1042
+ ::JS_UnlockGCThing(cx, wrapperObj);
1043
+
1044
+ if (argc == 2 && !JSVAL_IS_PRIMITIVE(argv[1])) {
1045
+ // An object was passed as the second argument to the
1046
+ // constructor. In this case we check that the object we're
1047
+ // wrapping is an instance of the assumed constructor that we
1048
+ // got. If not, throw an exception.
1049
+ JSBool hasInstance;
1050
+ if (!::JS_HasInstance(cx, JSVAL_TO_OBJECT(argv[1]), native,
1051
+ &hasInstance)) {
1052
+ return ThrowException(NS_ERROR_UNEXPECTED, cx);
1053
+ }
1054
+
1055
+ if (!hasInstance) {
1056
+ return ThrowException(NS_ERROR_INVALID_ARG, cx);
1057
+ }
1058
+ }
1059
+ }
1060
+
1061
+ if (!parent) {
1062
+ parent = wrappedNative->GetScope()->GetGlobalJSObject();
1063
+ }
1064
+
1065
+ if (!::JS_SetParent(cx, wrapperObj, parent))
1066
+ return JS_FALSE;
1067
+
1068
+ // Set the XPCWrappedNative as private data in the native wrapper.
1069
+ if (!::JS_SetPrivate(cx, wrapperObj, wrappedNative)) {
1070
+ return JS_FALSE;
1071
+ }
1072
+
1073
+ #if defined(DEBUG_XPCNativeWrapper) || defined(DEBUG_xpc_leaks)
1074
+ {
1075
+ XPCCallContext ccx(JS_CALLER, cx);
1076
+
1077
+ // Keep wrapperObj alive while we mess with strings
1078
+ AUTO_MARK_JSVAL(ccx, OBJECT_TO_JSVAL(wrapperObj));
1079
+
1080
+ char *s = wrappedNative->ToString(ccx);
1081
+ printf("Created new XPCNativeWrapper %p for wrapped native %s\n",
1082
+ (void*)wrapperObj, s);
1083
+ if (s)
1084
+ JS_smprintf_free(s);
1085
+ }
1086
+ #endif
1087
+
1088
+ *rval = OBJECT_TO_JSVAL(wrapperObj);
1089
+
1090
+ {
1091
+ XPCJSRuntime *rt = wrappedNative->GetRuntime();
1092
+
1093
+ // scoped lock
1094
+ XPCAutoLock lock(rt->GetMapLock());
1095
+ rt->GetExplicitNativeWrapperMap()->Add(wrapperObj);
1096
+ }
1097
+
1098
+ return JS_TRUE;
1099
+ }
1100
+
1101
+ static void
1102
+ XPC_NW_Trace(JSTracer *trc, JSObject *obj)
1103
+ {
1104
+ // Untrusted code can't trigger this.
1105
+ XPCWrappedNative *wrappedNative = XPCNativeWrapper::SafeGetWrappedNative(obj);
1106
+
1107
+ if (wrappedNative && wrappedNative->IsValid()) {
1108
+ JS_CALL_OBJECT_TRACER(trc, wrappedNative->GetFlatJSObject(),
1109
+ "wrappedNative.flatJSObject");
1110
+ }
1111
+ }
1112
+
1113
+ static JSBool
1114
+ XPC_NW_Equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp)
1115
+ {
1116
+ NS_ASSERTION(XPCNativeWrapper::IsNativeWrapper(obj),
1117
+ "Uh, we should only ever be called for XPCNativeWrapper "
1118
+ "objects!");
1119
+
1120
+ if (!EnsureLegalActivity(cx, obj)) {
1121
+ return JS_FALSE;
1122
+ }
1123
+
1124
+ if (JSVAL_IS_PRIMITIVE(v)) {
1125
+ *bp = JS_FALSE;
1126
+
1127
+ return JS_TRUE;
1128
+ }
1129
+
1130
+ // Protected by EnsureLegalActivity.
1131
+ XPCWrappedNative *wrappedNative = XPCNativeWrapper::SafeGetWrappedNative(obj);
1132
+
1133
+ if (wrappedNative && wrappedNative->IsValid() &&
1134
+ NATIVE_HAS_FLAG(wrappedNative, WantEquality)) {
1135
+ // Forward the call to the wrapped native's Equality() hook.
1136
+ nsresult rv = wrappedNative->GetScriptableCallback()->
1137
+ Equality(wrappedNative, cx, obj, v, bp);
1138
+
1139
+ if (NS_FAILED(rv)) {
1140
+ return ThrowException(rv, cx);
1141
+ }
1142
+ } else {
1143
+ JSObject *other = JSVAL_TO_OBJECT(v);
1144
+
1145
+ *bp = (obj == other ||
1146
+ XPC_GetIdentityObject(cx, obj) == XPC_GetIdentityObject(cx, other));
1147
+ }
1148
+
1149
+ return JS_TRUE;
1150
+ }
1151
+
1152
+ static JSBool
1153
+ XPC_NW_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
1154
+ jsval *rval)
1155
+ {
1156
+ while (!XPCNativeWrapper::IsNativeWrapper(obj)) {
1157
+ obj = STOBJ_GET_PROTO(obj);
1158
+ if (!obj) {
1159
+ return ThrowException(NS_ERROR_UNEXPECTED, cx);
1160
+ }
1161
+ }
1162
+
1163
+ if (!EnsureLegalActivity(cx, obj)) {
1164
+ return JS_FALSE;
1165
+ }
1166
+
1167
+ // Protected by EnsureLegalActivity.
1168
+ XPCWrappedNative *wrappedNative = XPCNativeWrapper::SafeGetWrappedNative(obj);
1169
+
1170
+ if (!wrappedNative) {
1171
+ // toString() called on XPCNativeWrapper.prototype
1172
+ NS_NAMED_LITERAL_STRING(protoString, "[object XPCNativeWrapper]");
1173
+ JSString *str =
1174
+ ::JS_NewUCStringCopyN(cx, reinterpret_cast<const jschar*>
1175
+ (protoString.get()),
1176
+ protoString.Length());
1177
+ NS_ENSURE_TRUE(str, JS_FALSE);
1178
+ *rval = STRING_TO_JSVAL(str);
1179
+ return JS_TRUE;
1180
+ }
1181
+
1182
+ return XPCWrapper::NativeToString(cx, wrappedNative, argc, argv, rval,
1183
+ JS_TRUE);
1184
+ }
1185
+
1186
+ // static
1187
+ PRBool
1188
+ XPCNativeWrapper::AttachNewConstructorObject(XPCCallContext &ccx,
1189
+ JSObject *aGlobalObject)
1190
+ {
1191
+ JSObject *class_obj =
1192
+ ::JS_InitClass(ccx, aGlobalObject, nsnull, &sXPC_NW_JSClass.base,
1193
+ XPCNativeWrapperCtor, 0, nsnull, nsnull,
1194
+ nsnull, nsnull);
1195
+ if (!class_obj) {
1196
+ NS_WARNING("can't initialize the XPCNativeWrapper class");
1197
+ return PR_FALSE;
1198
+ }
1199
+
1200
+ // Make sure our prototype chain is empty and that people can't mess
1201
+ // with XPCNativeWrapper.prototype.
1202
+ ::JS_SetPrototype(ccx, class_obj, nsnull);
1203
+ if (!::JS_SealObject(ccx, class_obj, JS_FALSE)) {
1204
+ NS_WARNING("Failed to seal XPCNativeWrapper.prototype");
1205
+ return PR_FALSE;
1206
+ }
1207
+
1208
+ JSBool found;
1209
+ return ::JS_SetPropertyAttributes(ccx, aGlobalObject,
1210
+ sXPC_NW_JSClass.base.name,
1211
+ JSPROP_READONLY | JSPROP_PERMANENT,
1212
+ &found);
1213
+ }
1214
+
1215
+ // static
1216
+ JSObject *
1217
+ XPCNativeWrapper::GetNewOrUsed(JSContext *cx, XPCWrappedNative *wrapper,
1218
+ nsIPrincipal *aObjectPrincipal)
1219
+ {
1220
+ if (aObjectPrincipal) {
1221
+ nsIScriptSecurityManager *ssm = XPCWrapper::GetSecurityManager();
1222
+
1223
+ PRBool isSystem;
1224
+ nsresult rv = ssm->IsSystemPrincipal(aObjectPrincipal, &isSystem);
1225
+ if (NS_SUCCEEDED(rv) && !isSystem) {
1226
+ jsval v = OBJECT_TO_JSVAL(wrapper->GetFlatJSObject());
1227
+ if (!XPCNativeWrapperCtor(cx, JSVAL_TO_OBJECT(v), 1, &v, &v))
1228
+ return nsnull;
1229
+ return JSVAL_TO_OBJECT(v);
1230
+ }
1231
+ }
1232
+
1233
+ // Prevent wrapping a double-wrapped JS object in an
1234
+ // XPCNativeWrapper!
1235
+ nsCOMPtr<nsIXPConnectWrappedJS> xpcwrappedjs(do_QueryWrappedNative(wrapper));
1236
+
1237
+ if (xpcwrappedjs) {
1238
+ JSObject *flat = wrapper->GetFlatJSObject();
1239
+ jsval v = OBJECT_TO_JSVAL(flat);
1240
+
1241
+ XPCCallContext ccx(JS_CALLER, cx);
1242
+
1243
+ // Make sure v doesn't get collected while we're re-wrapping it.
1244
+ AUTO_MARK_JSVAL(ccx, v);
1245
+
1246
+ if (XPC_SJOW_Construct(cx, nsnull, 1, &v, &v))
1247
+ return JSVAL_TO_OBJECT(v);
1248
+
1249
+ return nsnull;
1250
+ }
1251
+
1252
+ JSObject *obj = wrapper->GetWrapper();
1253
+ if (obj) {
1254
+ return obj;
1255
+ }
1256
+
1257
+ JSObject *nw_parent;
1258
+ if (!MirrorWrappedNativeParent(cx, wrapper, &nw_parent)) {
1259
+ return nsnull;
1260
+ }
1261
+
1262
+ PRBool lock;
1263
+
1264
+ if (!nw_parent) {
1265
+ nw_parent = wrapper->GetScope()->GetGlobalJSObject();
1266
+
1267
+ lock = PR_FALSE;
1268
+ } else {
1269
+ lock = PR_TRUE;
1270
+ }
1271
+
1272
+ if (lock) {
1273
+ // Make sure nw_parent doesn't get collected while we're creating
1274
+ // the new wrapper.
1275
+ ::JS_LockGCThing(cx, nw_parent);
1276
+ }
1277
+
1278
+ obj = ::JS_NewObjectWithGivenProto(cx, GetJSClass(), nsnull, nw_parent);
1279
+
1280
+ if (lock) {
1281
+ ::JS_UnlockGCThing(cx, nw_parent);
1282
+ }
1283
+
1284
+ if (!obj ||
1285
+ !::JS_SetPrivate(cx, obj, wrapper) ||
1286
+ !::JS_SetReservedSlot(cx, obj, 0, INT_TO_JSVAL(FLAG_DEEP))) {
1287
+ return nsnull;
1288
+ }
1289
+
1290
+ wrapper->SetWrapper(obj);
1291
+
1292
+ #if defined(DEBUG_XPCNativeWrapper) || defined(DEBUG_xpc_leaks)
1293
+ {
1294
+ XPCCallContext ccx(NATIVE_CALLER, cx);
1295
+
1296
+ // Keep obj alive while we mess with strings
1297
+ AUTO_MARK_JSVAL(ccx, OBJECT_TO_JSVAL(obj));
1298
+
1299
+ char *s = wrapper->ToString(ccx);
1300
+ printf("Created new XPCNativeWrapper %p for wrapped native %s\n",
1301
+ (void*)obj, s);
1302
+ if (s)
1303
+ JS_smprintf_free(s);
1304
+ }
1305
+ #endif
1306
+
1307
+ return obj;
1308
+ }
1309
+
1310
+ struct WrapperAndCxHolder
1311
+ {
1312
+ XPCWrappedNative* wrapper;
1313
+ JSContext* cx;
1314
+ };
1315
+
1316
+ static JSDHashOperator
1317
+ ClearNativeWrapperScope(JSDHashTable *table, JSDHashEntryHdr *hdr,
1318
+ uint32 number, void *arg)
1319
+ {
1320
+ JSDHashEntryStub* entry = (JSDHashEntryStub*)hdr;
1321
+ WrapperAndCxHolder* d = (WrapperAndCxHolder*)arg;
1322
+
1323
+ if (d->wrapper->GetWrapper() == (JSObject*)entry->key)
1324
+ {
1325
+ ::JS_ClearScope(d->cx, (JSObject*)entry->key);
1326
+ }
1327
+
1328
+ return JS_DHASH_NEXT;
1329
+ }
1330
+
1331
+ // static
1332
+ void
1333
+ XPCNativeWrapper::ClearWrappedNativeScopes(JSContext* cx,
1334
+ XPCWrappedNative* wrapper)
1335
+ {
1336
+ JSObject *nativeWrapper = wrapper->GetWrapper();
1337
+
1338
+ if (nativeWrapper) {
1339
+ ::JS_ClearScope(cx, nativeWrapper);
1340
+ }
1341
+
1342
+ WrapperAndCxHolder d =
1343
+ {
1344
+ wrapper,
1345
+ cx
1346
+ };
1347
+
1348
+ wrapper->GetRuntime()->GetExplicitNativeWrapperMap()->
1349
+ Enumerate(ClearNativeWrapperScope, &d);
1350
+ }