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,2003 @@
1
+ /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
+ * vim: set ts=8 sw=4 et tw=78:
3
+ *
4
+ * ***** BEGIN LICENSE BLOCK *****
5
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
6
+ *
7
+ * The contents of this file are subject to the Mozilla Public License Version
8
+ * 1.1 (the "License"); you may not use this file except in compliance with
9
+ * the License. You may obtain a copy of the License at
10
+ * http://www.mozilla.org/MPL/
11
+ *
12
+ * Software distributed under the License is distributed on an "AS IS" basis,
13
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14
+ * for the specific language governing rights and limitations under the
15
+ * License.
16
+ *
17
+ * The Original Code is Mozilla Communicator client code, released
18
+ * March 31, 1998.
19
+ *
20
+ * The Initial Developer of the Original Code is
21
+ * Netscape Communications Corporation.
22
+ * Portions created by the Initial Developer are Copyright (C) 1999
23
+ * the Initial Developer. All Rights Reserved.
24
+ *
25
+ * Contributor(s):
26
+ * John Bandhauer <jband@netscape.com> (original author)
27
+ *
28
+ * Alternatively, the contents of this file may be used under the terms of
29
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
30
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
31
+ * in which case the provisions of the GPL or the LGPL are applicable instead
32
+ * of those above. If you wish to allow use of your version of this file only
33
+ * under the terms of either the GPL or the LGPL, and not to allow others to
34
+ * use your version of this file under the terms of the MPL, indicate your
35
+ * decision by deleting the provisions above and replace them with the notice
36
+ * and other provisions required by the GPL or the LGPL. If you do not delete
37
+ * the provisions above, a recipient may use your version of this file under
38
+ * the terms of any one of the MPL, the GPL or the LGPL.
39
+ *
40
+ * ***** END LICENSE BLOCK ***** */
41
+
42
+ /* JavaScript JSClasses and JSOps for our Wrapped Native JS Objects. */
43
+
44
+ #include "xpcprivate.h"
45
+ #include "XPCNativeWrapper.h"
46
+ #include "XPCWrapper.h"
47
+
48
+ /***************************************************************************/
49
+
50
+ // All of the exceptions thrown into JS from this file go through here.
51
+ // That makes this a nice place to set a breakpoint.
52
+
53
+ static JSBool Throw(uintN errNum, JSContext* cx)
54
+ {
55
+ XPCThrower::Throw(errNum, cx);
56
+ return JS_FALSE;
57
+ }
58
+
59
+ // Handy macro used in many callback stub below.
60
+
61
+ #define THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper) \
62
+ PR_BEGIN_MACRO \
63
+ if(!wrapper) \
64
+ return Throw(NS_ERROR_XPC_BAD_OP_ON_WN_PROTO, cx); \
65
+ if(!wrapper->IsValid()) \
66
+ return Throw(NS_ERROR_XPC_HAS_BEEN_SHUTDOWN, cx); \
67
+ PR_END_MACRO
68
+
69
+ // We rely on the engine only giving us jsval ids that are actually the
70
+ // self-same jsvals that are in the atom table (that is, if the id represents
71
+ // a string). So, we assert by converting the jsval to an id and then back
72
+ // to a jsval and comparing pointers. If the engine ever breaks this promise
73
+ // then we will scream.
74
+ #ifdef DEBUG
75
+ #define CHECK_IDVAL(cx, idval) \
76
+ PR_BEGIN_MACRO \
77
+ if(JSVAL_IS_STRING(idval)) \
78
+ { \
79
+ jsid d_id; \
80
+ jsval d_val; \
81
+ NS_ASSERTION(JS_ValueToId(cx, idval, &d_id), "JS_ValueToId failed!");\
82
+ NS_ASSERTION(JS_IdToValue(cx, d_id, &d_val), "JS_IdToValue failed!");\
83
+ NS_ASSERTION(d_val == idval, "id differs from id in atom table!"); \
84
+ } \
85
+ PR_END_MACRO
86
+ #else
87
+ #define CHECK_IDVAL(cx, idval) ((void)0)
88
+ #endif
89
+
90
+ /***************************************************************************/
91
+
92
+ static JSBool
93
+ ToStringGuts(XPCCallContext& ccx)
94
+ {
95
+ char* sz;
96
+ XPCWrappedNative* wrapper = ccx.GetWrapper();
97
+
98
+ if(wrapper)
99
+ sz = wrapper->ToString(ccx, ccx.GetTearOff());
100
+ else
101
+ sz = JS_smprintf("[xpconnect wrapped native prototype]");
102
+
103
+ if(!sz)
104
+ {
105
+ JS_ReportOutOfMemory(ccx);
106
+ return JS_FALSE;
107
+ }
108
+
109
+ JSString* str = JS_NewString(ccx, sz, strlen(sz));
110
+ if(!str)
111
+ {
112
+ JS_smprintf_free(sz);
113
+ // JS_ReportOutOfMemory already reported by failed JS_NewString
114
+ return JS_FALSE;
115
+ }
116
+
117
+ ccx.SetRetVal(STRING_TO_JSVAL(str));
118
+ return JS_TRUE;
119
+ }
120
+
121
+ /***************************************************************************/
122
+
123
+ static JSBool
124
+ XPC_WN_Shared_ToString(JSContext *cx, JSObject *obj,
125
+ uintN argc, jsval *argv, jsval *vp)
126
+ {
127
+ XPCCallContext ccx(JS_CALLER, cx, obj);
128
+ ccx.SetName(ccx.GetRuntime()->GetStringJSVal(XPCJSRuntime::IDX_TO_STRING));
129
+ ccx.SetArgsAndResultPtr(argc, argv, vp);
130
+ return ToStringGuts(ccx);
131
+ }
132
+
133
+ static JSBool
134
+ XPC_WN_Shared_ToSource(JSContext *cx, JSObject *obj,
135
+ uintN argc, jsval *argv, jsval *vp)
136
+ {
137
+ static const char empty[] = "{}";
138
+ *vp = STRING_TO_JSVAL(JS_NewStringCopyN(cx, empty, sizeof(empty)-1));
139
+ return JS_TRUE;
140
+ }
141
+
142
+ /***************************************************************************/
143
+
144
+ // A "double wrapped object" is a user JSObject that has been wrapped as a
145
+ // wrappedJS in order to be used by native code and then re-wrapped by a
146
+ // wrappedNative wrapper to be used by JS code. One might think of it as:
147
+ // wrappedNative(wrappedJS(underlying_JSObject))
148
+ // This is done (as opposed to just unwrapping the wrapped JS and automatically
149
+ // returning the underlying JSObject) so that JS callers will see what looks
150
+ // Like any other xpcom object - and be limited to use its interfaces.
151
+ //
152
+ // See the comment preceeding nsIXPCWrappedJSObjectGetter in nsIXPConnect.idl.
153
+
154
+ static JSObject*
155
+ GetDoubleWrappedJSObject(XPCCallContext& ccx, XPCWrappedNative* wrapper)
156
+ {
157
+ JSObject* obj = nsnull;
158
+ nsCOMPtr<nsIXPConnectWrappedJS>
159
+ underware = do_QueryInterface(wrapper->GetIdentityObject());
160
+ if(underware)
161
+ {
162
+ JSObject* mainObj = nsnull;
163
+ if(NS_SUCCEEDED(underware->GetJSObject(&mainObj)) && mainObj)
164
+ {
165
+ jsid id = ccx.GetRuntime()->
166
+ GetStringID(XPCJSRuntime::IDX_WRAPPED_JSOBJECT);
167
+
168
+ jsval val;
169
+ if(JS_GetPropertyById(ccx, mainObj, id, &val) &&
170
+ !JSVAL_IS_PRIMITIVE(val))
171
+ {
172
+ obj = JSVAL_TO_OBJECT(val);
173
+ }
174
+ }
175
+ }
176
+ return obj;
177
+ }
178
+
179
+ // This is the getter native function we use to handle 'wrappedJSObject' for
180
+ // double wrapped JSObjects.
181
+
182
+ static JSBool
183
+ XPC_WN_DoubleWrappedGetter(JSContext *cx, JSObject *obj,
184
+ uintN argc, jsval *argv, jsval *vp)
185
+ {
186
+ XPCCallContext ccx(JS_CALLER, cx, obj);
187
+ XPCWrappedNative* wrapper = ccx.GetWrapper();
188
+ THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper);
189
+
190
+ NS_ASSERTION(JS_TypeOfValue(cx, argv[-2]) == JSTYPE_FUNCTION, "bad function");
191
+
192
+ JSObject* realObject = GetDoubleWrappedJSObject(ccx, wrapper);
193
+ if(!realObject)
194
+ {
195
+ // This is pretty unexpected at this point. The object originally
196
+ // responded to this get property call and now gives no object.
197
+ // XXX Should this throw something at the caller?
198
+ *vp = JSVAL_NULL;
199
+ return JS_TRUE;
200
+ }
201
+
202
+ // It is a double wrapped object. Figure out if the caller
203
+ // is allowed to see it.
204
+
205
+ nsIXPCSecurityManager* sm;
206
+ XPCContext* xpcc = ccx.GetXPCContext();
207
+
208
+ sm = xpcc->GetAppropriateSecurityManager(
209
+ nsIXPCSecurityManager::HOOK_GET_PROPERTY);
210
+ if(sm)
211
+ {
212
+ AutoMarkingNativeInterfacePtr iface(ccx);
213
+ iface = XPCNativeInterface::
214
+ GetNewOrUsed(ccx, &NS_GET_IID(nsIXPCWrappedJSObjectGetter));
215
+
216
+ if(iface)
217
+ {
218
+ jsval idval = ccx.GetRuntime()->
219
+ GetStringJSVal(XPCJSRuntime::IDX_WRAPPED_JSOBJECT);
220
+
221
+ ccx.SetCallInfo(iface, iface->GetMemberAt(1), JS_FALSE);
222
+ if(NS_FAILED(sm->
223
+ CanAccess(nsIXPCSecurityManager::ACCESS_GET_PROPERTY,
224
+ &ccx, ccx,
225
+ ccx.GetFlattenedJSObject(),
226
+ wrapper->GetIdentityObject(),
227
+ wrapper->GetClassInfo(), idval,
228
+ wrapper->GetSecurityInfoAddr())))
229
+ {
230
+ // The SecurityManager should have set an exception.
231
+ return JS_FALSE;
232
+ }
233
+ }
234
+ }
235
+ *vp = OBJECT_TO_JSVAL(realObject);
236
+ return JS_TRUE;
237
+ }
238
+
239
+ /***************************************************************************/
240
+
241
+ // This is our shared function to define properties on our JSObjects.
242
+
243
+ /*
244
+ * NOTE:
245
+ * We *never* set the tearoff names (e.g. nsIFoo) as JS_ENUMERATE.
246
+ * We *never* set toString or toSource as JS_ENUMERATE.
247
+ */
248
+
249
+ static JSBool
250
+ DefinePropertyIfFound(XPCCallContext& ccx,
251
+ JSObject *obj, jsval idval,
252
+ XPCNativeSet* set,
253
+ XPCNativeInterface* iface,
254
+ XPCNativeMember* member,
255
+ XPCWrappedNativeScope* scope,
256
+ JSBool reflectToStringAndToSource,
257
+ XPCWrappedNative* wrapperToReflectInterfaceNames,
258
+ XPCWrappedNative* wrapperToReflectDoubleWrap,
259
+ XPCNativeScriptableInfo* scriptableInfo,
260
+ uintN propFlags,
261
+ JSBool* resolved)
262
+ {
263
+ XPCJSRuntime* rt = ccx.GetRuntime();
264
+ JSBool found;
265
+ const char* name;
266
+ jsid id;
267
+
268
+ if(set)
269
+ {
270
+ if(iface)
271
+ found = JS_TRUE;
272
+ else
273
+ found = set->FindMember(idval, &member, &iface);
274
+ }
275
+ else
276
+ found = (nsnull != (member = iface->FindMember(idval)));
277
+
278
+ if(!found)
279
+ {
280
+ HANDLE_POSSIBLE_NAME_CASE_ERROR(ccx, set, iface, idval);
281
+
282
+ if(reflectToStringAndToSource)
283
+ {
284
+ JSNative call;
285
+
286
+ if(idval == rt->GetStringJSVal(XPCJSRuntime::IDX_TO_STRING))
287
+ {
288
+ call = XPC_WN_Shared_ToString;
289
+ name = rt->GetStringName(XPCJSRuntime::IDX_TO_STRING);
290
+ id = rt->GetStringID(XPCJSRuntime::IDX_TO_STRING);
291
+ }
292
+ else if(idval == rt->GetStringJSVal(XPCJSRuntime::IDX_TO_SOURCE))
293
+ {
294
+ call = XPC_WN_Shared_ToSource;
295
+ name = rt->GetStringName(XPCJSRuntime::IDX_TO_SOURCE);
296
+ id = rt->GetStringID(XPCJSRuntime::IDX_TO_SOURCE);
297
+ }
298
+
299
+ else
300
+ call = nsnull;
301
+
302
+ if(call)
303
+ {
304
+ JSFunction* fun = JS_NewFunction(ccx, call, 0, 0, obj, name);
305
+ if(!fun)
306
+ {
307
+ JS_ReportOutOfMemory(ccx);
308
+ return JS_FALSE;
309
+ }
310
+
311
+ AutoResolveName arn(ccx, idval);
312
+ if(resolved)
313
+ *resolved = JS_TRUE;
314
+ return JS_DefinePropertyById(ccx, obj, id,
315
+ OBJECT_TO_JSVAL(JS_GetFunctionObject(fun)),
316
+ nsnull, nsnull,
317
+ propFlags & ~JSPROP_ENUMERATE);
318
+ }
319
+ }
320
+ // This *might* be a tearoff name that is not yet part of our
321
+ // set. Let's lookup the name and see if it is the name of an
322
+ // interface. Then we'll see if the object actually *does* this
323
+ // interface and add a tearoff as necessary.
324
+
325
+ if(wrapperToReflectInterfaceNames)
326
+ {
327
+ AutoMarkingNativeInterfacePtr iface2(ccx);
328
+ XPCWrappedNativeTearOff* to;
329
+ JSObject* jso;
330
+
331
+ if(JSVAL_IS_STRING(idval) &&
332
+ nsnull != (name = JS_GetStringBytes(JSVAL_TO_STRING(idval))) &&
333
+ (iface2 = XPCNativeInterface::GetNewOrUsed(ccx, name), iface2) &&
334
+ nsnull != (to = wrapperToReflectInterfaceNames->
335
+ FindTearOff(ccx, iface2, JS_TRUE)) &&
336
+ nsnull != (jso = to->GetJSObject()))
337
+
338
+ {
339
+ AutoResolveName arn(ccx, idval);
340
+ if(resolved)
341
+ *resolved = JS_TRUE;
342
+ return JS_ValueToId(ccx, idval, &id) &&
343
+ JS_DefinePropertyById(ccx, obj, id, OBJECT_TO_JSVAL(jso),
344
+ nsnull, nsnull,
345
+ propFlags & ~JSPROP_ENUMERATE);
346
+ }
347
+ }
348
+
349
+ // This *might* be a double wrapped JSObject
350
+ if(wrapperToReflectDoubleWrap &&
351
+ idval == rt->GetStringJSVal(XPCJSRuntime::IDX_WRAPPED_JSOBJECT) &&
352
+ GetDoubleWrappedJSObject(ccx, wrapperToReflectDoubleWrap))
353
+ {
354
+ // We build and add a getter function.
355
+ // A security check is done on a per-get basis.
356
+
357
+ JSFunction* fun;
358
+
359
+ id = rt->GetStringID(XPCJSRuntime::IDX_WRAPPED_JSOBJECT);
360
+ name = rt->GetStringName(XPCJSRuntime::IDX_WRAPPED_JSOBJECT);
361
+
362
+ fun = JS_NewFunction(ccx, XPC_WN_DoubleWrappedGetter,
363
+ 0, JSFUN_GETTER, obj, name);
364
+
365
+ if(!fun)
366
+ return JS_FALSE;
367
+
368
+ JSObject* funobj = JS_GetFunctionObject(fun);
369
+ if(!funobj)
370
+ return JS_FALSE;
371
+
372
+ propFlags |= JSPROP_GETTER;
373
+ propFlags &= ~JSPROP_ENUMERATE;
374
+
375
+ AutoResolveName arn(ccx, idval);
376
+ if(resolved)
377
+ *resolved = JS_TRUE;
378
+ return JS_DefinePropertyById(ccx, obj, id, JSVAL_VOID,
379
+ JS_DATA_TO_FUNC_PTR(JSPropertyOp, funobj),
380
+ nsnull,
381
+ propFlags);
382
+ }
383
+
384
+ #ifdef XPC_IDISPATCH_SUPPORT
385
+ // Check to see if there's an IDispatch tearoff
386
+ if(wrapperToReflectInterfaceNames &&
387
+ XPCIDispatchExtension::DefineProperty(ccx, obj,
388
+ idval, wrapperToReflectInterfaceNames, propFlags, resolved))
389
+ return JS_TRUE;
390
+ #endif
391
+
392
+ if(resolved)
393
+ *resolved = JS_FALSE;
394
+ return JS_TRUE;
395
+ }
396
+
397
+ if(!member)
398
+ {
399
+ if(wrapperToReflectInterfaceNames)
400
+ {
401
+ XPCWrappedNativeTearOff* to =
402
+ wrapperToReflectInterfaceNames->FindTearOff(ccx, iface, JS_TRUE);
403
+
404
+ if(!to)
405
+ return JS_FALSE;
406
+ JSObject* jso = to->GetJSObject();
407
+ if(!jso)
408
+ return JS_FALSE;
409
+
410
+ AutoResolveName arn(ccx, idval);
411
+ if(resolved)
412
+ *resolved = JS_TRUE;
413
+ return JS_ValueToId(ccx, idval, &id) &&
414
+ JS_DefinePropertyById(ccx, obj, id, OBJECT_TO_JSVAL(jso),
415
+ nsnull, nsnull,
416
+ propFlags & ~JSPROP_ENUMERATE);
417
+ }
418
+ if(resolved)
419
+ *resolved = JS_FALSE;
420
+ return JS_TRUE;
421
+ }
422
+
423
+ if(member->IsConstant())
424
+ {
425
+ jsval val;
426
+ AutoResolveName arn(ccx, idval);
427
+ if(resolved)
428
+ *resolved = JS_TRUE;
429
+ return member->GetConstantValue(ccx, iface, &val) &&
430
+ JS_ValueToId(ccx, idval, &id) &&
431
+ JS_DefinePropertyById(ccx, obj, id, val, nsnull, nsnull,
432
+ propFlags);
433
+ }
434
+
435
+ if(idval == rt->GetStringJSVal(XPCJSRuntime::IDX_TO_STRING) ||
436
+ idval == rt->GetStringJSVal(XPCJSRuntime::IDX_TO_SOURCE) ||
437
+ (scriptableInfo &&
438
+ scriptableInfo->GetFlags().DontEnumQueryInterface() &&
439
+ idval == rt->GetStringJSVal(XPCJSRuntime::IDX_QUERY_INTERFACE)))
440
+ propFlags &= ~JSPROP_ENUMERATE;
441
+
442
+ jsval funval;
443
+ if(!member->NewFunctionObject(ccx, iface, obj, &funval))
444
+ return JS_FALSE;
445
+
446
+ // protect funobj until it is actually attached
447
+ AUTO_MARK_JSVAL(ccx, funval);
448
+
449
+ #ifdef off_DEBUG_jband
450
+ {
451
+ static int cloneCount = 0;
452
+ if(!(++cloneCount%10))
453
+ printf("<><><> %d cloned functions created\n", cloneCount);
454
+ }
455
+ #endif
456
+
457
+ if(member->IsMethod())
458
+ {
459
+ AutoResolveName arn(ccx, idval);
460
+ if(resolved)
461
+ *resolved = JS_TRUE;
462
+ return JS_ValueToId(ccx, idval, &id) &&
463
+ JS_DefinePropertyById(ccx, obj, id, funval, nsnull, nsnull,
464
+ propFlags);
465
+ }
466
+
467
+ // else...
468
+
469
+ NS_ASSERTION(member->IsAttribute(), "way broken!");
470
+
471
+ propFlags |= JSPROP_GETTER | JSPROP_SHARED;
472
+ JSObject* funobj = JSVAL_TO_OBJECT(funval);
473
+ JSPropertyOp getter = JS_DATA_TO_FUNC_PTR(JSPropertyOp, funobj);
474
+ JSPropertyOp setter;
475
+ if(member->IsWritableAttribute())
476
+ {
477
+ propFlags |= JSPROP_SETTER;
478
+ propFlags &= ~JSPROP_READONLY;
479
+ setter = getter;
480
+ }
481
+ else
482
+ {
483
+ setter = js_GetterOnlyPropertyStub;
484
+ }
485
+
486
+ AutoResolveName arn(ccx, idval);
487
+ if(resolved)
488
+ *resolved = JS_TRUE;
489
+
490
+ return JS_ValueToId(ccx, idval, &id) &&
491
+ JS_DefinePropertyById(ccx, obj, id, JSVAL_VOID, getter, setter,
492
+ propFlags);
493
+ }
494
+
495
+ /***************************************************************************/
496
+ /***************************************************************************/
497
+
498
+ static JSBool
499
+ XPC_WN_OnlyIWrite_PropertyStub(JSContext *cx, JSObject *obj, jsval idval, jsval *vp)
500
+ {
501
+ CHECK_IDVAL(cx, idval);
502
+
503
+ XPCCallContext ccx(JS_CALLER, cx, obj, nsnull, idval);
504
+ XPCWrappedNative* wrapper = ccx.GetWrapper();
505
+ THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper);
506
+
507
+ // Allow only XPConnect to add the property
508
+ if(ccx.GetResolveName() == idval)
509
+ return JS_TRUE;
510
+
511
+ return Throw(NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN, cx);
512
+ }
513
+
514
+ static JSBool
515
+ XPC_WN_CannotModifyPropertyStub(JSContext *cx, JSObject *obj, jsval idval, jsval *vp)
516
+ {
517
+ CHECK_IDVAL(cx, idval);
518
+ return Throw(NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN, cx);
519
+ }
520
+
521
+ static JSBool
522
+ XPC_WN_Shared_Convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
523
+ {
524
+ if(type == JSTYPE_OBJECT)
525
+ {
526
+ *vp = OBJECT_TO_JSVAL(obj);
527
+ return JS_TRUE;
528
+ }
529
+
530
+ XPCCallContext ccx(JS_CALLER, cx, obj);
531
+ XPCWrappedNative* wrapper = ccx.GetWrapper();
532
+ THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper);
533
+
534
+ switch (type)
535
+ {
536
+ case JSTYPE_FUNCTION:
537
+ {
538
+ if(!ccx.GetTearOff())
539
+ {
540
+ XPCNativeScriptableInfo* si = wrapper->GetScriptableInfo();
541
+ if(si && (si->GetFlags().WantCall() ||
542
+ si->GetFlags().WantConstruct()))
543
+ {
544
+ *vp = OBJECT_TO_JSVAL(obj);
545
+ return JS_TRUE;
546
+ }
547
+ }
548
+ }
549
+ return Throw(NS_ERROR_XPC_CANT_CONVERT_WN_TO_FUN, cx);
550
+ case JSTYPE_NUMBER:
551
+ *vp = JS_GetNaNValue(cx);
552
+ return JS_TRUE;
553
+ case JSTYPE_BOOLEAN:
554
+ *vp = JSVAL_TRUE;
555
+ return JS_TRUE;
556
+ case JSTYPE_VOID:
557
+ case JSTYPE_STRING:
558
+ {
559
+ ccx.SetName(ccx.GetRuntime()->GetStringJSVal(XPCJSRuntime::IDX_TO_STRING));
560
+ ccx.SetArgsAndResultPtr(0, nsnull, vp);
561
+
562
+ XPCNativeMember* member = ccx.GetMember();
563
+ if(member && member->IsMethod())
564
+ {
565
+ if(!XPCWrappedNative::CallMethod(ccx))
566
+ return JS_FALSE;
567
+
568
+ if(JSVAL_IS_PRIMITIVE(*vp))
569
+ return JS_TRUE;
570
+ }
571
+
572
+ // else...
573
+ return ToStringGuts(ccx);
574
+ }
575
+ default:
576
+ NS_ERROR("bad type in conversion");
577
+ return JS_FALSE;
578
+ }
579
+ NS_NOTREACHED("huh?");
580
+ return JS_FALSE;
581
+ }
582
+
583
+ static JSBool
584
+ XPC_WN_Shared_Enumerate(JSContext *cx, JSObject *obj)
585
+ {
586
+ XPCCallContext ccx(JS_CALLER, cx, obj);
587
+ XPCWrappedNative* wrapper = ccx.GetWrapper();
588
+ THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper);
589
+
590
+ // Since we aren't going to enumerate tearoff names and the prototype
591
+ // handles non-mutated members, we can do this potential short-circuit.
592
+ if(!wrapper->HasMutatedSet())
593
+ return JS_TRUE;
594
+
595
+ // Since we might be using this in the helper case, we check to
596
+ // see if this is all avoidable.
597
+
598
+ if(wrapper->GetScriptableInfo() &&
599
+ wrapper->GetScriptableInfo()->GetFlags().DontEnumStaticProps())
600
+ return JS_TRUE;
601
+
602
+ XPCNativeSet* set = wrapper->GetSet();
603
+ XPCNativeSet* protoSet = wrapper->HasProto() ?
604
+ wrapper->GetProto()->GetSet() : nsnull;
605
+
606
+ PRUint16 interface_count = set->GetInterfaceCount();
607
+ XPCNativeInterface** interfaceArray = set->GetInterfaceArray();
608
+ for(PRUint16 i = 0; i < interface_count; i++)
609
+ {
610
+ XPCNativeInterface* iface = interfaceArray[i];
611
+ #ifdef XPC_IDISPATCH_SUPPORT
612
+ if(iface->GetIID()->Equals(NSID_IDISPATCH))
613
+ {
614
+ XPCIDispatchExtension::Enumerate(ccx, obj, wrapper);
615
+ continue;
616
+ }
617
+ #endif
618
+ PRUint16 member_count = iface->GetMemberCount();
619
+ for(PRUint16 k = 0; k < member_count; k++)
620
+ {
621
+ XPCNativeMember* member = iface->GetMemberAt(k);
622
+ jsval name = member->GetName();
623
+
624
+ // Skip if this member is going to come from the proto.
625
+ PRUint16 index;
626
+ if(protoSet &&
627
+ protoSet->FindMember(name, nsnull, &index) && index == i)
628
+ continue;
629
+ if(!xpc_ForcePropertyResolve(cx, obj, name))
630
+ return JS_FALSE;
631
+ }
632
+ }
633
+ return JS_TRUE;
634
+ }
635
+
636
+ /***************************************************************************/
637
+
638
+ static void
639
+ XPC_WN_NoHelper_Finalize(JSContext *cx, JSObject *obj)
640
+ {
641
+ XPCWrappedNative* p = (XPCWrappedNative*) xpc_GetJSPrivate(obj);
642
+ if(!p)
643
+ return;
644
+ p->FlatJSObjectFinalized(cx);
645
+ }
646
+
647
+ static void
648
+ TraceScopeJSObjects(JSTracer *trc, XPCWrappedNativeScope* scope)
649
+ {
650
+ NS_ASSERTION(scope, "bad scope");
651
+
652
+ JSObject* obj;
653
+
654
+ obj = scope->GetGlobalJSObject();
655
+ NS_ASSERTION(obj, "bad scope JSObject");
656
+ JS_CALL_OBJECT_TRACER(trc, obj, "XPCWrappedNativeScope::mGlobalJSObject");
657
+
658
+ obj = scope->GetPrototypeJSObject();
659
+ if(obj)
660
+ {
661
+ JS_CALL_OBJECT_TRACER(trc, obj,
662
+ "XPCWrappedNativeScope::mPrototypeJSObject");
663
+ }
664
+
665
+ obj = scope->GetPrototypeJSFunction();
666
+ if(obj)
667
+ {
668
+ JS_CALL_OBJECT_TRACER(trc, obj,
669
+ "XPCWrappedNativeScope::mPrototypeJSFunction");
670
+ }
671
+ }
672
+
673
+ void
674
+ xpc_TraceForValidWrapper(JSTracer *trc, XPCWrappedNative* wrapper)
675
+ {
676
+ // NOTE: It might be nice to also do the wrapper->Mark() call here too
677
+ // when we are called during the marking phase of JS GC to mark the
678
+ // wrapper's and wrapper's proto's interface sets.
679
+ //
680
+ // We currently do that in the GC callback code. The reason we don't do that
681
+ // here is because the bits used in that marking do unpleasant things to the
682
+ // member counts in the interface and interface set objects. Those counts
683
+ // are used in the DealWithDyingGCThings calls that are part of this JS GC
684
+ // marking phase. By doing these calls later during our GC callback we
685
+ // avoid that problem. Arguably this could be changed. But it ain't broke.
686
+ //
687
+ // However, we do need to call the wrapper's TraceJS so that
688
+ // it can be sure that its (potentially shared) JSClass is traced. The
689
+ // danger is that a live wrapper might not be in a wrapper map and thus
690
+ // won't be fully marked in the GC callback. This can happen if there is
691
+ // a security exception during wrapper creation or if during wrapper
692
+ // creation it is determined that the wrapper is not needed. In those cases
693
+ // the wrapper can never actually be used from JS code - so resources like
694
+ // the interface set will never be accessed. But the JS engine will still
695
+ // need to use the JSClass. So, some marking is required for protection.
696
+
697
+ wrapper->TraceJS(trc);
698
+
699
+ TraceScopeJSObjects(trc, wrapper->GetScope());
700
+ }
701
+
702
+ static void
703
+ XPC_WN_Shared_Trace(JSTracer *trc, JSObject *obj)
704
+ {
705
+ XPCWrappedNative* wrapper =
706
+ XPCWrappedNative::GetWrappedNativeOfJSObject(trc->context, obj);
707
+
708
+ if(wrapper && wrapper->IsValid())
709
+ xpc_TraceForValidWrapper(trc, wrapper);
710
+ }
711
+
712
+ static JSBool
713
+ XPC_WN_NoHelper_Resolve(JSContext *cx, JSObject *obj, jsval idval)
714
+ {
715
+ CHECK_IDVAL(cx, idval);
716
+
717
+ XPCCallContext ccx(JS_CALLER, cx, obj, nsnull, idval);
718
+ XPCWrappedNative* wrapper = ccx.GetWrapper();
719
+ THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper);
720
+
721
+ XPCNativeSet* set = ccx.GetSet();
722
+ if(!set)
723
+ return JS_TRUE;
724
+
725
+ // Don't resolve properties that are on our prototype.
726
+ if(ccx.GetInterface() && !ccx.GetStaticMemberIsLocal())
727
+ return JS_TRUE;
728
+
729
+ return DefinePropertyIfFound(ccx, obj, idval,
730
+ set, nsnull, nsnull, wrapper->GetScope(),
731
+ JS_TRUE, wrapper, wrapper, nsnull,
732
+ JSPROP_ENUMERATE |
733
+ JSPROP_READONLY |
734
+ JSPROP_PERMANENT, nsnull);
735
+ }
736
+
737
+ nsISupports *
738
+ XPC_GetIdentityObject(JSContext *cx, JSObject *obj)
739
+ {
740
+ XPCWrappedNative *wrapper;
741
+
742
+ if(XPCNativeWrapper::IsNativeWrapper(obj))
743
+ // Note: It's okay to use SafeGetWrappedNative here since we only do
744
+ // identity checking on the returned object.
745
+ wrapper = XPCNativeWrapper::SafeGetWrappedNative(obj);
746
+ else
747
+ wrapper = XPCWrappedNative::GetWrappedNativeOfJSObject(cx, obj);
748
+
749
+ if(!wrapper) {
750
+ JSObject *unsafeObj = XPC_SJOW_GetUnsafeObject(obj);
751
+ if(unsafeObj)
752
+ return XPC_GetIdentityObject(cx, unsafeObj);
753
+
754
+ return nsnull;
755
+ }
756
+
757
+ return wrapper->GetIdentityObject();
758
+ }
759
+
760
+ static JSBool
761
+ XPC_WN_Equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp)
762
+ {
763
+ *bp = JS_FALSE;
764
+
765
+ XPCWrappedNative *wrapper =
766
+ XPCWrappedNative::GetWrappedNativeOfJSObject(cx, obj);
767
+ THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper);
768
+
769
+ XPCNativeScriptableInfo* si = wrapper->GetScriptableInfo();
770
+ if(si && si->GetFlags().WantEquality())
771
+ {
772
+ nsresult rv = si->GetCallback()->Equality(wrapper, cx, obj, v, bp);
773
+ if(NS_FAILED(rv))
774
+ return Throw(rv, cx);
775
+
776
+ if(!*bp && !JSVAL_IS_PRIMITIVE(v) &&
777
+ IsXPCSafeJSObjectWrapperClass(STOBJ_GET_CLASS(JSVAL_TO_OBJECT(v))))
778
+ {
779
+ v = OBJECT_TO_JSVAL(XPC_SJOW_GetUnsafeObject(JSVAL_TO_OBJECT(v)));
780
+
781
+ rv = si->GetCallback()->Equality(wrapper, cx, obj, v, bp);
782
+ if(NS_FAILED(rv))
783
+ return Throw(rv, cx);
784
+ }
785
+ }
786
+ else if(!JSVAL_IS_PRIMITIVE(v))
787
+ {
788
+ JSObject *other = JSVAL_TO_OBJECT(v);
789
+
790
+ *bp = (obj == other ||
791
+ XPC_GetIdentityObject(cx, obj) ==
792
+ XPC_GetIdentityObject(cx, other));
793
+ }
794
+
795
+ return JS_TRUE;
796
+ }
797
+
798
+ static JSObject *
799
+ XPC_WN_OuterObject(JSContext *cx, JSObject *obj)
800
+ {
801
+ XPCWrappedNative *wrapper =
802
+ XPCWrappedNative::GetWrappedNativeOfJSObject(cx, obj);
803
+ if(!wrapper)
804
+ {
805
+ Throw(NS_ERROR_XPC_BAD_OP_ON_WN_PROTO, cx);
806
+
807
+ return nsnull;
808
+ }
809
+
810
+ if(!wrapper->IsValid())
811
+ {
812
+ Throw(NS_ERROR_XPC_HAS_BEEN_SHUTDOWN, cx);
813
+
814
+ return nsnull;
815
+ }
816
+
817
+ XPCNativeScriptableInfo* si = wrapper->GetScriptableInfo();
818
+ if(si && si->GetFlags().WantOuterObject())
819
+ {
820
+ JSObject *newThis;
821
+ nsresult rv =
822
+ si->GetCallback()->OuterObject(wrapper, cx, obj, &newThis);
823
+
824
+ if(NS_FAILED(rv))
825
+ {
826
+ Throw(rv, cx);
827
+
828
+ return nsnull;
829
+ }
830
+
831
+ obj = newThis;
832
+ }
833
+
834
+ return obj;
835
+ }
836
+
837
+ static JSObject *
838
+ XPC_WN_InnerObject(JSContext *cx, JSObject *obj)
839
+ {
840
+ XPCWrappedNative *wrapper =
841
+ XPCWrappedNative::GetWrappedNativeOfJSObject(cx, obj);
842
+ if(!wrapper)
843
+ {
844
+ Throw(NS_ERROR_XPC_BAD_OP_ON_WN_PROTO, cx);
845
+
846
+ return nsnull;
847
+ }
848
+
849
+ if(!wrapper->IsValid())
850
+ {
851
+ Throw(NS_ERROR_XPC_HAS_BEEN_SHUTDOWN, cx);
852
+
853
+ return nsnull;
854
+ }
855
+
856
+ XPCNativeScriptableInfo* si = wrapper->GetScriptableInfo();
857
+ if(si && si->GetFlags().WantInnerObject())
858
+ {
859
+ JSObject *newThis;
860
+ nsresult rv =
861
+ si->GetCallback()->InnerObject(wrapper, cx, obj, &newThis);
862
+
863
+ if(NS_FAILED(rv))
864
+ {
865
+ Throw(rv, cx);
866
+
867
+ return nsnull;
868
+ }
869
+
870
+ obj = newThis;
871
+ }
872
+
873
+ return obj;
874
+ }
875
+
876
+ JSExtendedClass XPC_WN_NoHelper_JSClass = {
877
+ {
878
+ "XPCWrappedNative_NoHelper", // name;
879
+ JSCLASS_HAS_PRIVATE |
880
+ JSCLASS_PRIVATE_IS_NSISUPPORTS |
881
+ JSCLASS_MARK_IS_TRACE |
882
+ JSCLASS_IS_EXTENDED, // flags;
883
+
884
+ /* Mandatory non-null function pointer members. */
885
+ XPC_WN_OnlyIWrite_PropertyStub, // addProperty;
886
+ XPC_WN_CannotModifyPropertyStub,// delProperty;
887
+ JS_PropertyStub, // getProperty;
888
+ XPC_WN_OnlyIWrite_PropertyStub, // setProperty;
889
+
890
+ XPC_WN_Shared_Enumerate, // enumerate;
891
+ XPC_WN_NoHelper_Resolve, // resolve;
892
+ XPC_WN_Shared_Convert, // convert;
893
+ XPC_WN_NoHelper_Finalize, // finalize;
894
+
895
+ /* Optionally non-null members start here. */
896
+ XPC_WN_GetObjectOpsNoCall, // getObjectOps;
897
+ nsnull, // checkAccess;
898
+ nsnull, // call;
899
+ nsnull, // construct;
900
+ nsnull, // xdrObject;
901
+ nsnull, // hasInstance;
902
+ JS_CLASS_TRACE(XPC_WN_Shared_Trace), // mark/trace;
903
+ nsnull // spare;
904
+ },
905
+ XPC_WN_Equality,
906
+ XPC_WN_OuterObject,
907
+ XPC_WN_InnerObject,
908
+ nsnull,nsnull,nsnull,nsnull,nsnull
909
+ };
910
+
911
+
912
+ /***************************************************************************/
913
+
914
+ static JSBool
915
+ XPC_WN_MaybeResolvingPropertyStub(JSContext *cx, JSObject *obj, jsval idval, jsval *vp)
916
+ {
917
+ CHECK_IDVAL(cx, idval);
918
+ XPCCallContext ccx(JS_CALLER, cx, obj);
919
+ XPCWrappedNative* wrapper = ccx.GetWrapper();
920
+ THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper);
921
+
922
+ if(ccx.GetResolvingWrapper() == wrapper)
923
+ return JS_TRUE;
924
+ return Throw(NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN, cx);
925
+ }
926
+
927
+ // macro fun!
928
+ #define PRE_HELPER_STUB \
929
+ XPCWrappedNative* wrapper = \
930
+ XPCWrappedNative::GetWrappedNativeOfJSObject(cx, obj); \
931
+ THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper); \
932
+ PRBool retval = JS_TRUE; \
933
+ nsresult rv = wrapper->GetScriptableCallback()->
934
+
935
+ #define POST_HELPER_STUB \
936
+ if(NS_FAILED(rv)) \
937
+ return Throw(rv, cx); \
938
+ return retval;
939
+
940
+ static JSBool
941
+ XPC_WN_Helper_AddProperty(JSContext *cx, JSObject *obj, jsval idval, jsval *vp)
942
+ {
943
+ PRE_HELPER_STUB
944
+ AddProperty(wrapper, cx, obj, idval, vp, &retval);
945
+ POST_HELPER_STUB
946
+ }
947
+
948
+ static JSBool
949
+ XPC_WN_Helper_DelProperty(JSContext *cx, JSObject *obj, jsval idval, jsval *vp)
950
+ {
951
+ PRE_HELPER_STUB
952
+ DelProperty(wrapper, cx, obj, idval, vp, &retval);
953
+ POST_HELPER_STUB
954
+ }
955
+
956
+ static JSBool
957
+ XPC_WN_Helper_GetProperty(JSContext *cx, JSObject *obj, jsval idval, jsval *vp)
958
+ {
959
+ PRE_HELPER_STUB
960
+ GetProperty(wrapper, cx, obj, idval, vp, &retval);
961
+ POST_HELPER_STUB
962
+ }
963
+
964
+ static JSBool
965
+ XPC_WN_Helper_SetProperty(JSContext *cx, JSObject *obj, jsval idval, jsval *vp)
966
+ {
967
+ PRE_HELPER_STUB
968
+ SetProperty(wrapper, cx, obj, idval, vp, &retval);
969
+ POST_HELPER_STUB
970
+ }
971
+
972
+ static JSBool
973
+ XPC_WN_Helper_Convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
974
+ {
975
+ PRE_HELPER_STUB
976
+ Convert(wrapper, cx, obj, type, vp, &retval);
977
+ POST_HELPER_STUB
978
+ }
979
+
980
+ static JSBool
981
+ XPC_WN_Helper_CheckAccess(JSContext *cx, JSObject *obj, jsval idval,
982
+ JSAccessMode mode, jsval *vp)
983
+ {
984
+ CHECK_IDVAL(cx, idval);
985
+ PRE_HELPER_STUB
986
+ CheckAccess(wrapper, cx, obj, idval, mode, vp, &retval);
987
+ POST_HELPER_STUB
988
+ }
989
+
990
+ static JSBool
991
+ XPC_WN_Helper_Call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
992
+ jsval *rval)
993
+ {
994
+ // this is a hack to get the obj of the actual object not the object
995
+ // that JS thinks is the 'this' (which it passes as 'obj').
996
+ if(!(obj = (JSObject*)argv[-2]))
997
+ return JS_FALSE;
998
+
999
+ PRE_HELPER_STUB
1000
+ Call(wrapper, cx, obj, argc, argv, rval, &retval);
1001
+ POST_HELPER_STUB
1002
+ }
1003
+
1004
+ static JSBool
1005
+ XPC_WN_Helper_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
1006
+ jsval *rval)
1007
+ {
1008
+ // this is a hack to get the obj of the actual object not the object
1009
+ // that JS thinks is the 'this' (which it passes as 'obj').
1010
+ if(!(obj = (JSObject*)argv[-2]))
1011
+ return JS_FALSE;
1012
+
1013
+ PRE_HELPER_STUB
1014
+ Construct(wrapper, cx, obj, argc, argv, rval, &retval);
1015
+ POST_HELPER_STUB
1016
+ }
1017
+
1018
+ static JSBool
1019
+ XPC_WN_Helper_HasInstance(JSContext *cx, JSObject *obj, jsval v, JSBool *bp)
1020
+ {
1021
+ PRE_HELPER_STUB
1022
+ HasInstance(wrapper, cx, obj, v, bp, &retval);
1023
+ POST_HELPER_STUB
1024
+ }
1025
+
1026
+ static void
1027
+ XPC_WN_Helper_Finalize(JSContext *cx, JSObject *obj)
1028
+ {
1029
+ XPCWrappedNative* wrapper = (XPCWrappedNative*) xpc_GetJSPrivate(obj);
1030
+ if(!wrapper)
1031
+ return;
1032
+ wrapper->GetScriptableCallback()->Finalize(wrapper, cx, obj);
1033
+ wrapper->FlatJSObjectFinalized(cx);
1034
+ }
1035
+
1036
+ static void
1037
+ XPC_WN_Helper_Trace(JSTracer *trc, JSObject *obj)
1038
+ {
1039
+ XPCWrappedNative* wrapper =
1040
+ XPCWrappedNative::GetWrappedNativeOfJSObject(trc->context, obj);
1041
+ if(wrapper && wrapper->IsValid())
1042
+ {
1043
+ wrapper->GetScriptableCallback()->Trace(wrapper, trc, obj);
1044
+ xpc_TraceForValidWrapper(trc, wrapper);
1045
+ }
1046
+ }
1047
+
1048
+ static JSBool
1049
+ XPC_WN_Helper_NewResolve(JSContext *cx, JSObject *obj, jsval idval, uintN flags,
1050
+ JSObject **objp)
1051
+ {
1052
+ CHECK_IDVAL(cx, idval);
1053
+
1054
+ XPCCallContext ccx(JS_CALLER, cx, obj);
1055
+ XPCWrappedNative* wrapper = ccx.GetWrapper();
1056
+ THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper);
1057
+
1058
+ jsval old = ccx.SetResolveName(idval);
1059
+
1060
+ nsresult rv = NS_OK;
1061
+ JSBool retval = JS_TRUE;
1062
+ JSObject* obj2FromScriptable = nsnull;
1063
+
1064
+ XPCNativeScriptableInfo* si = wrapper->GetScriptableInfo();
1065
+ if(si && si->GetFlags().WantNewResolve())
1066
+ {
1067
+ XPCWrappedNative* oldResolvingWrapper;
1068
+ JSBool allowPropMods = si->GetFlags().AllowPropModsDuringResolve();
1069
+
1070
+ if(allowPropMods)
1071
+ oldResolvingWrapper = ccx.SetResolvingWrapper(wrapper);
1072
+
1073
+ rv = si->GetCallback()->NewResolve(wrapper, cx, obj, idval, flags,
1074
+ &obj2FromScriptable, &retval);
1075
+
1076
+ if(allowPropMods)
1077
+ (void)ccx.SetResolvingWrapper(oldResolvingWrapper);
1078
+ }
1079
+
1080
+ old = ccx.SetResolveName(old);
1081
+ NS_ASSERTION(old == idval, "bad nest");
1082
+
1083
+ if(NS_FAILED(rv))
1084
+ {
1085
+ return Throw(rv, cx);
1086
+ }
1087
+
1088
+ if(obj2FromScriptable)
1089
+ {
1090
+ *objp = obj2FromScriptable;
1091
+ }
1092
+ else if(wrapper->HasMutatedSet())
1093
+ {
1094
+ // We are here if scriptable did not resolve this property and
1095
+ // it *might* be in the instance set but not the proto set.
1096
+
1097
+ XPCNativeSet* set = wrapper->GetSet();
1098
+ XPCNativeSet* protoSet = wrapper->HasProto() ?
1099
+ wrapper->GetProto()->GetSet() : nsnull;
1100
+ XPCNativeMember* member;
1101
+ XPCNativeInterface* iface;
1102
+ JSBool IsLocal;
1103
+
1104
+ if(set->FindMember(idval, &member, &iface, protoSet, &IsLocal) &&
1105
+ IsLocal)
1106
+ {
1107
+ XPCWrappedNative* oldResolvingWrapper;
1108
+
1109
+ XPCNativeScriptableFlags siFlags(0);
1110
+ if(si)
1111
+ siFlags = si->GetFlags();
1112
+
1113
+ uintN enumFlag =
1114
+ siFlags.DontEnumStaticProps() ? 0 : JSPROP_ENUMERATE;
1115
+
1116
+ XPCWrappedNative* wrapperForInterfaceNames =
1117
+ siFlags.DontReflectInterfaceNames() ? nsnull : wrapper;
1118
+
1119
+ JSBool resolved;
1120
+ oldResolvingWrapper = ccx.SetResolvingWrapper(wrapper);
1121
+ retval = DefinePropertyIfFound(ccx, obj, idval,
1122
+ set, iface, member,
1123
+ wrapper->GetScope(),
1124
+ JS_FALSE,
1125
+ wrapperForInterfaceNames,
1126
+ nsnull, si,
1127
+ enumFlag, &resolved);
1128
+ (void)ccx.SetResolvingWrapper(oldResolvingWrapper);
1129
+ if(retval && resolved)
1130
+ *objp = obj;
1131
+ }
1132
+ }
1133
+
1134
+ return retval;
1135
+ }
1136
+
1137
+ /***************************************************************************/
1138
+
1139
+ extern "C" JS_IMPORT_DATA(JSObjectOps) js_ObjectOps;
1140
+
1141
+ static JSObjectOps XPC_WN_WithCall_JSOps;
1142
+ static JSObjectOps XPC_WN_NoCall_JSOps;
1143
+
1144
+ /*
1145
+ Here are the enumerator cases:
1146
+
1147
+ set jsclass enumerate to stub (unless noted otherwise)
1148
+
1149
+ if( helper wants new enumerate )
1150
+ if( DONT_ENUM_STATICS )
1151
+ forward to scriptable enumerate
1152
+ else
1153
+ if( set not mutated )
1154
+ forward to scriptable enumerate
1155
+ else
1156
+ call shared enumerate
1157
+ forward to scriptable enumerate
1158
+ else if( helper wants old enumerate )
1159
+ use this JSOp
1160
+ if( DONT_ENUM_STATICS )
1161
+ call scriptable enumerate
1162
+ call stub
1163
+ else
1164
+ if( set not mutated )
1165
+ call scriptable enumerate
1166
+ call stub
1167
+ else
1168
+ call shared enumerate
1169
+ call scriptable enumerate
1170
+ call stub
1171
+
1172
+ else //... if( helper wants NO enumerate )
1173
+ if( DONT_ENUM_STATICS )
1174
+ use enumerate stub - don't use this JSOp thing at all
1175
+ else
1176
+ do shared enumerate - don't use this JSOp thing at all
1177
+ */
1178
+
1179
+ static JSBool
1180
+ XPC_WN_JSOp_Enumerate(JSContext *cx, JSObject *obj, JSIterateOp enum_op,
1181
+ jsval *statep, jsid *idp)
1182
+ {
1183
+ JSClass *clazz = STOBJ_GET_CLASS(obj);
1184
+ if(!IS_WRAPPER_CLASS(clazz) || clazz == &XPC_WN_NoHelper_JSClass.base)
1185
+ {
1186
+ // obj must be a prototype object or a wrapper w/o a
1187
+ // helper. Short circuit this call to
1188
+ // js_ObjectOps.enumerate().
1189
+
1190
+ return js_ObjectOps.enumerate(cx, obj, enum_op, statep, idp);
1191
+ }
1192
+
1193
+ XPCCallContext ccx(JS_CALLER, cx, obj);
1194
+ XPCWrappedNative* wrapper = ccx.GetWrapper();
1195
+ THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper);
1196
+
1197
+ XPCNativeScriptableInfo* si = wrapper->GetScriptableInfo();
1198
+ if(!si)
1199
+ return Throw(NS_ERROR_XPC_BAD_OP_ON_WN_PROTO, cx);
1200
+
1201
+ PRBool retval = JS_TRUE;
1202
+ nsresult rv;
1203
+
1204
+ if(si->GetFlags().WantNewEnumerate())
1205
+ {
1206
+ if(enum_op == JSENUMERATE_INIT &&
1207
+ !si->GetFlags().DontEnumStaticProps() &&
1208
+ wrapper->HasMutatedSet() &&
1209
+ !XPC_WN_Shared_Enumerate(cx, obj))
1210
+ {
1211
+ *statep = JSVAL_NULL;
1212
+ return JS_FALSE;
1213
+ }
1214
+
1215
+ // XXX Might we really need to wrap this call and *also* call
1216
+ // js_ObjectOps.enumerate ???
1217
+
1218
+ rv = si->GetCallback()->
1219
+ NewEnumerate(wrapper, cx, obj, enum_op, statep, idp, &retval);
1220
+
1221
+ if(enum_op == JSENUMERATE_INIT && (NS_FAILED(rv) || !retval))
1222
+ *statep = JSVAL_NULL;
1223
+
1224
+ if(NS_FAILED(rv))
1225
+ return Throw(rv, cx);
1226
+ return retval;
1227
+ }
1228
+
1229
+ if(si->GetFlags().WantEnumerate())
1230
+ {
1231
+ if(enum_op == JSENUMERATE_INIT)
1232
+ {
1233
+ if(!si->GetFlags().DontEnumStaticProps() &&
1234
+ wrapper->HasMutatedSet() &&
1235
+ !XPC_WN_Shared_Enumerate(cx, obj))
1236
+ {
1237
+ *statep = JSVAL_NULL;
1238
+ return JS_FALSE;
1239
+ }
1240
+ rv = si->GetCallback()->
1241
+ Enumerate(wrapper, cx, obj, &retval);
1242
+
1243
+ if(NS_FAILED(rv) || !retval)
1244
+ *statep = JSVAL_NULL;
1245
+
1246
+ if(NS_FAILED(rv))
1247
+ return Throw(rv, cx);
1248
+ if(!retval)
1249
+ return JS_FALSE;
1250
+ // Then fall through and call js_ObjectOps.enumerate...
1251
+ }
1252
+ }
1253
+
1254
+ // else call js_ObjectOps.enumerate...
1255
+
1256
+ return js_ObjectOps.enumerate(cx, obj, enum_op, statep, idp);
1257
+ }
1258
+
1259
+ static void
1260
+ XPC_WN_JSOp_Clear(JSContext *cx, JSObject *obj)
1261
+ {
1262
+ // We're likely to enter this JSOp with a wrapper prototype
1263
+ // object. In that case we won't find a wrapper, so we'll just
1264
+ // call into js_ObjectOps.clear(), which is exactly what we want.
1265
+
1266
+ // If our scope is cleared, make sure we clear the scope of our
1267
+ // native wrapper as well.
1268
+ XPCWrappedNative *wrapper =
1269
+ XPCWrappedNative::GetWrappedNativeOfJSObject(cx, obj);
1270
+
1271
+ if(wrapper && wrapper->IsValid())
1272
+ {
1273
+ XPCNativeWrapper::ClearWrappedNativeScopes(cx, wrapper);
1274
+
1275
+ nsXPConnect* xpc = nsXPConnect::GetXPConnect();
1276
+ xpc->UpdateXOWs(cx, wrapper, nsIXPConnect::XPC_XOW_CLEARSCOPE);
1277
+ }
1278
+
1279
+ js_ObjectOps.clear(cx, obj);
1280
+ }
1281
+
1282
+ namespace {
1283
+
1284
+ NS_STACK_CLASS class AutoPopJSContext
1285
+ {
1286
+ public:
1287
+ AutoPopJSContext(XPCJSContextStack *stack)
1288
+ : mCx(nsnull), mStack(stack)
1289
+ {
1290
+ NS_ASSERTION(stack, "Null stack!");
1291
+ }
1292
+
1293
+ ~AutoPopJSContext()
1294
+ {
1295
+ if(mCx)
1296
+ mStack->Pop(nsnull);
1297
+ }
1298
+
1299
+ void PushIfNotTop(JSContext *cx)
1300
+ {
1301
+ NS_ASSERTION(cx, "Null context!");
1302
+ NS_ASSERTION(!mCx, "This class is only meant to be used once!");
1303
+
1304
+ JSContext *cxTop = nsnull;
1305
+ mStack->Peek(&cxTop);
1306
+
1307
+ if(cxTop != cx && NS_SUCCEEDED(mStack->Push(cx)))
1308
+ mCx = cx;
1309
+ }
1310
+
1311
+ private:
1312
+ JSContext *mCx;
1313
+ XPCJSContextStack *mStack;
1314
+ };
1315
+
1316
+ } // namespace
1317
+
1318
+ static JSObject*
1319
+ XPC_WN_JSOp_ThisObject(JSContext *cx, JSObject *obj)
1320
+ {
1321
+ // None of the wrappers we could potentially hand out are threadsafe so
1322
+ // just hand out the given object.
1323
+ if(!XPCPerThreadData::IsMainThread(cx))
1324
+ return obj;
1325
+
1326
+ OBJ_TO_OUTER_OBJECT(cx, obj);
1327
+ if(!obj)
1328
+ return nsnull;
1329
+
1330
+ JSObject *scope = JS_GetScopeChain(cx);
1331
+ if(!scope)
1332
+ {
1333
+ XPCThrower::Throw(NS_ERROR_FAILURE, cx);
1334
+ return nsnull;
1335
+ }
1336
+
1337
+ scope = JS_GetGlobalForObject(cx, scope);
1338
+
1339
+ XPCPerThreadData *threadData = XPCPerThreadData::GetData(cx);
1340
+ if(!threadData)
1341
+ {
1342
+ XPCThrower::Throw(NS_ERROR_FAILURE, cx);
1343
+ return nsnull;
1344
+ }
1345
+
1346
+ AutoPopJSContext popper(threadData->GetJSContextStack());
1347
+ popper.PushIfNotTop(cx);
1348
+
1349
+ nsIScriptSecurityManager* secMan = XPCWrapper::GetSecurityManager();
1350
+ if(!secMan)
1351
+ {
1352
+ XPCThrower::Throw(NS_ERROR_FAILURE, cx);
1353
+ return nsnull;
1354
+ }
1355
+
1356
+ JSStackFrame *fp;
1357
+ nsIPrincipal *principal = secMan->GetCxSubjectPrincipalAndFrame(cx, &fp);
1358
+
1359
+ jsval retval = OBJECT_TO_JSVAL(obj);
1360
+ JSAutoTempValueRooter atvr(cx, 1, &retval);
1361
+
1362
+ if(principal && fp)
1363
+ {
1364
+ JSScript* script = JS_GetFrameScript(cx, fp);
1365
+
1366
+ PRUint32 flags = script ? JS_GetScriptFilenameFlags(script) : 0;
1367
+ NS_ASSERTION(flags != JSFILENAME_NULL, "Null filename!");
1368
+
1369
+ nsXPConnect *xpc = nsXPConnect::GetXPConnect();
1370
+ if(!xpc)
1371
+ {
1372
+ XPCThrower::Throw(NS_ERROR_FAILURE, cx);
1373
+ return nsnull;
1374
+ }
1375
+
1376
+ nsresult rv = xpc->GetWrapperForObject(cx, obj, scope, principal, flags,
1377
+ &retval);
1378
+ if(NS_FAILED(rv))
1379
+ {
1380
+ XPCThrower::Throw(rv, cx);
1381
+ return nsnull;
1382
+ }
1383
+ }
1384
+
1385
+ return JSVAL_TO_OBJECT(retval);
1386
+ }
1387
+
1388
+ JSObjectOps *
1389
+ XPC_WN_GetObjectOpsNoCall(JSContext *cx, JSClass *clazz)
1390
+ {
1391
+ return &XPC_WN_NoCall_JSOps;
1392
+ }
1393
+
1394
+ JSObjectOps *
1395
+ XPC_WN_GetObjectOpsWithCall(JSContext *cx, JSClass *clazz)
1396
+ {
1397
+ return &XPC_WN_WithCall_JSOps;
1398
+ }
1399
+
1400
+ JSBool xpc_InitWrappedNativeJSOps()
1401
+ {
1402
+ if(!XPC_WN_NoCall_JSOps.lookupProperty)
1403
+ {
1404
+ memcpy(&XPC_WN_NoCall_JSOps, &js_ObjectOps, sizeof(JSObjectOps));
1405
+ XPC_WN_NoCall_JSOps.enumerate = XPC_WN_JSOp_Enumerate;
1406
+ XPC_WN_NoCall_JSOps.call = nsnull;
1407
+ XPC_WN_NoCall_JSOps.construct = nsnull;
1408
+ XPC_WN_NoCall_JSOps.clear = XPC_WN_JSOp_Clear;
1409
+ XPC_WN_NoCall_JSOps.thisObject = XPC_WN_JSOp_ThisObject;
1410
+
1411
+ memcpy(&XPC_WN_WithCall_JSOps, &js_ObjectOps, sizeof(JSObjectOps));
1412
+ XPC_WN_WithCall_JSOps.enumerate = XPC_WN_JSOp_Enumerate;
1413
+ XPC_WN_WithCall_JSOps.clear = XPC_WN_JSOp_Clear;
1414
+ XPC_WN_WithCall_JSOps.thisObject = XPC_WN_JSOp_ThisObject;
1415
+ }
1416
+ return JS_TRUE;
1417
+ }
1418
+
1419
+ /***************************************************************************/
1420
+
1421
+ // static
1422
+ XPCNativeScriptableInfo*
1423
+ XPCNativeScriptableInfo::Construct(XPCCallContext& ccx,
1424
+ JSBool isGlobal,
1425
+ const XPCNativeScriptableCreateInfo* sci)
1426
+ {
1427
+ NS_ASSERTION(sci, "bad param");
1428
+ NS_ASSERTION(sci->GetCallback(), "bad param");
1429
+
1430
+ XPCNativeScriptableInfo* newObj =
1431
+ new XPCNativeScriptableInfo(sci->GetCallback());
1432
+ if(!newObj)
1433
+ return nsnull;
1434
+
1435
+ char* name = nsnull;
1436
+ if(NS_FAILED(sci->GetCallback()->GetClassName(&name)) || !name)
1437
+ {
1438
+ delete newObj;
1439
+ return nsnull;
1440
+ }
1441
+
1442
+ JSBool success;
1443
+
1444
+ XPCJSRuntime* rt = ccx.GetRuntime();
1445
+ XPCNativeScriptableSharedMap* map = rt->GetNativeScriptableSharedMap();
1446
+ { // scoped lock
1447
+ XPCAutoLock lock(rt->GetMapLock());
1448
+ success = map->GetNewOrUsed(sci->GetFlags(), name, isGlobal, newObj);
1449
+ }
1450
+
1451
+ if(!success)
1452
+ {
1453
+ delete newObj;
1454
+ return nsnull;
1455
+ }
1456
+
1457
+ return newObj;
1458
+ }
1459
+
1460
+ void
1461
+ XPCNativeScriptableShared::PopulateJSClass(JSBool isGlobal)
1462
+ {
1463
+ NS_ASSERTION(mJSClass.base.name, "bad state!");
1464
+
1465
+ mJSClass.base.flags = JSCLASS_HAS_PRIVATE |
1466
+ JSCLASS_PRIVATE_IS_NSISUPPORTS |
1467
+ JSCLASS_NEW_RESOLVE |
1468
+ JSCLASS_MARK_IS_TRACE |
1469
+ JSCLASS_IS_EXTENDED;
1470
+
1471
+ if(isGlobal)
1472
+ mJSClass.base.flags |= JSCLASS_GLOBAL_FLAGS;
1473
+
1474
+ if(mFlags.WantAddProperty())
1475
+ mJSClass.base.addProperty = XPC_WN_Helper_AddProperty;
1476
+ else if(mFlags.UseJSStubForAddProperty())
1477
+ mJSClass.base.addProperty = JS_PropertyStub;
1478
+ else if(mFlags.AllowPropModsDuringResolve())
1479
+ mJSClass.base.addProperty = XPC_WN_MaybeResolvingPropertyStub;
1480
+ else
1481
+ mJSClass.base.addProperty = XPC_WN_CannotModifyPropertyStub;
1482
+
1483
+ if(mFlags.WantDelProperty())
1484
+ mJSClass.base.delProperty = XPC_WN_Helper_DelProperty;
1485
+ else if(mFlags.UseJSStubForDelProperty())
1486
+ mJSClass.base.delProperty = JS_PropertyStub;
1487
+ else if(mFlags.AllowPropModsDuringResolve())
1488
+ mJSClass.base.delProperty = XPC_WN_MaybeResolvingPropertyStub;
1489
+ else
1490
+ mJSClass.base.delProperty = XPC_WN_CannotModifyPropertyStub;
1491
+
1492
+ if(mFlags.WantGetProperty())
1493
+ mJSClass.base.getProperty = XPC_WN_Helper_GetProperty;
1494
+ else
1495
+ mJSClass.base.getProperty = JS_PropertyStub;
1496
+
1497
+ if(mFlags.WantSetProperty())
1498
+ mJSClass.base.setProperty = XPC_WN_Helper_SetProperty;
1499
+ else if(mFlags.UseJSStubForSetProperty())
1500
+ mJSClass.base.setProperty = JS_PropertyStub;
1501
+ else if(mFlags.AllowPropModsDuringResolve())
1502
+ mJSClass.base.setProperty = XPC_WN_MaybeResolvingPropertyStub;
1503
+ else
1504
+ mJSClass.base.setProperty = XPC_WN_CannotModifyPropertyStub;
1505
+
1506
+ // We figure out most of the enumerate strategy at call time.
1507
+
1508
+ if(mFlags.WantNewEnumerate() || mFlags.WantEnumerate() ||
1509
+ mFlags.DontEnumStaticProps())
1510
+ mJSClass.base.enumerate = JS_EnumerateStub;
1511
+ else
1512
+ mJSClass.base.enumerate = XPC_WN_Shared_Enumerate;
1513
+
1514
+ // We have to figure out resolve strategy at call time
1515
+ mJSClass.base.resolve = (JSResolveOp) XPC_WN_Helper_NewResolve;
1516
+
1517
+ if(mFlags.WantConvert())
1518
+ mJSClass.base.convert = XPC_WN_Helper_Convert;
1519
+ else
1520
+ mJSClass.base.convert = XPC_WN_Shared_Convert;
1521
+
1522
+ if(mFlags.WantFinalize())
1523
+ mJSClass.base.finalize = XPC_WN_Helper_Finalize;
1524
+ else
1525
+ mJSClass.base.finalize = XPC_WN_NoHelper_Finalize;
1526
+
1527
+ // We let the rest default to nsnull unless the helper wants them...
1528
+ if(mFlags.WantCheckAccess())
1529
+ mJSClass.base.checkAccess = XPC_WN_Helper_CheckAccess;
1530
+
1531
+ // Note that we *must* set
1532
+ // mJSClass.base.getObjectOps = XPC_WN_GetObjectOpsNoCall
1533
+ // or
1534
+ // mJSClass.base.getObjectOps = XPC_WN_GetObjectOpsWithCall
1535
+ // (even for the cases were it does not do much) because with these
1536
+ // dynamically generated JSClasses, the code in
1537
+ // XPCWrappedNative::GetWrappedNativeOfJSObject() needs to look for
1538
+ // that this callback pointer in order to identify that a given
1539
+ // JSObject represents a wrapper.
1540
+
1541
+ if(mFlags.WantCall() || mFlags.WantConstruct())
1542
+ {
1543
+ mJSClass.base.getObjectOps = XPC_WN_GetObjectOpsWithCall;
1544
+ if(mFlags.WantCall())
1545
+ mJSClass.base.call = XPC_WN_Helper_Call;
1546
+ if(mFlags.WantConstruct())
1547
+ mJSClass.base.construct = XPC_WN_Helper_Construct;
1548
+ }
1549
+ else
1550
+ {
1551
+ mJSClass.base.getObjectOps = XPC_WN_GetObjectOpsNoCall;
1552
+ }
1553
+
1554
+ if(mFlags.WantHasInstance())
1555
+ mJSClass.base.hasInstance = XPC_WN_Helper_HasInstance;
1556
+
1557
+ if(mFlags.WantTrace())
1558
+ mJSClass.base.mark = JS_CLASS_TRACE(XPC_WN_Helper_Trace);
1559
+ else
1560
+ mJSClass.base.mark = JS_CLASS_TRACE(XPC_WN_Shared_Trace);
1561
+
1562
+ // Equality is a required hook.
1563
+ mJSClass.equality = XPC_WN_Equality;
1564
+
1565
+ if(mFlags.WantOuterObject())
1566
+ mJSClass.outerObject = XPC_WN_OuterObject;
1567
+ if(mFlags.WantInnerObject())
1568
+ mJSClass.innerObject = XPC_WN_InnerObject;
1569
+ }
1570
+
1571
+ /***************************************************************************/
1572
+ /***************************************************************************/
1573
+
1574
+ JSBool
1575
+ XPC_WN_CallMethod(JSContext *cx, JSObject *obj,
1576
+ uintN argc, jsval *argv, jsval *vp)
1577
+ {
1578
+ NS_ASSERTION(JS_TypeOfValue(cx, argv[-2]) == JSTYPE_FUNCTION, "bad function");
1579
+ JSObject* funobj = JSVAL_TO_OBJECT(argv[-2]);
1580
+ XPCCallContext ccx(JS_CALLER, cx, obj, funobj, 0, argc, argv, vp);
1581
+ XPCWrappedNative* wrapper = ccx.GetWrapper();
1582
+ THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper);
1583
+
1584
+ XPCNativeInterface* iface;
1585
+ XPCNativeMember* member;
1586
+
1587
+ if(!XPCNativeMember::GetCallInfo(ccx, funobj, &iface, &member))
1588
+ return Throw(NS_ERROR_XPC_CANT_GET_METHOD_INFO, cx);
1589
+ ccx.SetCallInfo(iface, member, JS_FALSE);
1590
+ return XPCWrappedNative::CallMethod(ccx);
1591
+ }
1592
+
1593
+ JSBool
1594
+ XPC_WN_GetterSetter(JSContext *cx, JSObject *obj,
1595
+ uintN argc, jsval *argv, jsval *vp)
1596
+ {
1597
+ NS_ASSERTION(JS_TypeOfValue(cx, argv[-2]) == JSTYPE_FUNCTION, "bad function");
1598
+ JSObject* funobj = JSVAL_TO_OBJECT(argv[-2]);
1599
+
1600
+ XPCCallContext ccx(JS_CALLER, cx, obj, funobj);
1601
+ XPCWrappedNative* wrapper = ccx.GetWrapper();
1602
+ THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper);
1603
+
1604
+ XPCNativeInterface* iface;
1605
+ XPCNativeMember* member;
1606
+
1607
+ if(!XPCNativeMember::GetCallInfo(ccx, funobj, &iface, &member))
1608
+ return Throw(NS_ERROR_XPC_CANT_GET_METHOD_INFO, cx);
1609
+
1610
+ ccx.SetArgsAndResultPtr(argc, argv, vp);
1611
+ if(argc && member->IsWritableAttribute())
1612
+ {
1613
+ ccx.SetCallInfo(iface, member, JS_TRUE);
1614
+ JSBool retval = XPCWrappedNative::SetAttribute(ccx);
1615
+ if(retval && vp)
1616
+ *vp = argv[0];
1617
+ return retval;
1618
+ }
1619
+ // else...
1620
+
1621
+ ccx.SetCallInfo(iface, member, JS_FALSE);
1622
+ return XPCWrappedNative::GetAttribute(ccx);
1623
+ }
1624
+
1625
+ /***************************************************************************/
1626
+
1627
+ static JSBool
1628
+ XPC_WN_Shared_Proto_Enumerate(JSContext *cx, JSObject *obj)
1629
+ {
1630
+ NS_ASSERTION(
1631
+ JS_InstanceOf(cx, obj, &XPC_WN_ModsAllowed_WithCall_Proto_JSClass,
1632
+ nsnull) ||
1633
+ JS_InstanceOf(cx, obj, &XPC_WN_ModsAllowed_NoCall_Proto_JSClass,
1634
+ nsnull) ||
1635
+ JS_InstanceOf(cx, obj, &XPC_WN_NoMods_WithCall_Proto_JSClass, nsnull) ||
1636
+ JS_InstanceOf(cx, obj, &XPC_WN_NoMods_NoCall_Proto_JSClass, nsnull),
1637
+ "bad proto");
1638
+ XPCWrappedNativeProto* self =
1639
+ (XPCWrappedNativeProto*) xpc_GetJSPrivate(obj);
1640
+ if(!self)
1641
+ return JS_FALSE;
1642
+
1643
+ if(self->GetScriptableInfo() &&
1644
+ self->GetScriptableInfo()->GetFlags().DontEnumStaticProps())
1645
+ return JS_TRUE;
1646
+
1647
+ XPCNativeSet* set = self->GetSet();
1648
+ if(!set)
1649
+ return JS_FALSE;
1650
+
1651
+ XPCCallContext ccx(JS_CALLER, cx);
1652
+ if(!ccx.IsValid())
1653
+ return JS_FALSE;
1654
+
1655
+ PRUint16 interface_count = set->GetInterfaceCount();
1656
+ XPCNativeInterface** interfaceArray = set->GetInterfaceArray();
1657
+ for(PRUint16 i = 0; i < interface_count; i++)
1658
+ {
1659
+ XPCNativeInterface* iface = interfaceArray[i];
1660
+ PRUint16 member_count = iface->GetMemberCount();
1661
+
1662
+ for(PRUint16 k = 0; k < member_count; k++)
1663
+ {
1664
+ if(!xpc_ForcePropertyResolve(cx, obj, iface->GetMemberAt(k)->GetName()))
1665
+ return JS_FALSE;
1666
+ }
1667
+ }
1668
+
1669
+ return JS_TRUE;
1670
+ }
1671
+
1672
+ static JSBool
1673
+ XPC_WN_Shared_Proto_Convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
1674
+ {
1675
+ // XXX ?
1676
+ return JS_TRUE;
1677
+ }
1678
+
1679
+ static void
1680
+ XPC_WN_Shared_Proto_Finalize(JSContext *cx, JSObject *obj)
1681
+ {
1682
+ // This can be null if xpc shutdown has already happened
1683
+ XPCWrappedNativeProto* p = (XPCWrappedNativeProto*) xpc_GetJSPrivate(obj);
1684
+ if(p)
1685
+ p->JSProtoObjectFinalized(cx, obj);
1686
+ }
1687
+
1688
+ static void
1689
+ XPC_WN_Shared_Proto_Trace(JSTracer *trc, JSObject *obj)
1690
+ {
1691
+ // This can be null if xpc shutdown has already happened
1692
+ XPCWrappedNativeProto* p =
1693
+ (XPCWrappedNativeProto*) xpc_GetJSPrivate(obj);
1694
+ if(p)
1695
+ TraceScopeJSObjects(trc, p->GetScope());
1696
+ }
1697
+
1698
+ /*****************************************************/
1699
+
1700
+ static JSBool
1701
+ XPC_WN_ModsAllowed_Proto_Resolve(JSContext *cx, JSObject *obj, jsval idval)
1702
+ {
1703
+ CHECK_IDVAL(cx, idval);
1704
+
1705
+ NS_ASSERTION(
1706
+ JS_InstanceOf(cx, obj, &XPC_WN_ModsAllowed_WithCall_Proto_JSClass,
1707
+ nsnull) ||
1708
+ JS_InstanceOf(cx, obj, &XPC_WN_ModsAllowed_NoCall_Proto_JSClass,
1709
+ nsnull),
1710
+ "bad proto");
1711
+
1712
+ XPCWrappedNativeProto* self =
1713
+ (XPCWrappedNativeProto*) xpc_GetJSPrivate(obj);
1714
+ if(!self)
1715
+ return JS_FALSE;
1716
+
1717
+ XPCCallContext ccx(JS_CALLER, cx);
1718
+ if(!ccx.IsValid())
1719
+ return JS_FALSE;
1720
+
1721
+ XPCNativeScriptableInfo* si = self->GetScriptableInfo();
1722
+ uintN enumFlag = (si && si->GetFlags().DontEnumStaticProps()) ?
1723
+ 0 : JSPROP_ENUMERATE;
1724
+
1725
+ return DefinePropertyIfFound(ccx, obj, idval,
1726
+ self->GetSet(), nsnull, nsnull,
1727
+ self->GetScope(),
1728
+ JS_TRUE, nsnull, nsnull, si,
1729
+ enumFlag, nsnull);
1730
+ }
1731
+
1732
+ // Give our proto classes object ops that match the respective
1733
+ // wrappers so that the JS engine can share scope (maps) among
1734
+ // wrappers. This essentially duplicates the number of JSClasses we
1735
+ // use for prototype objects (from 2 to 4), but the scope sharing
1736
+ // benefit is well worth it.
1737
+ JSObjectOps *
1738
+ XPC_WN_Proto_GetObjectOps(JSContext *cx, JSClass *clazz)
1739
+ {
1740
+ // Protos for wrappers that want calls to their call() hooks get
1741
+ // jsops with a call hook, others get jsops w/o a call hook.
1742
+
1743
+ if(clazz == &XPC_WN_ModsAllowed_WithCall_Proto_JSClass ||
1744
+ clazz == &XPC_WN_NoMods_WithCall_Proto_JSClass)
1745
+ return &XPC_WN_WithCall_JSOps;
1746
+
1747
+ NS_ASSERTION(clazz == &XPC_WN_ModsAllowed_NoCall_Proto_JSClass ||
1748
+ clazz == &XPC_WN_NoMods_NoCall_Proto_JSClass ||
1749
+ clazz == &XPC_WN_NoHelper_Proto_JSClass,
1750
+ "bad proto");
1751
+
1752
+ return &XPC_WN_NoCall_JSOps;
1753
+ }
1754
+
1755
+ JSClass XPC_WN_ModsAllowed_WithCall_Proto_JSClass = {
1756
+ "XPC_WN_ModsAllowed_WithCall_Proto_JSClass", // name;
1757
+ JSCLASS_HAS_PRIVATE | JSCLASS_MARK_IS_TRACE, // flags;
1758
+
1759
+ /* Mandatory non-null function pointer members. */
1760
+ JS_PropertyStub, // addProperty;
1761
+ JS_PropertyStub, // delProperty;
1762
+ JS_PropertyStub, // getProperty;
1763
+ JS_PropertyStub, // setProperty;
1764
+ XPC_WN_Shared_Proto_Enumerate, // enumerate;
1765
+ XPC_WN_ModsAllowed_Proto_Resolve, // resolve;
1766
+ XPC_WN_Shared_Proto_Convert, // convert;
1767
+ XPC_WN_Shared_Proto_Finalize, // finalize;
1768
+
1769
+ /* Optionally non-null members start here. */
1770
+ XPC_WN_Proto_GetObjectOps, // getObjectOps;
1771
+ nsnull, // checkAccess;
1772
+ nsnull, // call;
1773
+ nsnull, // construct;
1774
+ nsnull, // xdrObject;
1775
+ nsnull, // hasInstance;
1776
+ JS_CLASS_TRACE(XPC_WN_Shared_Proto_Trace), // mark/trace;
1777
+ nsnull // spare;
1778
+ };
1779
+
1780
+ JSObjectOps *
1781
+ XPC_WN_ModsAllowedProto_NoCall_GetObjectOps(JSContext *cx, JSClass *clazz)
1782
+ {
1783
+ return &XPC_WN_NoCall_JSOps;
1784
+ }
1785
+
1786
+ JSClass XPC_WN_ModsAllowed_NoCall_Proto_JSClass = {
1787
+ "XPC_WN_ModsAllowed_NoCall_Proto_JSClass", // name;
1788
+ JSCLASS_HAS_PRIVATE | JSCLASS_MARK_IS_TRACE, // flags;
1789
+
1790
+ /* Mandatory non-null function pointer members. */
1791
+ JS_PropertyStub, // addProperty;
1792
+ JS_PropertyStub, // delProperty;
1793
+ JS_PropertyStub, // getProperty;
1794
+ JS_PropertyStub, // setProperty;
1795
+ XPC_WN_Shared_Proto_Enumerate, // enumerate;
1796
+ XPC_WN_ModsAllowed_Proto_Resolve, // resolve;
1797
+ XPC_WN_Shared_Proto_Convert, // convert;
1798
+ XPC_WN_Shared_Proto_Finalize, // finalize;
1799
+
1800
+ /* Optionally non-null members start here. */
1801
+ XPC_WN_Proto_GetObjectOps, // getObjectOps;
1802
+ nsnull, // checkAccess;
1803
+ nsnull, // call;
1804
+ nsnull, // construct;
1805
+ nsnull, // xdrObject;
1806
+ nsnull, // hasInstance;
1807
+ JS_CLASS_TRACE(XPC_WN_Shared_Proto_Trace), // mark/trace;
1808
+ nsnull // spare;
1809
+ };
1810
+
1811
+ /***************************************************************************/
1812
+
1813
+ static JSBool
1814
+ XPC_WN_OnlyIWrite_Proto_PropertyStub(JSContext *cx, JSObject *obj, jsval idval, jsval *vp)
1815
+ {
1816
+ CHECK_IDVAL(cx, idval);
1817
+
1818
+ NS_ASSERTION(
1819
+ JS_InstanceOf(cx, obj, &XPC_WN_NoMods_WithCall_Proto_JSClass, nsnull) ||
1820
+ JS_InstanceOf(cx, obj, &XPC_WN_NoMods_NoCall_Proto_JSClass, nsnull),
1821
+ "bad proto");
1822
+
1823
+ XPCWrappedNativeProto* self =
1824
+ (XPCWrappedNativeProto*) xpc_GetJSPrivate(obj);
1825
+ if(!self)
1826
+ return JS_FALSE;
1827
+
1828
+ XPCCallContext ccx(JS_CALLER, cx);
1829
+ if(!ccx.IsValid())
1830
+ return JS_FALSE;
1831
+
1832
+ // Allow XPConnect to add the property only
1833
+ if(ccx.GetResolveName() == idval)
1834
+ return JS_TRUE;
1835
+
1836
+ return Throw(NS_ERROR_XPC_BAD_OP_ON_WN_PROTO, cx);
1837
+ }
1838
+
1839
+ static JSBool
1840
+ XPC_WN_NoMods_Proto_Resolve(JSContext *cx, JSObject *obj, jsval idval)
1841
+ {
1842
+ CHECK_IDVAL(cx, idval);
1843
+
1844
+ NS_ASSERTION(
1845
+ JS_InstanceOf(cx, obj, &XPC_WN_NoMods_WithCall_Proto_JSClass, nsnull) ||
1846
+ JS_InstanceOf(cx, obj, &XPC_WN_NoMods_NoCall_Proto_JSClass, nsnull),
1847
+ "bad proto");
1848
+
1849
+ XPCWrappedNativeProto* self =
1850
+ (XPCWrappedNativeProto*) xpc_GetJSPrivate(obj);
1851
+ if(!self)
1852
+ return JS_FALSE;
1853
+
1854
+ XPCCallContext ccx(JS_CALLER, cx);
1855
+ if(!ccx.IsValid())
1856
+ return JS_FALSE;
1857
+
1858
+ XPCNativeScriptableInfo* si = self->GetScriptableInfo();
1859
+ uintN enumFlag = (si && si->GetFlags().DontEnumStaticProps()) ?
1860
+ 0 : JSPROP_ENUMERATE;
1861
+
1862
+ return DefinePropertyIfFound(ccx, obj, idval,
1863
+ self->GetSet(), nsnull, nsnull,
1864
+ self->GetScope(),
1865
+ JS_TRUE, nsnull, nsnull, si,
1866
+ JSPROP_READONLY |
1867
+ JSPROP_PERMANENT |
1868
+ enumFlag, nsnull);
1869
+ }
1870
+
1871
+ JSClass XPC_WN_NoMods_WithCall_Proto_JSClass = {
1872
+ "XPC_WN_NoMods_WithCall_Proto_JSClass", // name;
1873
+ JSCLASS_HAS_PRIVATE | JSCLASS_MARK_IS_TRACE, // flags;
1874
+
1875
+ /* Mandatory non-null function pointer members. */
1876
+ XPC_WN_OnlyIWrite_Proto_PropertyStub, // addProperty;
1877
+ XPC_WN_CannotModifyPropertyStub, // delProperty;
1878
+ JS_PropertyStub, // getProperty;
1879
+ XPC_WN_OnlyIWrite_Proto_PropertyStub, // setProperty;
1880
+ XPC_WN_Shared_Proto_Enumerate, // enumerate;
1881
+ XPC_WN_NoMods_Proto_Resolve, // resolve;
1882
+ XPC_WN_Shared_Proto_Convert, // convert;
1883
+ XPC_WN_Shared_Proto_Finalize, // finalize;
1884
+
1885
+ /* Optionally non-null members start here. */
1886
+ XPC_WN_Proto_GetObjectOps, // getObjectOps;
1887
+ nsnull, // checkAccess;
1888
+ nsnull, // call;
1889
+ nsnull, // construct;
1890
+ nsnull, // xdrObject;
1891
+ nsnull, // hasInstance;
1892
+ JS_CLASS_TRACE(XPC_WN_Shared_Proto_Trace), // mark/trace;
1893
+ nsnull // spare;
1894
+ };
1895
+
1896
+ JSClass XPC_WN_NoMods_NoCall_Proto_JSClass = {
1897
+ "XPC_WN_NoMods_NoCall_Proto_JSClass", // name;
1898
+ JSCLASS_HAS_PRIVATE | JSCLASS_MARK_IS_TRACE, // flags;
1899
+
1900
+ /* Mandatory non-null function pointer members. */
1901
+ XPC_WN_OnlyIWrite_Proto_PropertyStub, // addProperty;
1902
+ XPC_WN_CannotModifyPropertyStub, // delProperty;
1903
+ JS_PropertyStub, // getProperty;
1904
+ XPC_WN_OnlyIWrite_Proto_PropertyStub, // setProperty;
1905
+ XPC_WN_Shared_Proto_Enumerate, // enumerate;
1906
+ XPC_WN_NoMods_Proto_Resolve, // resolve;
1907
+ XPC_WN_Shared_Proto_Convert, // convert;
1908
+ XPC_WN_Shared_Proto_Finalize, // finalize;
1909
+
1910
+ /* Optionally non-null members start here. */
1911
+ XPC_WN_Proto_GetObjectOps, // getObjectOps;
1912
+ nsnull, // checkAccess;
1913
+ nsnull, // call;
1914
+ nsnull, // construct;
1915
+ nsnull, // xdrObject;
1916
+ nsnull, // hasInstance;
1917
+ JS_CLASS_TRACE(XPC_WN_Shared_Proto_Trace), // mark/trace;
1918
+ nsnull // spare;
1919
+ };
1920
+
1921
+ /***************************************************************************/
1922
+
1923
+ static JSBool
1924
+ XPC_WN_TearOff_Enumerate(JSContext *cx, JSObject *obj)
1925
+ {
1926
+ XPCCallContext ccx(JS_CALLER, cx, obj);
1927
+ XPCWrappedNative* wrapper = ccx.GetWrapper();
1928
+ THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper);
1929
+
1930
+ XPCWrappedNativeTearOff* to = ccx.GetTearOff();
1931
+ XPCNativeInterface* iface;
1932
+
1933
+ if(!to || nsnull == (iface = to->GetInterface()))
1934
+ return Throw(NS_ERROR_XPC_BAD_OP_ON_WN_PROTO, cx);
1935
+
1936
+ PRUint16 member_count = iface->GetMemberCount();
1937
+ for(PRUint16 k = 0; k < member_count; k++)
1938
+ {
1939
+ if(!xpc_ForcePropertyResolve(cx, obj, iface->GetMemberAt(k)->GetName()))
1940
+ return JS_FALSE;
1941
+ }
1942
+
1943
+ return JS_TRUE;
1944
+ }
1945
+
1946
+ static JSBool
1947
+ XPC_WN_TearOff_Resolve(JSContext *cx, JSObject *obj, jsval idval)
1948
+ {
1949
+ CHECK_IDVAL(cx, idval);
1950
+
1951
+ XPCCallContext ccx(JS_CALLER, cx, obj);
1952
+ XPCWrappedNative* wrapper = ccx.GetWrapper();
1953
+ THROW_AND_RETURN_IF_BAD_WRAPPER(cx, wrapper);
1954
+
1955
+ XPCWrappedNativeTearOff* to = ccx.GetTearOff();
1956
+ XPCNativeInterface* iface;
1957
+
1958
+ if(!to || nsnull == (iface = to->GetInterface()))
1959
+ return Throw(NS_ERROR_XPC_BAD_OP_ON_WN_PROTO, cx);
1960
+
1961
+ return DefinePropertyIfFound(ccx, obj, idval, nsnull, iface, nsnull,
1962
+ wrapper->GetScope(),
1963
+ JS_TRUE, nsnull, nsnull, nsnull,
1964
+ JSPROP_READONLY |
1965
+ JSPROP_PERMANENT |
1966
+ JSPROP_ENUMERATE, nsnull);
1967
+ }
1968
+
1969
+ static void
1970
+ XPC_WN_TearOff_Finalize(JSContext *cx, JSObject *obj)
1971
+ {
1972
+ XPCWrappedNativeTearOff* p = (XPCWrappedNativeTearOff*)
1973
+ xpc_GetJSPrivate(obj);
1974
+ if(!p)
1975
+ return;
1976
+ p->JSObjectFinalized();
1977
+ }
1978
+
1979
+ JSClass XPC_WN_Tearoff_JSClass = {
1980
+ "WrappedNative_TearOff", // name;
1981
+ JSCLASS_HAS_PRIVATE | JSCLASS_MARK_IS_TRACE, // flags;
1982
+
1983
+ /* Mandatory non-null function pointer members. */
1984
+ XPC_WN_OnlyIWrite_PropertyStub, // addProperty;
1985
+ XPC_WN_CannotModifyPropertyStub, // delProperty;
1986
+ JS_PropertyStub, // getProperty;
1987
+ XPC_WN_OnlyIWrite_PropertyStub, // setProperty;
1988
+ XPC_WN_TearOff_Enumerate, // enumerate;
1989
+ XPC_WN_TearOff_Resolve, // resolve;
1990
+ XPC_WN_Shared_Convert, // convert;
1991
+ XPC_WN_TearOff_Finalize, // finalize;
1992
+
1993
+ /* Optionally non-null members start here. */
1994
+ nsnull, // getObjectOps;
1995
+ nsnull, // checkAccess;
1996
+ nsnull, // call;
1997
+ nsnull, // construct;
1998
+ nsnull, // xdrObject;
1999
+ nsnull, // hasInstance;
2000
+ nsnull, // mark/trace;
2001
+ nsnull // spare;
2002
+ };
2003
+