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,4144 @@
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) 1998
23
+ * the Initial Developer. All Rights Reserved.
24
+ *
25
+ * Contributor(s):
26
+ * John Bandhauer <jband@netscape.com> (original author)
27
+ * Pierre Phaneuf <pp@ludusdesign.com>
28
+ *
29
+ * Alternatively, the contents of this file may be used under the terms of
30
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
31
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
32
+ * in which case the provisions of the GPL or the LGPL are applicable instead
33
+ * of those above. If you wish to allow use of your version of this file only
34
+ * under the terms of either the GPL or the LGPL, and not to allow others to
35
+ * use your version of this file under the terms of the MPL, indicate your
36
+ * decision by deleting the provisions above and replace them with the notice
37
+ * and other provisions required by the GPL or the LGPL. If you do not delete
38
+ * the provisions above, a recipient may use your version of this file under
39
+ * the terms of any one of the MPL, the GPL or the LGPL.
40
+ *
41
+ * ***** END LICENSE BLOCK ***** */
42
+
43
+ /* The "Components" xpcom objects for JavaScript. */
44
+
45
+ #include "xpcprivate.h"
46
+ #include "nsReadableUtils.h"
47
+ #include "xpcIJSModuleLoader.h"
48
+ #include "nsIScriptObjectPrincipal.h"
49
+ #include "nsIDOMWindow.h"
50
+ #include "xpcJSWeakReference.h"
51
+ #include "XPCWrapper.h"
52
+
53
+ #ifdef MOZ_JSLOADER
54
+ #include "mozJSComponentLoader.h"
55
+ #endif
56
+
57
+ /***************************************************************************/
58
+ // stuff used by all
59
+
60
+ static nsresult ThrowAndFail(uintN errNum, JSContext* cx, JSBool* retval)
61
+ {
62
+ XPCThrower::Throw(errNum, cx);
63
+ *retval = JS_FALSE;
64
+ return NS_OK;
65
+ }
66
+
67
+ static JSBool
68
+ JSValIsInterfaceOfType(JSContext *cx, jsval v, REFNSIID iid)
69
+ {
70
+ nsCOMPtr<nsIXPConnect> xpc;
71
+ nsCOMPtr<nsIXPConnectWrappedNative> wn;
72
+ nsCOMPtr<nsISupports> sup;
73
+ nsISupports* iface;
74
+ if(!JSVAL_IS_PRIMITIVE(v) &&
75
+ nsnull != (xpc = nsXPConnect::GetXPConnect()) &&
76
+ NS_SUCCEEDED(xpc->GetWrappedNativeOfJSObject(cx, JSVAL_TO_OBJECT(v),
77
+ getter_AddRefs(wn))) && wn &&
78
+ NS_SUCCEEDED(wn->Native()->QueryInterface(iid, (void**)&iface)) && iface)
79
+ {
80
+ NS_RELEASE(iface);
81
+ return JS_TRUE;
82
+ }
83
+ return JS_FALSE;
84
+ }
85
+
86
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
87
+ char* xpc_CloneAllAccess()
88
+ {
89
+ static const char allAccess[] = "AllAccess";
90
+ return (char*)nsMemory::Clone(allAccess, sizeof(allAccess));
91
+ }
92
+
93
+ char * xpc_CheckAccessList(const PRUnichar* wideName, const char* list[])
94
+ {
95
+ nsCAutoString asciiName;
96
+ CopyUTF16toUTF8(nsDependentString(wideName), asciiName);
97
+
98
+ for(const char** p = list; *p; p++)
99
+ if(!strcmp(*p, asciiName.get()))
100
+ return xpc_CloneAllAccess();
101
+
102
+ return nsnull;
103
+ }
104
+ #endif
105
+
106
+ /***************************************************************************/
107
+
108
+ /* void getInterfaces (out PRUint32 count, [array, size_is (count), retval]
109
+ out nsIIDPtr array); */
110
+ NS_IMETHODIMP
111
+ nsXPCComponents_Interfaces::GetInterfaces(PRUint32 *aCount, nsIID * **aArray)
112
+ {
113
+ PRUint32 count = 2;
114
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
115
+ ++count;
116
+ #endif
117
+ *aCount = count;
118
+ nsIID **array;
119
+ *aArray = array = static_cast<nsIID**>(nsMemory::Alloc(count * sizeof(nsIID*)));
120
+ if(!array)
121
+ return NS_ERROR_OUT_OF_MEMORY;
122
+
123
+ PRUint32 index = 0;
124
+ nsIID* clone;
125
+ #define PUSH_IID(id) \
126
+ clone = static_cast<nsIID *>(nsMemory::Clone(&NS_GET_IID( id ), \
127
+ sizeof(nsIID))); \
128
+ if (!clone) \
129
+ goto oom; \
130
+ array[index++] = clone;
131
+
132
+ PUSH_IID(nsIScriptableInterfaces)
133
+ PUSH_IID(nsIXPCScriptable)
134
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
135
+ PUSH_IID(nsISecurityCheckedComponent)
136
+ #endif
137
+ #undef PUSH_IID
138
+
139
+ return NS_OK;
140
+ oom:
141
+ while (index)
142
+ nsMemory::Free(array[--index]);
143
+ nsMemory::Free(array);
144
+ *aArray = nsnull;
145
+ return NS_ERROR_OUT_OF_MEMORY;
146
+ }
147
+
148
+ /* nsISupports getHelperForLanguage (in PRUint32 language); */
149
+ NS_IMETHODIMP
150
+ nsXPCComponents_Interfaces::GetHelperForLanguage(PRUint32 language,
151
+ nsISupports **retval)
152
+ {
153
+ *retval = nsnull;
154
+ return NS_OK;
155
+ }
156
+
157
+ /* readonly attribute string contractID; */
158
+ NS_IMETHODIMP
159
+ nsXPCComponents_Interfaces::GetContractID(char * *aContractID)
160
+ {
161
+ *aContractID = nsnull;
162
+ return NS_ERROR_NOT_AVAILABLE;
163
+ }
164
+
165
+ /* readonly attribute string classDescription; */
166
+ NS_IMETHODIMP
167
+ nsXPCComponents_Interfaces::GetClassDescription(char * *aClassDescription)
168
+ {
169
+ static const char classDescription[] = "XPCComponents_Interfaces";
170
+ *aClassDescription = (char*)nsMemory::Clone(classDescription, sizeof(classDescription));
171
+ return *aClassDescription ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
172
+ }
173
+
174
+ /* readonly attribute nsCIDPtr classID; */
175
+ NS_IMETHODIMP
176
+ nsXPCComponents_Interfaces::GetClassID(nsCID * *aClassID)
177
+ {
178
+ *aClassID = nsnull;
179
+ return NS_OK;
180
+ }
181
+
182
+ /* readonly attribute PRUint32 implementationLanguage; */
183
+ NS_IMETHODIMP
184
+ nsXPCComponents_Interfaces::GetImplementationLanguage(
185
+ PRUint32 *aImplementationLanguage)
186
+ {
187
+ *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
188
+ return NS_OK;
189
+ }
190
+
191
+ /* readonly attribute PRUint32 flags; */
192
+ NS_IMETHODIMP
193
+ nsXPCComponents_Interfaces::GetFlags(PRUint32 *aFlags)
194
+ {
195
+ *aFlags = nsIClassInfo::THREADSAFE;
196
+ return NS_OK;
197
+ }
198
+
199
+ /* [notxpcom] readonly attribute nsCID classIDNoAlloc; */
200
+ NS_IMETHODIMP
201
+ nsXPCComponents_Interfaces::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
202
+ {
203
+ return NS_ERROR_NOT_AVAILABLE;
204
+ }
205
+
206
+ nsXPCComponents_Interfaces::nsXPCComponents_Interfaces() :
207
+ mManager(do_GetService(NS_INTERFACEINFOMANAGER_SERVICE_CONTRACTID))
208
+ {
209
+ }
210
+
211
+ nsXPCComponents_Interfaces::~nsXPCComponents_Interfaces()
212
+ {
213
+ // empty
214
+ }
215
+
216
+
217
+ /* [noscript] attribute nsIInterfaceInfoManager manager; */
218
+ NS_IMETHODIMP nsXPCComponents_Interfaces::GetManager(nsIInterfaceInfoManager * *aManager)
219
+ {
220
+ *aManager = mManager;
221
+ NS_IF_ADDREF(*aManager);
222
+ return NS_OK;
223
+ }
224
+ NS_IMETHODIMP nsXPCComponents_Interfaces::SetManager(nsIInterfaceInfoManager * aManager)
225
+ {
226
+ mManager = aManager;
227
+ return NS_OK;
228
+ }
229
+
230
+ NS_INTERFACE_MAP_BEGIN(nsXPCComponents_Interfaces)
231
+ NS_INTERFACE_MAP_ENTRY(nsIScriptableInterfaces)
232
+ NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
233
+ NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
234
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
235
+ NS_INTERFACE_MAP_ENTRY(nsISecurityCheckedComponent)
236
+ #endif
237
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIScriptableInterfaces)
238
+ NS_INTERFACE_MAP_END_THREADSAFE
239
+
240
+ NS_IMPL_THREADSAFE_ADDREF(nsXPCComponents_Interfaces)
241
+ NS_IMPL_THREADSAFE_RELEASE(nsXPCComponents_Interfaces)
242
+
243
+ // The nsIXPCScriptable map declaration that will generate stubs for us...
244
+ #define XPC_MAP_CLASSNAME nsXPCComponents_Interfaces
245
+ #define XPC_MAP_QUOTED_CLASSNAME "nsXPCComponents_Interfaces"
246
+ #define XPC_MAP_WANT_NEWRESOLVE
247
+ #define XPC_MAP_WANT_NEWENUMERATE
248
+ #define XPC_MAP_FLAGS nsIXPCScriptable::DONT_ENUM_STATIC_PROPS |\
249
+ nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE
250
+ #include "xpc_map_end.h" /* This will #undef the above */
251
+
252
+
253
+ /* PRBool newEnumerate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 enum_op, in JSValPtr statep, out JSID idp); */
254
+ NS_IMETHODIMP
255
+ nsXPCComponents_Interfaces::NewEnumerate(nsIXPConnectWrappedNative *wrapper,
256
+ JSContext * cx, JSObject * obj,
257
+ PRUint32 enum_op, jsval * statep,
258
+ jsid * idp, PRBool *_retval)
259
+ {
260
+ nsIEnumerator* e;
261
+
262
+ switch(enum_op)
263
+ {
264
+ case JSENUMERATE_INIT:
265
+ {
266
+ if(!mManager ||
267
+ NS_FAILED(mManager->EnumerateInterfaces(&e)) || !e ||
268
+ NS_FAILED(e->First()))
269
+
270
+ {
271
+ *statep = JSVAL_NULL;
272
+ return NS_ERROR_UNEXPECTED;
273
+ }
274
+
275
+ *statep = PRIVATE_TO_JSVAL(e);
276
+ if(idp)
277
+ *idp = JSVAL_ZERO; // indicate that we don't know the count
278
+ return NS_OK;
279
+ }
280
+ case JSENUMERATE_NEXT:
281
+ {
282
+ nsCOMPtr<nsISupports> isup;
283
+
284
+ e = (nsIEnumerator*) JSVAL_TO_PRIVATE(*statep);
285
+
286
+ while(1)
287
+ {
288
+ if(NS_ENUMERATOR_FALSE == e->IsDone() &&
289
+ NS_SUCCEEDED(e->CurrentItem(getter_AddRefs(isup))) && isup)
290
+ {
291
+ e->Next();
292
+ nsCOMPtr<nsIInterfaceInfo> iface(do_QueryInterface(isup));
293
+ if(iface)
294
+ {
295
+ JSString* idstr;
296
+ const char* name;
297
+ PRBool scriptable;
298
+
299
+ if(NS_SUCCEEDED(iface->IsScriptable(&scriptable)) &&
300
+ !scriptable)
301
+ {
302
+ continue;
303
+ }
304
+
305
+ if(NS_SUCCEEDED(iface->GetNameShared(&name)) && name &&
306
+ nsnull != (idstr = JS_NewStringCopyZ(cx, name)) &&
307
+ JS_ValueToId(cx, STRING_TO_JSVAL(idstr), idp))
308
+ {
309
+ return NS_OK;
310
+ }
311
+ }
312
+ }
313
+ // else...
314
+ break;
315
+ }
316
+ // FALL THROUGH
317
+ }
318
+
319
+ case JSENUMERATE_DESTROY:
320
+ default:
321
+ e = (nsIEnumerator*) JSVAL_TO_PRIVATE(*statep);
322
+ NS_IF_RELEASE(e);
323
+ *statep = JSVAL_NULL;
324
+ return NS_OK;
325
+ }
326
+ }
327
+
328
+ /* PRBool newResolve (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in PRUint32 flags, out JSObjectPtr objp); */
329
+ NS_IMETHODIMP
330
+ nsXPCComponents_Interfaces::NewResolve(nsIXPConnectWrappedNative *wrapper,
331
+ JSContext * cx, JSObject * obj,
332
+ jsval id, PRUint32 flags,
333
+ JSObject * *objp, PRBool *_retval)
334
+ {
335
+ const char* name = nsnull;
336
+
337
+ if(mManager &&
338
+ JSVAL_IS_STRING(id) &&
339
+ nsnull != (name = JS_GetStringBytes(JSVAL_TO_STRING(id))) &&
340
+ name[0] != '{') // we only allow interfaces by name here
341
+ {
342
+ nsCOMPtr<nsIInterfaceInfo> info;
343
+ mManager->GetInfoForName(name, getter_AddRefs(info));
344
+ if(!info)
345
+ return NS_OK;
346
+
347
+ nsCOMPtr<nsIJSIID> nsid =
348
+ dont_AddRef(static_cast<nsIJSIID*>(nsJSIID::NewID(info)));
349
+
350
+ if(nsid)
351
+ {
352
+ nsCOMPtr<nsIXPConnect> xpc;
353
+ wrapper->GetXPConnect(getter_AddRefs(xpc));
354
+ if(xpc)
355
+ {
356
+ nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
357
+ if(NS_SUCCEEDED(xpc->WrapNative(cx, obj,
358
+ static_cast<nsIJSIID*>(nsid),
359
+ NS_GET_IID(nsIJSIID),
360
+ getter_AddRefs(holder))))
361
+ {
362
+ JSObject* idobj;
363
+ if(holder && NS_SUCCEEDED(holder->GetJSObject(&idobj)))
364
+ {
365
+ jsid idid;
366
+
367
+ *objp = obj;
368
+ *_retval = JS_ValueToId(cx, id, &idid) &&
369
+ JS_DefinePropertyById(cx, obj, idid,
370
+ OBJECT_TO_JSVAL(idobj),
371
+ nsnull, nsnull,
372
+ JSPROP_ENUMERATE |
373
+ JSPROP_READONLY |
374
+ JSPROP_PERMANENT);
375
+ }
376
+ }
377
+ }
378
+ }
379
+ }
380
+ return NS_OK;
381
+ }
382
+
383
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
384
+ /* string canCreateWrapper (in nsIIDPtr iid); */
385
+ NS_IMETHODIMP
386
+ nsXPCComponents_Interfaces::CanCreateWrapper(const nsIID * iid, char **_retval)
387
+ {
388
+ // We let anyone do this...
389
+ *_retval = xpc_CloneAllAccess();
390
+ return NS_OK;
391
+ }
392
+
393
+ /* string canCallMethod (in nsIIDPtr iid, in wstring methodName); */
394
+ NS_IMETHODIMP
395
+ nsXPCComponents_Interfaces::CanCallMethod(const nsIID * iid, const PRUnichar *methodName, char **_retval)
396
+ {
397
+ // If you have to ask, then the answer is NO
398
+ *_retval = nsnull;
399
+ return NS_OK;
400
+ }
401
+
402
+ /* string canGetProperty (in nsIIDPtr iid, in wstring propertyName); */
403
+ NS_IMETHODIMP
404
+ nsXPCComponents_Interfaces::CanGetProperty(const nsIID * iid, const PRUnichar *propertyName, char **_retval)
405
+ {
406
+ // If you have to ask, then the answer is NO
407
+ *_retval = nsnull;
408
+ return NS_OK;
409
+ }
410
+
411
+ /* string canSetProperty (in nsIIDPtr iid, in wstring propertyName); */
412
+ NS_IMETHODIMP
413
+ nsXPCComponents_Interfaces::CanSetProperty(const nsIID * iid, const PRUnichar *propertyName, char **_retval)
414
+ {
415
+ // If you have to ask, then the answer is NO
416
+ *_retval = nsnull;
417
+ return NS_OK;
418
+ }
419
+ #endif
420
+
421
+ /***************************************************************************/
422
+ /***************************************************************************/
423
+ /***************************************************************************/
424
+
425
+ class nsXPCComponents_InterfacesByID :
426
+ public nsIScriptableInterfacesByID,
427
+ public nsIXPCScriptable,
428
+ public nsIClassInfo
429
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
430
+ , public nsISecurityCheckedComponent
431
+ #endif
432
+ {
433
+ public:
434
+ // all the interface method declarations...
435
+ NS_DECL_ISUPPORTS
436
+ NS_DECL_NSISCRIPTABLEINTERFACESBYID
437
+ NS_DECL_NSIXPCSCRIPTABLE
438
+ NS_DECL_NSICLASSINFO
439
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
440
+ NS_DECL_NSISECURITYCHECKEDCOMPONENT
441
+ #endif
442
+
443
+ public:
444
+ nsXPCComponents_InterfacesByID();
445
+ virtual ~nsXPCComponents_InterfacesByID();
446
+
447
+ private:
448
+ nsCOMPtr<nsIInterfaceInfoManager> mManager;
449
+ };
450
+
451
+ /***************************************************************************/
452
+ /* void getInterfaces (out PRUint32 count, [array, size_is (count), retval]
453
+ out nsIIDPtr array); */
454
+ NS_IMETHODIMP
455
+ nsXPCComponents_InterfacesByID::GetInterfaces(PRUint32 *aCount, nsIID * **aArray)
456
+ {
457
+ PRUint32 count = 2;
458
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
459
+ ++count;
460
+ #endif
461
+ *aCount = count;
462
+ nsIID **array;
463
+ *aArray = array = static_cast<nsIID**>(nsMemory::Alloc(count * sizeof(nsIID*)));
464
+ if(!array)
465
+ return NS_ERROR_OUT_OF_MEMORY;
466
+
467
+ PRUint32 index = 0;
468
+ nsIID* clone;
469
+ #define PUSH_IID(id) \
470
+ clone = static_cast<nsIID *>(nsMemory::Clone(&NS_GET_IID( id ), \
471
+ sizeof(nsIID))); \
472
+ if (!clone) \
473
+ goto oom; \
474
+ array[index++] = clone;
475
+
476
+ PUSH_IID(nsIScriptableInterfacesByID)
477
+ PUSH_IID(nsIXPCScriptable)
478
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
479
+ PUSH_IID(nsISecurityCheckedComponent)
480
+ #endif
481
+ #undef PUSH_IID
482
+
483
+ return NS_OK;
484
+ oom:
485
+ while (index)
486
+ nsMemory::Free(array[--index]);
487
+ nsMemory::Free(array);
488
+ *aArray = nsnull;
489
+ return NS_ERROR_OUT_OF_MEMORY;
490
+ }
491
+
492
+ /* nsISupports getHelperForLanguage (in PRUint32 language); */
493
+ NS_IMETHODIMP
494
+ nsXPCComponents_InterfacesByID::GetHelperForLanguage(PRUint32 language,
495
+ nsISupports **retval)
496
+ {
497
+ *retval = nsnull;
498
+ return NS_OK;
499
+ }
500
+
501
+ /* readonly attribute string contractID; */
502
+ NS_IMETHODIMP
503
+ nsXPCComponents_InterfacesByID::GetContractID(char * *aContractID)
504
+ {
505
+ *aContractID = nsnull;
506
+ return NS_ERROR_NOT_AVAILABLE;
507
+ }
508
+
509
+ /* readonly attribute string classDescription; */
510
+ NS_IMETHODIMP
511
+ nsXPCComponents_InterfacesByID::GetClassDescription(char * *aClassDescription)
512
+ {
513
+ static const char classDescription[] = "XPCComponents_Interfaces";
514
+ *aClassDescription = (char*)nsMemory::Clone(classDescription, sizeof(classDescription));
515
+ return *aClassDescription ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
516
+ }
517
+
518
+ /* readonly attribute nsCIDPtr classID; */
519
+ NS_IMETHODIMP
520
+ nsXPCComponents_InterfacesByID::GetClassID(nsCID * *aClassID)
521
+ {
522
+ *aClassID = nsnull;
523
+ return NS_OK;
524
+ }
525
+
526
+ /* readonly attribute PRUint32 implementationLanguage; */
527
+ NS_IMETHODIMP
528
+ nsXPCComponents_InterfacesByID::GetImplementationLanguage(
529
+ PRUint32 *aImplementationLanguage)
530
+ {
531
+ *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
532
+ return NS_OK;
533
+ }
534
+
535
+ /* readonly attribute PRUint32 flags; */
536
+ NS_IMETHODIMP
537
+ nsXPCComponents_InterfacesByID::GetFlags(PRUint32 *aFlags)
538
+ {
539
+ *aFlags = nsIClassInfo::THREADSAFE;
540
+ return NS_OK;
541
+ }
542
+
543
+ /* [notxpcom] readonly attribute nsCID classIDNoAlloc; */
544
+ NS_IMETHODIMP
545
+ nsXPCComponents_InterfacesByID::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
546
+ {
547
+ return NS_ERROR_NOT_AVAILABLE;
548
+ }
549
+
550
+ nsXPCComponents_InterfacesByID::nsXPCComponents_InterfacesByID() :
551
+ mManager(do_GetService(NS_INTERFACEINFOMANAGER_SERVICE_CONTRACTID))
552
+ {
553
+ }
554
+
555
+ nsXPCComponents_InterfacesByID::~nsXPCComponents_InterfacesByID()
556
+ {
557
+ // empty
558
+ }
559
+
560
+ NS_INTERFACE_MAP_BEGIN(nsXPCComponents_InterfacesByID)
561
+ NS_INTERFACE_MAP_ENTRY(nsIScriptableInterfacesByID)
562
+ NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
563
+ NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
564
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
565
+ NS_INTERFACE_MAP_ENTRY(nsISecurityCheckedComponent)
566
+ #endif
567
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIScriptableInterfacesByID)
568
+ NS_INTERFACE_MAP_END_THREADSAFE
569
+
570
+ NS_IMPL_THREADSAFE_ADDREF(nsXPCComponents_InterfacesByID)
571
+ NS_IMPL_THREADSAFE_RELEASE(nsXPCComponents_InterfacesByID)
572
+
573
+ // The nsIXPCScriptable map declaration that will generate stubs for us...
574
+ #define XPC_MAP_CLASSNAME nsXPCComponents_InterfacesByID
575
+ #define XPC_MAP_QUOTED_CLASSNAME "nsXPCComponents_InterfacesByID"
576
+ #define XPC_MAP_WANT_NEWRESOLVE
577
+ #define XPC_MAP_WANT_NEWENUMERATE
578
+ #define XPC_MAP_FLAGS nsIXPCScriptable::DONT_ENUM_STATIC_PROPS |\
579
+ nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE
580
+ #include "xpc_map_end.h" /* This will #undef the above */
581
+
582
+ /* PRBool newEnumerate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 enum_op, in JSValPtr statep, out JSID idp); */
583
+ NS_IMETHODIMP
584
+ nsXPCComponents_InterfacesByID::NewEnumerate(nsIXPConnectWrappedNative *wrapper,
585
+ JSContext * cx, JSObject * obj,
586
+ PRUint32 enum_op, jsval * statep,
587
+ jsid * idp, PRBool *_retval)
588
+ {
589
+ nsIEnumerator* e;
590
+
591
+ switch(enum_op)
592
+ {
593
+ case JSENUMERATE_INIT:
594
+ {
595
+ if(!mManager ||
596
+ NS_FAILED(mManager->EnumerateInterfaces(&e)) || !e ||
597
+ NS_FAILED(e->First()))
598
+
599
+ {
600
+ *statep = JSVAL_NULL;
601
+ return NS_ERROR_UNEXPECTED;
602
+ }
603
+
604
+ *statep = PRIVATE_TO_JSVAL(e);
605
+ if(idp)
606
+ *idp = JSVAL_ZERO; // indicate that we don't know the count
607
+ return NS_OK;
608
+ }
609
+ case JSENUMERATE_NEXT:
610
+ {
611
+ nsCOMPtr<nsISupports> isup;
612
+
613
+ e = (nsIEnumerator*) JSVAL_TO_PRIVATE(*statep);
614
+
615
+ while(1)
616
+ {
617
+ if(NS_ENUMERATOR_FALSE == e->IsDone() &&
618
+ NS_SUCCEEDED(e->CurrentItem(getter_AddRefs(isup))) && isup)
619
+ {
620
+ e->Next();
621
+ nsCOMPtr<nsIInterfaceInfo> iface(do_QueryInterface(isup));
622
+ if(iface)
623
+ {
624
+ nsIID const *iid;
625
+ char idstr[NSID_LENGTH];
626
+ JSString* jsstr;
627
+ PRBool scriptable;
628
+
629
+ if(NS_SUCCEEDED(iface->IsScriptable(&scriptable)) &&
630
+ !scriptable)
631
+ {
632
+ continue;
633
+ }
634
+
635
+ if(NS_SUCCEEDED(iface->GetIIDShared(&iid)))
636
+ {
637
+ iid->ToProvidedString(idstr);
638
+ jsstr = JS_NewStringCopyZ(cx, idstr);
639
+ if (jsstr &&
640
+ JS_ValueToId(cx, STRING_TO_JSVAL(jsstr), idp))
641
+ {
642
+ return NS_OK;
643
+ }
644
+ }
645
+ }
646
+ }
647
+ // else...
648
+ break;
649
+ }
650
+ // FALL THROUGH
651
+ }
652
+
653
+ case JSENUMERATE_DESTROY:
654
+ default:
655
+ e = (nsIEnumerator*) JSVAL_TO_PRIVATE(*statep);
656
+ NS_IF_RELEASE(e);
657
+ *statep = JSVAL_NULL;
658
+ return NS_OK;
659
+ }
660
+ }
661
+
662
+ /* PRBool newResolve (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in PRUint32 flags, out JSObjectPtr objp); */
663
+ NS_IMETHODIMP
664
+ nsXPCComponents_InterfacesByID::NewResolve(nsIXPConnectWrappedNative *wrapper,
665
+ JSContext * cx, JSObject * obj,
666
+ jsval id, PRUint32 flags,
667
+ JSObject * *objp, PRBool *_retval)
668
+ {
669
+ const jschar* name = nsnull;
670
+
671
+ if(mManager &&
672
+ JSVAL_IS_STRING(id) &&
673
+ 38 == JS_GetStringLength(JSVAL_TO_STRING(id)) &&
674
+ nsnull != (name = JS_GetStringChars(JSVAL_TO_STRING(id))))
675
+ {
676
+ nsID iid;
677
+ if (!iid.Parse(NS_ConvertUTF16toUTF8(reinterpret_cast<const PRUnichar*>
678
+ (name)).get()))
679
+ return NS_OK;
680
+
681
+ nsCOMPtr<nsIInterfaceInfo> info;
682
+ mManager->GetInfoForIID(&iid, getter_AddRefs(info));
683
+ if(!info)
684
+ return NS_OK;
685
+
686
+ nsCOMPtr<nsIJSIID> nsid =
687
+ dont_AddRef(static_cast<nsIJSIID*>(nsJSIID::NewID(info)));
688
+
689
+ if (!nsid)
690
+ return NS_ERROR_OUT_OF_MEMORY;
691
+
692
+ nsCOMPtr<nsIXPConnect> xpc;
693
+ wrapper->GetXPConnect(getter_AddRefs(xpc));
694
+ if(xpc)
695
+ {
696
+ nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
697
+ if(NS_SUCCEEDED(xpc->WrapNative(cx, obj,
698
+ static_cast<nsIJSIID*>(nsid),
699
+ NS_GET_IID(nsIJSIID),
700
+ getter_AddRefs(holder))))
701
+ {
702
+ JSObject* idobj;
703
+ if(holder && NS_SUCCEEDED(holder->GetJSObject(&idobj)))
704
+ {
705
+ jsid idid;
706
+
707
+ *objp = obj;
708
+ *_retval = JS_ValueToId(cx, id, &idid) &&
709
+ JS_DefinePropertyById(cx, obj, idid,
710
+ OBJECT_TO_JSVAL(idobj),
711
+ nsnull, nsnull,
712
+ JSPROP_ENUMERATE |
713
+ JSPROP_READONLY |
714
+ JSPROP_PERMANENT);
715
+ }
716
+ }
717
+ }
718
+ }
719
+ return NS_OK;
720
+ }
721
+
722
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
723
+ /* string canCreateWrapper (in nsIIDPtr iid); */
724
+ NS_IMETHODIMP
725
+ nsXPCComponents_InterfacesByID::CanCreateWrapper(const nsIID * iid, char **_retval)
726
+ {
727
+ // We let anyone do this...
728
+ *_retval = xpc_CloneAllAccess();
729
+ return NS_OK;
730
+ }
731
+
732
+ /* string canCallMethod (in nsIIDPtr iid, in wstring methodName); */
733
+ NS_IMETHODIMP
734
+ nsXPCComponents_InterfacesByID::CanCallMethod(const nsIID * iid, const PRUnichar *methodName, char **_retval)
735
+ {
736
+ // If you have to ask, then the answer is NO
737
+ *_retval = nsnull;
738
+ return NS_OK;
739
+ }
740
+
741
+ /* string canGetProperty (in nsIIDPtr iid, in wstring propertyName); */
742
+ NS_IMETHODIMP
743
+ nsXPCComponents_InterfacesByID::CanGetProperty(const nsIID * iid, const PRUnichar *propertyName, char **_retval)
744
+ {
745
+ // If you have to ask, then the answer is NO
746
+ *_retval = nsnull;
747
+ return NS_OK;
748
+ }
749
+
750
+ /* string canSetProperty (in nsIIDPtr iid, in wstring propertyName); */
751
+ NS_IMETHODIMP
752
+ nsXPCComponents_InterfacesByID::CanSetProperty(const nsIID * iid, const PRUnichar *propertyName, char **_retval)
753
+ {
754
+ // If you have to ask, then the answer is NO
755
+ *_retval = nsnull;
756
+ return NS_OK;
757
+ }
758
+ #endif
759
+
760
+ /***************************************************************************/
761
+ /***************************************************************************/
762
+ /***************************************************************************/
763
+
764
+
765
+
766
+ class nsXPCComponents_Classes :
767
+ public nsIXPCComponents_Classes,
768
+ public nsIXPCScriptable,
769
+ public nsIClassInfo
770
+ {
771
+ public:
772
+ // all the interface method declarations...
773
+ NS_DECL_ISUPPORTS
774
+ NS_DECL_NSIXPCCOMPONENTS_CLASSES
775
+ NS_DECL_NSIXPCSCRIPTABLE
776
+ NS_DECL_NSICLASSINFO
777
+
778
+ public:
779
+ nsXPCComponents_Classes();
780
+ virtual ~nsXPCComponents_Classes();
781
+ };
782
+
783
+ /***************************************************************************/
784
+ /* void getInterfaces (out PRUint32 count, [array, size_is (count), retval]
785
+ out nsIIDPtr array); */
786
+ NS_IMETHODIMP
787
+ nsXPCComponents_Classes::GetInterfaces(PRUint32 *aCount, nsIID * **aArray)
788
+ {
789
+ PRUint32 count = 2;
790
+ *aCount = count;
791
+ nsIID **array;
792
+ *aArray = array = static_cast<nsIID**>(nsMemory::Alloc(count * sizeof(nsIID*)));
793
+ if(!array)
794
+ return NS_ERROR_OUT_OF_MEMORY;
795
+
796
+ PRUint32 index = 0;
797
+ nsIID* clone;
798
+ #define PUSH_IID(id) \
799
+ clone = static_cast<nsIID *>(nsMemory::Clone(&NS_GET_IID( id ), \
800
+ sizeof(nsIID))); \
801
+ if (!clone) \
802
+ goto oom; \
803
+ array[index++] = clone;
804
+
805
+ PUSH_IID(nsIXPCComponents_Classes)
806
+ PUSH_IID(nsIXPCScriptable)
807
+ #undef PUSH_IID
808
+
809
+ return NS_OK;
810
+ oom:
811
+ while (index)
812
+ nsMemory::Free(array[--index]);
813
+ nsMemory::Free(array);
814
+ *aArray = nsnull;
815
+ return NS_ERROR_OUT_OF_MEMORY;
816
+ }
817
+
818
+ /* nsISupports getHelperForLanguage (in PRUint32 language); */
819
+ NS_IMETHODIMP
820
+ nsXPCComponents_Classes::GetHelperForLanguage(PRUint32 language,
821
+ nsISupports **retval)
822
+ {
823
+ *retval = nsnull;
824
+ return NS_OK;
825
+ }
826
+
827
+ /* readonly attribute string contractID; */
828
+ NS_IMETHODIMP
829
+ nsXPCComponents_Classes::GetContractID(char * *aContractID)
830
+ {
831
+ *aContractID = nsnull;
832
+ return NS_ERROR_NOT_AVAILABLE;
833
+ }
834
+
835
+ /* readonly attribute string classDescription; */
836
+ NS_IMETHODIMP
837
+ nsXPCComponents_Classes::GetClassDescription(char * *aClassDescription)
838
+ {
839
+ static const char classDescription[] = "XPCComponents_Classes";
840
+ *aClassDescription = (char*)nsMemory::Clone(classDescription, sizeof(classDescription));
841
+ return *aClassDescription ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
842
+ }
843
+
844
+ /* readonly attribute nsCIDPtr classID; */
845
+ NS_IMETHODIMP
846
+ nsXPCComponents_Classes::GetClassID(nsCID * *aClassID)
847
+ {
848
+ *aClassID = nsnull;
849
+ return NS_OK;
850
+ }
851
+
852
+ /* readonly attribute PRUint32 implementationLanguage; */
853
+ NS_IMETHODIMP
854
+ nsXPCComponents_Classes::GetImplementationLanguage(
855
+ PRUint32 *aImplementationLanguage)
856
+ {
857
+ *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
858
+ return NS_OK;
859
+ }
860
+
861
+ /* readonly attribute PRUint32 flags; */
862
+ NS_IMETHODIMP
863
+ nsXPCComponents_Classes::GetFlags(PRUint32 *aFlags)
864
+ {
865
+ *aFlags = nsIClassInfo::THREADSAFE;
866
+ return NS_OK;
867
+ }
868
+
869
+ /* [notxpcom] readonly attribute nsCID classIDNoAlloc; */
870
+ NS_IMETHODIMP
871
+ nsXPCComponents_Classes::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
872
+ {
873
+ return NS_ERROR_NOT_AVAILABLE;
874
+ }
875
+
876
+ nsXPCComponents_Classes::nsXPCComponents_Classes()
877
+ {
878
+ }
879
+
880
+ nsXPCComponents_Classes::~nsXPCComponents_Classes()
881
+ {
882
+ // empty
883
+ }
884
+
885
+ NS_INTERFACE_MAP_BEGIN(nsXPCComponents_Classes)
886
+ NS_INTERFACE_MAP_ENTRY(nsIXPCComponents_Classes)
887
+ NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
888
+ NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
889
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPCComponents_Classes)
890
+ NS_INTERFACE_MAP_END_THREADSAFE
891
+
892
+ NS_IMPL_THREADSAFE_ADDREF(nsXPCComponents_Classes)
893
+ NS_IMPL_THREADSAFE_RELEASE(nsXPCComponents_Classes)
894
+
895
+ // The nsIXPCScriptable map declaration that will generate stubs for us...
896
+ #define XPC_MAP_CLASSNAME nsXPCComponents_Classes
897
+ #define XPC_MAP_QUOTED_CLASSNAME "nsXPCComponents_Classes"
898
+ #define XPC_MAP_WANT_NEWRESOLVE
899
+ #define XPC_MAP_WANT_NEWENUMERATE
900
+ #define XPC_MAP_FLAGS nsIXPCScriptable::DONT_ENUM_STATIC_PROPS |\
901
+ nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE
902
+ #include "xpc_map_end.h" /* This will #undef the above */
903
+
904
+
905
+ /* PRBool newEnumerate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 enum_op, in JSValPtr statep, out JSID idp); */
906
+ NS_IMETHODIMP
907
+ nsXPCComponents_Classes::NewEnumerate(nsIXPConnectWrappedNative *wrapper,
908
+ JSContext * cx, JSObject * obj,
909
+ PRUint32 enum_op, jsval * statep,
910
+ jsid * idp, PRBool *_retval)
911
+ {
912
+ nsISimpleEnumerator* e;
913
+
914
+ switch(enum_op)
915
+ {
916
+ case JSENUMERATE_INIT:
917
+ {
918
+ nsCOMPtr<nsIComponentRegistrar> compMgr;
919
+ if(NS_FAILED(NS_GetComponentRegistrar(getter_AddRefs(compMgr))) || !compMgr ||
920
+ NS_FAILED(compMgr->EnumerateContractIDs(&e)) || !e )
921
+ {
922
+ *statep = JSVAL_NULL;
923
+ return NS_ERROR_UNEXPECTED;
924
+ }
925
+
926
+ *statep = PRIVATE_TO_JSVAL(e);
927
+ if(idp)
928
+ *idp = JSVAL_ZERO; // indicate that we don't know the count
929
+ return NS_OK;
930
+ }
931
+ case JSENUMERATE_NEXT:
932
+ {
933
+ nsCOMPtr<nsISupports> isup;
934
+ PRBool hasMore;
935
+ e = (nsISimpleEnumerator*) JSVAL_TO_PRIVATE(*statep);
936
+
937
+ if(NS_SUCCEEDED(e->HasMoreElements(&hasMore)) && hasMore &&
938
+ NS_SUCCEEDED(e->GetNext(getter_AddRefs(isup))) && isup)
939
+ {
940
+ nsCOMPtr<nsISupportsCString> holder(do_QueryInterface(isup));
941
+ if(holder)
942
+ {
943
+ nsCAutoString name;
944
+ if(NS_SUCCEEDED(holder->GetData(name)))
945
+ {
946
+ JSString* idstr = JS_NewStringCopyN(cx, name.get(), name.Length());
947
+ if(idstr &&
948
+ JS_ValueToId(cx, STRING_TO_JSVAL(idstr), idp))
949
+ {
950
+ return NS_OK;
951
+ }
952
+ }
953
+ }
954
+ }
955
+ // else... FALL THROUGH
956
+ }
957
+
958
+ case JSENUMERATE_DESTROY:
959
+ default:
960
+ e = (nsISimpleEnumerator*) JSVAL_TO_PRIVATE(*statep);
961
+ NS_IF_RELEASE(e);
962
+ *statep = JSVAL_NULL;
963
+ return NS_OK;
964
+ }
965
+ }
966
+
967
+ /* PRBool newResolve (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in PRUint32 flags, out JSObjectPtr objp); */
968
+ NS_IMETHODIMP
969
+ nsXPCComponents_Classes::NewResolve(nsIXPConnectWrappedNative *wrapper,
970
+ JSContext * cx, JSObject * obj,
971
+ jsval id, PRUint32 flags,
972
+ JSObject * *objp, PRBool *_retval)
973
+
974
+ {
975
+ const char* name = nsnull;
976
+
977
+ if(JSVAL_IS_STRING(id) &&
978
+ nsnull != (name = JS_GetStringBytes(JSVAL_TO_STRING(id))) &&
979
+ name[0] != '{') // we only allow contractids here
980
+ {
981
+ nsCOMPtr<nsIJSCID> nsid =
982
+ dont_AddRef(static_cast<nsIJSCID*>(nsJSCID::NewID(name)));
983
+ if(nsid)
984
+ {
985
+ nsCOMPtr<nsIXPConnect> xpc;
986
+ wrapper->GetXPConnect(getter_AddRefs(xpc));
987
+ if(xpc)
988
+ {
989
+ nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
990
+ if(NS_SUCCEEDED(xpc->WrapNative(cx, obj,
991
+ static_cast<nsIJSCID*>(nsid),
992
+ NS_GET_IID(nsIJSCID),
993
+ getter_AddRefs(holder))))
994
+ {
995
+ JSObject* idobj;
996
+ if(holder && NS_SUCCEEDED(holder->GetJSObject(&idobj)))
997
+ {
998
+ jsid idid;
999
+
1000
+ *objp = obj;
1001
+ *_retval = JS_ValueToId(cx, id, &idid) &&
1002
+ JS_DefinePropertyById(cx, obj, idid,
1003
+ OBJECT_TO_JSVAL(idobj),
1004
+ nsnull, nsnull,
1005
+ JSPROP_ENUMERATE |
1006
+ JSPROP_READONLY |
1007
+ JSPROP_PERMANENT);
1008
+ }
1009
+ }
1010
+ }
1011
+ }
1012
+ }
1013
+ return NS_OK;
1014
+ }
1015
+
1016
+ /***************************************************************************/
1017
+ /***************************************************************************/
1018
+ /***************************************************************************/
1019
+
1020
+ class nsXPCComponents_ClassesByID :
1021
+ public nsIXPCComponents_ClassesByID,
1022
+ public nsIXPCScriptable,
1023
+ public nsIClassInfo
1024
+ {
1025
+ public:
1026
+ // all the interface method declarations...
1027
+ NS_DECL_ISUPPORTS
1028
+ NS_DECL_NSIXPCCOMPONENTS_CLASSESBYID
1029
+ NS_DECL_NSIXPCSCRIPTABLE
1030
+ NS_DECL_NSICLASSINFO
1031
+
1032
+ public:
1033
+ nsXPCComponents_ClassesByID();
1034
+ virtual ~nsXPCComponents_ClassesByID();
1035
+ };
1036
+
1037
+ /***************************************************************************/
1038
+ /* void getInterfaces (out PRUint32 count, [array, size_is (count), retval]
1039
+ out nsIIDPtr array); */
1040
+ NS_IMETHODIMP
1041
+ nsXPCComponents_ClassesByID::GetInterfaces(PRUint32 *aCount, nsIID * **aArray)
1042
+ {
1043
+ PRUint32 count = 2;
1044
+ *aCount = count;
1045
+ nsIID **array;
1046
+ *aArray = array = static_cast<nsIID**>(nsMemory::Alloc(count * sizeof(nsIID*)));
1047
+ if(!array)
1048
+ return NS_ERROR_OUT_OF_MEMORY;
1049
+
1050
+ PRUint32 index = 0;
1051
+ nsIID* clone;
1052
+ #define PUSH_IID(id) \
1053
+ clone = static_cast<nsIID *>(nsMemory::Clone(&NS_GET_IID( id ), \
1054
+ sizeof(nsIID))); \
1055
+ if (!clone) \
1056
+ goto oom; \
1057
+ array[index++] = clone;
1058
+
1059
+ PUSH_IID(nsIXPCComponents_ClassesByID)
1060
+ PUSH_IID(nsIXPCScriptable)
1061
+ #undef PUSH_IID
1062
+
1063
+ return NS_OK;
1064
+ oom:
1065
+ while (index)
1066
+ nsMemory::Free(array[--index]);
1067
+ nsMemory::Free(array);
1068
+ *aArray = nsnull;
1069
+ return NS_ERROR_OUT_OF_MEMORY;
1070
+ }
1071
+
1072
+ /* nsISupports getHelperForLanguage (in PRUint32 language); */
1073
+ NS_IMETHODIMP
1074
+ nsXPCComponents_ClassesByID::GetHelperForLanguage(PRUint32 language,
1075
+ nsISupports **retval)
1076
+ {
1077
+ *retval = nsnull;
1078
+ return NS_OK;
1079
+ }
1080
+
1081
+ /* readonly attribute string contractID; */
1082
+ NS_IMETHODIMP
1083
+ nsXPCComponents_ClassesByID::GetContractID(char * *aContractID)
1084
+ {
1085
+ *aContractID = nsnull;
1086
+ return NS_ERROR_NOT_AVAILABLE;
1087
+ }
1088
+
1089
+ /* readonly attribute string classDescription; */
1090
+ NS_IMETHODIMP
1091
+ nsXPCComponents_ClassesByID::GetClassDescription(char * *aClassDescription)
1092
+ {
1093
+ static const char classDescription[] = "XPCComponents_Interfaces";
1094
+ *aClassDescription = (char*)nsMemory::Clone(classDescription, sizeof(classDescription));
1095
+ return *aClassDescription ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
1096
+ }
1097
+
1098
+ /* readonly attribute nsCIDPtr classID; */
1099
+ NS_IMETHODIMP
1100
+ nsXPCComponents_ClassesByID::GetClassID(nsCID * *aClassID)
1101
+ {
1102
+ *aClassID = nsnull;
1103
+ return NS_OK;
1104
+ }
1105
+
1106
+ /* readonly attribute PRUint32 implementationLanguage; */
1107
+ NS_IMETHODIMP
1108
+ nsXPCComponents_ClassesByID::GetImplementationLanguage(
1109
+ PRUint32 *aImplementationLanguage)
1110
+ {
1111
+ *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
1112
+ return NS_OK;
1113
+ }
1114
+
1115
+ /* readonly attribute PRUint32 flags; */
1116
+ NS_IMETHODIMP
1117
+ nsXPCComponents_ClassesByID::GetFlags(PRUint32 *aFlags)
1118
+ {
1119
+ *aFlags = nsIClassInfo::THREADSAFE;
1120
+ return NS_OK;
1121
+ }
1122
+
1123
+ /* [notxpcom] readonly attribute nsCID classIDNoAlloc; */
1124
+ NS_IMETHODIMP
1125
+ nsXPCComponents_ClassesByID::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
1126
+ {
1127
+ return NS_ERROR_NOT_AVAILABLE;
1128
+ }
1129
+
1130
+ nsXPCComponents_ClassesByID::nsXPCComponents_ClassesByID()
1131
+ {
1132
+ }
1133
+
1134
+ nsXPCComponents_ClassesByID::~nsXPCComponents_ClassesByID()
1135
+ {
1136
+ // empty
1137
+ }
1138
+
1139
+ NS_INTERFACE_MAP_BEGIN(nsXPCComponents_ClassesByID)
1140
+ NS_INTERFACE_MAP_ENTRY(nsIXPCComponents_ClassesByID)
1141
+ NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
1142
+ NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
1143
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPCComponents_ClassesByID)
1144
+ NS_INTERFACE_MAP_END_THREADSAFE
1145
+
1146
+ NS_IMPL_THREADSAFE_ADDREF(nsXPCComponents_ClassesByID)
1147
+ NS_IMPL_THREADSAFE_RELEASE(nsXPCComponents_ClassesByID)
1148
+
1149
+ // The nsIXPCScriptable map declaration that will generate stubs for us...
1150
+ #define XPC_MAP_CLASSNAME nsXPCComponents_ClassesByID
1151
+ #define XPC_MAP_QUOTED_CLASSNAME "nsXPCComponents_ClassesByID"
1152
+ #define XPC_MAP_WANT_NEWRESOLVE
1153
+ #define XPC_MAP_WANT_NEWENUMERATE
1154
+ #define XPC_MAP_FLAGS nsIXPCScriptable::DONT_ENUM_STATIC_PROPS |\
1155
+ nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE
1156
+ #include "xpc_map_end.h" /* This will #undef the above */
1157
+
1158
+ /* PRBool newEnumerate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 enum_op, in JSValPtr statep, out JSID idp); */
1159
+ NS_IMETHODIMP
1160
+ nsXPCComponents_ClassesByID::NewEnumerate(nsIXPConnectWrappedNative *wrapper,
1161
+ JSContext * cx, JSObject * obj,
1162
+ PRUint32 enum_op, jsval * statep,
1163
+ jsid * idp, PRBool *_retval)
1164
+ {
1165
+ nsISimpleEnumerator* e;
1166
+
1167
+ switch(enum_op)
1168
+ {
1169
+ case JSENUMERATE_INIT:
1170
+ {
1171
+ nsCOMPtr<nsIComponentRegistrar> compMgr;
1172
+ if(NS_FAILED(NS_GetComponentRegistrar(getter_AddRefs(compMgr))) || !compMgr ||
1173
+ NS_FAILED(compMgr->EnumerateCIDs(&e)) || !e )
1174
+ {
1175
+ *statep = JSVAL_NULL;
1176
+ return NS_ERROR_UNEXPECTED;
1177
+ }
1178
+
1179
+ *statep = PRIVATE_TO_JSVAL(e);
1180
+ if(idp)
1181
+ *idp = JSVAL_ZERO; // indicate that we don't know the count
1182
+ return NS_OK;
1183
+ }
1184
+ case JSENUMERATE_NEXT:
1185
+ {
1186
+ nsCOMPtr<nsISupports> isup;
1187
+ PRBool hasMore;
1188
+ e = (nsISimpleEnumerator*) JSVAL_TO_PRIVATE(*statep);
1189
+
1190
+ if(NS_SUCCEEDED(e->HasMoreElements(&hasMore)) && hasMore &&
1191
+ NS_SUCCEEDED(e->GetNext(getter_AddRefs(isup))) && isup)
1192
+ {
1193
+ nsCOMPtr<nsISupportsID> holder(do_QueryInterface(isup));
1194
+ if(holder)
1195
+ {
1196
+ char* name;
1197
+ if(NS_SUCCEEDED(holder->ToString(&name)) && name)
1198
+ {
1199
+ JSString* idstr = JS_NewStringCopyZ(cx, name);
1200
+ nsMemory::Free(name);
1201
+ if(idstr &&
1202
+ JS_ValueToId(cx, STRING_TO_JSVAL(idstr), idp))
1203
+ {
1204
+ return NS_OK;
1205
+ }
1206
+ }
1207
+ }
1208
+ }
1209
+ // else... FALL THROUGH
1210
+ }
1211
+
1212
+ case JSENUMERATE_DESTROY:
1213
+ default:
1214
+ e = (nsISimpleEnumerator*) JSVAL_TO_PRIVATE(*statep);
1215
+ NS_IF_RELEASE(e);
1216
+ *statep = JSVAL_NULL;
1217
+ return NS_OK;
1218
+ }
1219
+ }
1220
+
1221
+ static PRBool
1222
+ IsRegisteredCLSID(const char* str)
1223
+ {
1224
+ PRBool registered;
1225
+ nsID id;
1226
+
1227
+ if(!id.Parse(str))
1228
+ return PR_FALSE;
1229
+
1230
+ nsCOMPtr<nsIComponentRegistrar> compMgr;
1231
+ if(NS_FAILED(NS_GetComponentRegistrar(getter_AddRefs(compMgr))) || !compMgr ||
1232
+ NS_FAILED(compMgr->IsCIDRegistered(id, &registered)))
1233
+ return PR_FALSE;
1234
+
1235
+ return registered;
1236
+ }
1237
+
1238
+ /* PRBool newResolve (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in PRUint32 flags, out JSObjectPtr objp); */
1239
+ NS_IMETHODIMP
1240
+ nsXPCComponents_ClassesByID::NewResolve(nsIXPConnectWrappedNative *wrapper,
1241
+ JSContext * cx, JSObject * obj,
1242
+ jsval id, PRUint32 flags,
1243
+ JSObject * *objp, PRBool *_retval)
1244
+ {
1245
+ const char* name = nsnull;
1246
+
1247
+ if(JSVAL_IS_STRING(id) &&
1248
+ nsnull != (name = JS_GetStringBytes(JSVAL_TO_STRING(id))) &&
1249
+ name[0] == '{' &&
1250
+ IsRegisteredCLSID(name)) // we only allow canonical CLSIDs here
1251
+ {
1252
+ nsCOMPtr<nsIJSCID> nsid =
1253
+ dont_AddRef(static_cast<nsIJSCID*>(nsJSCID::NewID(name)));
1254
+ if(nsid)
1255
+ {
1256
+ nsCOMPtr<nsIXPConnect> xpc;
1257
+ wrapper->GetXPConnect(getter_AddRefs(xpc));
1258
+ if(xpc)
1259
+ {
1260
+ nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
1261
+ if(NS_SUCCEEDED(xpc->WrapNative(cx, obj,
1262
+ static_cast<nsIJSCID*>(nsid),
1263
+ NS_GET_IID(nsIJSCID),
1264
+ getter_AddRefs(holder))))
1265
+ {
1266
+ JSObject* idobj;
1267
+ if(holder && NS_SUCCEEDED(holder->GetJSObject(&idobj)))
1268
+ {
1269
+ jsid idid;
1270
+
1271
+ *objp = obj;
1272
+ *_retval = JS_ValueToId(cx, id, &idid) &&
1273
+ JS_DefinePropertyById(cx, obj, idid,
1274
+ OBJECT_TO_JSVAL(idobj),
1275
+ nsnull, nsnull,
1276
+ JSPROP_ENUMERATE |
1277
+ JSPROP_READONLY |
1278
+ JSPROP_PERMANENT);
1279
+ }
1280
+ }
1281
+ }
1282
+ }
1283
+ }
1284
+ return NS_OK;
1285
+ }
1286
+
1287
+
1288
+ /***************************************************************************/
1289
+
1290
+ // Currently the possible results do not change at runtime, so they are only
1291
+ // cached once (unlike ContractIDs, CLSIDs, and IIDs)
1292
+
1293
+ class nsXPCComponents_Results :
1294
+ public nsIXPCComponents_Results,
1295
+ public nsIXPCScriptable,
1296
+ public nsIClassInfo
1297
+ {
1298
+ public:
1299
+ // all the interface method declarations...
1300
+ NS_DECL_ISUPPORTS
1301
+ NS_DECL_NSIXPCCOMPONENTS_RESULTS
1302
+ NS_DECL_NSIXPCSCRIPTABLE
1303
+ NS_DECL_NSICLASSINFO
1304
+
1305
+ public:
1306
+ nsXPCComponents_Results();
1307
+ virtual ~nsXPCComponents_Results();
1308
+ };
1309
+
1310
+ /***************************************************************************/
1311
+ /* void getInterfaces (out PRUint32 count, [array, size_is (count), retval]
1312
+ out nsIIDPtr array); */
1313
+ NS_IMETHODIMP
1314
+ nsXPCComponents_Results::GetInterfaces(PRUint32 *aCount, nsIID * **aArray)
1315
+ {
1316
+ PRUint32 count = 2;
1317
+ *aCount = count;
1318
+ nsIID **array;
1319
+ *aArray = array = static_cast<nsIID**>(nsMemory::Alloc(count * sizeof(nsIID*)));
1320
+ if(!array)
1321
+ return NS_ERROR_OUT_OF_MEMORY;
1322
+
1323
+ PRUint32 index = 0;
1324
+ nsIID* clone;
1325
+ #define PUSH_IID(id) \
1326
+ clone = static_cast<nsIID *>(nsMemory::Clone(&NS_GET_IID( id ), \
1327
+ sizeof(nsIID))); \
1328
+ if (!clone) \
1329
+ goto oom; \
1330
+ array[index++] = clone;
1331
+
1332
+ PUSH_IID(nsIXPCComponents_Results)
1333
+ PUSH_IID(nsIXPCScriptable)
1334
+ #undef PUSH_IID
1335
+
1336
+ return NS_OK;
1337
+ oom:
1338
+ while (index)
1339
+ nsMemory::Free(array[--index]);
1340
+ nsMemory::Free(array);
1341
+ *aArray = nsnull;
1342
+ return NS_ERROR_OUT_OF_MEMORY;
1343
+ }
1344
+
1345
+ /* nsISupports getHelperForLanguage (in PRUint32 language); */
1346
+ NS_IMETHODIMP
1347
+ nsXPCComponents_Results::GetHelperForLanguage(PRUint32 language,
1348
+ nsISupports **retval)
1349
+ {
1350
+ *retval = nsnull;
1351
+ return NS_OK;
1352
+ }
1353
+
1354
+ /* readonly attribute string contractID; */
1355
+ NS_IMETHODIMP
1356
+ nsXPCComponents_Results::GetContractID(char * *aContractID)
1357
+ {
1358
+ *aContractID = nsnull;
1359
+ return NS_ERROR_NOT_AVAILABLE;
1360
+ }
1361
+
1362
+ /* readonly attribute string classDescription; */
1363
+ NS_IMETHODIMP
1364
+ nsXPCComponents_Results::GetClassDescription(char * *aClassDescription)
1365
+ {
1366
+ static const char classDescription[] = "XPCComponents_Interfaces";
1367
+ *aClassDescription = (char*)nsMemory::Clone(classDescription, sizeof(classDescription));
1368
+ return *aClassDescription ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
1369
+ }
1370
+
1371
+ /* readonly attribute nsCIDPtr classID; */
1372
+ NS_IMETHODIMP
1373
+ nsXPCComponents_Results::GetClassID(nsCID * *aClassID)
1374
+ {
1375
+ *aClassID = nsnull;
1376
+ return NS_OK;
1377
+ }
1378
+
1379
+ /* readonly attribute PRUint32 implementationLanguage; */
1380
+ NS_IMETHODIMP
1381
+ nsXPCComponents_Results::GetImplementationLanguage(
1382
+ PRUint32 *aImplementationLanguage)
1383
+ {
1384
+ *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
1385
+ return NS_OK;
1386
+ }
1387
+
1388
+ /* readonly attribute PRUint32 flags; */
1389
+ NS_IMETHODIMP
1390
+ nsXPCComponents_Results::GetFlags(PRUint32 *aFlags)
1391
+ {
1392
+ *aFlags = nsIClassInfo::THREADSAFE;
1393
+ return NS_OK;
1394
+ }
1395
+
1396
+ /* [notxpcom] readonly attribute nsCID classIDNoAlloc; */
1397
+ NS_IMETHODIMP
1398
+ nsXPCComponents_Results::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
1399
+ {
1400
+ return NS_ERROR_NOT_AVAILABLE;
1401
+ }
1402
+
1403
+ nsXPCComponents_Results::nsXPCComponents_Results()
1404
+ {
1405
+ }
1406
+
1407
+ nsXPCComponents_Results::~nsXPCComponents_Results()
1408
+ {
1409
+ // empty
1410
+ }
1411
+
1412
+ NS_INTERFACE_MAP_BEGIN(nsXPCComponents_Results)
1413
+ NS_INTERFACE_MAP_ENTRY(nsIXPCComponents_Results)
1414
+ NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
1415
+ NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
1416
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPCComponents_Results)
1417
+ NS_INTERFACE_MAP_END_THREADSAFE
1418
+
1419
+ NS_IMPL_THREADSAFE_ADDREF(nsXPCComponents_Results)
1420
+ NS_IMPL_THREADSAFE_RELEASE(nsXPCComponents_Results)
1421
+
1422
+ // The nsIXPCScriptable map declaration that will generate stubs for us...
1423
+ #define XPC_MAP_CLASSNAME nsXPCComponents_Results
1424
+ #define XPC_MAP_QUOTED_CLASSNAME "nsXPCComponents_Results"
1425
+ #define XPC_MAP_WANT_NEWRESOLVE
1426
+ #define XPC_MAP_WANT_NEWENUMERATE
1427
+ #define XPC_MAP_FLAGS nsIXPCScriptable::DONT_ENUM_STATIC_PROPS |\
1428
+ nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE
1429
+ #include "xpc_map_end.h" /* This will #undef the above */
1430
+
1431
+ /* PRBool newEnumerate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 enum_op, in JSValPtr statep, out JSID idp); */
1432
+ NS_IMETHODIMP
1433
+ nsXPCComponents_Results::NewEnumerate(nsIXPConnectWrappedNative *wrapper,
1434
+ JSContext * cx, JSObject * obj,
1435
+ PRUint32 enum_op, jsval * statep,
1436
+ jsid * idp, PRBool *_retval)
1437
+ {
1438
+ void** iter;
1439
+
1440
+ switch(enum_op)
1441
+ {
1442
+ case JSENUMERATE_INIT:
1443
+ {
1444
+ if(idp)
1445
+ *idp = INT_TO_JSVAL(nsXPCException::GetNSResultCount());
1446
+
1447
+ void** space = (void**) new char[sizeof(void*)];
1448
+ *space = nsnull;
1449
+ *statep = PRIVATE_TO_JSVAL(space);
1450
+ return NS_OK;
1451
+ }
1452
+ case JSENUMERATE_NEXT:
1453
+ {
1454
+ const char* name;
1455
+ iter = (void**) JSVAL_TO_PRIVATE(*statep);
1456
+ if(nsXPCException::IterateNSResults(nsnull, &name, nsnull, iter))
1457
+ {
1458
+ JSString* idstr = JS_NewStringCopyZ(cx, name);
1459
+ if(idstr && JS_ValueToId(cx, STRING_TO_JSVAL(idstr), idp))
1460
+ return NS_OK;
1461
+ }
1462
+ // else... FALL THROUGH
1463
+ }
1464
+
1465
+ case JSENUMERATE_DESTROY:
1466
+ default:
1467
+ iter = (void**) JSVAL_TO_PRIVATE(*statep);
1468
+ delete [] (char*) iter;
1469
+ *statep = JSVAL_NULL;
1470
+ return NS_OK;
1471
+ }
1472
+ }
1473
+
1474
+
1475
+ /* PRBool newResolve (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in PRUint32 flags, out JSObjectPtr objp); */
1476
+ NS_IMETHODIMP
1477
+ nsXPCComponents_Results::NewResolve(nsIXPConnectWrappedNative *wrapper,
1478
+ JSContext * cx, JSObject * obj,
1479
+ jsval id, PRUint32 flags,
1480
+ JSObject * *objp, PRBool *_retval)
1481
+ {
1482
+ const char* name = nsnull;
1483
+
1484
+ if(JSVAL_IS_STRING(id) &&
1485
+ nsnull != (name = JS_GetStringBytes(JSVAL_TO_STRING(id))))
1486
+ {
1487
+ const char* rv_name;
1488
+ void* iter = nsnull;
1489
+ nsresult rv;
1490
+ while(nsXPCException::IterateNSResults(&rv, &rv_name, nsnull, &iter))
1491
+ {
1492
+ if(!strcmp(name, rv_name))
1493
+ {
1494
+ jsid idid;
1495
+ jsval val;
1496
+
1497
+ *objp = obj;
1498
+ if(!JS_NewNumberValue(cx, (jsdouble)rv, &val) ||
1499
+ !JS_ValueToId(cx, id, &idid) ||
1500
+ !JS_DefinePropertyById(cx, obj, idid, val,
1501
+ nsnull, nsnull,
1502
+ JSPROP_ENUMERATE |
1503
+ JSPROP_READONLY |
1504
+ JSPROP_PERMANENT))
1505
+ {
1506
+ return NS_ERROR_UNEXPECTED;
1507
+ }
1508
+ }
1509
+ }
1510
+ }
1511
+ return NS_OK;
1512
+ }
1513
+
1514
+ /***************************************************************************/
1515
+ // JavaScript Constructor for nsIJSID objects (Components.ID)
1516
+
1517
+ class nsXPCComponents_ID :
1518
+ public nsIXPCComponents_ID,
1519
+ public nsIXPCScriptable,
1520
+ public nsIClassInfo
1521
+ {
1522
+ public:
1523
+ // all the interface method declarations...
1524
+ NS_DECL_ISUPPORTS
1525
+ NS_DECL_NSIXPCCOMPONENTS_ID
1526
+ NS_DECL_NSIXPCSCRIPTABLE
1527
+ NS_DECL_NSICLASSINFO
1528
+
1529
+
1530
+ public:
1531
+ nsXPCComponents_ID();
1532
+ virtual ~nsXPCComponents_ID();
1533
+
1534
+ private:
1535
+ NS_METHOD CallOrConstruct(nsIXPConnectWrappedNative *wrapper,
1536
+ JSContext * cx, JSObject * obj,
1537
+ PRUint32 argc, jsval * argv,
1538
+ jsval * vp, PRBool *_retval);
1539
+ };
1540
+
1541
+ /***************************************************************************/
1542
+ /* void getInterfaces (out PRUint32 count, [array, size_is (count), retval]
1543
+ out nsIIDPtr array); */
1544
+ NS_IMETHODIMP
1545
+ nsXPCComponents_ID::GetInterfaces(PRUint32 *aCount, nsIID * **aArray)
1546
+ {
1547
+ PRUint32 count = 2;
1548
+ *aCount = count;
1549
+ nsIID **array;
1550
+ *aArray = array = static_cast<nsIID**>(nsMemory::Alloc(count * sizeof(nsIID*)));
1551
+ if(!array)
1552
+ return NS_ERROR_OUT_OF_MEMORY;
1553
+
1554
+ PRUint32 index = 0;
1555
+ nsIID* clone;
1556
+ #define PUSH_IID(id) \
1557
+ clone = static_cast<nsIID *>(nsMemory::Clone(&NS_GET_IID( id ), \
1558
+ sizeof(nsIID))); \
1559
+ if (!clone) \
1560
+ goto oom; \
1561
+ array[index++] = clone;
1562
+
1563
+ PUSH_IID(nsIXPCComponents_ID)
1564
+ PUSH_IID(nsIXPCScriptable)
1565
+ #undef PUSH_IID
1566
+
1567
+ return NS_OK;
1568
+ oom:
1569
+ while (index)
1570
+ nsMemory::Free(array[--index]);
1571
+ nsMemory::Free(array);
1572
+ *aArray = nsnull;
1573
+ return NS_ERROR_OUT_OF_MEMORY;
1574
+ }
1575
+
1576
+ /* nsISupports getHelperForLanguage (in PRUint32 language); */
1577
+ NS_IMETHODIMP
1578
+ nsXPCComponents_ID::GetHelperForLanguage(PRUint32 language,
1579
+ nsISupports **retval)
1580
+ {
1581
+ *retval = nsnull;
1582
+ return NS_OK;
1583
+ }
1584
+
1585
+ /* readonly attribute string contractID; */
1586
+ NS_IMETHODIMP
1587
+ nsXPCComponents_ID::GetContractID(char * *aContractID)
1588
+ {
1589
+ *aContractID = nsnull;
1590
+ return NS_ERROR_NOT_AVAILABLE;
1591
+ }
1592
+
1593
+ /* readonly attribute string classDescription; */
1594
+ NS_IMETHODIMP
1595
+ nsXPCComponents_ID::GetClassDescription(char * *aClassDescription)
1596
+ {
1597
+ static const char classDescription[] = "XPCComponents_Interfaces";
1598
+ *aClassDescription = (char*)nsMemory::Clone(classDescription, sizeof(classDescription));
1599
+ return *aClassDescription ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
1600
+ }
1601
+
1602
+ /* readonly attribute nsCIDPtr classID; */
1603
+ NS_IMETHODIMP
1604
+ nsXPCComponents_ID::GetClassID(nsCID * *aClassID)
1605
+ {
1606
+ *aClassID = nsnull;
1607
+ return NS_OK;
1608
+ }
1609
+
1610
+ /* readonly attribute PRUint32 implementationLanguage; */
1611
+ NS_IMETHODIMP
1612
+ nsXPCComponents_ID::GetImplementationLanguage(
1613
+ PRUint32 *aImplementationLanguage)
1614
+ {
1615
+ *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
1616
+ return NS_OK;
1617
+ }
1618
+
1619
+ /* readonly attribute PRUint32 flags; */
1620
+ NS_IMETHODIMP
1621
+ nsXPCComponents_ID::GetFlags(PRUint32 *aFlags)
1622
+ {
1623
+ *aFlags = nsIClassInfo::THREADSAFE;
1624
+ return NS_OK;
1625
+ }
1626
+
1627
+ /* [notxpcom] readonly attribute nsCID classIDNoAlloc; */
1628
+ NS_IMETHODIMP
1629
+ nsXPCComponents_ID::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
1630
+ {
1631
+ return NS_ERROR_NOT_AVAILABLE;
1632
+ }
1633
+
1634
+ nsXPCComponents_ID::nsXPCComponents_ID()
1635
+ {
1636
+ }
1637
+
1638
+ nsXPCComponents_ID::~nsXPCComponents_ID()
1639
+ {
1640
+ // empty
1641
+ }
1642
+
1643
+ NS_INTERFACE_MAP_BEGIN(nsXPCComponents_ID)
1644
+ NS_INTERFACE_MAP_ENTRY(nsIXPCComponents_ID)
1645
+ NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
1646
+ NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
1647
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPCComponents_ID)
1648
+ NS_INTERFACE_MAP_END_THREADSAFE
1649
+
1650
+ NS_IMPL_THREADSAFE_ADDREF(nsXPCComponents_ID)
1651
+ NS_IMPL_THREADSAFE_RELEASE(nsXPCComponents_ID)
1652
+
1653
+ // The nsIXPCScriptable map declaration that will generate stubs for us...
1654
+ #define XPC_MAP_CLASSNAME nsXPCComponents_ID
1655
+ #define XPC_MAP_QUOTED_CLASSNAME "nsXPCComponents_ID"
1656
+ #define XPC_MAP_WANT_CALL
1657
+ #define XPC_MAP_WANT_CONSTRUCT
1658
+ #define XPC_MAP_WANT_HASINSTANCE
1659
+ #define XPC_MAP_FLAGS 0
1660
+ #include "xpc_map_end.h" /* This will #undef the above */
1661
+
1662
+
1663
+ /* PRBool call (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
1664
+ NS_IMETHODIMP
1665
+ nsXPCComponents_ID::Call(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp, PRBool *_retval)
1666
+ {
1667
+ return CallOrConstruct(wrapper, cx, obj, argc, argv, vp, _retval);
1668
+
1669
+ }
1670
+
1671
+ /* PRBool construct (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
1672
+ NS_IMETHODIMP
1673
+ nsXPCComponents_ID::Construct(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp, PRBool *_retval)
1674
+ {
1675
+ return CallOrConstruct(wrapper, cx, obj, argc, argv, vp, _retval);
1676
+ }
1677
+
1678
+ NS_METHOD
1679
+ nsXPCComponents_ID::CallOrConstruct(nsIXPConnectWrappedNative *wrapper,
1680
+ JSContext * cx, JSObject * obj,
1681
+ PRUint32 argc, jsval * argv,
1682
+ jsval * vp, PRBool *_retval)
1683
+ {
1684
+ // make sure we have at least one arg
1685
+
1686
+ if(!argc)
1687
+ return ThrowAndFail(NS_ERROR_XPC_NOT_ENOUGH_ARGS, cx, _retval);
1688
+
1689
+ XPCCallContext ccx(JS_CALLER, cx);
1690
+ if(!ccx.IsValid())
1691
+ return ThrowAndFail(NS_ERROR_XPC_UNEXPECTED, cx, _retval);
1692
+
1693
+ XPCContext* xpcc = ccx.GetXPCContext();
1694
+
1695
+ // Do the security check if necessary
1696
+
1697
+ nsIXPCSecurityManager* sm =
1698
+ xpcc->GetAppropriateSecurityManager(
1699
+ nsIXPCSecurityManager::HOOK_CREATE_INSTANCE);
1700
+ if(sm && NS_FAILED(sm->CanCreateInstance(cx, nsJSID::GetCID())))
1701
+ {
1702
+ // the security manager vetoed. It should have set an exception.
1703
+ *_retval = JS_FALSE;
1704
+ return NS_OK;
1705
+ }
1706
+
1707
+ // convert the first argument into a string and see if it looks like an id
1708
+
1709
+ JSString* jsstr;
1710
+ const char* str;
1711
+ nsID id;
1712
+
1713
+ if(!(jsstr = JS_ValueToString(cx, argv[0])) ||
1714
+ !(str = JS_GetStringBytes(jsstr)) ||
1715
+ ! id.Parse(str))
1716
+ {
1717
+ return ThrowAndFail(NS_ERROR_XPC_BAD_ID_STRING, cx, _retval);
1718
+ }
1719
+
1720
+ // make the new object and return it.
1721
+
1722
+ JSObject* newobj = xpc_NewIDObject(cx, obj, id);
1723
+
1724
+ if(vp)
1725
+ *vp = OBJECT_TO_JSVAL(newobj);
1726
+
1727
+ return NS_OK;
1728
+ }
1729
+
1730
+ /* PRBool hasInstance (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal val, out PRBool bp); */
1731
+ NS_IMETHODIMP
1732
+ nsXPCComponents_ID::HasInstance(nsIXPConnectWrappedNative *wrapper,
1733
+ JSContext * cx, JSObject * obj,
1734
+ jsval val, PRBool *bp, PRBool *_retval)
1735
+ {
1736
+ if(bp)
1737
+ *bp = JSValIsInterfaceOfType(cx, val, NS_GET_IID(nsIJSID));
1738
+ return NS_OK;
1739
+ }
1740
+
1741
+ /***************************************************************************/
1742
+ // JavaScript Constructor for nsIXPCException objects (Components.Exception)
1743
+
1744
+ class nsXPCComponents_Exception :
1745
+ public nsIXPCComponents_Exception,
1746
+ public nsIXPCScriptable,
1747
+ public nsIClassInfo
1748
+ {
1749
+ public:
1750
+ // all the interface method declarations...
1751
+ NS_DECL_ISUPPORTS
1752
+ NS_DECL_NSIXPCCOMPONENTS_EXCEPTION
1753
+ NS_DECL_NSIXPCSCRIPTABLE
1754
+ NS_DECL_NSICLASSINFO
1755
+
1756
+
1757
+ public:
1758
+ nsXPCComponents_Exception();
1759
+ virtual ~nsXPCComponents_Exception();
1760
+
1761
+ private:
1762
+ NS_METHOD CallOrConstruct(nsIXPConnectWrappedNative *wrapper,
1763
+ JSContext * cx, JSObject * obj,
1764
+ PRUint32 argc, jsval * argv,
1765
+ jsval * vp, PRBool *_retval);
1766
+ };
1767
+
1768
+ /***************************************************************************/
1769
+ /* void getInterfaces (out PRUint32 count, [array, size_is (count), retval]
1770
+ out nsIIDPtr array); */
1771
+ NS_IMETHODIMP
1772
+ nsXPCComponents_Exception::GetInterfaces(PRUint32 *aCount, nsIID * **aArray)
1773
+ {
1774
+ PRUint32 count = 2;
1775
+ *aCount = count;
1776
+ nsIID **array;
1777
+ *aArray = array = static_cast<nsIID**>(nsMemory::Alloc(count * sizeof(nsIID*)));
1778
+ if(!array)
1779
+ return NS_ERROR_OUT_OF_MEMORY;
1780
+
1781
+ PRUint32 index = 0;
1782
+ nsIID* clone;
1783
+ #define PUSH_IID(id) \
1784
+ clone = static_cast<nsIID *>(nsMemory::Clone(&NS_GET_IID( id ), \
1785
+ sizeof(nsIID))); \
1786
+ if (!clone) \
1787
+ goto oom; \
1788
+ array[index++] = clone;
1789
+
1790
+ PUSH_IID(nsIXPCComponents_Exception)
1791
+ PUSH_IID(nsIXPCScriptable)
1792
+ #undef PUSH_IID
1793
+
1794
+ return NS_OK;
1795
+ oom:
1796
+ while (index)
1797
+ nsMemory::Free(array[--index]);
1798
+ nsMemory::Free(array);
1799
+ *aArray = nsnull;
1800
+ return NS_ERROR_OUT_OF_MEMORY;
1801
+ }
1802
+
1803
+ /* nsISupports getHelperForLanguage (in PRUint32 language); */
1804
+ NS_IMETHODIMP
1805
+ nsXPCComponents_Exception::GetHelperForLanguage(PRUint32 language,
1806
+ nsISupports **retval)
1807
+ {
1808
+ *retval = nsnull;
1809
+ return NS_OK;
1810
+ }
1811
+
1812
+ /* readonly attribute string contractID; */
1813
+ NS_IMETHODIMP
1814
+ nsXPCComponents_Exception::GetContractID(char * *aContractID)
1815
+ {
1816
+ *aContractID = nsnull;
1817
+ return NS_ERROR_NOT_AVAILABLE;
1818
+ }
1819
+
1820
+ /* readonly attribute string classDescription; */
1821
+ NS_IMETHODIMP
1822
+ nsXPCComponents_Exception::GetClassDescription(char * *aClassDescription)
1823
+ {
1824
+ static const char classDescription[] = "XPCComponents_Interfaces";
1825
+ *aClassDescription = (char*)nsMemory::Clone(classDescription, sizeof(classDescription));
1826
+ return *aClassDescription ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
1827
+ }
1828
+
1829
+ /* readonly attribute nsCIDPtr classID; */
1830
+ NS_IMETHODIMP
1831
+ nsXPCComponents_Exception::GetClassID(nsCID * *aClassID)
1832
+ {
1833
+ *aClassID = nsnull;
1834
+ return NS_OK;
1835
+ }
1836
+
1837
+ /* readonly attribute PRUint32 implementationLanguage; */
1838
+ NS_IMETHODIMP
1839
+ nsXPCComponents_Exception::GetImplementationLanguage(
1840
+ PRUint32 *aImplementationLanguage)
1841
+ {
1842
+ *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
1843
+ return NS_OK;
1844
+ }
1845
+
1846
+ /* readonly attribute PRUint32 flags; */
1847
+ NS_IMETHODIMP
1848
+ nsXPCComponents_Exception::GetFlags(PRUint32 *aFlags)
1849
+ {
1850
+ *aFlags = nsIClassInfo::THREADSAFE;
1851
+ return NS_OK;
1852
+ }
1853
+
1854
+ /* [notxpcom] readonly attribute nsCID classIDNoAlloc; */
1855
+ NS_IMETHODIMP
1856
+ nsXPCComponents_Exception::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
1857
+ {
1858
+ return NS_ERROR_NOT_AVAILABLE;
1859
+ }
1860
+
1861
+ nsXPCComponents_Exception::nsXPCComponents_Exception()
1862
+ {
1863
+ }
1864
+
1865
+ nsXPCComponents_Exception::~nsXPCComponents_Exception()
1866
+ {
1867
+ // empty
1868
+ }
1869
+
1870
+ NS_INTERFACE_MAP_BEGIN(nsXPCComponents_Exception)
1871
+ NS_INTERFACE_MAP_ENTRY(nsIXPCComponents_Exception)
1872
+ NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
1873
+ NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
1874
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPCComponents_Exception)
1875
+ NS_INTERFACE_MAP_END_THREADSAFE
1876
+
1877
+ NS_IMPL_THREADSAFE_ADDREF(nsXPCComponents_Exception)
1878
+ NS_IMPL_THREADSAFE_RELEASE(nsXPCComponents_Exception)
1879
+
1880
+ // The nsIXPCScriptable map declaration that will generate stubs for us...
1881
+ #define XPC_MAP_CLASSNAME nsXPCComponents_Exception
1882
+ #define XPC_MAP_QUOTED_CLASSNAME "nsXPCComponents_Exception"
1883
+ #define XPC_MAP_WANT_CALL
1884
+ #define XPC_MAP_WANT_CONSTRUCT
1885
+ #define XPC_MAP_WANT_HASINSTANCE
1886
+ #define XPC_MAP_FLAGS 0
1887
+ #include "xpc_map_end.h" /* This will #undef the above */
1888
+
1889
+
1890
+ /* PRBool call (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
1891
+ NS_IMETHODIMP
1892
+ nsXPCComponents_Exception::Call(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp, PRBool *_retval)
1893
+ {
1894
+ return CallOrConstruct(wrapper, cx, obj, argc, argv, vp, _retval);
1895
+
1896
+ }
1897
+
1898
+ /* PRBool construct (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
1899
+ NS_IMETHODIMP
1900
+ nsXPCComponents_Exception::Construct(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp, PRBool *_retval)
1901
+ {
1902
+ return CallOrConstruct(wrapper, cx, obj, argc, argv, vp, _retval);
1903
+ }
1904
+
1905
+ NS_METHOD
1906
+ nsXPCComponents_Exception::CallOrConstruct(nsIXPConnectWrappedNative *wrapper,
1907
+ JSContext * cx, JSObject * obj,
1908
+ PRUint32 argc, jsval * argv,
1909
+ jsval * vp, PRBool *_retval)
1910
+ {
1911
+ XPCCallContext ccx(JS_CALLER, cx);
1912
+ if(!ccx.IsValid())
1913
+ return ThrowAndFail(NS_ERROR_XPC_UNEXPECTED, cx, _retval);
1914
+
1915
+ nsXPConnect* xpc = ccx.GetXPConnect();
1916
+ XPCContext* xpcc = ccx.GetXPCContext();
1917
+
1918
+ // Do the security check if necessary
1919
+
1920
+ nsIXPCSecurityManager* sm =
1921
+ xpcc->GetAppropriateSecurityManager(
1922
+ nsIXPCSecurityManager::HOOK_CREATE_INSTANCE);
1923
+ if(sm && NS_FAILED(sm->CanCreateInstance(cx, nsXPCException::GetCID())))
1924
+ {
1925
+ // the security manager vetoed. It should have set an exception.
1926
+ *_retval = JS_FALSE;
1927
+ return NS_OK;
1928
+ }
1929
+
1930
+ // initialization params for the exception object we will create
1931
+ const char* eMsg = "exception";
1932
+ nsresult eResult = NS_ERROR_FAILURE;
1933
+ nsCOMPtr<nsIStackFrame> eStack;
1934
+ nsCOMPtr<nsISupports> eData;
1935
+
1936
+ // all params are optional - grab any passed in
1937
+ switch(argc)
1938
+ {
1939
+ default: // more than 4 - ignore extra
1940
+ // ...fall through...
1941
+ case 4: // argv[3] is object for eData
1942
+ if(JSVAL_IS_NULL(argv[3]))
1943
+ {
1944
+ // do nothing, leave eData as null
1945
+ }
1946
+ else
1947
+ {
1948
+ if(JSVAL_IS_PRIMITIVE(argv[3]) ||
1949
+ NS_FAILED(xpc->WrapJS(cx, JSVAL_TO_OBJECT(argv[3]),
1950
+ NS_GET_IID(nsISupports),
1951
+ (void**)getter_AddRefs(eData))))
1952
+ return ThrowAndFail(NS_ERROR_XPC_BAD_CONVERT_JS, cx, _retval);
1953
+ }
1954
+ // ...fall through...
1955
+ case 3: // argv[2] is object for eStack
1956
+ if(JSVAL_IS_NULL(argv[2]))
1957
+ {
1958
+ // do nothing, leave eStack as null
1959
+ }
1960
+ else
1961
+ {
1962
+ if(JSVAL_IS_PRIMITIVE(argv[2]) ||
1963
+ NS_FAILED(xpc->WrapJS(cx, JSVAL_TO_OBJECT(argv[2]),
1964
+ NS_GET_IID(nsIStackFrame),
1965
+ (void**)getter_AddRefs(eStack))))
1966
+ return ThrowAndFail(NS_ERROR_XPC_BAD_CONVERT_JS, cx, _retval);
1967
+ }
1968
+ // fall through...
1969
+ case 2: // argv[1] is nsresult for eResult
1970
+ if(!JS_ValueToECMAInt32(cx, argv[1], (int32*) &eResult))
1971
+ return ThrowAndFail(NS_ERROR_XPC_BAD_CONVERT_JS, cx, _retval);
1972
+ // ...fall through...
1973
+ case 1: // argv[0] is string for eMsg
1974
+ {
1975
+ JSString* str = JS_ValueToString(cx, argv[0]);
1976
+ if(!str || !(eMsg = JS_GetStringBytes(str)))
1977
+ return ThrowAndFail(NS_ERROR_XPC_BAD_CONVERT_JS, cx, _retval);
1978
+ }
1979
+ // ...fall through...
1980
+ case 0: // this case required so that 'default' does not include zero.
1981
+ ; // -- do nothing --
1982
+ }
1983
+
1984
+ nsCOMPtr<nsIException> e;
1985
+ nsXPCException::NewException(eMsg, eResult, eStack, eData, getter_AddRefs(e));
1986
+ if(!e)
1987
+ return ThrowAndFail(NS_ERROR_XPC_UNEXPECTED, cx, _retval);
1988
+
1989
+ nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
1990
+ JSObject* newObj = nsnull;
1991
+
1992
+ if(NS_FAILED(xpc->WrapNative(cx, obj, e, NS_GET_IID(nsIXPCException),
1993
+ getter_AddRefs(holder))) || !holder ||
1994
+ NS_FAILED(holder->GetJSObject(&newObj)) || !newObj)
1995
+ {
1996
+ return ThrowAndFail(NS_ERROR_XPC_CANT_CREATE_WN, cx, _retval);
1997
+ }
1998
+
1999
+ if(vp)
2000
+ *vp = OBJECT_TO_JSVAL(newObj);
2001
+
2002
+ return NS_OK;
2003
+ }
2004
+
2005
+ /* PRBool hasInstance (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal val, out PRBool bp); */
2006
+ NS_IMETHODIMP
2007
+ nsXPCComponents_Exception::HasInstance(nsIXPConnectWrappedNative *wrapper,
2008
+ JSContext * cx, JSObject * obj,
2009
+ jsval val, PRBool *bp,
2010
+ PRBool *_retval)
2011
+ {
2012
+ if(bp)
2013
+ *bp = JSValIsInterfaceOfType(cx, val, NS_GET_IID(nsIException));
2014
+ return NS_OK;
2015
+ }
2016
+
2017
+ /***************************************************************************/
2018
+ // This class is for the thing returned by "new Component.Constructor".
2019
+
2020
+ // XXXjband we use this CID for security check, but security system can't see
2021
+ // it since it has no registed factory. Security really kicks in when we try
2022
+ // to build a wrapper around an instance.
2023
+
2024
+ // {B4A95150-E25A-11d3-8F61-0010A4E73D9A}
2025
+ #define NS_XPCCONSTRUCTOR_CID \
2026
+ { 0xb4a95150, 0xe25a, 0x11d3, \
2027
+ { 0x8f, 0x61, 0x0, 0x10, 0xa4, 0xe7, 0x3d, 0x9a } }
2028
+
2029
+ class nsXPCConstructor :
2030
+ public nsIXPCConstructor,
2031
+ public nsIXPCScriptable,
2032
+ public nsIClassInfo
2033
+ {
2034
+ public:
2035
+ NS_DEFINE_STATIC_CID_ACCESSOR(NS_XPCCONSTRUCTOR_CID)
2036
+ public:
2037
+ // all the interface method declarations...
2038
+ NS_DECL_ISUPPORTS
2039
+ NS_DECL_NSIXPCCONSTRUCTOR
2040
+ NS_DECL_NSIXPCSCRIPTABLE
2041
+ NS_DECL_NSICLASSINFO
2042
+
2043
+ public:
2044
+ nsXPCConstructor(); // not implemented
2045
+ nsXPCConstructor(nsIJSCID* aClassID,
2046
+ nsIJSIID* aInterfaceID,
2047
+ const char* aInitializer);
2048
+ virtual ~nsXPCConstructor();
2049
+
2050
+ private:
2051
+ NS_METHOD CallOrConstruct(nsIXPConnectWrappedNative *wrapper,
2052
+ JSContext * cx, JSObject * obj,
2053
+ PRUint32 argc, jsval * argv,
2054
+ jsval * vp, PRBool *_retval);
2055
+ private:
2056
+ nsIJSCID* mClassID;
2057
+ nsIJSIID* mInterfaceID;
2058
+ char* mInitializer;
2059
+ };
2060
+
2061
+ /***************************************************************************/
2062
+ /* void getInterfaces (out PRUint32 count, [array, size_is (count), retval]
2063
+ out nsIIDPtr array); */
2064
+ NS_IMETHODIMP
2065
+ nsXPCConstructor::GetInterfaces(PRUint32 *aCount, nsIID * **aArray)
2066
+ {
2067
+ PRUint32 count = 2;
2068
+ *aCount = count;
2069
+ nsIID **array;
2070
+ *aArray = array = static_cast<nsIID**>(nsMemory::Alloc(count * sizeof(nsIID*)));
2071
+ if(!array)
2072
+ return NS_ERROR_OUT_OF_MEMORY;
2073
+
2074
+ PRUint32 index = 0;
2075
+ nsIID* clone;
2076
+ #define PUSH_IID(id) \
2077
+ clone = static_cast<nsIID *>(nsMemory::Clone(&NS_GET_IID( id ), \
2078
+ sizeof(nsIID))); \
2079
+ if (!clone) \
2080
+ goto oom; \
2081
+ array[index++] = clone;
2082
+
2083
+ PUSH_IID(nsIXPCConstructor)
2084
+ PUSH_IID(nsIXPCScriptable)
2085
+ #undef PUSH_IID
2086
+
2087
+ return NS_OK;
2088
+ oom:
2089
+ while (index)
2090
+ nsMemory::Free(array[--index]);
2091
+ nsMemory::Free(array);
2092
+ *aArray = nsnull;
2093
+ return NS_ERROR_OUT_OF_MEMORY;
2094
+ }
2095
+
2096
+ /* nsISupports getHelperForLanguage (in PRUint32 language); */
2097
+ NS_IMETHODIMP
2098
+ nsXPCConstructor::GetHelperForLanguage(PRUint32 language,
2099
+ nsISupports **retval)
2100
+ {
2101
+ *retval = nsnull;
2102
+ return NS_OK;
2103
+ }
2104
+
2105
+ /* readonly attribute string contractID; */
2106
+ NS_IMETHODIMP
2107
+ nsXPCConstructor::GetContractID(char * *aContractID)
2108
+ {
2109
+ *aContractID = nsnull;
2110
+ return NS_ERROR_NOT_AVAILABLE;
2111
+ }
2112
+
2113
+ /* readonly attribute string classDescription; */
2114
+ NS_IMETHODIMP
2115
+ nsXPCConstructor::GetClassDescription(char * *aClassDescription)
2116
+ {
2117
+ static const char classDescription[] = "XPCComponents_Interfaces";
2118
+ *aClassDescription = (char*)nsMemory::Clone(classDescription, sizeof(classDescription));
2119
+ return *aClassDescription ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
2120
+ }
2121
+
2122
+ /* readonly attribute nsCIDPtr classID; */
2123
+ NS_IMETHODIMP
2124
+ nsXPCConstructor::GetClassID(nsCID * *aClassID)
2125
+ {
2126
+ *aClassID = nsnull;
2127
+ return NS_OK;
2128
+ }
2129
+
2130
+ /* readonly attribute PRUint32 implementationLanguage; */
2131
+ NS_IMETHODIMP
2132
+ nsXPCConstructor::GetImplementationLanguage(
2133
+ PRUint32 *aImplementationLanguage)
2134
+ {
2135
+ *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
2136
+ return NS_OK;
2137
+ }
2138
+
2139
+ /* readonly attribute PRUint32 flags; */
2140
+ NS_IMETHODIMP
2141
+ nsXPCConstructor::GetFlags(PRUint32 *aFlags)
2142
+ {
2143
+ *aFlags = nsIClassInfo::THREADSAFE;
2144
+ return NS_OK;
2145
+ }
2146
+
2147
+ /* [notxpcom] readonly attribute nsCID classIDNoAlloc; */
2148
+ NS_IMETHODIMP
2149
+ nsXPCConstructor::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
2150
+ {
2151
+ return NS_ERROR_NOT_AVAILABLE;
2152
+ }
2153
+
2154
+ nsXPCConstructor::nsXPCConstructor(nsIJSCID* aClassID,
2155
+ nsIJSIID* aInterfaceID,
2156
+ const char* aInitializer)
2157
+ {
2158
+ NS_IF_ADDREF(mClassID = aClassID);
2159
+ NS_IF_ADDREF(mInterfaceID = aInterfaceID);
2160
+ mInitializer = aInitializer ?
2161
+ (char*) nsMemory::Clone(aInitializer, strlen(aInitializer)+1) :
2162
+ nsnull;
2163
+ }
2164
+
2165
+ nsXPCConstructor::~nsXPCConstructor()
2166
+ {
2167
+ NS_IF_RELEASE(mClassID);
2168
+ NS_IF_RELEASE(mInterfaceID);
2169
+ if(mInitializer)
2170
+ nsMemory::Free(mInitializer);
2171
+ }
2172
+
2173
+ /* readonly attribute nsIJSCID classID; */
2174
+ NS_IMETHODIMP
2175
+ nsXPCConstructor::GetClassID(nsIJSCID * *aClassID)
2176
+ {
2177
+ NS_IF_ADDREF(*aClassID = mClassID);
2178
+ return NS_OK;
2179
+ }
2180
+
2181
+ /* readonly attribute nsIJSIID interfaceID; */
2182
+ NS_IMETHODIMP
2183
+ nsXPCConstructor::GetInterfaceID(nsIJSIID * *aInterfaceID)
2184
+ {
2185
+ NS_IF_ADDREF(*aInterfaceID = mInterfaceID);
2186
+ return NS_OK;
2187
+ }
2188
+
2189
+ /* readonly attribute string initializer; */
2190
+ NS_IMETHODIMP
2191
+ nsXPCConstructor::GetInitializer(char * *aInitializer)
2192
+ {
2193
+ XPC_STRING_GETTER_BODY(aInitializer, mInitializer);
2194
+ }
2195
+
2196
+ NS_INTERFACE_MAP_BEGIN(nsXPCConstructor)
2197
+ NS_INTERFACE_MAP_ENTRY(nsIXPCConstructor)
2198
+ NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
2199
+ NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
2200
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPCConstructor)
2201
+ NS_INTERFACE_MAP_END_THREADSAFE
2202
+
2203
+ NS_IMPL_THREADSAFE_ADDREF(nsXPCConstructor)
2204
+ NS_IMPL_THREADSAFE_RELEASE(nsXPCConstructor)
2205
+
2206
+ // The nsIXPCScriptable map declaration that will generate stubs for us...
2207
+ #define XPC_MAP_CLASSNAME nsXPCConstructor
2208
+ #define XPC_MAP_QUOTED_CLASSNAME "nsXPCConstructor"
2209
+ #define XPC_MAP_WANT_CALL
2210
+ #define XPC_MAP_WANT_CONSTRUCT
2211
+ #define XPC_MAP_FLAGS 0
2212
+ #include "xpc_map_end.h" /* This will #undef the above */
2213
+
2214
+
2215
+ /* PRBool call (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
2216
+ NS_IMETHODIMP
2217
+ nsXPCConstructor::Call(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp, PRBool *_retval)
2218
+ {
2219
+ return CallOrConstruct(wrapper, cx, obj, argc, argv, vp, _retval);
2220
+
2221
+ }
2222
+
2223
+ /* PRBool construct (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
2224
+ NS_IMETHODIMP
2225
+ nsXPCConstructor::Construct(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp, PRBool *_retval)
2226
+ {
2227
+ return CallOrConstruct(wrapper, cx, obj, argc, argv, vp, _retval);
2228
+ }
2229
+
2230
+ NS_METHOD
2231
+ nsXPCConstructor::CallOrConstruct(nsIXPConnectWrappedNative *wrapper,
2232
+ JSContext * cx, JSObject * obj,
2233
+ PRUint32 argc, jsval * argv,
2234
+ jsval * vp, PRBool *_retval)
2235
+ {
2236
+ XPCCallContext ccx(JS_CALLER, cx);
2237
+ if(!ccx.IsValid())
2238
+ return ThrowAndFail(NS_ERROR_XPC_UNEXPECTED, cx, _retval);
2239
+
2240
+ nsXPConnect* xpc = ccx.GetXPConnect();
2241
+
2242
+ // security check not required because we are going to call through the
2243
+ // code which is reflected into JS which will do that for us later.
2244
+
2245
+ nsCOMPtr<nsIXPConnectJSObjectHolder> cidHolder;
2246
+ nsCOMPtr<nsIXPConnectJSObjectHolder> iidHolder;
2247
+ JSObject* cidObj;
2248
+ JSObject* iidObj;
2249
+
2250
+ if(NS_FAILED(xpc->WrapNative(cx, obj, mClassID, NS_GET_IID(nsIJSCID),
2251
+ getter_AddRefs(cidHolder))) || !cidHolder ||
2252
+ NS_FAILED(cidHolder->GetJSObject(&cidObj)) || !cidObj ||
2253
+ NS_FAILED(xpc->WrapNative(cx, obj, mInterfaceID, NS_GET_IID(nsIJSIID),
2254
+ getter_AddRefs(iidHolder))) || !iidHolder ||
2255
+ NS_FAILED(iidHolder->GetJSObject(&iidObj)) || !iidObj)
2256
+ {
2257
+ return ThrowAndFail(NS_ERROR_XPC_CANT_CREATE_WN, cx, _retval);
2258
+ }
2259
+
2260
+ jsval ctorArgs[1] = {OBJECT_TO_JSVAL(iidObj)};
2261
+ jsval val;
2262
+
2263
+ if(!JS_CallFunctionName(cx, cidObj, "createInstance", 1, ctorArgs, &val) ||
2264
+ JSVAL_IS_PRIMITIVE(val))
2265
+ {
2266
+ // createInstance will have thrown an exception
2267
+ *_retval = JS_FALSE;
2268
+ return NS_OK;
2269
+ }
2270
+
2271
+ // root the result
2272
+ if(vp)
2273
+ *vp = val;
2274
+
2275
+ // call initializer method if supplied
2276
+ if(mInitializer)
2277
+ {
2278
+ JSObject* newObj = JSVAL_TO_OBJECT(val);
2279
+ jsval fun;
2280
+ jsval ignored;
2281
+
2282
+ // first check existence of function property for better error reporting
2283
+ if(!JS_GetProperty(cx, newObj, mInitializer, &fun) ||
2284
+ JSVAL_IS_PRIMITIVE(fun))
2285
+ {
2286
+ return ThrowAndFail(NS_ERROR_XPC_BAD_INITIALIZER_NAME, cx, _retval);
2287
+ }
2288
+
2289
+ if(!JS_CallFunctionValue(cx, newObj, fun, argc, argv, &ignored))
2290
+ {
2291
+ // function should have thrown an exception
2292
+ *_retval = JS_FALSE;
2293
+ return NS_OK;
2294
+ }
2295
+ }
2296
+
2297
+ return NS_OK;
2298
+ }
2299
+
2300
+ /*******************************************************/
2301
+ // JavaScript Constructor for nsIXPCConstructor objects (Components.Constructor)
2302
+
2303
+ class nsXPCComponents_Constructor :
2304
+ public nsIXPCComponents_Constructor,
2305
+ public nsIXPCScriptable,
2306
+ public nsIClassInfo
2307
+ {
2308
+ public:
2309
+ // all the interface method declarations...
2310
+ NS_DECL_ISUPPORTS
2311
+ NS_DECL_NSIXPCCOMPONENTS_CONSTRUCTOR
2312
+ NS_DECL_NSIXPCSCRIPTABLE
2313
+ NS_DECL_NSICLASSINFO
2314
+
2315
+ public:
2316
+ nsXPCComponents_Constructor();
2317
+ virtual ~nsXPCComponents_Constructor();
2318
+
2319
+ private:
2320
+ NS_METHOD CallOrConstruct(nsIXPConnectWrappedNative *wrapper,
2321
+ JSContext * cx, JSObject * obj,
2322
+ PRUint32 argc, jsval * argv,
2323
+ jsval * vp, PRBool *_retval);
2324
+ };
2325
+
2326
+ /***************************************************************************/
2327
+ /* void getInterfaces (out PRUint32 count, [array, size_is (count), retval]
2328
+ out nsIIDPtr array); */
2329
+ NS_IMETHODIMP
2330
+ nsXPCComponents_Constructor::GetInterfaces(PRUint32 *aCount, nsIID * **aArray)
2331
+ {
2332
+ PRUint32 count = 2;
2333
+ *aCount = count;
2334
+ nsIID **array;
2335
+ *aArray = array = static_cast<nsIID**>(nsMemory::Alloc(count * sizeof(nsIID*)));
2336
+ if(!array)
2337
+ return NS_ERROR_OUT_OF_MEMORY;
2338
+
2339
+ PRUint32 index = 0;
2340
+ nsIID* clone;
2341
+ #define PUSH_IID(id) \
2342
+ clone = static_cast<nsIID *>(nsMemory::Clone(&NS_GET_IID( id ), \
2343
+ sizeof(nsIID))); \
2344
+ if (!clone) \
2345
+ goto oom; \
2346
+ array[index++] = clone;
2347
+
2348
+ PUSH_IID(nsIXPCComponents_Constructor)
2349
+ PUSH_IID(nsIXPCScriptable)
2350
+ #undef PUSH_IID
2351
+
2352
+ return NS_OK;
2353
+ oom:
2354
+ while (index)
2355
+ nsMemory::Free(array[--index]);
2356
+ nsMemory::Free(array);
2357
+ *aArray = nsnull;
2358
+ return NS_ERROR_OUT_OF_MEMORY;
2359
+ }
2360
+
2361
+ /* nsISupports getHelperForLanguage (in PRUint32 language); */
2362
+ NS_IMETHODIMP
2363
+ nsXPCComponents_Constructor::GetHelperForLanguage(PRUint32 language,
2364
+ nsISupports **retval)
2365
+ {
2366
+ *retval = nsnull;
2367
+ return NS_OK;
2368
+ }
2369
+
2370
+ /* readonly attribute string contractID; */
2371
+ NS_IMETHODIMP
2372
+ nsXPCComponents_Constructor::GetContractID(char * *aContractID)
2373
+ {
2374
+ *aContractID = nsnull;
2375
+ return NS_ERROR_NOT_AVAILABLE;
2376
+ }
2377
+
2378
+ /* readonly attribute string classDescription; */
2379
+ NS_IMETHODIMP
2380
+ nsXPCComponents_Constructor::GetClassDescription(char * *aClassDescription)
2381
+ {
2382
+ static const char classDescription[] = "XPCComponents_Interfaces";
2383
+ *aClassDescription = (char*)nsMemory::Clone(classDescription, sizeof(classDescription));
2384
+ return *aClassDescription ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
2385
+ }
2386
+
2387
+ /* readonly attribute nsCIDPtr classID; */
2388
+ NS_IMETHODIMP
2389
+ nsXPCComponents_Constructor::GetClassID(nsCID * *aClassID)
2390
+ {
2391
+ *aClassID = nsnull;
2392
+ return NS_OK;
2393
+ }
2394
+
2395
+ /* readonly attribute PRUint32 implementationLanguage; */
2396
+ NS_IMETHODIMP
2397
+ nsXPCComponents_Constructor::GetImplementationLanguage(
2398
+ PRUint32 *aImplementationLanguage)
2399
+ {
2400
+ *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
2401
+ return NS_OK;
2402
+ }
2403
+
2404
+ /* readonly attribute PRUint32 flags; */
2405
+ NS_IMETHODIMP
2406
+ nsXPCComponents_Constructor::GetFlags(PRUint32 *aFlags)
2407
+ {
2408
+ *aFlags = nsIClassInfo::THREADSAFE;
2409
+ return NS_OK;
2410
+ }
2411
+
2412
+ /* [notxpcom] readonly attribute nsCID classIDNoAlloc; */
2413
+ NS_IMETHODIMP
2414
+ nsXPCComponents_Constructor::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
2415
+ {
2416
+ return NS_ERROR_NOT_AVAILABLE;
2417
+ }
2418
+
2419
+ nsXPCComponents_Constructor::nsXPCComponents_Constructor()
2420
+ {
2421
+ }
2422
+
2423
+ nsXPCComponents_Constructor::~nsXPCComponents_Constructor()
2424
+ {
2425
+ // empty
2426
+ }
2427
+
2428
+ NS_INTERFACE_MAP_BEGIN(nsXPCComponents_Constructor)
2429
+ NS_INTERFACE_MAP_ENTRY(nsIXPCComponents_Constructor)
2430
+ NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
2431
+ NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
2432
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPCComponents_Constructor)
2433
+ NS_INTERFACE_MAP_END_THREADSAFE
2434
+
2435
+ NS_IMPL_THREADSAFE_ADDREF(nsXPCComponents_Constructor)
2436
+ NS_IMPL_THREADSAFE_RELEASE(nsXPCComponents_Constructor)
2437
+
2438
+ // The nsIXPCScriptable map declaration that will generate stubs for us...
2439
+ #define XPC_MAP_CLASSNAME nsXPCComponents_Constructor
2440
+ #define XPC_MAP_QUOTED_CLASSNAME "nsXPCComponents_Constructor"
2441
+ #define XPC_MAP_WANT_CALL
2442
+ #define XPC_MAP_WANT_CONSTRUCT
2443
+ #define XPC_MAP_WANT_HASINSTANCE
2444
+ #define XPC_MAP_FLAGS 0
2445
+ #include "xpc_map_end.h" /* This will #undef the above */
2446
+
2447
+
2448
+ /* PRBool call (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
2449
+ NS_IMETHODIMP
2450
+ nsXPCComponents_Constructor::Call(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp, PRBool *_retval)
2451
+ {
2452
+ return CallOrConstruct(wrapper, cx, obj, argc, argv, vp, _retval);
2453
+ }
2454
+
2455
+ /* PRBool construct (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
2456
+ NS_IMETHODIMP
2457
+ nsXPCComponents_Constructor::Construct(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp, PRBool *_retval)
2458
+ {
2459
+ return CallOrConstruct(wrapper, cx, obj, argc, argv, vp, _retval);
2460
+ }
2461
+
2462
+ NS_METHOD
2463
+ nsXPCComponents_Constructor::CallOrConstruct(nsIXPConnectWrappedNative *wrapper,
2464
+ JSContext * cx, JSObject * obj,
2465
+ PRUint32 argc, jsval * argv,
2466
+ jsval * vp, PRBool *_retval)
2467
+ {
2468
+ // make sure we have at least one arg
2469
+
2470
+ if(!argc)
2471
+ return ThrowAndFail(NS_ERROR_XPC_NOT_ENOUGH_ARGS, cx, _retval);
2472
+
2473
+ // get the various other object pointers we need
2474
+
2475
+ XPCCallContext ccx(JS_CALLER, cx);
2476
+ if(!ccx.IsValid())
2477
+ return ThrowAndFail(NS_ERROR_XPC_UNEXPECTED, cx, _retval);
2478
+
2479
+ nsXPConnect* xpc = ccx.GetXPConnect();
2480
+ XPCContext* xpcc = ccx.GetXPCContext();
2481
+ XPCWrappedNativeScope* scope =
2482
+ XPCWrappedNativeScope::FindInJSObjectScope(ccx, obj);
2483
+ nsXPCComponents* comp;
2484
+
2485
+ if(!xpc || !xpcc || !scope || !(comp = scope->GetComponents()))
2486
+ return ThrowAndFail(NS_ERROR_XPC_UNEXPECTED, cx, _retval);
2487
+
2488
+ // Do the security check if necessary
2489
+
2490
+ nsIXPCSecurityManager* sm =
2491
+ xpcc->GetAppropriateSecurityManager(
2492
+ nsIXPCSecurityManager::HOOK_CREATE_INSTANCE);
2493
+ if(sm && NS_FAILED(sm->CanCreateInstance(cx, nsXPCConstructor::GetCID())))
2494
+ {
2495
+ // the security manager vetoed. It should have set an exception.
2496
+ *_retval = JS_FALSE;
2497
+ return NS_OK;
2498
+ }
2499
+
2500
+ // initialization params for the Constructor object we will create
2501
+ nsCOMPtr<nsIJSCID> cClassID;
2502
+ nsCOMPtr<nsIJSIID> cInterfaceID;
2503
+ const char* cInitializer = nsnull;
2504
+
2505
+ if(argc >= 3)
2506
+ {
2507
+ // argv[2] is an initializer function or property name
2508
+ JSString* str = JS_ValueToString(cx, argv[2]);
2509
+ if(!str || !(cInitializer = JS_GetStringBytes(str)))
2510
+ return ThrowAndFail(NS_ERROR_XPC_BAD_CONVERT_JS, cx, _retval);
2511
+ }
2512
+
2513
+ if(argc >= 2)
2514
+ {
2515
+ // argv[1] is an iid name string
2516
+ // XXXjband support passing "Components.interfaces.foo"?
2517
+
2518
+ nsCOMPtr<nsIScriptableInterfaces> ifaces;
2519
+ nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
2520
+ JSObject* ifacesObj = nsnull;
2521
+
2522
+ // we do the lookup by asking the Components.interfaces object
2523
+ // for the property with this name - i.e. we let its caching of these
2524
+ // nsIJSIID objects work for us.
2525
+
2526
+ if(NS_FAILED(comp->GetInterfaces(getter_AddRefs(ifaces))) ||
2527
+ NS_FAILED(xpc->WrapNative(cx, obj, ifaces,
2528
+ NS_GET_IID(nsIScriptableInterfaces),
2529
+ getter_AddRefs(holder))) || !holder ||
2530
+ NS_FAILED(holder->GetJSObject(&ifacesObj)) || !ifacesObj)
2531
+ {
2532
+ return ThrowAndFail(NS_ERROR_XPC_UNEXPECTED, cx, _retval);
2533
+ }
2534
+
2535
+ JSString* str = JS_ValueToString(cx, argv[1]);
2536
+ if(!str)
2537
+ return ThrowAndFail(NS_ERROR_XPC_BAD_CONVERT_JS, cx, _retval);
2538
+
2539
+ jsval val;
2540
+ if(!JS_GetProperty(cx, ifacesObj, JS_GetStringBytes(str), &val) ||
2541
+ JSVAL_IS_PRIMITIVE(val))
2542
+ {
2543
+ return ThrowAndFail(NS_ERROR_XPC_BAD_IID, cx, _retval);
2544
+ }
2545
+
2546
+ nsCOMPtr<nsIXPConnectWrappedNative> wn;
2547
+ if(NS_FAILED(xpc->GetWrappedNativeOfJSObject(cx, JSVAL_TO_OBJECT(val),
2548
+ getter_AddRefs(wn))) || !wn ||
2549
+ !(cInterfaceID = do_QueryWrappedNative(wn)))
2550
+ {
2551
+ return ThrowAndFail(NS_ERROR_XPC_UNEXPECTED, cx, _retval);
2552
+ }
2553
+ }
2554
+ else
2555
+ {
2556
+ nsCOMPtr<nsIInterfaceInfo> info;
2557
+ xpc->GetInfoForIID(&NS_GET_IID(nsISupports), getter_AddRefs(info));
2558
+
2559
+ if(info)
2560
+ {
2561
+ cInterfaceID =
2562
+ dont_AddRef(
2563
+ static_cast<nsIJSIID*>(nsJSIID::NewID(info)));
2564
+ }
2565
+ if(!cInterfaceID)
2566
+ return ThrowAndFail(NS_ERROR_XPC_UNEXPECTED, cx, _retval);
2567
+ }
2568
+
2569
+ // a new scope to avoid warnings about shadowed names
2570
+ {
2571
+ // argv[0] is a contractid name string
2572
+ // XXXjband support passing "Components.classes.foo"?
2573
+
2574
+ // we do the lookup by asking the Components.classes object
2575
+ // for the property with this name - i.e. we let its caching of these
2576
+ // nsIJSCID objects work for us.
2577
+
2578
+ nsCOMPtr<nsIXPCComponents_Classes> classes;
2579
+ nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
2580
+ JSObject* classesObj = nsnull;
2581
+
2582
+ if(NS_FAILED(comp->GetClasses(getter_AddRefs(classes))) ||
2583
+ NS_FAILED(xpc->WrapNative(cx, obj, classes,
2584
+ NS_GET_IID(nsIXPCComponents_Classes),
2585
+ getter_AddRefs(holder))) || !holder ||
2586
+ NS_FAILED(holder->GetJSObject(&classesObj)) || !classesObj)
2587
+ {
2588
+ return ThrowAndFail(NS_ERROR_XPC_UNEXPECTED, cx, _retval);
2589
+ }
2590
+
2591
+ JSString* str = JS_ValueToString(cx, argv[0]);
2592
+ if(!str)
2593
+ return ThrowAndFail(NS_ERROR_XPC_BAD_CONVERT_JS, cx, _retval);
2594
+
2595
+ jsval val;
2596
+ if(!JS_GetProperty(cx, classesObj, JS_GetStringBytes(str), &val) ||
2597
+ JSVAL_IS_PRIMITIVE(val))
2598
+ {
2599
+ return ThrowAndFail(NS_ERROR_XPC_BAD_CID, cx, _retval);
2600
+ }
2601
+
2602
+ nsCOMPtr<nsIXPConnectWrappedNative> wn;
2603
+ if(NS_FAILED(xpc->GetWrappedNativeOfJSObject(cx, JSVAL_TO_OBJECT(val),
2604
+ getter_AddRefs(wn))) || !wn ||
2605
+ !(cClassID = do_QueryWrappedNative(wn)))
2606
+ {
2607
+ return ThrowAndFail(NS_ERROR_XPC_UNEXPECTED, cx, _retval);
2608
+ }
2609
+ }
2610
+
2611
+ nsCOMPtr<nsIXPCConstructor> ctor =
2612
+ static_cast<nsIXPCConstructor*>
2613
+ (new nsXPCConstructor(cClassID, cInterfaceID, cInitializer));
2614
+ if(!ctor)
2615
+ return ThrowAndFail(NS_ERROR_XPC_UNEXPECTED, cx, _retval);
2616
+
2617
+ nsCOMPtr<nsIXPConnectJSObjectHolder> holder2;
2618
+ JSObject* newObj = nsnull;
2619
+
2620
+ if(NS_FAILED(xpc->WrapNative(cx, obj, ctor, NS_GET_IID(nsIXPCConstructor),
2621
+ getter_AddRefs(holder2))) || !holder2 ||
2622
+ NS_FAILED(holder2->GetJSObject(&newObj)) || !newObj)
2623
+ {
2624
+ return ThrowAndFail(NS_ERROR_XPC_CANT_CREATE_WN, cx, _retval);
2625
+ }
2626
+
2627
+ if(vp)
2628
+ *vp = OBJECT_TO_JSVAL(newObj);
2629
+
2630
+ return NS_OK;
2631
+ }
2632
+
2633
+ /* PRBool hasInstance (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal val, out PRBool bp); */
2634
+ NS_IMETHODIMP
2635
+ nsXPCComponents_Constructor::HasInstance(nsIXPConnectWrappedNative *wrapper,
2636
+ JSContext * cx, JSObject * obj,
2637
+ jsval val, PRBool *bp,
2638
+ PRBool *_retval)
2639
+ {
2640
+ if(bp)
2641
+ *bp = JSValIsInterfaceOfType(cx, val, NS_GET_IID(nsIXPCConstructor));
2642
+ return NS_OK;
2643
+ }
2644
+
2645
+ /***************************************************************************/
2646
+ // Javascript constructor for the sandbox object
2647
+ class nsXPCComponents_utils_Sandbox : public nsIXPCComponents_utils_Sandbox,
2648
+ public nsIXPCScriptable
2649
+ {
2650
+ public:
2651
+ // Aren't macros nice?
2652
+ NS_DECL_ISUPPORTS
2653
+ NS_DECL_NSIXPCCOMPONENTS_UTILS_SANDBOX
2654
+ NS_DECL_NSIXPCSCRIPTABLE
2655
+
2656
+ public:
2657
+ nsXPCComponents_utils_Sandbox();
2658
+ virtual ~nsXPCComponents_utils_Sandbox();
2659
+
2660
+ private:
2661
+ // XXXjst: This method (and other CallOrConstruct()'s in this
2662
+ // file) doesn't need to be virtual, could even be a static
2663
+ // method!
2664
+ NS_METHOD CallOrConstruct(nsIXPConnectWrappedNative *wrapper,
2665
+ JSContext * cx, JSObject * obj,
2666
+ PRUint32 argc, jsval * argv,
2667
+ jsval * vp, PRBool *_retval);
2668
+ };
2669
+
2670
+ class nsXPCComponents_Utils :
2671
+ public nsIXPCComponents_Utils,
2672
+ public nsIXPCScriptable
2673
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
2674
+ , public nsISecurityCheckedComponent
2675
+ #endif
2676
+ {
2677
+ public:
2678
+ // all the interface method declarations...
2679
+ NS_DECL_ISUPPORTS
2680
+ NS_DECL_NSIXPCSCRIPTABLE
2681
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
2682
+ NS_DECL_NSISECURITYCHECKEDCOMPONENT
2683
+ #endif
2684
+ NS_DECL_NSIXPCCOMPONENTS_UTILS
2685
+
2686
+ public:
2687
+ nsXPCComponents_Utils() { }
2688
+ virtual ~nsXPCComponents_Utils() { }
2689
+
2690
+ private:
2691
+ nsCOMPtr<nsIXPCComponents_utils_Sandbox> mSandbox;
2692
+ };
2693
+
2694
+ NS_INTERFACE_MAP_BEGIN(nsXPCComponents_Utils)
2695
+ NS_INTERFACE_MAP_ENTRY(nsIXPCComponents_Utils)
2696
+ NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
2697
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
2698
+ NS_INTERFACE_MAP_ENTRY(nsISecurityCheckedComponent)
2699
+ #endif
2700
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPCComponents_Utils)
2701
+ NS_INTERFACE_MAP_END_THREADSAFE
2702
+
2703
+ NS_IMPL_THREADSAFE_ADDREF(nsXPCComponents_Utils)
2704
+ NS_IMPL_THREADSAFE_RELEASE(nsXPCComponents_Utils)
2705
+
2706
+ // The nsIXPCScriptable map declaration that will generate stubs for us...
2707
+ #define XPC_MAP_CLASSNAME nsXPCComponents_Utils
2708
+ #define XPC_MAP_QUOTED_CLASSNAME "nsXPCComponents_Utils"
2709
+ #define XPC_MAP_FLAGS nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE
2710
+ #include "xpc_map_end.h" /* This will #undef the above */
2711
+
2712
+ NS_IMETHODIMP
2713
+ nsXPCComponents_Utils::GetSandbox(nsIXPCComponents_utils_Sandbox **aSandbox)
2714
+ {
2715
+ NS_ENSURE_ARG_POINTER(aSandbox);
2716
+ if (!mSandbox && !(mSandbox = new nsXPCComponents_utils_Sandbox())) {
2717
+ *aSandbox = nsnull;
2718
+ return NS_ERROR_OUT_OF_MEMORY;
2719
+ }
2720
+ NS_ADDREF(*aSandbox = mSandbox);
2721
+ return NS_OK;
2722
+ }
2723
+
2724
+ static JSBool
2725
+ MethodWrapper(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
2726
+ jsval *rval)
2727
+ {
2728
+ jsval v;
2729
+ if (!JS_GetReservedSlot(cx, JSVAL_TO_OBJECT(argv[-2]), 0, &v) ||
2730
+ !JS_CallFunctionValue(cx, obj, v, argc, argv, rval)) {
2731
+ return JS_FALSE;
2732
+ }
2733
+
2734
+ if (JSVAL_IS_PRIMITIVE(*rval))
2735
+ return JS_TRUE;
2736
+ return XPCNativeWrapperCtor(cx, nsnull, 1, rval, rval);
2737
+ }
2738
+
2739
+ /* void lookupMethod (); */
2740
+ NS_IMETHODIMP
2741
+ nsXPCComponents_Utils::LookupMethod()
2742
+ {
2743
+ nsresult rv;
2744
+
2745
+ nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv));
2746
+ if(NS_FAILED(rv))
2747
+ return NS_ERROR_FAILURE;
2748
+
2749
+ // get the xpconnect native call context
2750
+ nsAXPCNativeCallContext *cc = nsnull;
2751
+ xpc->GetCurrentNativeCallContext(&cc);
2752
+ if(!cc)
2753
+ return NS_ERROR_FAILURE;
2754
+
2755
+ // Check disabled until deprecated Components.lookupMethod removed.
2756
+ #undef CHECK_FOR_INDIRECT_CALL
2757
+ #ifdef CHECK_FOR_INDIRECT_CALL
2758
+ // verify that we are being called from JS (i.e. the current call is
2759
+ // to this object - though we don't verify that it is to this exact method)
2760
+ nsCOMPtr<nsISupports> callee;
2761
+ cc->GetCallee(getter_AddRefs(callee));
2762
+ if(!callee || callee.get() !=
2763
+ static_cast<const nsISupports*>
2764
+ (static_cast<const nsIXPCComponents_Utils*>(this)))
2765
+ return NS_ERROR_FAILURE;
2766
+ #endif
2767
+
2768
+ // Get JSContext of current call
2769
+ JSContext* cx;
2770
+ rv = cc->GetJSContext(&cx);
2771
+ if(NS_FAILED(rv) || !cx)
2772
+ return NS_ERROR_FAILURE;
2773
+
2774
+ JSAutoRequest ar(cx);
2775
+
2776
+ // get place for return value
2777
+ jsval *retval = nsnull;
2778
+ rv = cc->GetRetValPtr(&retval);
2779
+ if(NS_FAILED(rv) || !retval)
2780
+ return NS_ERROR_FAILURE;
2781
+
2782
+ // get argc and argv and verify arg count
2783
+ PRUint32 argc;
2784
+ rv = cc->GetArgc(&argc);
2785
+ if(NS_FAILED(rv))
2786
+ return NS_ERROR_FAILURE;
2787
+
2788
+ if(argc < 2)
2789
+ return NS_ERROR_XPC_NOT_ENOUGH_ARGS;
2790
+
2791
+ jsval* argv;
2792
+ rv = cc->GetArgvPtr(&argv);
2793
+ if(NS_FAILED(rv) || !argv)
2794
+ return NS_ERROR_FAILURE;
2795
+
2796
+ // first param must be a JSObject
2797
+ if(JSVAL_IS_PRIMITIVE(argv[0]))
2798
+ return NS_ERROR_XPC_BAD_CONVERT_JS;
2799
+
2800
+ JSObject* obj = JSVAL_TO_OBJECT(argv[0]);
2801
+
2802
+ OBJ_TO_INNER_OBJECT(cx, obj);
2803
+
2804
+ // second param must be a string
2805
+ if(!JSVAL_IS_STRING(argv[1]))
2806
+ return NS_ERROR_XPC_BAD_CONVERT_JS;
2807
+
2808
+ // Make sure the name (argv[1]) that we use for looking up the
2809
+ // method/property is atomized.
2810
+
2811
+ jsid name_id;
2812
+ if(!JS_ValueToId(cx, argv[1], &name_id) ||
2813
+ !JS_IdToValue(cx, name_id, &argv[1]))
2814
+ return NS_ERROR_XPC_BAD_CONVERT_JS;
2815
+
2816
+ // this will do verification and the method lookup for us
2817
+ // Note that if |obj| is an XPCNativeWrapper this will all still work.
2818
+ // We'll hand back the same method that we'd hand back for the underlying
2819
+ // XPCWrappedNative. This means no deep wrapping, unfortunately, but we
2820
+ // can't keep track of both the underlying function and the
2821
+ // XPCNativeWrapper at once in a single parent slot...
2822
+ XPCCallContext inner_cc(JS_CALLER, cx, obj, nsnull, argv[1]);
2823
+
2824
+ // was our jsobject really a wrapped native at all?
2825
+ XPCWrappedNative* wrapper = inner_cc.GetWrapper();
2826
+ if(!wrapper || !wrapper->IsValid())
2827
+ return NS_ERROR_XPC_BAD_CONVERT_JS;
2828
+
2829
+ // did we find a method/attribute by that name?
2830
+ XPCNativeMember* member = inner_cc.GetMember();
2831
+ if(!member || member->IsConstant())
2832
+ return NS_ERROR_XPC_BAD_CONVERT_JS;
2833
+
2834
+ // it would a be a big surprise if there is a member without an interface :)
2835
+ XPCNativeInterface* iface = inner_cc.GetInterface();
2836
+ if(!iface)
2837
+ return NS_ERROR_XPC_BAD_CONVERT_JS;
2838
+
2839
+ // get (and perhaps lazily create) the member's cloned function
2840
+ jsval funval;
2841
+ if(!member->NewFunctionObject(inner_cc, iface, wrapper->GetFlatJSObject(),
2842
+ &funval))
2843
+ return NS_ERROR_XPC_BAD_CONVERT_JS;
2844
+
2845
+ // Stick the function in the return value. This roots it.
2846
+ *retval = funval;
2847
+
2848
+ // Callers of this method are implicitly buying into
2849
+ // XPCNativeWrapper-like protection. The easiest way
2850
+ // to enforce this is to use our own wrapper.
2851
+ // Note: We use the outer call context to ensure that we wrap
2852
+ // the function in the right scope.
2853
+ NS_ASSERTION(JSVAL_IS_OBJECT(funval), "Function is not an object");
2854
+ JSContext *outercx;
2855
+ cc->GetJSContext(&outercx);
2856
+ JSFunction *oldfunction = JS_ValueToFunction(outercx, funval);
2857
+ NS_ASSERTION(oldfunction, "Function is not a function");
2858
+
2859
+ JSFunction *f = JS_NewFunction(outercx, MethodWrapper,
2860
+ JS_GetFunctionArity(oldfunction), 0,
2861
+ JS_GetScopeChain(outercx),
2862
+ JS_GetFunctionName(oldfunction));
2863
+ if(!f)
2864
+ return NS_ERROR_FAILURE;
2865
+
2866
+ JSObject *funobj = JS_GetFunctionObject(f);
2867
+ if(!JS_SetReservedSlot(outercx, funobj, 0, funval))
2868
+ return NS_ERROR_FAILURE;
2869
+
2870
+ *retval = OBJECT_TO_JSVAL(funobj);
2871
+
2872
+ // Tell XPConnect that we returned the function through the call context.
2873
+ cc->SetReturnValueWasSet(PR_TRUE);
2874
+ return NS_OK;
2875
+ }
2876
+
2877
+ /* void reportError (); */
2878
+ NS_IMETHODIMP
2879
+ nsXPCComponents_Utils::ReportError()
2880
+ {
2881
+ // This function shall never fail! Silently eat any failure conditions.
2882
+ nsresult rv;
2883
+
2884
+ nsCOMPtr<nsIConsoleService> console(
2885
+ do_GetService(NS_CONSOLESERVICE_CONTRACTID));
2886
+
2887
+ nsCOMPtr<nsIScriptError> scripterr(new nsScriptError());
2888
+
2889
+ nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID()));
2890
+ if(!scripterr || !console || !xpc)
2891
+ return NS_OK;
2892
+
2893
+ // get the xpconnect native call context
2894
+ nsAXPCNativeCallContext *cc = nsnull;
2895
+ xpc->GetCurrentNativeCallContext(&cc);
2896
+ if(!cc)
2897
+ return NS_OK;
2898
+
2899
+ // Check disabled until deprecated Components.reportError removed.
2900
+ #undef CHECK_FOR_INDIRECT_CALL
2901
+ #ifdef CHECK_FOR_INDIRECT_CALL
2902
+ // verify that we are being called from JS (i.e. the current call is
2903
+ // to this object - though we don't verify that it is to this exact method)
2904
+ nsCOMPtr<nsISupports> callee;
2905
+ cc->GetCallee(getter_AddRefs(callee));
2906
+ if(!callee || callee.get() !=
2907
+ static_cast<const nsISupports*>
2908
+ (static_cast<const nsIXPCComponents_Utils*>(this))) {
2909
+ NS_ERROR("reportError() must only be called from JS!");
2910
+ return NS_ERROR_FAILURE;
2911
+ }
2912
+ #endif
2913
+
2914
+ // Get JSContext of current call
2915
+ JSContext* cx;
2916
+ rv = cc->GetJSContext(&cx);
2917
+ if(NS_FAILED(rv) || !cx)
2918
+ return NS_OK;
2919
+
2920
+ JSAutoRequest ar(cx);
2921
+
2922
+ // get argc and argv and verify arg count
2923
+ PRUint32 argc;
2924
+ rv = cc->GetArgc(&argc);
2925
+ if(NS_FAILED(rv))
2926
+ return NS_OK;
2927
+
2928
+ if(argc < 1)
2929
+ return NS_ERROR_XPC_NOT_ENOUGH_ARGS;
2930
+
2931
+ jsval* argv;
2932
+ rv = cc->GetArgvPtr(&argv);
2933
+ if(NS_FAILED(rv) || !argv)
2934
+ return NS_OK;
2935
+
2936
+ JSErrorReport* err = JS_ErrorFromException(cx, argv[0]);
2937
+ if(err)
2938
+ {
2939
+ // It's a proper JS Error
2940
+ nsAutoString fileUni;
2941
+ CopyUTF8toUTF16(err->filename, fileUni);
2942
+
2943
+ PRUint32 column = err->uctokenptr - err->uclinebuf;
2944
+
2945
+ rv = scripterr->Init(reinterpret_cast<const PRUnichar*>
2946
+ (err->ucmessage),
2947
+ fileUni.get(),
2948
+ reinterpret_cast<const PRUnichar*>
2949
+ (err->uclinebuf),
2950
+ err->lineno,
2951
+ column,
2952
+ err->flags,
2953
+ "XPConnect JavaScript");
2954
+ if(NS_FAILED(rv))
2955
+ return NS_OK;
2956
+
2957
+ console->LogMessage(scripterr);
2958
+ return NS_OK;
2959
+ }
2960
+
2961
+ // It's not a JS Error object, so we synthesize as best we're able
2962
+ JSString* msgstr = JS_ValueToString(cx, argv[0]);
2963
+ if(msgstr)
2964
+ {
2965
+ // Root the string during scripterr->Init
2966
+ argv[0] = STRING_TO_JSVAL(msgstr);
2967
+
2968
+ nsCOMPtr<nsIStackFrame> frame;
2969
+ nsXPConnect* xpc = nsXPConnect::GetXPConnect();
2970
+ if(xpc)
2971
+ xpc->GetCurrentJSStack(getter_AddRefs(frame));
2972
+
2973
+ nsXPIDLCString fileName;
2974
+ PRInt32 lineNo = 0;
2975
+ if(frame)
2976
+ {
2977
+ frame->GetFilename(getter_Copies(fileName));
2978
+ frame->GetLineNumber(&lineNo);
2979
+ }
2980
+
2981
+ rv = scripterr->Init(reinterpret_cast<const PRUnichar*>
2982
+ (JS_GetStringChars(msgstr)),
2983
+ NS_ConvertUTF8toUTF16(fileName).get(),
2984
+ nsnull,
2985
+ lineNo, 0,
2986
+ 0, "XPConnect JavaScript");
2987
+ if(NS_SUCCEEDED(rv))
2988
+ console->LogMessage(scripterr);
2989
+ }
2990
+
2991
+ return NS_OK;
2992
+ }
2993
+
2994
+ #ifndef XPCONNECT_STANDALONE
2995
+ #include "nsIScriptSecurityManager.h"
2996
+ #include "nsIURI.h"
2997
+ #include "nsNetUtil.h"
2998
+ const char kScriptSecurityManagerContractID[] = NS_SCRIPTSECURITYMANAGER_CONTRACTID;
2999
+
3000
+ NS_IMPL_THREADSAFE_ISUPPORTS1(PrincipalHolder, nsIScriptObjectPrincipal)
3001
+
3002
+ nsIPrincipal *
3003
+ PrincipalHolder::GetPrincipal()
3004
+ {
3005
+ return mHoldee;
3006
+ }
3007
+
3008
+ static JSBool
3009
+ SandboxDump(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
3010
+ {
3011
+ JSString *str;
3012
+ if (!argc)
3013
+ return JS_TRUE;
3014
+
3015
+ str = JS_ValueToString(cx, argv[0]);
3016
+ if (!str)
3017
+ return JS_FALSE;
3018
+
3019
+ char *bytes = JS_GetStringBytes(str);
3020
+ if (!bytes)
3021
+ return JS_FALSE;
3022
+
3023
+ fputs(bytes, stderr);
3024
+ return JS_TRUE;
3025
+ }
3026
+
3027
+ static JSBool
3028
+ SandboxDebug(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
3029
+ {
3030
+ #ifdef DEBUG
3031
+ return SandboxDump(cx, obj, argc, argv, rval);
3032
+ #else
3033
+ return JS_TRUE;
3034
+ #endif
3035
+ }
3036
+
3037
+ static JSBool
3038
+ SandboxFunForwarder(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
3039
+ jsval *rval)
3040
+ {
3041
+ jsval v;
3042
+ if (!JS_GetReservedSlot(cx, JSVAL_TO_OBJECT(argv[-2]), 0, &v) ||
3043
+ !JS_CallFunctionValue(cx, obj, v, argc, argv, rval)) {
3044
+ return JS_FALSE;
3045
+ }
3046
+
3047
+ if (JSVAL_IS_PRIMITIVE(*rval))
3048
+ return JS_TRUE; // nothing more to do.
3049
+
3050
+ XPCThrower::Throw(NS_ERROR_NOT_IMPLEMENTED, cx);
3051
+ return JS_FALSE;
3052
+ }
3053
+
3054
+ static JSBool
3055
+ SandboxImport(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
3056
+ jsval *rval)
3057
+ {
3058
+ if (argc < 1) {
3059
+ XPCThrower::Throw(NS_ERROR_INVALID_ARG, cx);
3060
+ return JS_FALSE;
3061
+ }
3062
+
3063
+ JSFunction *fun = JS_ValueToFunction(cx, argv[0]);
3064
+ if (!fun) {
3065
+ XPCThrower::Throw(NS_ERROR_INVALID_ARG, cx);
3066
+ return JS_FALSE;
3067
+ }
3068
+
3069
+ JSString *funname;
3070
+ if (argc > 1) {
3071
+ // Use the second parameter as the function name.
3072
+ funname = JS_ValueToString(cx, argv[1]);
3073
+ if (!funname)
3074
+ return JS_FALSE;
3075
+ argv[1] = STRING_TO_JSVAL(funname);
3076
+ } else {
3077
+ // Use the actual function name as the name.
3078
+ funname = JS_GetFunctionId(fun);
3079
+ if (!funname) {
3080
+ XPCThrower::Throw(NS_ERROR_INVALID_ARG, cx);
3081
+ return JS_FALSE;
3082
+ }
3083
+ }
3084
+
3085
+ nsresult rv = NS_ERROR_FAILURE;
3086
+ JSObject *oldfunobj = JS_GetFunctionObject(fun);
3087
+ nsXPConnect *xpc = nsXPConnect::GetXPConnect();
3088
+
3089
+ if (xpc && oldfunobj) {
3090
+ nsIXPCSecurityManager *secman = xpc->GetDefaultSecurityManager();
3091
+ if (secman) {
3092
+ rv = secman->CanAccess(nsIXPCSecurityManager::ACCESS_CALL_METHOD,
3093
+ nsnull, cx, oldfunobj, nsnull, nsnull,
3094
+ STRING_TO_JSVAL(funname), nsnull);
3095
+ }
3096
+ }
3097
+
3098
+ if (NS_FAILED(rv)) {
3099
+ if (rv == NS_ERROR_FAILURE)
3100
+ XPCThrower::Throw(NS_ERROR_XPC_SECURITY_MANAGER_VETO, cx);
3101
+ return JS_FALSE;
3102
+ }
3103
+
3104
+ JSFunction *newfun = JS_DefineUCFunction(cx, obj,
3105
+ JS_GetStringChars(funname), JS_GetStringLength(funname),
3106
+ SandboxFunForwarder, JS_GetFunctionArity(fun), 0);
3107
+
3108
+ if (!newfun)
3109
+ return JS_FALSE;
3110
+
3111
+ JSObject *newfunobj = JS_GetFunctionObject(newfun);
3112
+ if (!newfunobj)
3113
+ return JS_FALSE;
3114
+
3115
+ // Functions come with two extra reserved slots on them. Use the 0-th slot
3116
+ // to communicate the wrapped function to our forwarder.
3117
+ return JS_SetReservedSlot(cx, newfunobj, 0, argv[0]);
3118
+ }
3119
+
3120
+ static JSBool
3121
+ sandbox_enumerate(JSContext *cx, JSObject *obj)
3122
+ {
3123
+ return JS_EnumerateStandardClasses(cx, obj);
3124
+ }
3125
+
3126
+ static JSBool
3127
+ sandbox_resolve(JSContext *cx, JSObject *obj, jsval id)
3128
+ {
3129
+ JSBool resolved;
3130
+ return JS_ResolveStandardClass(cx, obj, id, &resolved);
3131
+ }
3132
+
3133
+ static void
3134
+ sandbox_finalize(JSContext *cx, JSObject *obj)
3135
+ {
3136
+ nsIScriptObjectPrincipal *sop =
3137
+ (nsIScriptObjectPrincipal *)xpc_GetJSPrivate(obj);
3138
+ NS_IF_RELEASE(sop);
3139
+ }
3140
+
3141
+ static JSBool
3142
+ sandbox_convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
3143
+ {
3144
+ if (type == JSTYPE_OBJECT) {
3145
+ *vp = OBJECT_TO_JSVAL(obj);
3146
+ return JS_TRUE;
3147
+ }
3148
+
3149
+ return JS_ConvertStub(cx, obj, type, vp);
3150
+ }
3151
+
3152
+ static JSClass SandboxClass = {
3153
+ "Sandbox",
3154
+ JSCLASS_HAS_PRIVATE | JSCLASS_PRIVATE_IS_NSISUPPORTS | JSCLASS_GLOBAL_FLAGS,
3155
+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
3156
+ sandbox_enumerate, sandbox_resolve, sandbox_convert, sandbox_finalize,
3157
+ JSCLASS_NO_OPTIONAL_MEMBERS
3158
+ };
3159
+
3160
+ static JSFunctionSpec SandboxFunctions[] = {
3161
+ {"dump", SandboxDump, 1,0,0},
3162
+ {"debug", SandboxDebug, 1,0,0},
3163
+ {"importFunction", SandboxImport, 1,0,0},
3164
+ {nsnull,nsnull,0,0,0}
3165
+ };
3166
+
3167
+ #endif /* !XPCONNECT_STANDALONE */
3168
+
3169
+ /***************************************************************************/
3170
+ nsXPCComponents_utils_Sandbox::nsXPCComponents_utils_Sandbox()
3171
+ {
3172
+ }
3173
+
3174
+ nsXPCComponents_utils_Sandbox::~nsXPCComponents_utils_Sandbox()
3175
+ {
3176
+ }
3177
+
3178
+ NS_INTERFACE_MAP_BEGIN(nsXPCComponents_utils_Sandbox)
3179
+ NS_INTERFACE_MAP_ENTRY(nsIXPCComponents_utils_Sandbox)
3180
+ NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
3181
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPCComponents_utils_Sandbox)
3182
+ NS_INTERFACE_MAP_END_THREADSAFE
3183
+
3184
+ NS_IMPL_THREADSAFE_ADDREF(nsXPCComponents_utils_Sandbox)
3185
+ NS_IMPL_THREADSAFE_RELEASE(nsXPCComponents_utils_Sandbox)
3186
+
3187
+ // We use the nsIXPScriptable macros to generate lots of stuff for us.
3188
+ #define XPC_MAP_CLASSNAME nsXPCComponents_utils_Sandbox
3189
+ #define XPC_MAP_QUOTED_CLASSNAME "nsXPCComponents_utils_Sandbox"
3190
+ #define XPC_MAP_WANT_CALL
3191
+ #define XPC_MAP_WANT_CONSTRUCT
3192
+ #define XPC_MAP_FLAGS 0
3193
+ #include "xpc_map_end.h" /* This #undef's the above. */
3194
+
3195
+ #ifndef XPCONNECT_STANDALONE
3196
+ nsresult
3197
+ xpc_CreateSandboxObject(JSContext * cx, jsval * vp, nsISupports *prinOrSop)
3198
+ {
3199
+ // Create the sandbox global object
3200
+ nsresult rv;
3201
+ nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv));
3202
+ if(NS_FAILED(rv))
3203
+ return NS_ERROR_XPC_UNEXPECTED;
3204
+
3205
+ XPCAutoJSContext tempcx(JS_NewContext(JS_GetRuntime(cx), 1024), PR_FALSE);
3206
+ if (!tempcx)
3207
+ return NS_ERROR_OUT_OF_MEMORY;
3208
+
3209
+ AutoJSRequestWithNoCallContext req(tempcx);
3210
+ JSObject *sandbox = JS_NewObject(tempcx, &SandboxClass, nsnull, nsnull);
3211
+ if (!sandbox)
3212
+ return NS_ERROR_XPC_UNEXPECTED;
3213
+
3214
+ JS_SetGlobalObject(tempcx, sandbox);
3215
+
3216
+ nsCOMPtr<nsIScriptObjectPrincipal> sop(do_QueryInterface(prinOrSop));
3217
+
3218
+ if (!sop) {
3219
+ nsCOMPtr<nsIPrincipal> principal(do_QueryInterface(prinOrSop));
3220
+
3221
+ if (!principal) {
3222
+ principal = do_CreateInstance("@mozilla.org/nullprincipal;1", &rv);
3223
+ NS_ASSERTION(NS_FAILED(rv) || principal,
3224
+ "Bad return from do_CreateInstance");
3225
+
3226
+ if (!principal || NS_FAILED(rv)) {
3227
+ if (NS_SUCCEEDED(rv))
3228
+ rv = NS_ERROR_FAILURE;
3229
+
3230
+ return rv;
3231
+ }
3232
+ }
3233
+
3234
+ sop = new PrincipalHolder(principal);
3235
+ if (!sop)
3236
+ return NS_ERROR_OUT_OF_MEMORY;
3237
+ }
3238
+
3239
+ // Pass on ownership of sop to |sandbox|.
3240
+
3241
+ {
3242
+ nsIScriptObjectPrincipal *tmp = sop;
3243
+
3244
+ if (!JS_SetPrivate(cx, sandbox, tmp)) {
3245
+ return NS_ERROR_XPC_UNEXPECTED;
3246
+ }
3247
+
3248
+ NS_ADDREF(tmp);
3249
+ }
3250
+
3251
+ rv = xpc->InitClasses(cx, sandbox);
3252
+ if (NS_SUCCEEDED(rv) &&
3253
+ !JS_DefineFunctions(cx, sandbox, SandboxFunctions)) {
3254
+ rv = NS_ERROR_FAILURE;
3255
+ }
3256
+ if (NS_FAILED(rv))
3257
+ return NS_ERROR_XPC_UNEXPECTED;
3258
+
3259
+ if (vp)
3260
+ *vp = OBJECT_TO_JSVAL(sandbox);
3261
+
3262
+ return NS_OK;
3263
+ }
3264
+ #endif /* !XPCONNECT_STANDALONE */
3265
+
3266
+ /* PRBool call(in nsIXPConnectWrappedNative wrapper,
3267
+ in JSContextPtr cx,
3268
+ in JSObjectPtr obj,
3269
+ in PRUint32 argc,
3270
+ in JSValPtr argv,
3271
+ in JSValPtr vp);
3272
+ */
3273
+ NS_IMETHODIMP
3274
+ nsXPCComponents_utils_Sandbox::Call(nsIXPConnectWrappedNative *wrapper,
3275
+ JSContext * cx,
3276
+ JSObject * obj,
3277
+ PRUint32 argc,
3278
+ jsval * argv,
3279
+ jsval * vp,
3280
+ PRBool *_retval)
3281
+ {
3282
+ return CallOrConstruct(wrapper, cx, obj, argc, argv, vp, _retval);
3283
+ }
3284
+
3285
+ /* PRBool construct(in nsIXPConnectWrappedNative wrapper,
3286
+ in JSContextPtr cx,
3287
+ in JSObjectPtr obj,
3288
+ in PRUint32 argc,
3289
+ in JSValPtr argv,
3290
+ in JSValPtr vp);
3291
+ */
3292
+ NS_IMETHODIMP
3293
+ nsXPCComponents_utils_Sandbox::Construct(nsIXPConnectWrappedNative *wrapper,
3294
+ JSContext * cx,
3295
+ JSObject * obj,
3296
+ PRUint32 argc,
3297
+ jsval * argv,
3298
+ jsval * vp,
3299
+ PRBool *_retval)
3300
+ {
3301
+ return CallOrConstruct(wrapper, cx, obj, argc, argv, vp, _retval);
3302
+ }
3303
+
3304
+ NS_IMETHODIMP
3305
+ nsXPCComponents_utils_Sandbox::CallOrConstruct(nsIXPConnectWrappedNative *wrapper,
3306
+ JSContext * cx, JSObject * obj,
3307
+ PRUint32 argc, jsval * argv,
3308
+ jsval * vp, PRBool *_retval)
3309
+ {
3310
+ #ifdef XPCONNECT_STANDALONE
3311
+ return NS_ERROR_NOT_AVAILABLE;
3312
+ #else /* XPCONNECT_STANDALONE */
3313
+ if (argc < 1)
3314
+ return ThrowAndFail(NS_ERROR_XPC_NOT_ENOUGH_ARGS, cx, _retval);
3315
+
3316
+ nsresult rv;
3317
+
3318
+ // Make sure to set up principals on the sandbox before initing classes
3319
+ nsCOMPtr<nsIScriptObjectPrincipal> sop;
3320
+ nsCOMPtr<nsIPrincipal> principal;
3321
+ nsISupports *prinOrSop = nsnull;
3322
+ if (JSVAL_IS_STRING(argv[0])) {
3323
+ JSString *codebasestr = JSVAL_TO_STRING(argv[0]);
3324
+ nsAutoString codebase(reinterpret_cast<PRUnichar*>
3325
+ (JS_GetStringChars(codebasestr)),
3326
+ JS_GetStringLength(codebasestr));
3327
+ nsCOMPtr<nsIURI> uri;
3328
+ rv = NS_NewURI(getter_AddRefs(uri), codebase);
3329
+ if (NS_FAILED(rv)) {
3330
+ return ThrowAndFail(rv, cx, _retval);
3331
+ }
3332
+
3333
+ nsCOMPtr<nsIScriptSecurityManager> secman =
3334
+ do_GetService(kScriptSecurityManagerContractID);
3335
+ if (!secman ||
3336
+ NS_FAILED(rv = secman->GetCodebasePrincipal(uri,
3337
+ getter_AddRefs(principal))) ||
3338
+ !principal) {
3339
+ if (NS_SUCCEEDED(rv))
3340
+ rv = NS_ERROR_FAILURE;
3341
+ return ThrowAndFail(rv, cx, _retval);
3342
+ }
3343
+
3344
+ prinOrSop = principal;
3345
+ } else {
3346
+ if (!JSVAL_IS_PRIMITIVE(argv[0])) {
3347
+ nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID()));
3348
+ if(!xpc)
3349
+ return NS_ERROR_XPC_UNEXPECTED;
3350
+ nsCOMPtr<nsIXPConnectWrappedNative> wrapper;
3351
+ xpc->GetWrappedNativeOfJSObject(cx, JSVAL_TO_OBJECT(argv[0]),
3352
+ getter_AddRefs(wrapper));
3353
+
3354
+ if (wrapper) {
3355
+ sop = do_QueryWrappedNative(wrapper);
3356
+ if (sop) {
3357
+ prinOrSop = sop;
3358
+ } else {
3359
+ principal = do_QueryWrappedNative(wrapper);
3360
+ prinOrSop = principal;
3361
+ }
3362
+ }
3363
+ }
3364
+
3365
+ if (!prinOrSop)
3366
+ return ThrowAndFail(NS_ERROR_INVALID_ARG, cx, _retval);
3367
+ }
3368
+
3369
+ rv = xpc_CreateSandboxObject(cx, vp, prinOrSop);
3370
+
3371
+ if (NS_FAILED(rv)) {
3372
+ return ThrowAndFail(rv, cx, _retval);
3373
+ }
3374
+
3375
+ *_retval = PR_TRUE;
3376
+
3377
+ return rv;
3378
+ #endif /* XPCONNECT_STANDALONE */
3379
+ }
3380
+
3381
+ class ContextHolder : public nsISupports
3382
+ {
3383
+ public:
3384
+ ContextHolder(JSContext *aOuterCx, JSObject *aSandbox);
3385
+
3386
+ JSContext * GetJSContext()
3387
+ {
3388
+ return mJSContext;
3389
+ }
3390
+
3391
+ NS_DECL_ISUPPORTS
3392
+
3393
+ private:
3394
+ static JSBool ContextHolderOperationCallback(JSContext *cx);
3395
+
3396
+ XPCAutoJSContext mJSContext;
3397
+ JSContext* mOrigCx;
3398
+ };
3399
+
3400
+ NS_IMPL_ISUPPORTS0(ContextHolder)
3401
+
3402
+ ContextHolder::ContextHolder(JSContext *aOuterCx, JSObject *aSandbox)
3403
+ : mJSContext(JS_NewContext(JS_GetRuntime(aOuterCx), 1024), JS_FALSE),
3404
+ mOrigCx(aOuterCx)
3405
+ {
3406
+ if(mJSContext)
3407
+ {
3408
+ JS_SetOptions(mJSContext,
3409
+ JSOPTION_DONT_REPORT_UNCAUGHT |
3410
+ JSOPTION_PRIVATE_IS_NSISUPPORTS);
3411
+ JS_SetGlobalObject(mJSContext, aSandbox);
3412
+ JS_SetContextPrivate(mJSContext, this);
3413
+ JS_SetOperationCallback(mJSContext, ContextHolderOperationCallback);
3414
+ }
3415
+ }
3416
+
3417
+ JSBool
3418
+ ContextHolder::ContextHolderOperationCallback(JSContext *cx)
3419
+ {
3420
+ ContextHolder* thisObject =
3421
+ static_cast<ContextHolder*>(JS_GetContextPrivate(cx));
3422
+ NS_ASSERTION(thisObject, "How did that happen?");
3423
+
3424
+ JSContext *origCx = thisObject->mOrigCx;
3425
+ JSOperationCallback callback = JS_GetOperationCallback(origCx);
3426
+ JSBool ok = JS_TRUE;
3427
+ if(callback)
3428
+ ok = callback(origCx);
3429
+ return ok;
3430
+ }
3431
+
3432
+ /***************************************************************************/
3433
+
3434
+ /* void evalInSandbox(in AString source, in nativeobj sandbox); */
3435
+ NS_IMETHODIMP
3436
+ nsXPCComponents_Utils::EvalInSandbox(const nsAString &source)
3437
+ {
3438
+ #ifdef XPCONNECT_STANDALONE
3439
+ return NS_ERROR_NOT_AVAILABLE;
3440
+ #else /* XPCONNECT_STANDALONE */
3441
+ nsresult rv;
3442
+
3443
+ nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv));
3444
+ if(NS_FAILED(rv))
3445
+ return rv;
3446
+
3447
+ // get the xpconnect native call context
3448
+ nsAXPCNativeCallContext *cc = nsnull;
3449
+ xpc->GetCurrentNativeCallContext(&cc);
3450
+ if(!cc)
3451
+ return NS_ERROR_FAILURE;
3452
+
3453
+ // Get JSContext of current call
3454
+ JSContext* cx;
3455
+ rv = cc->GetJSContext(&cx);
3456
+ if(NS_FAILED(rv) || !cx)
3457
+ return NS_ERROR_FAILURE;
3458
+
3459
+ // get place for return value
3460
+ jsval *rval = nsnull;
3461
+ rv = cc->GetRetValPtr(&rval);
3462
+ if(NS_FAILED(rv) || !rval)
3463
+ return NS_ERROR_FAILURE;
3464
+
3465
+ // get argc and argv and verify arg count
3466
+ PRUint32 argc;
3467
+ rv = cc->GetArgc(&argc);
3468
+ if(NS_FAILED(rv))
3469
+ return rv;
3470
+
3471
+ // The second argument is the sandbox object. It is required.
3472
+ if (argc < 2)
3473
+ return NS_ERROR_XPC_NOT_ENOUGH_ARGS;
3474
+
3475
+ jsval *argv;
3476
+ rv = cc->GetArgvPtr(&argv);
3477
+ if (NS_FAILED(rv))
3478
+ return rv;
3479
+
3480
+ JSObject *sandbox;
3481
+ char *jsVersionStr = NULL;
3482
+ char *filenameStr = NULL;
3483
+ PRInt32 lineNo = 0;
3484
+
3485
+ JSBool ok = JS_ConvertArguments(cx, argc, argv, "*o/ssi",
3486
+ &sandbox, &jsVersionStr,
3487
+ &filenameStr, &lineNo);
3488
+
3489
+ if (!ok)
3490
+ return NS_ERROR_INVALID_ARG;
3491
+
3492
+ JSVersion jsVersion = JSVERSION_DEFAULT;
3493
+
3494
+ // Optional third argument: JS version, as a string.
3495
+ if (jsVersionStr) {
3496
+ jsVersion = JS_StringToVersion(jsVersionStr);
3497
+ if (jsVersion == JSVERSION_UNKNOWN)
3498
+ return NS_ERROR_INVALID_ARG;
3499
+ }
3500
+
3501
+ nsXPIDLCString filename;
3502
+
3503
+ // Optional fourth and fifth arguments: filename and line number.
3504
+ if (filenameStr) {
3505
+ filename = filenameStr;
3506
+ } else {
3507
+ // Get the current source info from xpc.
3508
+ nsCOMPtr<nsIStackFrame> frame;
3509
+ xpc->GetCurrentJSStack(getter_AddRefs(frame));
3510
+ if (frame) {
3511
+ frame->GetFilename(getter_Copies(filename));
3512
+ frame->GetLineNumber(&lineNo);
3513
+ }
3514
+ }
3515
+
3516
+ rv = xpc_EvalInSandbox(cx, sandbox, source, filename.get(), lineNo,
3517
+ jsVersion, PR_FALSE, rval);
3518
+
3519
+ if (NS_SUCCEEDED(rv) && !JS_IsExceptionPending(cx))
3520
+ cc->SetReturnValueWasSet(PR_TRUE);
3521
+
3522
+ return rv;
3523
+ #endif /* XPCONNECT_STANDALONE */
3524
+ }
3525
+
3526
+ #ifndef XPCONNECT_STANDALONE
3527
+ nsresult
3528
+ xpc_EvalInSandbox(JSContext *cx, JSObject *sandbox, const nsAString& source,
3529
+ const char *filename, PRInt32 lineNo,
3530
+ JSVersion jsVersion, PRBool returnStringOnly, jsval *rval)
3531
+ {
3532
+ if (STOBJ_GET_CLASS(sandbox) != &SandboxClass)
3533
+ return NS_ERROR_INVALID_ARG;
3534
+
3535
+ nsIScriptObjectPrincipal *sop =
3536
+ (nsIScriptObjectPrincipal*)xpc_GetJSPrivate(sandbox);
3537
+ NS_ASSERTION(sop, "Invalid sandbox passed");
3538
+ nsCOMPtr<nsIPrincipal> prin = sop->GetPrincipal();
3539
+
3540
+ JSPrincipals *jsPrincipals;
3541
+
3542
+ if (!prin ||
3543
+ NS_FAILED(prin->GetJSPrincipals(cx, &jsPrincipals)) ||
3544
+ !jsPrincipals) {
3545
+ return NS_ERROR_FAILURE;
3546
+ }
3547
+
3548
+ nsRefPtr<ContextHolder> sandcx = new ContextHolder(cx, sandbox);
3549
+ if(!sandcx || !sandcx->GetJSContext()) {
3550
+ JS_ReportError(cx, "Can't prepare context for evalInSandbox");
3551
+ JSPRINCIPALS_DROP(cx, jsPrincipals);
3552
+ return NS_ERROR_OUT_OF_MEMORY;
3553
+ }
3554
+
3555
+ if (jsVersion != JSVERSION_DEFAULT)
3556
+ JS_SetVersion(sandcx->GetJSContext(), jsVersion);
3557
+
3558
+ XPCPerThreadData *data = XPCPerThreadData::GetData(cx);
3559
+ XPCJSContextStack *stack = nsnull;
3560
+ if (data && (stack = data->GetJSContextStack())) {
3561
+ if (NS_FAILED(stack->Push(sandcx->GetJSContext()))) {
3562
+ JS_ReportError(cx,
3563
+ "Unable to initialize XPConnect with the sandbox context");
3564
+ JSPRINCIPALS_DROP(cx, jsPrincipals);
3565
+ return NS_ERROR_FAILURE;
3566
+ }
3567
+ }
3568
+
3569
+ if (!filename) {
3570
+ // Default the filename to the codebase.
3571
+ filename = jsPrincipals->codebase;
3572
+ lineNo = 1;
3573
+ }
3574
+
3575
+ nsresult rv = NS_OK;
3576
+
3577
+ {
3578
+ AutoJSRequestWithNoCallContext req(sandcx->GetJSContext());
3579
+ JSString *str = nsnull;
3580
+ if (!JS_EvaluateUCScriptForPrincipals(sandcx->GetJSContext(), sandbox,
3581
+ jsPrincipals,
3582
+ reinterpret_cast<const jschar *>
3583
+ (PromiseFlatString(source).get()),
3584
+ source.Length(), filename, lineNo,
3585
+ rval) ||
3586
+ (returnStringOnly &&
3587
+ !JSVAL_IS_VOID(*rval) &&
3588
+ !(str = JS_ValueToString(sandcx->GetJSContext(), *rval)))) {
3589
+ jsval exn;
3590
+ if (JS_GetPendingException(sandcx->GetJSContext(), &exn)) {
3591
+ // Stash the exception in |cx| so we can execute code on
3592
+ // sandcx without a pending exception.
3593
+ {
3594
+ AutoJSSuspendRequestWithNoCallContext sus(sandcx->GetJSContext());
3595
+ AutoJSRequestWithNoCallContext cxreq(cx);
3596
+
3597
+ JS_SetPendingException(cx, exn);
3598
+ }
3599
+
3600
+ JS_ClearPendingException(sandcx->GetJSContext());
3601
+ if (returnStringOnly) {
3602
+ // The caller asked for strings only, convert the
3603
+ // exception into a string.
3604
+ str = JS_ValueToString(sandcx->GetJSContext(), exn);
3605
+
3606
+ AutoJSSuspendRequestWithNoCallContext sus(sandcx->GetJSContext());
3607
+ AutoJSRequestWithNoCallContext cxreq(cx);
3608
+ if (str) {
3609
+ // We converted the exception to a string. Use that
3610
+ // as the value exception.
3611
+ JS_SetPendingException(cx, STRING_TO_JSVAL(str));
3612
+ } else {
3613
+ JS_ClearPendingException(cx);
3614
+ rv = NS_ERROR_FAILURE;
3615
+ }
3616
+ }
3617
+
3618
+ // Clear str so we don't confuse callers.
3619
+ str = nsnull;
3620
+ } else {
3621
+ rv = NS_ERROR_OUT_OF_MEMORY;
3622
+ }
3623
+ }
3624
+
3625
+ if (str) {
3626
+ *rval = STRING_TO_JSVAL(str);
3627
+ }
3628
+ }
3629
+
3630
+ if (stack) {
3631
+ stack->Pop(nsnull);
3632
+ }
3633
+
3634
+ JSPRINCIPALS_DROP(cx, jsPrincipals);
3635
+
3636
+ return rv;
3637
+ }
3638
+ #endif /* !XPCONNECT_STANDALONE */
3639
+
3640
+ /* JSObject import (in AUTF8String registryLocation,
3641
+ * [optional] in JSObject targetObj);
3642
+ */
3643
+ NS_IMETHODIMP
3644
+ nsXPCComponents_Utils::Import(const nsACString & registryLocation)
3645
+ {
3646
+ #ifdef MOZ_JSLOADER
3647
+ nsCOMPtr<xpcIJSModuleLoader> moduleloader =
3648
+ do_GetService(MOZJSCOMPONENTLOADER_CONTRACTID);
3649
+ if (!moduleloader)
3650
+ return NS_ERROR_FAILURE;
3651
+ return moduleloader->Import(registryLocation);
3652
+ #else
3653
+ return NS_ERROR_NOT_AVAILABLE;
3654
+ #endif
3655
+ }
3656
+
3657
+ /* xpcIJSWeakReference getWeakReference (); */
3658
+ NS_IMETHODIMP
3659
+ nsXPCComponents_Utils::GetWeakReference(xpcIJSWeakReference **_retval)
3660
+ {
3661
+ nsRefPtr<xpcJSWeakReference> ref(new xpcJSWeakReference());
3662
+ if (!ref)
3663
+ return NS_ERROR_OUT_OF_MEMORY;
3664
+ ref->Init();
3665
+ *_retval = ref;
3666
+ NS_ADDREF(*_retval);
3667
+ return NS_OK;
3668
+ }
3669
+
3670
+ /* void forceGC (); */
3671
+ NS_IMETHODIMP
3672
+ nsXPCComponents_Utils::ForceGC()
3673
+ {
3674
+ nsXPConnect* xpc = nsXPConnect::GetXPConnect();
3675
+ if (!xpc)
3676
+ return NS_ERROR_FAILURE;
3677
+
3678
+ // get the xpconnect native call context
3679
+ nsAXPCNativeCallContext *cc = nsnull;
3680
+ nsresult rv = xpc->GetCurrentNativeCallContext(&cc);
3681
+ if (!cc)
3682
+ return rv;
3683
+
3684
+ // Get JSContext of current call
3685
+ JSContext* cx;
3686
+ cc->GetJSContext(&cx);
3687
+ if (!cx)
3688
+ return NS_ERROR_FAILURE;
3689
+
3690
+ JS_GC(cx);
3691
+
3692
+ return NS_OK;
3693
+ }
3694
+
3695
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
3696
+ /* string canCreateWrapper (in nsIIDPtr iid); */
3697
+ NS_IMETHODIMP
3698
+ nsXPCComponents_Utils::CanCreateWrapper(const nsIID * iid, char **_retval)
3699
+ {
3700
+ // We let anyone do this...
3701
+ *_retval = xpc_CloneAllAccess();
3702
+ return NS_OK;
3703
+ }
3704
+
3705
+ /* string canCallMethod (in nsIIDPtr iid, in wstring methodName); */
3706
+ NS_IMETHODIMP
3707
+ nsXPCComponents_Utils::CanCallMethod(const nsIID * iid, const PRUnichar *methodName, char **_retval)
3708
+ {
3709
+ static const char* allowed[] = { "lookupMethod", "evalInSandbox", nsnull };
3710
+ *_retval = xpc_CheckAccessList(methodName, allowed);
3711
+ return NS_OK;
3712
+ }
3713
+
3714
+ /* string canGetProperty (in nsIIDPtr iid, in wstring propertyName); */
3715
+ NS_IMETHODIMP
3716
+ nsXPCComponents_Utils::CanGetProperty(const nsIID * iid, const PRUnichar *propertyName, char **_retval)
3717
+ {
3718
+ *_retval = nsnull;
3719
+ return NS_OK;
3720
+ }
3721
+
3722
+ /* string canSetProperty (in nsIIDPtr iid, in wstring propertyName); */
3723
+ NS_IMETHODIMP
3724
+ nsXPCComponents_Utils::CanSetProperty(const nsIID * iid, const PRUnichar *propertyName, char **_retval)
3725
+ {
3726
+ // If you have to ask, then the answer is NO
3727
+ *_retval = nsnull;
3728
+ return NS_OK;
3729
+ }
3730
+ #endif
3731
+
3732
+ /***************************************************************************/
3733
+ /***************************************************************************/
3734
+ /***************************************************************************/
3735
+
3736
+ // XXXjband We ought to cache the wrapper in the object's slots rather than
3737
+ // re-wrapping on demand
3738
+
3739
+ NS_INTERFACE_MAP_BEGIN(nsXPCComponents)
3740
+ NS_INTERFACE_MAP_ENTRY(nsIXPCComponents)
3741
+ NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
3742
+ NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
3743
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
3744
+ NS_INTERFACE_MAP_ENTRY(nsISecurityCheckedComponent)
3745
+ #endif
3746
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPCComponents)
3747
+ NS_INTERFACE_MAP_END_THREADSAFE
3748
+
3749
+ NS_IMPL_THREADSAFE_ADDREF(nsXPCComponents)
3750
+ NS_IMPL_THREADSAFE_RELEASE(nsXPCComponents)
3751
+
3752
+ /* void getInterfaces (out PRUint32 count, [array, size_is (count), retval]
3753
+ out nsIIDPtr array); */
3754
+ NS_IMETHODIMP
3755
+ nsXPCComponents::GetInterfaces(PRUint32 *aCount, nsIID * **aArray)
3756
+ {
3757
+ PRUint32 count = 2;
3758
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
3759
+ ++count;
3760
+ #endif
3761
+ *aCount = count;
3762
+ nsIID **array;
3763
+ *aArray = array = static_cast<nsIID**>(nsMemory::Alloc(count * sizeof(nsIID*)));
3764
+ if(!array)
3765
+ return NS_ERROR_OUT_OF_MEMORY;
3766
+
3767
+ PRUint32 index = 0;
3768
+ nsIID* clone;
3769
+ #define PUSH_IID(id) \
3770
+ clone = static_cast<nsIID *>(nsMemory::Clone(&NS_GET_IID( id ), \
3771
+ sizeof(nsIID))); \
3772
+ if (!clone) \
3773
+ goto oom; \
3774
+ array[index++] = clone;
3775
+
3776
+ PUSH_IID(nsIXPCComponents)
3777
+ PUSH_IID(nsIXPCScriptable)
3778
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
3779
+ PUSH_IID(nsISecurityCheckedComponent)
3780
+ #endif
3781
+ #undef PUSH_IID
3782
+
3783
+ return NS_OK;
3784
+ oom:
3785
+ while (index)
3786
+ nsMemory::Free(array[--index]);
3787
+ nsMemory::Free(array);
3788
+ *aArray = nsnull;
3789
+ return NS_ERROR_OUT_OF_MEMORY;
3790
+ }
3791
+
3792
+ /* nsISupports getHelperForLanguage (in PRUint32 language); */
3793
+ NS_IMETHODIMP
3794
+ nsXPCComponents::GetHelperForLanguage(PRUint32 language,
3795
+ nsISupports **retval)
3796
+ {
3797
+ *retval = nsnull;
3798
+ return NS_OK;
3799
+ }
3800
+
3801
+ /* readonly attribute string contractID; */
3802
+ NS_IMETHODIMP
3803
+ nsXPCComponents::GetContractID(char * *aContractID)
3804
+ {
3805
+ *aContractID = nsnull;
3806
+ return NS_ERROR_NOT_AVAILABLE;
3807
+ }
3808
+
3809
+ /* readonly attribute string classDescription; */
3810
+ NS_IMETHODIMP
3811
+ nsXPCComponents::GetClassDescription(char * *aClassDescription)
3812
+ {
3813
+ static const char classDescription[] = "XPCComponents";
3814
+ *aClassDescription = (char*)nsMemory::Clone(classDescription, sizeof(classDescription));
3815
+ return *aClassDescription ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
3816
+ }
3817
+
3818
+ /* readonly attribute nsCIDPtr classID; */
3819
+ NS_IMETHODIMP
3820
+ nsXPCComponents::GetClassID(nsCID * *aClassID)
3821
+ {
3822
+ *aClassID = nsnull;
3823
+ return NS_OK;
3824
+ }
3825
+
3826
+ /* readonly attribute PRUint32 implementationLanguage; */
3827
+ NS_IMETHODIMP
3828
+ nsXPCComponents::GetImplementationLanguage(
3829
+ PRUint32 *aImplementationLanguage)
3830
+ {
3831
+ *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
3832
+ return NS_OK;
3833
+ }
3834
+
3835
+ /* readonly attribute PRUint32 flags; */
3836
+ NS_IMETHODIMP
3837
+ nsXPCComponents::GetFlags(PRUint32 *aFlags)
3838
+ {
3839
+ *aFlags = nsIClassInfo::THREADSAFE;
3840
+ return NS_OK;
3841
+ }
3842
+
3843
+ /* [notxpcom] readonly attribute nsCID classIDNoAlloc; */
3844
+ NS_IMETHODIMP
3845
+ nsXPCComponents::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
3846
+ {
3847
+ return NS_ERROR_NOT_AVAILABLE;
3848
+ }
3849
+
3850
+ nsXPCComponents::nsXPCComponents()
3851
+ : mInterfaces(nsnull),
3852
+ mInterfacesByID(nsnull),
3853
+ mClasses(nsnull),
3854
+ mClassesByID(nsnull),
3855
+ mResults(nsnull),
3856
+ mID(nsnull),
3857
+ mException(nsnull),
3858
+ mConstructor(nsnull),
3859
+ mUtils(nsnull)
3860
+ {
3861
+ }
3862
+
3863
+ nsXPCComponents::~nsXPCComponents()
3864
+ {
3865
+ ClearMembers();
3866
+ }
3867
+
3868
+ void
3869
+ nsXPCComponents::ClearMembers()
3870
+ {
3871
+ NS_IF_RELEASE(mInterfaces);
3872
+ NS_IF_RELEASE(mInterfacesByID);
3873
+ NS_IF_RELEASE(mClasses);
3874
+ NS_IF_RELEASE(mClassesByID);
3875
+ NS_IF_RELEASE(mResults);
3876
+ NS_IF_RELEASE(mID);
3877
+ NS_IF_RELEASE(mException);
3878
+ NS_IF_RELEASE(mConstructor);
3879
+ NS_IF_RELEASE(mUtils);
3880
+ }
3881
+
3882
+ /*******************************************/
3883
+ #define XPC_IMPL_GET_OBJ_METHOD(_b, _n) \
3884
+ NS_IMETHODIMP nsXPCComponents::Get##_n(_b##_n * *a##_n) { \
3885
+ NS_ENSURE_ARG_POINTER(a##_n); \
3886
+ if(!m##_n) { \
3887
+ if(!(m##_n = new nsXPCComponents_##_n())) { \
3888
+ *a##_n = nsnull; \
3889
+ return NS_ERROR_OUT_OF_MEMORY; \
3890
+ } \
3891
+ NS_ADDREF(m##_n); \
3892
+ } \
3893
+ NS_ADDREF(m##_n); \
3894
+ *a##_n = m##_n; \
3895
+ return NS_OK; \
3896
+ }
3897
+
3898
+ XPC_IMPL_GET_OBJ_METHOD(nsIScriptable, Interfaces)
3899
+ XPC_IMPL_GET_OBJ_METHOD(nsIScriptable, InterfacesByID)
3900
+ XPC_IMPL_GET_OBJ_METHOD(nsIXPCComponents_, Classes)
3901
+ XPC_IMPL_GET_OBJ_METHOD(nsIXPCComponents_, ClassesByID)
3902
+ XPC_IMPL_GET_OBJ_METHOD(nsIXPCComponents_, Results)
3903
+ XPC_IMPL_GET_OBJ_METHOD(nsIXPCComponents_, ID)
3904
+ XPC_IMPL_GET_OBJ_METHOD(nsIXPCComponents_, Exception)
3905
+ XPC_IMPL_GET_OBJ_METHOD(nsIXPCComponents_, Constructor)
3906
+ XPC_IMPL_GET_OBJ_METHOD(nsIXPCComponents_, Utils)
3907
+
3908
+ #undef XPC_IMPL_GET_OBJ_METHOD
3909
+ /*******************************************/
3910
+
3911
+ NS_IMETHODIMP
3912
+ nsXPCComponents::IsSuccessCode(nsresult result, PRBool *out)
3913
+ {
3914
+ *out = NS_SUCCEEDED(result);
3915
+ return NS_OK;
3916
+ }
3917
+
3918
+ NS_IMETHODIMP
3919
+ nsXPCComponents::GetStack(nsIStackFrame * *aStack)
3920
+ {
3921
+ nsresult rv;
3922
+ nsXPConnect* xpc = nsXPConnect::GetXPConnect();
3923
+ if(!xpc)
3924
+ return NS_ERROR_FAILURE;
3925
+ rv = xpc->GetCurrentJSStack(aStack);
3926
+ return rv;
3927
+ }
3928
+
3929
+ NS_IMETHODIMP
3930
+ nsXPCComponents::GetManager(nsIComponentManager * *aManager)
3931
+ {
3932
+ NS_ASSERTION(aManager, "bad param");
3933
+ return NS_GetComponentManager(aManager);
3934
+ }
3935
+
3936
+ /**********************************************/
3937
+
3938
+ // The nsIXPCScriptable map declaration that will generate stubs for us...
3939
+ #define XPC_MAP_CLASSNAME nsXPCComponents
3940
+ #define XPC_MAP_QUOTED_CLASSNAME "nsXPCComponents"
3941
+ #define XPC_MAP_WANT_NEWRESOLVE
3942
+ #define XPC_MAP_WANT_GETPROPERTY
3943
+ #define XPC_MAP_WANT_SETPROPERTY
3944
+ #define XPC_MAP_FLAGS nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE
3945
+ #include "xpc_map_end.h" /* This will #undef the above */
3946
+
3947
+ /* PRBool newResolve (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in PRUint32 flags, out JSObjectPtr objp); */
3948
+ NS_IMETHODIMP
3949
+ nsXPCComponents::NewResolve(nsIXPConnectWrappedNative *wrapper,
3950
+ JSContext * cx, JSObject * obj,
3951
+ jsval id, PRUint32 flags,
3952
+ JSObject * *objp, PRBool *_retval)
3953
+ {
3954
+ XPCJSRuntime* rt = nsXPConnect::GetRuntimeInstance();
3955
+ if(!rt)
3956
+ return NS_ERROR_FAILURE;
3957
+
3958
+ jsid idid;
3959
+ uintN attrs = 0;
3960
+
3961
+ if(id == rt->GetStringJSVal(XPCJSRuntime::IDX_LAST_RESULT))
3962
+ {
3963
+ idid = rt->GetStringID(XPCJSRuntime::IDX_LAST_RESULT);
3964
+ attrs = JSPROP_READONLY;
3965
+ }
3966
+ else if(id == rt->GetStringJSVal(XPCJSRuntime::IDX_RETURN_CODE))
3967
+ idid = rt->GetStringID(XPCJSRuntime::IDX_RETURN_CODE);
3968
+ else
3969
+ return NS_OK;
3970
+
3971
+ *objp = obj;
3972
+ *_retval = JS_DefinePropertyById(cx, obj, idid, JSVAL_VOID, nsnull, nsnull,
3973
+ JSPROP_ENUMERATE | JSPROP_PERMANENT |
3974
+ attrs);
3975
+ return NS_OK;
3976
+ }
3977
+
3978
+ /* PRBool getProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
3979
+ NS_IMETHODIMP
3980
+ nsXPCComponents::GetProperty(nsIXPConnectWrappedNative *wrapper,
3981
+ JSContext * cx, JSObject * obj,
3982
+ jsval id, jsval * vp, PRBool *_retval)
3983
+ {
3984
+ XPCContext* xpcc = XPCContext::GetXPCContext(cx);
3985
+ if(!xpcc)
3986
+ return NS_ERROR_FAILURE;
3987
+
3988
+ PRBool doResult = JS_FALSE;
3989
+ nsresult res;
3990
+ XPCJSRuntime* rt = xpcc->GetRuntime();
3991
+ if(id == rt->GetStringJSVal(XPCJSRuntime::IDX_LAST_RESULT))
3992
+ {
3993
+ res = xpcc->GetLastResult();
3994
+ doResult = JS_TRUE;
3995
+ }
3996
+ else if(id == rt->GetStringJSVal(XPCJSRuntime::IDX_RETURN_CODE))
3997
+ {
3998
+ res = xpcc->GetPendingResult();
3999
+ doResult = JS_TRUE;
4000
+ }
4001
+
4002
+ nsresult rv = NS_OK;
4003
+ if(doResult)
4004
+ {
4005
+ if(!JS_NewNumberValue(cx, (jsdouble) res, vp))
4006
+ return NS_ERROR_OUT_OF_MEMORY;
4007
+ rv = NS_SUCCESS_I_DID_SOMETHING;
4008
+ }
4009
+
4010
+ return rv;
4011
+ }
4012
+
4013
+ /* PRBool setProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
4014
+ NS_IMETHODIMP
4015
+ nsXPCComponents::SetProperty(nsIXPConnectWrappedNative *wrapper,
4016
+ JSContext * cx, JSObject * obj, jsval id,
4017
+ jsval * vp, PRBool *_retval)
4018
+ {
4019
+ XPCContext* xpcc = XPCContext::GetXPCContext(cx);
4020
+ if(!xpcc)
4021
+ return NS_ERROR_FAILURE;
4022
+
4023
+ XPCJSRuntime* rt = xpcc->GetRuntime();
4024
+ if(!rt)
4025
+ return NS_ERROR_FAILURE;
4026
+
4027
+ if(id == rt->GetStringJSVal(XPCJSRuntime::IDX_RETURN_CODE))
4028
+ {
4029
+ nsresult rv;
4030
+ if(JS_ValueToECMAUint32(cx, *vp, (uint32*)&rv))
4031
+ {
4032
+ xpcc->SetPendingResult(rv);
4033
+ xpcc->SetLastResult(rv);
4034
+ return NS_SUCCESS_I_DID_SOMETHING;
4035
+ }
4036
+ return NS_ERROR_FAILURE;
4037
+ }
4038
+
4039
+ return NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN;
4040
+ }
4041
+
4042
+ // static
4043
+ JSBool
4044
+ nsXPCComponents::AttachNewComponentsObject(XPCCallContext& ccx,
4045
+ XPCWrappedNativeScope* aScope,
4046
+ JSObject* aGlobal)
4047
+ {
4048
+ if(!aGlobal)
4049
+ return JS_FALSE;
4050
+
4051
+ nsXPCComponents* components = new nsXPCComponents();
4052
+ if(!components)
4053
+ return JS_FALSE;
4054
+
4055
+ nsCOMPtr<nsIXPCComponents> cholder(components);
4056
+
4057
+ AutoMarkingNativeInterfacePtr iface(ccx);
4058
+ iface = XPCNativeInterface::GetNewOrUsed(ccx, &NS_GET_IID(nsIXPCComponents));
4059
+
4060
+ if(!iface)
4061
+ return JS_FALSE;
4062
+
4063
+ nsCOMPtr<XPCWrappedNative> wrapper;
4064
+ XPCWrappedNative::GetNewOrUsed(ccx, cholder, aScope, iface, nsnull,
4065
+ OBJ_IS_NOT_GLOBAL, getter_AddRefs(wrapper));
4066
+ if(!wrapper)
4067
+ return JS_FALSE;
4068
+
4069
+ aScope->SetComponents(components);
4070
+
4071
+ jsid id = ccx.GetRuntime()->GetStringID(XPCJSRuntime::IDX_COMPONENTS);
4072
+ JSObject* obj;
4073
+
4074
+ return NS_SUCCEEDED(wrapper->GetJSObject(&obj)) &&
4075
+ obj && JS_DefinePropertyById(ccx, aGlobal, id, OBJECT_TO_JSVAL(obj),
4076
+ nsnull, nsnull,
4077
+ JSPROP_PERMANENT | JSPROP_READONLY);
4078
+ }
4079
+
4080
+ /* void lookupMethod (); */
4081
+ NS_IMETHODIMP nsXPCComponents::LookupMethod()
4082
+ {
4083
+ nsresult rv;
4084
+ nsCOMPtr<nsIXPCComponents_Utils> utils;
4085
+
4086
+ NS_WARNING("Components.lookupMethod deprecated, use Components.utils.lookupMethod");
4087
+ rv = GetUtils(getter_AddRefs(utils));
4088
+ if (NS_FAILED(rv))
4089
+ return rv;
4090
+
4091
+ return utils->LookupMethod();
4092
+ }
4093
+
4094
+ /* void reportError (); */
4095
+ NS_IMETHODIMP nsXPCComponents::ReportError()
4096
+ {
4097
+ nsresult rv;
4098
+ nsCOMPtr<nsIXPCComponents_Utils> utils;
4099
+
4100
+ NS_WARNING("Components.reportError deprecated, use Components.utils.reportError");
4101
+ rv = GetUtils(getter_AddRefs(utils));
4102
+ if (NS_FAILED(rv))
4103
+ return rv;
4104
+
4105
+ return utils->ReportError();
4106
+ }
4107
+
4108
+ #ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
4109
+ /* string canCreateWrapper (in nsIIDPtr iid); */
4110
+ NS_IMETHODIMP
4111
+ nsXPCComponents::CanCreateWrapper(const nsIID * iid, char **_retval)
4112
+ {
4113
+ // We let anyone do this...
4114
+ *_retval = xpc_CloneAllAccess();
4115
+ return NS_OK;
4116
+ }
4117
+
4118
+ /* string canCallMethod (in nsIIDPtr iid, in wstring methodName); */
4119
+ NS_IMETHODIMP
4120
+ nsXPCComponents::CanCallMethod(const nsIID * iid, const PRUnichar *methodName, char **_retval)
4121
+ {
4122
+ static const char* allowed[] = { "isSuccessCode", "lookupMethod", nsnull };
4123
+ *_retval = xpc_CheckAccessList(methodName, allowed);
4124
+ return NS_OK;
4125
+ }
4126
+
4127
+ /* string canGetProperty (in nsIIDPtr iid, in wstring propertyName); */
4128
+ NS_IMETHODIMP
4129
+ nsXPCComponents::CanGetProperty(const nsIID * iid, const PRUnichar *propertyName, char **_retval)
4130
+ {
4131
+ static const char* allowed[] = { "interfaces", "interfacesByID", "results", nsnull};
4132
+ *_retval = xpc_CheckAccessList(propertyName, allowed);
4133
+ return NS_OK;
4134
+ }
4135
+
4136
+ /* string canSetProperty (in nsIIDPtr iid, in wstring propertyName); */
4137
+ NS_IMETHODIMP
4138
+ nsXPCComponents::CanSetProperty(const nsIID * iid, const PRUnichar *propertyName, char **_retval)
4139
+ {
4140
+ // If you have to ask, then the answer is NO
4141
+ *_retval = nsnull;
4142
+ return NS_OK;
4143
+ }
4144
+ #endif