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.
- data/CHANGELOG.rdoc +8 -0
- data/Manifest.txt +762 -48
- data/README.rdoc +2 -1
- data/Rakefile +90 -18
- data/ext/spidermonkey/conversions.c +9 -2
- data/ext/spidermonkey/ruby_land_proxy.c +1 -1
- data/ext/spidermonkey/runtime.h +1 -1
- data/ext/tracemonkey/context.cc +125 -0
- data/ext/tracemonkey/context.h +19 -0
- data/ext/tracemonkey/conversions.cc +365 -0
- data/ext/tracemonkey/conversions.h +32 -0
- data/ext/tracemonkey/debugger.cc +234 -0
- data/ext/tracemonkey/debugger.h +10 -0
- data/ext/tracemonkey/extconf.rb +37 -0
- data/ext/tracemonkey/extensions.cc +37 -0
- data/ext/tracemonkey/extensions.h +12 -0
- data/ext/tracemonkey/global.cc +40 -0
- data/ext/tracemonkey/global.h +11 -0
- data/ext/tracemonkey/idhash.cc +16 -0
- data/ext/tracemonkey/idhash.h +8 -0
- data/ext/tracemonkey/immutable_node.cc +1199 -0
- data/ext/tracemonkey/immutable_node.cc.erb +559 -0
- data/ext/tracemonkey/immutable_node.h +22 -0
- data/ext/tracemonkey/jroot.h +215 -0
- data/ext/tracemonkey/js_land_proxy.cc +620 -0
- data/ext/tracemonkey/js_land_proxy.h +20 -0
- data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
- data/ext/tracemonkey/ruby_land_proxy.h +38 -0
- data/ext/tracemonkey/runtime.cc +454 -0
- data/ext/tracemonkey/runtime.h +27 -0
- data/ext/tracemonkey/split_global.cc +392 -0
- data/ext/tracemonkey/split_global.h +11 -0
- data/ext/tracemonkey/tracemonkey.cc +23 -0
- data/ext/tracemonkey/tracemonkey.h +32 -0
- data/lib/johnson.rb +12 -4
- data/lib/johnson/error.rb +5 -0
- data/lib/johnson/js/prelude.js +16 -1
- data/lib/johnson/parser.rb +2 -1
- data/lib/johnson/runtime.rb +87 -26
- data/lib/johnson/spidermonkey/runtime.rb +7 -16
- data/lib/johnson/tracemonkey.rb +13 -0
- data/lib/johnson/tracemonkey/context.rb +10 -0
- data/lib/johnson/tracemonkey/debugger.rb +67 -0
- data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
- data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
- data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
- data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
- data/lib/johnson/tracemonkey/runtime.rb +80 -0
- data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
- data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
- data/test/helper.rb +23 -4
- data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
- data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
- data/test/johnson/generic/conversions/helper.rb +1 -0
- data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
- data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
- data/test/johnson/generic/default_test.rb +12 -0
- data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
- data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
- data/test/johnson/generic/helper.rb +1 -0
- data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
- data/test/johnson/generic/nodes/export_test.rb +11 -0
- data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
- data/test/johnson/generic/nodes/helper.rb +1 -0
- data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
- data/test/johnson/generic/nodes/import_test.rb +15 -0
- data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
- data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
- data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
- data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
- data/test/johnson/generic/version_test.rb +13 -0
- data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
- data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
- data/test/johnson/generic/visitors/helper.rb +1 -0
- data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
- data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
- data/test/johnson/tracemonkey/context_test.rb +21 -0
- data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
- data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
- data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
- data/test/johnson/tracemonkey/runtime_test.rb +41 -0
- data/test/johnson/tracemonkey/split_global_test.rb +32 -0
- data/vendor/spidermonkey/js.pkg +2 -0
- data/vendor/tracemonkey/Makefile.in +668 -0
- data/vendor/tracemonkey/Makefile.ref +483 -0
- data/vendor/tracemonkey/README.html +54 -0
- data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
- data/vendor/tracemonkey/Y.js +19 -0
- data/vendor/tracemonkey/aclocal.m4 +9 -0
- data/vendor/tracemonkey/bench.sh +5 -0
- data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
- data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
- data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
- data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
- data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
- data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
- data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
- data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
- data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
- data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
- data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
- data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
- data/vendor/tracemonkey/build/hcc +111 -0
- data/vendor/tracemonkey/build/hcpp +155 -0
- data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
- data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
- data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
- data/vendor/tracemonkey/builtins.tbl +91 -0
- data/vendor/tracemonkey/call.js +13 -0
- data/vendor/tracemonkey/config.mk +206 -0
- data/vendor/tracemonkey/config/Makefile.in +106 -0
- data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
- data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
- data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
- data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
- data/vendor/tracemonkey/config/config.mk +881 -0
- data/vendor/tracemonkey/config/fastcwd.pl +66 -0
- data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
- data/vendor/tracemonkey/config/insure.mk +53 -0
- data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
- data/vendor/tracemonkey/config/milestone.pl +112 -0
- data/vendor/tracemonkey/config/milestone.txt +13 -0
- data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
- data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
- data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
- data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
- data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
- data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
- data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
- data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
- data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
- data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
- data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
- data/vendor/tracemonkey/config/nfspwd.pl +50 -0
- data/vendor/tracemonkey/config/nsinstall.c +481 -0
- data/vendor/tracemonkey/config/nsinstall.py +155 -0
- data/vendor/tracemonkey/config/pathsub.c +247 -0
- data/vendor/tracemonkey/config/pathsub.h +74 -0
- data/vendor/tracemonkey/config/preprocessor.pl +671 -0
- data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
- data/vendor/tracemonkey/config/revdepth.pl +51 -0
- data/vendor/tracemonkey/config/rules.mk +2310 -0
- data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
- data/vendor/tracemonkey/config/static-checking.js +92 -0
- data/vendor/tracemonkey/config/string-format.js +61 -0
- data/vendor/tracemonkey/config/system-headers +1035 -0
- data/vendor/tracemonkey/config/version.mk +85 -0
- data/vendor/tracemonkey/config/version_win.pl +442 -0
- data/vendor/tracemonkey/configure +14183 -0
- data/vendor/tracemonkey/configure.in +5363 -0
- data/vendor/tracemonkey/correct.sh +23 -0
- data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
- data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
- data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
- data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
- data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
- data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
- data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
- data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
- data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
- data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
- data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
- data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
- data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
- data/vendor/tracemonkey/correct/check-mont.js +119 -0
- data/vendor/tracemonkey/dtoa.c +3335 -0
- data/vendor/tracemonkey/editline/Makefile.in +55 -0
- data/vendor/tracemonkey/editline/Makefile.ref +143 -0
- data/vendor/tracemonkey/editline/README +83 -0
- data/vendor/tracemonkey/editline/editline.3 +175 -0
- data/vendor/tracemonkey/editline/editline.c +1371 -0
- data/vendor/tracemonkey/editline/editline.h +135 -0
- data/vendor/tracemonkey/editline/sysunix.c +182 -0
- data/vendor/tracemonkey/editline/unix.h +82 -0
- data/vendor/tracemonkey/if.js +13 -0
- data/vendor/tracemonkey/imacro_asm.js.in +396 -0
- data/vendor/tracemonkey/imacros.c.out +1034 -0
- data/vendor/tracemonkey/imacros.jsasm +770 -0
- data/vendor/tracemonkey/javascript-trace.d +73 -0
- data/vendor/tracemonkey/jitstats.tbl +55 -0
- data/vendor/tracemonkey/js-config.h.in +82 -0
- data/vendor/tracemonkey/js-config.in +111 -0
- data/vendor/tracemonkey/js.mdp +0 -0
- data/vendor/tracemonkey/js.msg +312 -0
- data/vendor/tracemonkey/js3240.rc +79 -0
- data/vendor/tracemonkey/jsOS240.def +654 -0
- data/vendor/tracemonkey/jsapi.cpp +6005 -0
- data/vendor/tracemonkey/jsapi.h +2727 -0
- data/vendor/tracemonkey/jsarena.cpp +450 -0
- data/vendor/tracemonkey/jsarena.h +318 -0
- data/vendor/tracemonkey/jsarray.cpp +3664 -0
- data/vendor/tracemonkey/jsarray.h +238 -0
- data/vendor/tracemonkey/jsatom.cpp +1244 -0
- data/vendor/tracemonkey/jsatom.h +493 -0
- data/vendor/tracemonkey/jsbit.h +249 -0
- data/vendor/tracemonkey/jsbool.cpp +184 -0
- data/vendor/tracemonkey/jsbool.h +88 -0
- data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
- data/vendor/tracemonkey/jsbuiltins.h +456 -0
- data/vendor/tracemonkey/jsclist.h +139 -0
- data/vendor/tracemonkey/jscntxt.cpp +1816 -0
- data/vendor/tracemonkey/jscntxt.h +1541 -0
- data/vendor/tracemonkey/jscompat.h +57 -0
- data/vendor/tracemonkey/jsconfig.mk +181 -0
- data/vendor/tracemonkey/jscpucfg.cpp +194 -0
- data/vendor/tracemonkey/jscpucfg.h +91 -0
- data/vendor/tracemonkey/jsdate.cpp +2465 -0
- data/vendor/tracemonkey/jsdate.h +129 -0
- data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
- data/vendor/tracemonkey/jsdbgapi.h +500 -0
- data/vendor/tracemonkey/jsdhash.cpp +876 -0
- data/vendor/tracemonkey/jsdhash.h +588 -0
- data/vendor/tracemonkey/jsdtoa.cpp +572 -0
- data/vendor/tracemonkey/jsdtoa.h +131 -0
- data/vendor/tracemonkey/jsdtracef.c +318 -0
- data/vendor/tracemonkey/jsdtracef.h +81 -0
- data/vendor/tracemonkey/jsemit.cpp +7292 -0
- data/vendor/tracemonkey/jsemit.h +802 -0
- data/vendor/tracemonkey/jsexn.cpp +1337 -0
- data/vendor/tracemonkey/jsexn.h +96 -0
- data/vendor/tracemonkey/jsfile.cpp +2747 -0
- data/vendor/tracemonkey/jsfile.h +56 -0
- data/vendor/tracemonkey/jsfile.msg +90 -0
- data/vendor/tracemonkey/jsfun.cpp +3089 -0
- data/vendor/tracemonkey/jsfun.h +366 -0
- data/vendor/tracemonkey/jsgc.cpp +3816 -0
- data/vendor/tracemonkey/jsgc.h +429 -0
- data/vendor/tracemonkey/jshash.cpp +477 -0
- data/vendor/tracemonkey/jshash.h +151 -0
- data/vendor/tracemonkey/jsify.pl +483 -0
- data/vendor/tracemonkey/jsinterp.cpp +7441 -0
- data/vendor/tracemonkey/jsinterp.h +666 -0
- data/vendor/tracemonkey/jsinvoke.cpp +42 -0
- data/vendor/tracemonkey/jsiter.cpp +1040 -0
- data/vendor/tracemonkey/jsiter.h +140 -0
- data/vendor/tracemonkey/jskeyword.tbl +124 -0
- data/vendor/tracemonkey/jskwgen.cpp +460 -0
- data/vendor/tracemonkey/jslibmath.h +69 -0
- data/vendor/tracemonkey/jslock.cpp +1512 -0
- data/vendor/tracemonkey/jslock.h +325 -0
- data/vendor/tracemonkey/jslocko.asm +60 -0
- data/vendor/tracemonkey/jslog2.cpp +111 -0
- data/vendor/tracemonkey/jslong.h +167 -0
- data/vendor/tracemonkey/jsmath.cpp +806 -0
- data/vendor/tracemonkey/jsmath.h +63 -0
- data/vendor/tracemonkey/jsnum.cpp +1374 -0
- data/vendor/tracemonkey/jsnum.h +280 -0
- data/vendor/tracemonkey/jsobj.cpp +6165 -0
- data/vendor/tracemonkey/jsobj.h +870 -0
- data/vendor/tracemonkey/json.cpp +1338 -0
- data/vendor/tracemonkey/json.h +108 -0
- data/vendor/tracemonkey/jsopcode.cpp +5484 -0
- data/vendor/tracemonkey/jsopcode.h +434 -0
- data/vendor/tracemonkey/jsopcode.tbl +591 -0
- data/vendor/tracemonkey/jsoplengen.cpp +121 -0
- data/vendor/tracemonkey/jsotypes.h +202 -0
- data/vendor/tracemonkey/jsparse.cpp +9257 -0
- data/vendor/tracemonkey/jsparse.h +900 -0
- data/vendor/tracemonkey/jsprf.cpp +1262 -0
- data/vendor/tracemonkey/jsprf.h +150 -0
- data/vendor/tracemonkey/jsproto.tbl +117 -0
- data/vendor/tracemonkey/jsprvtd.h +366 -0
- data/vendor/tracemonkey/jspubtd.h +585 -0
- data/vendor/tracemonkey/jsregexp.cpp +5051 -0
- data/vendor/tracemonkey/jsregexp.h +199 -0
- data/vendor/tracemonkey/jsreops.tbl +145 -0
- data/vendor/tracemonkey/jsscan.cpp +2040 -0
- data/vendor/tracemonkey/jsscan.h +467 -0
- data/vendor/tracemonkey/jsscope.cpp +1966 -0
- data/vendor/tracemonkey/jsscope.h +487 -0
- data/vendor/tracemonkey/jsscript.cpp +1932 -0
- data/vendor/tracemonkey/jsscript.h +345 -0
- data/vendor/tracemonkey/jsshell.msg +54 -0
- data/vendor/tracemonkey/jsstack.js +167 -0
- data/vendor/tracemonkey/jsstaticcheck.h +69 -0
- data/vendor/tracemonkey/jsstddef.h +87 -0
- data/vendor/tracemonkey/jsstdint.h +96 -0
- data/vendor/tracemonkey/jsstr.cpp +5277 -0
- data/vendor/tracemonkey/jsstr.h +702 -0
- data/vendor/tracemonkey/jstracer.cpp +10991 -0
- data/vendor/tracemonkey/jstracer.h +794 -0
- data/vendor/tracemonkey/jstypes.h +481 -0
- data/vendor/tracemonkey/jsutil.cpp +361 -0
- data/vendor/tracemonkey/jsutil.h +178 -0
- data/vendor/tracemonkey/jsversion.h +243 -0
- data/vendor/tracemonkey/jswince.asm +44 -0
- data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
- data/vendor/tracemonkey/jsxdrapi.h +220 -0
- data/vendor/tracemonkey/jsxml.cpp +8327 -0
- data/vendor/tracemonkey/jsxml.h +305 -0
- data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
- data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
- data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
- data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
- data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
- data/vendor/tracemonkey/liveconnect/README.html +712 -0
- data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
- data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
- data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
- data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
- data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
- data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
- data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
- data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
- data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
- data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
- data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
- data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
- data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
- data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
- data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
- data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
- data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
- data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
- data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
- data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
- data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
- data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
- data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
- data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
- data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
- data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
- data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
- data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
- data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
- data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
- data/vendor/tracemonkey/lock_SunOS.s +119 -0
- data/vendor/tracemonkey/mandelbrot-results.js +3 -0
- data/vendor/tracemonkey/math-partial-sums.js +32 -0
- data/vendor/tracemonkey/math-trace-tests.js +507 -0
- data/vendor/tracemonkey/md5.js +289 -0
- data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
- data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
- data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
- data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
- data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
- data/vendor/tracemonkey/nanojit/LIR.h +879 -0
- data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
- data/vendor/tracemonkey/nanojit/Native.h +127 -0
- data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
- data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
- data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
- data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
- data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
- data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
- data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
- data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
- data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
- data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
- data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
- data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
- data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
- data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
- data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
- data/vendor/tracemonkey/perfect.js +39 -0
- data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
- data/vendor/tracemonkey/prmjtime.cpp +869 -0
- data/vendor/tracemonkey/prmjtime.h +103 -0
- data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
- data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
- data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
- data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
- data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
- data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
- data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
- data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
- data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
- data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
- data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
- data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
- data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
- data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
- data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
- data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
- data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
- data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
- data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
- data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
- data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
- data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
- data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
- data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
- data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
- data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
- data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
- data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
- data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
- data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
- data/vendor/tracemonkey/resource.h +15 -0
- data/vendor/tracemonkey/rules.mk +206 -0
- data/vendor/tracemonkey/shell/Makefile.in +72 -0
- data/vendor/tracemonkey/shell/js.cpp +4719 -0
- data/vendor/tracemonkey/t/3d-cube.js +337 -0
- data/vendor/tracemonkey/t/3d-morph.js +54 -0
- data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
- data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
- data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
- data/vendor/tracemonkey/t/access-nbody.js +169 -0
- data/vendor/tracemonkey/t/access-nsieve.js +38 -0
- data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
- data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
- data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
- data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
- data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
- data/vendor/tracemonkey/t/crypto-aes.js +422 -0
- data/vendor/tracemonkey/t/crypto-md5.js +286 -0
- data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
- data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
- data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
- data/vendor/tracemonkey/t/math-cordic.js +95 -0
- data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
- data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
- data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
- data/vendor/tracemonkey/t/string-base64.js +135 -0
- data/vendor/tracemonkey/t/string-fasta.js +85 -0
- data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
- data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
- data/vendor/tracemonkey/t/string-validate-input.js +89 -0
- data/vendor/tracemonkey/time.sh +13 -0
- data/vendor/tracemonkey/trace-test.js +5564 -0
- data/vendor/tracemonkey/v8/base.js +187 -0
- data/vendor/tracemonkey/v8/crypto.js +1689 -0
- data/vendor/tracemonkey/v8/deltablue.js +880 -0
- data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
- data/vendor/tracemonkey/v8/raytrace.js +3418 -0
- data/vendor/tracemonkey/v8/richards.js +539 -0
- data/vendor/tracemonkey/v8/run-crypto.js +44 -0
- data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
- data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
- data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
- data/vendor/tracemonkey/v8/run-richards.js +44 -0
- data/vendor/tracemonkey/v8/run.js +49 -0
- data/vendor/tracemonkey/vprof/readme.txt +93 -0
- data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
- data/vendor/tracemonkey/vprof/vprof.h +245 -0
- data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
- data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
- data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
- data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
- data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
- data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
- data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
- data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
- data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
- data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
- data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
- data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
- data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
- data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
- data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
- data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
- data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
- data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
- data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
- data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
- data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
- data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
- data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
- data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
- data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
- data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
- data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
- data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
- data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
- data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
- data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
- data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
- data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
- data/vendor/tracemonkey/xpconnect/sample/README +39 -0
- data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
- data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
- data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
- data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
- data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
- data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
- data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
- data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
- data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
- data/vendor/tracemonkey/xpconnect/src/README +3 -0
- data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
- data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
- data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
- data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
- data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
- data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
- data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
- data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
- data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
- data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
- data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
- data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
- data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
- data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
- data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
- data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
- data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
- data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
- data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
- data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
- data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
- data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
- data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
- data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
- data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
- data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
- data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
- data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
- data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
- data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
- data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
- data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
- data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
- data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
- data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
- data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
- data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
- data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
- data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
- data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
- data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
- data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
- data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
- data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
- data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
- data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
- data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
- data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
- data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
- data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
- data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
- data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
- data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
- data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
- data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
- data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
- data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
- data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
- data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
- data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
- data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
- data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
- data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
- data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
- data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
- data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
- data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
- metadata +782 -107
- data/test/johnson/nodes/export_test.rb +0 -9
- data/test/johnson/nodes/import_test.rb +0 -13
- data/test/johnson/version_test.rb +0 -13
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
2
|
+
*
|
|
3
|
+
* ***** BEGIN LICENSE BLOCK *****
|
|
4
|
+
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
5
|
+
*
|
|
6
|
+
* The contents of this file are subject to the Mozilla Public License Version
|
|
7
|
+
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
8
|
+
* the License. You may obtain a copy of the License at
|
|
9
|
+
* http://www.mozilla.org/MPL/
|
|
10
|
+
*
|
|
11
|
+
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
12
|
+
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
13
|
+
* for the specific language governing rights and limitations under the
|
|
14
|
+
* License.
|
|
15
|
+
*
|
|
16
|
+
* The Original Code is Mozilla Communicator client code, released
|
|
17
|
+
* March 31, 1998.
|
|
18
|
+
*
|
|
19
|
+
* The Initial Developer of the Original Code is
|
|
20
|
+
* Netscape Communications Corporation.
|
|
21
|
+
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
22
|
+
* the Initial Developer. All Rights Reserved.
|
|
23
|
+
*
|
|
24
|
+
* Contributor(s):
|
|
25
|
+
* John Bandhauer <jband@netscape.com> (original author)
|
|
26
|
+
*
|
|
27
|
+
* Alternatively, the contents of this file may be used under the terms of
|
|
28
|
+
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
29
|
+
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
30
|
+
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
31
|
+
* of those above. If you wish to allow use of your version of this file only
|
|
32
|
+
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
33
|
+
* use your version of this file under the terms of the MPL, indicate your
|
|
34
|
+
* decision by deleting the provisions above and replace them with the notice
|
|
35
|
+
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
36
|
+
* the provisions above, a recipient may use your version of this file under
|
|
37
|
+
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
38
|
+
*
|
|
39
|
+
* ***** END LICENSE BLOCK ***** */
|
|
40
|
+
|
|
41
|
+
/* Module level methods. */
|
|
42
|
+
|
|
43
|
+
#include "xpcprivate.h"
|
|
44
|
+
#ifdef MOZ_JSLOADER
|
|
45
|
+
#include "mozJSLoaderConstructors.h"
|
|
46
|
+
#endif
|
|
47
|
+
|
|
48
|
+
/* Module implementation for the xpconnect library. */
|
|
49
|
+
|
|
50
|
+
NS_DECL_CLASSINFO(XPCVariant)
|
|
51
|
+
|
|
52
|
+
// {DC524540-487E-4501-9AC7-AAA784B17C1C}
|
|
53
|
+
#define XPCVARIANT_CID \
|
|
54
|
+
{0xdc524540, 0x487e, 0x4501, \
|
|
55
|
+
{ 0x9a, 0xc7, 0xaa, 0xa7, 0x84, 0xb1, 0x7c, 0x1c } }
|
|
56
|
+
|
|
57
|
+
#define XPCVARIANT_CONTRACTID "@mozilla.org/xpcvariant;1"
|
|
58
|
+
#define XPC_JSCONTEXT_STACK_ITERATOR_CONTRACTID "@mozilla.org/js/xpc/ContextStackIterator;1"
|
|
59
|
+
|
|
60
|
+
// {FE4F7592-C1FC-4662-AC83-538841318803}
|
|
61
|
+
#define SCRIPTABLE_INTERFACES_CID \
|
|
62
|
+
{0xfe4f7592, 0xc1fc, 0x4662, \
|
|
63
|
+
{ 0xac, 0x83, 0x53, 0x88, 0x41, 0x31, 0x88, 0x3 } }
|
|
64
|
+
|
|
65
|
+
NS_GENERIC_FACTORY_CONSTRUCTOR(nsJSID)
|
|
66
|
+
NS_GENERIC_FACTORY_CONSTRUCTOR(nsXPCException)
|
|
67
|
+
NS_GENERIC_FACTORY_CONSTRUCTOR(nsXPCJSContextStackIterator)
|
|
68
|
+
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIXPConnect, nsXPConnect::GetSingleton)
|
|
69
|
+
NS_GENERIC_FACTORY_CONSTRUCTOR(nsScriptError)
|
|
70
|
+
NS_GENERIC_FACTORY_CONSTRUCTOR(nsXPCComponents_Interfaces)
|
|
71
|
+
|
|
72
|
+
#ifdef XPC_IDISPATCH_SUPPORT
|
|
73
|
+
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIDispatchSupport, nsDispatchSupport::GetSingleton)
|
|
74
|
+
#endif
|
|
75
|
+
|
|
76
|
+
NS_DECL_CLASSINFO(nsXPCException)
|
|
77
|
+
|
|
78
|
+
#ifdef XPCONNECT_STANDALONE
|
|
79
|
+
#define NO_SUBSCRIPT_LOADER
|
|
80
|
+
#endif
|
|
81
|
+
|
|
82
|
+
static const nsModuleComponentInfo components[] = {
|
|
83
|
+
{nsnull, NS_JS_ID_CID, XPC_ID_CONTRACTID, nsJSIDConstructor },
|
|
84
|
+
{nsnull, NS_XPCONNECT_CID, XPC_XPCONNECT_CONTRACTID, nsIXPConnectConstructor },
|
|
85
|
+
{nsnull, NS_XPC_THREAD_JSCONTEXT_STACK_CID, XPC_CONTEXT_STACK_CONTRACTID, nsIXPConnectConstructor },
|
|
86
|
+
{nsnull, NS_XPCEXCEPTION_CID, XPC_EXCEPTION_CONTRACTID, nsXPCExceptionConstructor, nsnull, nsnull, nsnull, NS_CI_INTERFACE_GETTER_NAME(nsXPCException), nsnull, &NS_CLASSINFO_NAME(nsXPCException), nsIClassInfo::DOM_OBJECT },
|
|
87
|
+
{nsnull, NS_JS_RUNTIME_SERVICE_CID, XPC_RUNTIME_CONTRACTID, nsIXPConnectConstructor},
|
|
88
|
+
{NS_SCRIPTERROR_CLASSNAME, NS_SCRIPTERROR_CID, NS_SCRIPTERROR_CONTRACTID, nsScriptErrorConstructor },
|
|
89
|
+
{nsnull, SCRIPTABLE_INTERFACES_CID, NS_SCRIPTABLE_INTERFACES_CONTRACTID, nsXPCComponents_InterfacesConstructor, 0, 0, 0, 0, 0, 0, nsIClassInfo::THREADSAFE },
|
|
90
|
+
{nsnull, XPCVARIANT_CID, XPCVARIANT_CONTRACTID, nsnull, nsnull, nsnull, nsnull, NS_CI_INTERFACE_GETTER_NAME(XPCVariant), nsnull, &NS_CLASSINFO_NAME(XPCVariant)},
|
|
91
|
+
{nsnull, NS_XPC_JSCONTEXT_STACK_ITERATOR_CID, XPC_JSCONTEXT_STACK_ITERATOR_CONTRACTID, nsXPCJSContextStackIteratorConstructor }
|
|
92
|
+
|
|
93
|
+
#ifdef MOZ_JSLOADER
|
|
94
|
+
// jsloader stuff
|
|
95
|
+
,{ "JS component loader", MOZJSCOMPONENTLOADER_CID,
|
|
96
|
+
MOZJSCOMPONENTLOADER_CONTRACTID, mozJSComponentLoaderConstructor,
|
|
97
|
+
RegisterJSLoader, UnregisterJSLoader }
|
|
98
|
+
#ifndef NO_SUBSCRIPT_LOADER
|
|
99
|
+
,{ "JS subscript loader", MOZ_JSSUBSCRIPTLOADER_CID,
|
|
100
|
+
mozJSSubScriptLoadContractID, mozJSSubScriptLoaderConstructor }
|
|
101
|
+
#endif
|
|
102
|
+
#endif
|
|
103
|
+
#ifdef XPC_IDISPATCH_SUPPORT
|
|
104
|
+
,{ nsnull, NS_IDISPATCH_SUPPORT_CID, NS_IDISPATCH_SUPPORT_CONTRACTID,
|
|
105
|
+
nsIDispatchSupportConstructor }
|
|
106
|
+
#endif
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
static nsresult
|
|
110
|
+
xpcModuleCtor(nsIModule* self)
|
|
111
|
+
{
|
|
112
|
+
nsXPConnect::InitStatics();
|
|
113
|
+
nsXPCException::InitStatics();
|
|
114
|
+
XPCWrappedNativeScope::InitStatics();
|
|
115
|
+
XPCPerThreadData::InitStatics();
|
|
116
|
+
|
|
117
|
+
#ifdef XPC_IDISPATCH_SUPPORT
|
|
118
|
+
XPCIDispatchExtension::InitStatics();
|
|
119
|
+
#endif
|
|
120
|
+
|
|
121
|
+
return NS_OK;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
static void
|
|
125
|
+
xpcModuleDtor(nsIModule* self)
|
|
126
|
+
{
|
|
127
|
+
// Release our singletons
|
|
128
|
+
nsXPConnect::ReleaseXPConnectSingleton();
|
|
129
|
+
xpc_DestroyJSxIDClassObjects();
|
|
130
|
+
#ifdef XPC_IDISPATCH_SUPPORT
|
|
131
|
+
nsDispatchSupport::FreeSingleton();
|
|
132
|
+
XPCIDispatchClassInfo::FreeSingleton();
|
|
133
|
+
#endif
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
NS_IMPL_NSGETMODULE_WITH_CTOR_DTOR(xpconnect, components, xpcModuleCtor, xpcModuleDtor)
|
|
@@ -0,0 +1,4138 @@
|
|
|
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
|
+
* Mike Shaver <shaver@mozilla.org>
|
|
28
|
+
* Mark Hammond <MarkH@ActiveState.com>
|
|
29
|
+
*
|
|
30
|
+
* Alternatively, the contents of this file may be used under the terms of
|
|
31
|
+
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
32
|
+
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
33
|
+
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
34
|
+
* of those above. If you wish to allow use of your version of this file only
|
|
35
|
+
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
36
|
+
* use your version of this file under the terms of the MPL, indicate your
|
|
37
|
+
* decision by deleting the provisions above and replace them with the notice
|
|
38
|
+
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
39
|
+
* the provisions above, a recipient may use your version of this file under
|
|
40
|
+
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
41
|
+
*
|
|
42
|
+
* ***** END LICENSE BLOCK ***** */
|
|
43
|
+
|
|
44
|
+
/* All the XPConnect private declarations - only include locally. */
|
|
45
|
+
|
|
46
|
+
#ifndef xpcprivate_h___
|
|
47
|
+
#define xpcprivate_h___
|
|
48
|
+
|
|
49
|
+
#include <string.h>
|
|
50
|
+
#include <stdlib.h>
|
|
51
|
+
#include <stdarg.h>
|
|
52
|
+
#include <math.h>
|
|
53
|
+
#include "nscore.h"
|
|
54
|
+
#include "nsXPCOM.h"
|
|
55
|
+
#include "nsAutoPtr.h"
|
|
56
|
+
#include "nsCycleCollectionParticipant.h"
|
|
57
|
+
#include "nsCycleCollector.h"
|
|
58
|
+
#include "nsISupports.h"
|
|
59
|
+
#include "nsIServiceManager.h"
|
|
60
|
+
#include "nsIClassInfoImpl.h"
|
|
61
|
+
#include "nsIComponentManager.h"
|
|
62
|
+
#include "nsIComponentRegistrar.h"
|
|
63
|
+
#include "nsISupportsPrimitives.h"
|
|
64
|
+
#include "nsIGenericFactory.h"
|
|
65
|
+
#include "nsMemory.h"
|
|
66
|
+
#include "nsIXPConnect.h"
|
|
67
|
+
#include "nsIInterfaceInfo.h"
|
|
68
|
+
#include "nsIInterfaceInfoManager.h"
|
|
69
|
+
#include "nsIXPCScriptable.h"
|
|
70
|
+
#include "nsIXPCSecurityManager.h"
|
|
71
|
+
#include "nsIJSRuntimeService.h"
|
|
72
|
+
#include "nsWeakReference.h"
|
|
73
|
+
#include "nsCOMPtr.h"
|
|
74
|
+
#include "nsIModule.h"
|
|
75
|
+
#include "nsAutoLock.h"
|
|
76
|
+
#include "nsXPTCUtils.h"
|
|
77
|
+
#include "jsapi.h"
|
|
78
|
+
#include "jsdhash.h"
|
|
79
|
+
#include "jsprf.h"
|
|
80
|
+
#include "prprf.h"
|
|
81
|
+
#include "jsinterp.h"
|
|
82
|
+
#include "jscntxt.h"
|
|
83
|
+
#include "jsdbgapi.h"
|
|
84
|
+
#include "jsgc.h"
|
|
85
|
+
#include "xptinfo.h"
|
|
86
|
+
#include "xpcforwards.h"
|
|
87
|
+
#include "xpclog.h"
|
|
88
|
+
#include "xpccomponents.h"
|
|
89
|
+
#include "xpcexception.h"
|
|
90
|
+
#include "xpcjsid.h"
|
|
91
|
+
#include "prlong.h"
|
|
92
|
+
#include "prmem.h"
|
|
93
|
+
#include "prenv.h"
|
|
94
|
+
#include "prclist.h"
|
|
95
|
+
#include "nsString.h"
|
|
96
|
+
#include "nsReadableUtils.h"
|
|
97
|
+
#include "nsXPIDLString.h"
|
|
98
|
+
#include "nsAutoJSValHolder.h"
|
|
99
|
+
|
|
100
|
+
#include "nsThreadUtils.h"
|
|
101
|
+
#include "nsIJSContextStack.h"
|
|
102
|
+
#include "nsDeque.h"
|
|
103
|
+
#include "nsVoidArray.h"
|
|
104
|
+
|
|
105
|
+
#include "nsIConsoleService.h"
|
|
106
|
+
#include "nsIScriptError.h"
|
|
107
|
+
#include "nsIExceptionService.h"
|
|
108
|
+
|
|
109
|
+
#include "nsVariant.h"
|
|
110
|
+
#include "nsIPropertyBag.h"
|
|
111
|
+
#include "nsIProperty.h"
|
|
112
|
+
#include "nsSupportsArray.h"
|
|
113
|
+
#include "nsTArray.h"
|
|
114
|
+
#include "nsBaseHashtable.h"
|
|
115
|
+
#include "nsHashKeys.h"
|
|
116
|
+
#include "nsWrapperCache.h"
|
|
117
|
+
|
|
118
|
+
#include "nsIXPCScriptNotify.h" // used to notify: ScriptEvaluated
|
|
119
|
+
|
|
120
|
+
#ifndef XPCONNECT_STANDALONE
|
|
121
|
+
#define XPC_USE_SECURITY_CHECKED_COMPONENT
|
|
122
|
+
#include "nsIScriptObjectPrincipal.h"
|
|
123
|
+
#include "nsIPrincipal.h"
|
|
124
|
+
#endif
|
|
125
|
+
|
|
126
|
+
#ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
|
|
127
|
+
#include "nsISecurityCheckedComponent.h"
|
|
128
|
+
#endif
|
|
129
|
+
|
|
130
|
+
#ifdef XPC_TOOLS_SUPPORT
|
|
131
|
+
#include "nsIXPCToolsProfiler.h"
|
|
132
|
+
#endif
|
|
133
|
+
|
|
134
|
+
#include "nsIThreadInternal.h"
|
|
135
|
+
|
|
136
|
+
#ifdef XPC_IDISPATCH_SUPPORT
|
|
137
|
+
// This goop was added because of EXCEPINFO in ThrowCOMError
|
|
138
|
+
// This include is here, because it needs to occur before the undefines below
|
|
139
|
+
#include <atlbase.h>
|
|
140
|
+
#include "oaidl.h"
|
|
141
|
+
// Nasty MS defines
|
|
142
|
+
#undef GetClassInfo
|
|
143
|
+
#undef GetClassName
|
|
144
|
+
#endif
|
|
145
|
+
|
|
146
|
+
/***************************************************************************/
|
|
147
|
+
// Compile time switches for instrumentation and stuff....
|
|
148
|
+
|
|
149
|
+
// Note that one would not normally turn *any* of these on in a non-DEBUG build.
|
|
150
|
+
|
|
151
|
+
#if defined(DEBUG_jband) || defined(DEBUG_jst) || defined(DEBUG_dbradley) || defined(DEBUG_shaver_no) || defined(DEBUG_timeless)
|
|
152
|
+
#define DEBUG_xpc_hacker
|
|
153
|
+
#endif
|
|
154
|
+
|
|
155
|
+
#if defined(DEBUG_brendan)
|
|
156
|
+
#define DEBUG_XPCNativeWrapper 1
|
|
157
|
+
#endif
|
|
158
|
+
|
|
159
|
+
#ifdef DEBUG
|
|
160
|
+
#define XPC_DETECT_LEADING_UPPERCASE_ACCESS_ERRORS
|
|
161
|
+
#define XPC_CHECK_WRAPPER_THREADSAFETY
|
|
162
|
+
#endif
|
|
163
|
+
|
|
164
|
+
#if defined(DEBUG_xpc_hacker)
|
|
165
|
+
#define XPC_DUMP_AT_SHUTDOWN
|
|
166
|
+
#define XPC_TRACK_WRAPPER_STATS
|
|
167
|
+
#define XPC_TRACK_SCOPE_STATS
|
|
168
|
+
#define XPC_TRACK_PROTO_STATS
|
|
169
|
+
#define XPC_TRACK_DEFERRED_RELEASES
|
|
170
|
+
#define XPC_CHECK_WRAPPERS_AT_SHUTDOWN
|
|
171
|
+
#define XPC_REPORT_SHADOWED_WRAPPED_NATIVE_MEMBERS
|
|
172
|
+
#define XPC_CHECK_CLASSINFO_CLAIMS
|
|
173
|
+
#if defined(DEBUG_jst)
|
|
174
|
+
#define XPC_ASSERT_CLASSINFO_CLAIMS
|
|
175
|
+
#endif
|
|
176
|
+
//#define DEBUG_stats_jband 1
|
|
177
|
+
//#define XPC_REPORT_NATIVE_INTERFACE_AND_SET_FLUSHING
|
|
178
|
+
//#define XPC_REPORT_JSCLASS_FLUSHING
|
|
179
|
+
//#define XPC_TRACK_AUTOMARKINGPTR_STATS
|
|
180
|
+
#endif
|
|
181
|
+
|
|
182
|
+
#if defined(DEBUG_dbaron) || defined(DEBUG_bzbarsky) // only part of DEBUG_xpc_hacker!
|
|
183
|
+
#define XPC_DUMP_AT_SHUTDOWN
|
|
184
|
+
#endif
|
|
185
|
+
|
|
186
|
+
/***************************************************************************/
|
|
187
|
+
// conditional forward declarations....
|
|
188
|
+
|
|
189
|
+
#ifdef XPC_REPORT_SHADOWED_WRAPPED_NATIVE_MEMBERS
|
|
190
|
+
void DEBUG_ReportShadowedMembers(XPCNativeSet* set,
|
|
191
|
+
XPCWrappedNative* wrapper,
|
|
192
|
+
XPCWrappedNativeProto* proto);
|
|
193
|
+
#else
|
|
194
|
+
#define DEBUG_ReportShadowedMembers(set, wrapper, proto) ((void)0)
|
|
195
|
+
#endif
|
|
196
|
+
|
|
197
|
+
#ifdef XPC_CHECK_WRAPPER_THREADSAFETY
|
|
198
|
+
void DEBUG_ReportWrapperThreadSafetyError(XPCCallContext& ccx,
|
|
199
|
+
const char* msg,
|
|
200
|
+
const XPCWrappedNative* wrapper);
|
|
201
|
+
void DEBUG_CheckWrapperThreadSafety(const XPCWrappedNative* wrapper);
|
|
202
|
+
#else
|
|
203
|
+
#define DEBUG_CheckWrapperThreadSafety(w) ((void)0)
|
|
204
|
+
#endif
|
|
205
|
+
|
|
206
|
+
/***************************************************************************/
|
|
207
|
+
|
|
208
|
+
// Defeat possible Windows macro-mangling of the name
|
|
209
|
+
#ifdef GetClassInfo
|
|
210
|
+
#undef GetClassInfo
|
|
211
|
+
#endif
|
|
212
|
+
|
|
213
|
+
/***************************************************************************/
|
|
214
|
+
// default initial sizes for maps (hashtables)
|
|
215
|
+
|
|
216
|
+
#define XPC_CONTEXT_MAP_SIZE 16
|
|
217
|
+
#define XPC_JS_MAP_SIZE 64
|
|
218
|
+
#define XPC_JS_CLASS_MAP_SIZE 64
|
|
219
|
+
|
|
220
|
+
#define XPC_NATIVE_MAP_SIZE 64
|
|
221
|
+
#define XPC_NATIVE_PROTO_MAP_SIZE 16
|
|
222
|
+
#define XPC_DYING_NATIVE_PROTO_MAP_SIZE 16
|
|
223
|
+
#define XPC_DETACHED_NATIVE_PROTO_MAP_SIZE 32
|
|
224
|
+
#define XPC_NATIVE_INTERFACE_MAP_SIZE 64
|
|
225
|
+
#define XPC_NATIVE_SET_MAP_SIZE 64
|
|
226
|
+
#define XPC_NATIVE_JSCLASS_MAP_SIZE 32
|
|
227
|
+
#define XPC_THIS_TRANSLATOR_MAP_SIZE 8
|
|
228
|
+
#define XPC_NATIVE_WRAPPER_MAP_SIZE 16
|
|
229
|
+
#define XPC_WRAPPER_MAP_SIZE 8
|
|
230
|
+
|
|
231
|
+
/***************************************************************************/
|
|
232
|
+
// data declarations...
|
|
233
|
+
extern const char* XPC_ARG_FORMATTER_FORMAT_STRINGS[]; // format strings
|
|
234
|
+
extern const char XPC_CONTEXT_STACK_CONTRACTID[];
|
|
235
|
+
extern const char XPC_RUNTIME_CONTRACTID[];
|
|
236
|
+
extern const char XPC_EXCEPTION_CONTRACTID[];
|
|
237
|
+
extern const char XPC_CONSOLE_CONTRACTID[];
|
|
238
|
+
extern const char XPC_SCRIPT_ERROR_CONTRACTID[];
|
|
239
|
+
extern const char XPC_ID_CONTRACTID[];
|
|
240
|
+
extern const char XPC_XPCONNECT_CONTRACTID[];
|
|
241
|
+
|
|
242
|
+
/***************************************************************************/
|
|
243
|
+
// useful macros...
|
|
244
|
+
|
|
245
|
+
#define XPC_STRING_GETTER_BODY(dest, src) \
|
|
246
|
+
NS_ENSURE_ARG_POINTER(dest); \
|
|
247
|
+
char* result; \
|
|
248
|
+
if(src) \
|
|
249
|
+
result = (char*) nsMemory::Clone(src, \
|
|
250
|
+
sizeof(char)*(strlen(src)+1)); \
|
|
251
|
+
else \
|
|
252
|
+
result = nsnull; \
|
|
253
|
+
*dest = result; \
|
|
254
|
+
return (result || !src) ? NS_OK : NS_ERROR_OUT_OF_MEMORY
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
// NOTE!!!
|
|
258
|
+
//
|
|
259
|
+
// If this ever changes,
|
|
260
|
+
// nsScriptSecurityManager::doGetObjectPrincipal() *must* be updated
|
|
261
|
+
// also!
|
|
262
|
+
//
|
|
263
|
+
// NOTE!!!
|
|
264
|
+
#define IS_WRAPPER_CLASS(clazz) \
|
|
265
|
+
((clazz) == &XPC_WN_NoHelper_JSClass.base || \
|
|
266
|
+
(clazz)->getObjectOps == XPC_WN_GetObjectOpsNoCall || \
|
|
267
|
+
(clazz)->getObjectOps == XPC_WN_GetObjectOpsWithCall)
|
|
268
|
+
|
|
269
|
+
/***************************************************************************/
|
|
270
|
+
// Auto locking support class...
|
|
271
|
+
|
|
272
|
+
// We PROMISE to never screw this up.
|
|
273
|
+
#ifdef _MSC_VER
|
|
274
|
+
#pragma warning(disable : 4355) // OK to pass "this" in member initializer
|
|
275
|
+
#endif
|
|
276
|
+
|
|
277
|
+
typedef PRMonitor XPCLock;
|
|
278
|
+
|
|
279
|
+
static inline void xpc_Wait(XPCLock* lock)
|
|
280
|
+
{
|
|
281
|
+
NS_ASSERTION(lock, "xpc_Wait called with null lock!");
|
|
282
|
+
#ifdef DEBUG
|
|
283
|
+
PRStatus result =
|
|
284
|
+
#endif
|
|
285
|
+
PR_Wait(lock, PR_INTERVAL_NO_TIMEOUT);
|
|
286
|
+
NS_ASSERTION(PR_SUCCESS == result, "bad result from PR_Wait!");
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
static inline void xpc_NotifyAll(XPCLock* lock)
|
|
290
|
+
{
|
|
291
|
+
NS_ASSERTION(lock, "xpc_NotifyAll called with null lock!");
|
|
292
|
+
#ifdef DEBUG
|
|
293
|
+
PRStatus result =
|
|
294
|
+
#endif
|
|
295
|
+
PR_NotifyAll(lock);
|
|
296
|
+
NS_ASSERTION(PR_SUCCESS == result, "bad result from PR_NotifyAll!");
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// This is a cloned subset of nsAutoMonitor. We want the use of a monitor -
|
|
300
|
+
// mostly because we need reenterability - but we also want to support passing
|
|
301
|
+
// a null monitor in without things blowing up. This is used for wrappers that
|
|
302
|
+
// are guaranteed to be used only on one thread. We avoid lock overhead by
|
|
303
|
+
// using a null monitor. By changing this class we can avoid having multiplte
|
|
304
|
+
// code paths or (conditional) manual calls to PR_{Enter,Exit}Monitor.
|
|
305
|
+
//
|
|
306
|
+
// Note that xpconnect only makes *one* monitor and *mostly* holds it locked
|
|
307
|
+
// only through very small critical sections.
|
|
308
|
+
|
|
309
|
+
class XPCAutoLock : public nsAutoLockBase {
|
|
310
|
+
public:
|
|
311
|
+
|
|
312
|
+
static XPCLock* NewLock(const char* name)
|
|
313
|
+
{return nsAutoMonitor::NewMonitor(name);}
|
|
314
|
+
static void DestroyLock(XPCLock* lock)
|
|
315
|
+
{nsAutoMonitor::DestroyMonitor(lock);}
|
|
316
|
+
|
|
317
|
+
XPCAutoLock(XPCLock* lock)
|
|
318
|
+
#ifdef DEBUG_jband
|
|
319
|
+
: nsAutoLockBase(lock ? (void*) lock : (void*) this, eAutoMonitor),
|
|
320
|
+
#else
|
|
321
|
+
: nsAutoLockBase(lock, eAutoMonitor),
|
|
322
|
+
#endif
|
|
323
|
+
mLock(lock)
|
|
324
|
+
{
|
|
325
|
+
if(mLock)
|
|
326
|
+
PR_EnterMonitor(mLock);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
~XPCAutoLock()
|
|
330
|
+
{
|
|
331
|
+
if(mLock)
|
|
332
|
+
{
|
|
333
|
+
#ifdef DEBUG
|
|
334
|
+
PRStatus status =
|
|
335
|
+
#endif
|
|
336
|
+
PR_ExitMonitor(mLock);
|
|
337
|
+
NS_ASSERTION(status == PR_SUCCESS, "PR_ExitMonitor failed");
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
private:
|
|
342
|
+
XPCLock* mLock;
|
|
343
|
+
|
|
344
|
+
// Not meant to be implemented. This makes it a compiler error to
|
|
345
|
+
// construct or assign an XPCAutoLock object incorrectly.
|
|
346
|
+
XPCAutoLock(void) {}
|
|
347
|
+
XPCAutoLock(XPCAutoLock& /*aMon*/) {}
|
|
348
|
+
XPCAutoLock& operator =(XPCAutoLock& /*aMon*/) {
|
|
349
|
+
return *this;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Not meant to be implemented. This makes it a compiler error to
|
|
353
|
+
// attempt to create an XPCAutoLock object on the heap.
|
|
354
|
+
static void* operator new(size_t /*size*/) CPP_THROW_NEW {
|
|
355
|
+
return nsnull;
|
|
356
|
+
}
|
|
357
|
+
static void operator delete(void* /*memory*/) {}
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
/************************************************/
|
|
361
|
+
|
|
362
|
+
class XPCAutoUnlock : public nsAutoUnlockBase {
|
|
363
|
+
public:
|
|
364
|
+
XPCAutoUnlock(XPCLock* lock)
|
|
365
|
+
: nsAutoUnlockBase(lock),
|
|
366
|
+
mLock(lock)
|
|
367
|
+
{
|
|
368
|
+
if(mLock)
|
|
369
|
+
{
|
|
370
|
+
#ifdef DEBUG
|
|
371
|
+
PRStatus status =
|
|
372
|
+
#endif
|
|
373
|
+
PR_ExitMonitor(mLock);
|
|
374
|
+
NS_ASSERTION(status == PR_SUCCESS, "PR_ExitMonitor failed");
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
~XPCAutoUnlock()
|
|
379
|
+
{
|
|
380
|
+
if(mLock)
|
|
381
|
+
PR_EnterMonitor(mLock);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
private:
|
|
385
|
+
XPCLock* mLock;
|
|
386
|
+
|
|
387
|
+
// Not meant to be implemented. This makes it a compiler error to
|
|
388
|
+
// construct or assign an XPCAutoUnlock object incorrectly.
|
|
389
|
+
XPCAutoUnlock(void) {}
|
|
390
|
+
XPCAutoUnlock(XPCAutoUnlock& /*aMon*/) {}
|
|
391
|
+
XPCAutoUnlock& operator =(XPCAutoUnlock& /*aMon*/) {
|
|
392
|
+
return *this;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// Not meant to be implemented. This makes it a compiler error to
|
|
396
|
+
// attempt to create an XPCAutoUnlock object on the heap.
|
|
397
|
+
static void* operator new(size_t /*size*/) CPP_THROW_NEW {
|
|
398
|
+
return nsnull;
|
|
399
|
+
}
|
|
400
|
+
static void operator delete(void* /*memory*/) {}
|
|
401
|
+
};
|
|
402
|
+
|
|
403
|
+
// A helper class to deal with temporary JS contexts. It destroys the context
|
|
404
|
+
// when it goes out of scope.
|
|
405
|
+
class XPCAutoJSContext
|
|
406
|
+
{
|
|
407
|
+
public:
|
|
408
|
+
XPCAutoJSContext(JSContext *aContext, PRBool aGCOnDestroy)
|
|
409
|
+
: mContext(aContext), mGCOnDestroy(aGCOnDestroy)
|
|
410
|
+
{
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
~XPCAutoJSContext()
|
|
414
|
+
{
|
|
415
|
+
if(!mContext)
|
|
416
|
+
return;
|
|
417
|
+
|
|
418
|
+
if(mGCOnDestroy)
|
|
419
|
+
JS_DestroyContext(mContext);
|
|
420
|
+
else
|
|
421
|
+
JS_DestroyContextNoGC(mContext);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
operator JSContext * () {return mContext;}
|
|
425
|
+
|
|
426
|
+
private:
|
|
427
|
+
JSContext *mContext;
|
|
428
|
+
PRBool mGCOnDestroy;
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
/***************************************************************************
|
|
432
|
+
****************************************************************************
|
|
433
|
+
*
|
|
434
|
+
* Core runtime and context classes...
|
|
435
|
+
*
|
|
436
|
+
****************************************************************************
|
|
437
|
+
***************************************************************************/
|
|
438
|
+
|
|
439
|
+
// We have a general rule internally that getters that return addref'd interface
|
|
440
|
+
// pointer generally do so using an 'out' parm. When interface pointers are
|
|
441
|
+
// returned as function call result values they are not addref'd. Exceptions
|
|
442
|
+
// to this rule are noted explicitly.
|
|
443
|
+
|
|
444
|
+
const PRBool OBJ_IS_GLOBAL = PR_TRUE;
|
|
445
|
+
const PRBool OBJ_IS_NOT_GLOBAL = PR_FALSE;
|
|
446
|
+
|
|
447
|
+
#define NS_JS_RUNTIME_SERVICE_CID \
|
|
448
|
+
{0xb5e65b52, 0x1dd1, 0x11b2, \
|
|
449
|
+
{ 0xae, 0x8f, 0xf0, 0x92, 0x8e, 0xd8, 0x84, 0x82 }}
|
|
450
|
+
|
|
451
|
+
#define NS_XPC_THREAD_JSCONTEXT_STACK_CID \
|
|
452
|
+
{ 0xff8c4d10, 0x3194, 0x11d3, \
|
|
453
|
+
{ 0x98, 0x85, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } }
|
|
454
|
+
|
|
455
|
+
class nsXPConnect : public nsIXPConnect,
|
|
456
|
+
public nsIThreadObserver,
|
|
457
|
+
public nsSupportsWeakReference,
|
|
458
|
+
public nsCycleCollectionJSRuntime,
|
|
459
|
+
public nsCycleCollectionParticipant,
|
|
460
|
+
public nsIJSRuntimeService,
|
|
461
|
+
public nsIThreadJSContextStack
|
|
462
|
+
{
|
|
463
|
+
public:
|
|
464
|
+
// all the interface method declarations...
|
|
465
|
+
NS_DECL_ISUPPORTS
|
|
466
|
+
NS_DECL_NSIXPCONNECT
|
|
467
|
+
NS_DECL_NSITHREADOBSERVER
|
|
468
|
+
NS_DECL_NSIJSRUNTIMESERVICE
|
|
469
|
+
NS_DECL_NSIJSCONTEXTSTACK
|
|
470
|
+
NS_DECL_NSITHREADJSCONTEXTSTACK
|
|
471
|
+
|
|
472
|
+
// non-interface implementation
|
|
473
|
+
public:
|
|
474
|
+
// These get non-addref'd pointers
|
|
475
|
+
static nsXPConnect* GetXPConnect();
|
|
476
|
+
static XPCJSRuntime* GetRuntimeInstance();
|
|
477
|
+
XPCJSRuntime* GetRuntime() {return mRuntime;}
|
|
478
|
+
|
|
479
|
+
// Gets addref'd pointer
|
|
480
|
+
static nsresult GetInterfaceInfoManager(nsIInterfaceInfoSuperManager** iim,
|
|
481
|
+
nsXPConnect* xpc = nsnull);
|
|
482
|
+
|
|
483
|
+
static JSBool IsISupportsDescendant(nsIInterfaceInfo* info);
|
|
484
|
+
|
|
485
|
+
nsIXPCSecurityManager* GetDefaultSecurityManager() const
|
|
486
|
+
{return mDefaultSecurityManager;}
|
|
487
|
+
|
|
488
|
+
PRUint16 GetDefaultSecurityManagerFlags() const
|
|
489
|
+
{return mDefaultSecurityManagerFlags;}
|
|
490
|
+
|
|
491
|
+
// This returns an AddRef'd pointer. It does not do this with an 'out' param
|
|
492
|
+
// only because this form is required by the generic module macro:
|
|
493
|
+
// NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR
|
|
494
|
+
static nsXPConnect* GetSingleton();
|
|
495
|
+
|
|
496
|
+
// Called by module code in dll startup
|
|
497
|
+
static void InitStatics() { gSelf = nsnull; gOnceAliveNowDead = JS_FALSE; }
|
|
498
|
+
// Called by module code on dll shutdown.
|
|
499
|
+
static void ReleaseXPConnectSingleton();
|
|
500
|
+
|
|
501
|
+
virtual ~nsXPConnect();
|
|
502
|
+
|
|
503
|
+
JSBool IsShuttingDown() const {return mShuttingDown;}
|
|
504
|
+
|
|
505
|
+
nsresult GetInfoForIID(const nsIID * aIID, nsIInterfaceInfo** info);
|
|
506
|
+
nsresult GetInfoForName(const char * name, nsIInterfaceInfo** info);
|
|
507
|
+
|
|
508
|
+
// nsCycleCollectionParticipant
|
|
509
|
+
NS_IMETHOD RootAndUnlinkJSObjects(void *p);
|
|
510
|
+
NS_IMETHOD Unlink(void *p);
|
|
511
|
+
NS_IMETHOD Unroot(void *p);
|
|
512
|
+
NS_IMETHOD Traverse(void *p,
|
|
513
|
+
nsCycleCollectionTraversalCallback &cb);
|
|
514
|
+
|
|
515
|
+
// nsCycleCollectionLanguageRuntime
|
|
516
|
+
virtual nsresult BeginCycleCollection(nsCycleCollectionTraversalCallback &cb);
|
|
517
|
+
virtual nsresult FinishCycleCollection();
|
|
518
|
+
virtual nsCycleCollectionParticipant *ToParticipant(void *p);
|
|
519
|
+
virtual PRBool Collect();
|
|
520
|
+
#ifdef DEBUG_CC
|
|
521
|
+
virtual void PrintAllReferencesTo(void *p);
|
|
522
|
+
#endif
|
|
523
|
+
|
|
524
|
+
// We should not trace XPConnect JS roots when tracing the graph for the
|
|
525
|
+
// cycle collector. Those should be traced from the XPCOM objects that hold
|
|
526
|
+
// them when we know that they won't be collected by the cycle collector.
|
|
527
|
+
PRBool ShouldTraceRoots()
|
|
528
|
+
{
|
|
529
|
+
return !mCycleCollecting;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
XPCCallContext* GetCycleCollectionContext()
|
|
533
|
+
{
|
|
534
|
+
return mCycleCollectionContext;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
PRInt32 GetRequestDepth(JSContext* cx);
|
|
538
|
+
|
|
539
|
+
// This returns the singleton nsCycleCollectionParticipant for JSContexts.
|
|
540
|
+
static nsCycleCollectionParticipant *JSContextParticipant();
|
|
541
|
+
|
|
542
|
+
#ifndef XPCONNECT_STANDALONE
|
|
543
|
+
void RecordTraversal(void *p, nsISupports *s);
|
|
544
|
+
#endif
|
|
545
|
+
static PRBool ReportAllJSExceptions()
|
|
546
|
+
{
|
|
547
|
+
return gReportAllJSExceptions > 0;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
#ifdef XPC_IDISPATCH_SUPPORT
|
|
551
|
+
public:
|
|
552
|
+
static PRBool IsIDispatchEnabled();
|
|
553
|
+
#endif
|
|
554
|
+
protected:
|
|
555
|
+
nsXPConnect();
|
|
556
|
+
|
|
557
|
+
private:
|
|
558
|
+
static PRThread* FindMainThread();
|
|
559
|
+
|
|
560
|
+
private:
|
|
561
|
+
// Singleton instance
|
|
562
|
+
static nsXPConnect* gSelf;
|
|
563
|
+
static JSBool gOnceAliveNowDead;
|
|
564
|
+
|
|
565
|
+
XPCJSRuntime* mRuntime;
|
|
566
|
+
nsCOMPtr<nsIInterfaceInfoSuperManager> mInterfaceInfoManager;
|
|
567
|
+
nsIXPCSecurityManager* mDefaultSecurityManager;
|
|
568
|
+
PRUint16 mDefaultSecurityManagerFlags;
|
|
569
|
+
JSBool mShuttingDown;
|
|
570
|
+
XPCCallContext* mCycleCollectionContext;
|
|
571
|
+
#ifdef DEBUG_CC
|
|
572
|
+
nsAutoPtr<XPCCallContext> mExplainCycleCollectionContext;
|
|
573
|
+
PLDHashTable mJSRoots;
|
|
574
|
+
#endif
|
|
575
|
+
PRBool mCycleCollecting;
|
|
576
|
+
|
|
577
|
+
#ifdef XPC_TOOLS_SUPPORT
|
|
578
|
+
nsCOMPtr<nsIXPCToolsProfiler> mProfiler;
|
|
579
|
+
nsCOMPtr<nsILocalFile> mProfilerOutputFile;
|
|
580
|
+
#endif
|
|
581
|
+
|
|
582
|
+
#ifndef XPCONNECT_STANDALONE
|
|
583
|
+
typedef nsBaseHashtable<nsVoidPtrHashKey, nsISupports*, nsISupports*> ScopeSet;
|
|
584
|
+
ScopeSet mScopes;
|
|
585
|
+
#endif
|
|
586
|
+
nsCOMPtr<nsIXPCScriptable> mBackstagePass;
|
|
587
|
+
|
|
588
|
+
static PRUint32 gReportAllJSExceptions;
|
|
589
|
+
};
|
|
590
|
+
|
|
591
|
+
/***************************************************************************/
|
|
592
|
+
|
|
593
|
+
class XPCRootSetElem
|
|
594
|
+
{
|
|
595
|
+
public:
|
|
596
|
+
XPCRootSetElem()
|
|
597
|
+
{
|
|
598
|
+
#ifdef DEBUG
|
|
599
|
+
mNext = nsnull;
|
|
600
|
+
mSelfp = nsnull;
|
|
601
|
+
#endif
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
~XPCRootSetElem()
|
|
605
|
+
{
|
|
606
|
+
NS_ASSERTION(!mNext, "Must be unlinked");
|
|
607
|
+
NS_ASSERTION(!mSelfp, "Must be unlinked");
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
inline XPCRootSetElem* GetNextRoot() { return mNext; }
|
|
611
|
+
void AddToRootSet(JSRuntime* rt, XPCRootSetElem** listHead);
|
|
612
|
+
void RemoveFromRootSet(JSRuntime* rt);
|
|
613
|
+
|
|
614
|
+
private:
|
|
615
|
+
XPCRootSetElem *mNext;
|
|
616
|
+
XPCRootSetElem **mSelfp;
|
|
617
|
+
};
|
|
618
|
+
|
|
619
|
+
/***************************************************************************/
|
|
620
|
+
|
|
621
|
+
// In the current xpconnect system there can only be one XPCJSRuntime.
|
|
622
|
+
// So, xpconnect can only be used on one JSRuntime within the process.
|
|
623
|
+
|
|
624
|
+
// no virtuals. no refcounting.
|
|
625
|
+
class XPCJSRuntime
|
|
626
|
+
{
|
|
627
|
+
public:
|
|
628
|
+
static XPCJSRuntime* newXPCJSRuntime(nsXPConnect* aXPConnect);
|
|
629
|
+
|
|
630
|
+
JSRuntime* GetJSRuntime() const {return mJSRuntime;}
|
|
631
|
+
nsXPConnect* GetXPConnect() const {return mXPConnect;}
|
|
632
|
+
|
|
633
|
+
JSObject2WrappedJSMap* GetWrappedJSMap() const
|
|
634
|
+
{return mWrappedJSMap;}
|
|
635
|
+
|
|
636
|
+
IID2WrappedJSClassMap* GetWrappedJSClassMap() const
|
|
637
|
+
{return mWrappedJSClassMap;}
|
|
638
|
+
|
|
639
|
+
IID2NativeInterfaceMap* GetIID2NativeInterfaceMap() const
|
|
640
|
+
{return mIID2NativeInterfaceMap;}
|
|
641
|
+
|
|
642
|
+
ClassInfo2NativeSetMap* GetClassInfo2NativeSetMap() const
|
|
643
|
+
{return mClassInfo2NativeSetMap;}
|
|
644
|
+
|
|
645
|
+
NativeSetMap* GetNativeSetMap() const
|
|
646
|
+
{return mNativeSetMap;}
|
|
647
|
+
|
|
648
|
+
IID2ThisTranslatorMap* GetThisTranslatorMap() const
|
|
649
|
+
{return mThisTranslatorMap;}
|
|
650
|
+
|
|
651
|
+
XPCNativeScriptableSharedMap* GetNativeScriptableSharedMap() const
|
|
652
|
+
{return mNativeScriptableSharedMap;}
|
|
653
|
+
|
|
654
|
+
XPCWrappedNativeProtoMap* GetDyingWrappedNativeProtoMap() const
|
|
655
|
+
{return mDyingWrappedNativeProtoMap;}
|
|
656
|
+
|
|
657
|
+
XPCWrappedNativeProtoMap* GetDetachedWrappedNativeProtoMap() const
|
|
658
|
+
{return mDetachedWrappedNativeProtoMap;}
|
|
659
|
+
|
|
660
|
+
XPCNativeWrapperMap* GetExplicitNativeWrapperMap() const
|
|
661
|
+
{return mExplicitNativeWrapperMap;}
|
|
662
|
+
|
|
663
|
+
XPCLock* GetMapLock() const {return mMapLock;}
|
|
664
|
+
|
|
665
|
+
JSBool OnJSContextNew(JSContext* cx);
|
|
666
|
+
|
|
667
|
+
JSBool DeferredRelease(nsISupports* obj);
|
|
668
|
+
|
|
669
|
+
JSBool GetDoingFinalization() const {return mDoingFinalization;}
|
|
670
|
+
|
|
671
|
+
// Mapping of often used strings to jsid atoms that live 'forever'.
|
|
672
|
+
//
|
|
673
|
+
// To add a new string: add to this list and to XPCJSRuntime::mStrings
|
|
674
|
+
// at the top of xpcjsruntime.cpp
|
|
675
|
+
enum {
|
|
676
|
+
IDX_CONSTRUCTOR = 0 ,
|
|
677
|
+
IDX_TO_STRING ,
|
|
678
|
+
IDX_TO_SOURCE ,
|
|
679
|
+
IDX_LAST_RESULT ,
|
|
680
|
+
IDX_RETURN_CODE ,
|
|
681
|
+
IDX_VALUE ,
|
|
682
|
+
IDX_QUERY_INTERFACE ,
|
|
683
|
+
IDX_COMPONENTS ,
|
|
684
|
+
IDX_WRAPPED_JSOBJECT ,
|
|
685
|
+
IDX_OBJECT ,
|
|
686
|
+
IDX_FUNCTION ,
|
|
687
|
+
IDX_PROTOTYPE ,
|
|
688
|
+
IDX_CREATE_INSTANCE ,
|
|
689
|
+
IDX_ITEM ,
|
|
690
|
+
IDX_PROTO ,
|
|
691
|
+
IDX_ITERATOR ,
|
|
692
|
+
#ifdef XPC_IDISPATCH_SUPPORT
|
|
693
|
+
IDX_ACTIVEX_OBJECT ,
|
|
694
|
+
IDX_COM_OBJECT ,
|
|
695
|
+
IDX_ACTIVEX_SUPPORTS ,
|
|
696
|
+
#endif
|
|
697
|
+
IDX_TOTAL_COUNT // just a count of the above
|
|
698
|
+
};
|
|
699
|
+
|
|
700
|
+
jsid GetStringID(uintN index) const
|
|
701
|
+
{
|
|
702
|
+
NS_ASSERTION(index < IDX_TOTAL_COUNT, "index out of range");
|
|
703
|
+
return mStrIDs[index];
|
|
704
|
+
}
|
|
705
|
+
jsval GetStringJSVal(uintN index) const
|
|
706
|
+
{
|
|
707
|
+
NS_ASSERTION(index < IDX_TOTAL_COUNT, "index out of range");
|
|
708
|
+
return mStrJSVals[index];
|
|
709
|
+
}
|
|
710
|
+
const char* GetStringName(uintN index) const
|
|
711
|
+
{
|
|
712
|
+
NS_ASSERTION(index < IDX_TOTAL_COUNT, "index out of range");
|
|
713
|
+
return mStrings[index];
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
static void TraceJS(JSTracer* trc, void* data);
|
|
717
|
+
void TraceXPConnectRoots(JSTracer *trc, JSBool rootGlobals = JS_FALSE);
|
|
718
|
+
void AddXPConnectRoots(JSContext* cx,
|
|
719
|
+
nsCycleCollectionTraversalCallback& cb);
|
|
720
|
+
|
|
721
|
+
static JSBool GCCallback(JSContext *cx, JSGCStatus status);
|
|
722
|
+
|
|
723
|
+
inline void AddVariantRoot(XPCTraceableVariant* variant);
|
|
724
|
+
inline void AddWrappedJSRoot(nsXPCWrappedJS* wrappedJS);
|
|
725
|
+
inline void AddObjectHolderRoot(XPCJSObjectHolder* holder);
|
|
726
|
+
|
|
727
|
+
nsresult AddJSHolder(void* aHolder, nsScriptObjectTracer* aTracer);
|
|
728
|
+
nsresult RemoveJSHolder(void* aHolder);
|
|
729
|
+
|
|
730
|
+
void UnrootContextGlobals();
|
|
731
|
+
#ifdef DEBUG_CC
|
|
732
|
+
void RootContextGlobals();
|
|
733
|
+
#endif
|
|
734
|
+
|
|
735
|
+
void DebugDump(PRInt16 depth);
|
|
736
|
+
|
|
737
|
+
void SystemIsBeingShutDown(JSContext* cx);
|
|
738
|
+
|
|
739
|
+
PRThread* GetThreadRunningGC() const {return mThreadRunningGC;}
|
|
740
|
+
|
|
741
|
+
~XPCJSRuntime();
|
|
742
|
+
|
|
743
|
+
#ifdef XPC_CHECK_WRAPPERS_AT_SHUTDOWN
|
|
744
|
+
void DEBUG_AddWrappedNative(nsIXPConnectWrappedNative* wrapper)
|
|
745
|
+
{XPCAutoLock lock(GetMapLock());
|
|
746
|
+
JSDHashEntryHdr *entry =
|
|
747
|
+
JS_DHashTableOperate(DEBUG_WrappedNativeHashtable,
|
|
748
|
+
wrapper, JS_DHASH_ADD);
|
|
749
|
+
if(entry) ((JSDHashEntryStub *)entry)->key = wrapper;}
|
|
750
|
+
|
|
751
|
+
void DEBUG_RemoveWrappedNative(nsIXPConnectWrappedNative* wrapper)
|
|
752
|
+
{XPCAutoLock lock(GetMapLock());
|
|
753
|
+
JS_DHashTableOperate(DEBUG_WrappedNativeHashtable,
|
|
754
|
+
wrapper, JS_DHASH_REMOVE);}
|
|
755
|
+
private:
|
|
756
|
+
JSDHashTable* DEBUG_WrappedNativeHashtable;
|
|
757
|
+
public:
|
|
758
|
+
#endif
|
|
759
|
+
|
|
760
|
+
private:
|
|
761
|
+
XPCJSRuntime(); // no implementation
|
|
762
|
+
XPCJSRuntime(nsXPConnect* aXPConnect);
|
|
763
|
+
|
|
764
|
+
// The caller must be holding the GC lock
|
|
765
|
+
void RescheduleWatchdog(XPCContext* ccx);
|
|
766
|
+
|
|
767
|
+
static void WatchdogMain(void *arg);
|
|
768
|
+
|
|
769
|
+
static const char* mStrings[IDX_TOTAL_COUNT];
|
|
770
|
+
jsid mStrIDs[IDX_TOTAL_COUNT];
|
|
771
|
+
jsval mStrJSVals[IDX_TOTAL_COUNT];
|
|
772
|
+
|
|
773
|
+
nsXPConnect* mXPConnect;
|
|
774
|
+
JSRuntime* mJSRuntime;
|
|
775
|
+
JSObject2WrappedJSMap* mWrappedJSMap;
|
|
776
|
+
IID2WrappedJSClassMap* mWrappedJSClassMap;
|
|
777
|
+
IID2NativeInterfaceMap* mIID2NativeInterfaceMap;
|
|
778
|
+
ClassInfo2NativeSetMap* mClassInfo2NativeSetMap;
|
|
779
|
+
NativeSetMap* mNativeSetMap;
|
|
780
|
+
IID2ThisTranslatorMap* mThisTranslatorMap;
|
|
781
|
+
XPCNativeScriptableSharedMap* mNativeScriptableSharedMap;
|
|
782
|
+
XPCWrappedNativeProtoMap* mDyingWrappedNativeProtoMap;
|
|
783
|
+
XPCWrappedNativeProtoMap* mDetachedWrappedNativeProtoMap;
|
|
784
|
+
XPCNativeWrapperMap* mExplicitNativeWrapperMap;
|
|
785
|
+
XPCLock* mMapLock;
|
|
786
|
+
PRThread* mThreadRunningGC;
|
|
787
|
+
nsVoidArray mWrappedJSToReleaseArray;
|
|
788
|
+
nsVoidArray mNativesToReleaseArray;
|
|
789
|
+
JSBool mDoingFinalization;
|
|
790
|
+
XPCRootSetElem *mVariantRoots;
|
|
791
|
+
XPCRootSetElem *mWrappedJSRoots;
|
|
792
|
+
XPCRootSetElem *mObjectHolderRoots;
|
|
793
|
+
JSDHashTable mJSHolders;
|
|
794
|
+
uintN mUnrootedGlobalCount;
|
|
795
|
+
PRCondVar *mWatchdogWakeup;
|
|
796
|
+
PRThread *mWatchdogThread;
|
|
797
|
+
};
|
|
798
|
+
|
|
799
|
+
/***************************************************************************/
|
|
800
|
+
/***************************************************************************/
|
|
801
|
+
// XPCContext is mostly a dumb class to hold JSContext specific data and
|
|
802
|
+
// maps that let us find wrappers created for the given JSContext.
|
|
803
|
+
|
|
804
|
+
// no virtuals
|
|
805
|
+
class XPCContext
|
|
806
|
+
{
|
|
807
|
+
friend class XPCJSRuntime;
|
|
808
|
+
public:
|
|
809
|
+
static XPCContext* GetXPCContext(JSContext* aJSContext)
|
|
810
|
+
{
|
|
811
|
+
NS_ASSERTION(aJSContext->data2, "should already have XPCContext");
|
|
812
|
+
return static_cast<XPCContext *>(aJSContext->data2);
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
XPCJSRuntime* GetRuntime() const {return mRuntime;}
|
|
816
|
+
JSContext* GetJSContext() const {return mJSContext;}
|
|
817
|
+
|
|
818
|
+
enum LangType {LANG_UNKNOWN, LANG_JS, LANG_NATIVE};
|
|
819
|
+
|
|
820
|
+
LangType GetCallingLangType() const
|
|
821
|
+
{
|
|
822
|
+
return mCallingLangType;
|
|
823
|
+
}
|
|
824
|
+
LangType SetCallingLangType(LangType lt)
|
|
825
|
+
{
|
|
826
|
+
LangType tmp = mCallingLangType;
|
|
827
|
+
mCallingLangType = lt;
|
|
828
|
+
return tmp;
|
|
829
|
+
}
|
|
830
|
+
JSBool CallerTypeIsJavaScript() const
|
|
831
|
+
{
|
|
832
|
+
return LANG_JS == mCallingLangType;
|
|
833
|
+
}
|
|
834
|
+
JSBool CallerTypeIsNative() const
|
|
835
|
+
{
|
|
836
|
+
return LANG_NATIVE == mCallingLangType;
|
|
837
|
+
}
|
|
838
|
+
JSBool CallerTypeIsKnown() const
|
|
839
|
+
{
|
|
840
|
+
return LANG_UNKNOWN != mCallingLangType;
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
nsresult GetException(nsIException** e)
|
|
844
|
+
{
|
|
845
|
+
NS_IF_ADDREF(mException);
|
|
846
|
+
*e = mException;
|
|
847
|
+
return NS_OK;
|
|
848
|
+
}
|
|
849
|
+
void SetException(nsIException* e)
|
|
850
|
+
{
|
|
851
|
+
NS_IF_ADDREF(e);
|
|
852
|
+
NS_IF_RELEASE(mException);
|
|
853
|
+
mException = e;
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
nsresult GetLastResult() {return mLastResult;}
|
|
857
|
+
void SetLastResult(nsresult rc) {mLastResult = rc;}
|
|
858
|
+
|
|
859
|
+
nsresult GetPendingResult() {return mPendingResult;}
|
|
860
|
+
void SetPendingResult(nsresult rc) {mPendingResult = rc;}
|
|
861
|
+
|
|
862
|
+
nsIXPCSecurityManager* GetSecurityManager() const
|
|
863
|
+
{return mSecurityManager;}
|
|
864
|
+
void SetSecurityManager(nsIXPCSecurityManager* aSecurityManager)
|
|
865
|
+
{mSecurityManager = aSecurityManager;}
|
|
866
|
+
|
|
867
|
+
PRUint16 GetSecurityManagerFlags() const
|
|
868
|
+
{return mSecurityManagerFlags;}
|
|
869
|
+
void SetSecurityManagerFlags(PRUint16 f)
|
|
870
|
+
{mSecurityManagerFlags = f;}
|
|
871
|
+
|
|
872
|
+
nsIXPCSecurityManager* GetAppropriateSecurityManager(PRUint16 flags) const
|
|
873
|
+
{
|
|
874
|
+
NS_ASSERTION(CallerTypeIsKnown(),"missing caller type set somewhere");
|
|
875
|
+
if(!CallerTypeIsJavaScript())
|
|
876
|
+
return nsnull;
|
|
877
|
+
if(mSecurityManager)
|
|
878
|
+
{
|
|
879
|
+
if(flags & mSecurityManagerFlags)
|
|
880
|
+
return mSecurityManager;
|
|
881
|
+
}
|
|
882
|
+
else
|
|
883
|
+
{
|
|
884
|
+
nsIXPCSecurityManager* mgr;
|
|
885
|
+
nsXPConnect* xpc = mRuntime->GetXPConnect();
|
|
886
|
+
mgr = xpc->GetDefaultSecurityManager();
|
|
887
|
+
if(mgr && (flags & xpc->GetDefaultSecurityManagerFlags()))
|
|
888
|
+
return mgr;
|
|
889
|
+
}
|
|
890
|
+
return nsnull;
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
void DebugDump(PRInt16 depth);
|
|
894
|
+
void AddScope(PRCList *scope) { PR_INSERT_AFTER(scope, &mScopes); }
|
|
895
|
+
void RemoveScope(PRCList *scope) { PR_REMOVE_LINK(scope); }
|
|
896
|
+
|
|
897
|
+
~XPCContext();
|
|
898
|
+
|
|
899
|
+
private:
|
|
900
|
+
XPCContext(); // no implementation
|
|
901
|
+
XPCContext(XPCJSRuntime* aRuntime, JSContext* aJSContext);
|
|
902
|
+
|
|
903
|
+
static XPCContext* newXPCContext(XPCJSRuntime* aRuntime,
|
|
904
|
+
JSContext* aJSContext);
|
|
905
|
+
private:
|
|
906
|
+
XPCJSRuntime* mRuntime;
|
|
907
|
+
JSContext* mJSContext;
|
|
908
|
+
nsresult mLastResult;
|
|
909
|
+
nsresult mPendingResult;
|
|
910
|
+
nsIXPCSecurityManager* mSecurityManager;
|
|
911
|
+
nsIException* mException;
|
|
912
|
+
LangType mCallingLangType;
|
|
913
|
+
PRUint16 mSecurityManagerFlags;
|
|
914
|
+
|
|
915
|
+
// A linked list of scopes to notify when we are destroyed.
|
|
916
|
+
PRCList mScopes;
|
|
917
|
+
};
|
|
918
|
+
|
|
919
|
+
/***************************************************************************/
|
|
920
|
+
|
|
921
|
+
#define NATIVE_CALLER XPCContext::LANG_NATIVE
|
|
922
|
+
#define JS_CALLER XPCContext::LANG_JS
|
|
923
|
+
|
|
924
|
+
// class to export a JSString as an const nsAString, no refcounting :(
|
|
925
|
+
class XPCReadableJSStringWrapper : public nsDependentString
|
|
926
|
+
{
|
|
927
|
+
public:
|
|
928
|
+
typedef nsDependentString::char_traits char_traits;
|
|
929
|
+
|
|
930
|
+
XPCReadableJSStringWrapper(const PRUnichar *chars, size_t length) :
|
|
931
|
+
nsDependentString(chars, length)
|
|
932
|
+
{ }
|
|
933
|
+
|
|
934
|
+
XPCReadableJSStringWrapper() :
|
|
935
|
+
nsDependentString(char_traits::sEmptyBuffer, char_traits::sEmptyBuffer)
|
|
936
|
+
{ SetIsVoid(PR_TRUE); }
|
|
937
|
+
|
|
938
|
+
explicit XPCReadableJSStringWrapper(JSString *str) :
|
|
939
|
+
nsDependentString((const PRUnichar *)::JS_GetStringChars(str),
|
|
940
|
+
::JS_GetStringLength(str))
|
|
941
|
+
{ }
|
|
942
|
+
};
|
|
943
|
+
|
|
944
|
+
// No virtuals
|
|
945
|
+
// XPCCallContext is ALWAYS declared as a local variable in some function;
|
|
946
|
+
// i.e. instance lifetime is always controled by some C++ function returning.
|
|
947
|
+
//
|
|
948
|
+
// These things are created frequently in many places. We *intentionally* do
|
|
949
|
+
// not inialialize all members in order to save on construction overhead.
|
|
950
|
+
// Some constructor pass more valid params than others. We init what must be
|
|
951
|
+
// init'd and leave other members undefined. In debug builds the accessors
|
|
952
|
+
// use a CHECK_STATE macro to track whether or not the object is in a valid
|
|
953
|
+
// state to answer the question a caller might be asking. As long as this
|
|
954
|
+
// class is maintained correctly it can do its job without a bunch of added
|
|
955
|
+
// overhead from useless initializations and non-DEBUG error checking.
|
|
956
|
+
//
|
|
957
|
+
// Note that most accessors are inlined.
|
|
958
|
+
|
|
959
|
+
class XPCCallContext : public nsAXPCNativeCallContext
|
|
960
|
+
{
|
|
961
|
+
public:
|
|
962
|
+
NS_IMETHOD GetCallee(nsISupports **aResult);
|
|
963
|
+
NS_IMETHOD GetCalleeMethodIndex(PRUint16 *aResult);
|
|
964
|
+
NS_IMETHOD GetCalleeWrapper(nsIXPConnectWrappedNative **aResult);
|
|
965
|
+
NS_IMETHOD GetJSContext(JSContext **aResult);
|
|
966
|
+
NS_IMETHOD GetArgc(PRUint32 *aResult);
|
|
967
|
+
NS_IMETHOD GetArgvPtr(jsval **aResult);
|
|
968
|
+
NS_IMETHOD GetRetValPtr(jsval **aResult);
|
|
969
|
+
NS_IMETHOD GetReturnValueWasSet(PRBool *aResult);
|
|
970
|
+
NS_IMETHOD SetReturnValueWasSet(PRBool aValue);
|
|
971
|
+
NS_IMETHOD GetCalleeInterface(nsIInterfaceInfo **aResult);
|
|
972
|
+
NS_IMETHOD GetCalleeClassInfo(nsIClassInfo **aResult);
|
|
973
|
+
NS_IMETHOD GetPreviousCallContext(nsAXPCNativeCallContext **aResult);
|
|
974
|
+
NS_IMETHOD GetLanguage(PRUint16 *aResult);
|
|
975
|
+
|
|
976
|
+
enum {NO_ARGS = (uintN) -1};
|
|
977
|
+
|
|
978
|
+
XPCCallContext(XPCContext::LangType callerLanguage,
|
|
979
|
+
JSContext* cx = nsnull,
|
|
980
|
+
JSObject* obj = nsnull,
|
|
981
|
+
JSObject* funobj = nsnull,
|
|
982
|
+
jsval id = 0,
|
|
983
|
+
uintN argc = NO_ARGS,
|
|
984
|
+
jsval *argv = nsnull,
|
|
985
|
+
jsval *rval = nsnull);
|
|
986
|
+
|
|
987
|
+
virtual ~XPCCallContext();
|
|
988
|
+
|
|
989
|
+
inline JSBool IsValid() const ;
|
|
990
|
+
|
|
991
|
+
inline nsXPConnect* GetXPConnect() const ;
|
|
992
|
+
inline XPCJSRuntime* GetRuntime() const ;
|
|
993
|
+
inline XPCPerThreadData* GetThreadData() const ;
|
|
994
|
+
inline XPCContext* GetXPCContext() const ;
|
|
995
|
+
inline JSContext* GetJSContext() const ;
|
|
996
|
+
inline JSContext* GetSafeJSContext() const ;
|
|
997
|
+
inline JSBool GetContextPopRequired() const ;
|
|
998
|
+
inline XPCContext::LangType GetCallerLanguage() const ;
|
|
999
|
+
inline XPCContext::LangType GetPrevCallerLanguage() const ;
|
|
1000
|
+
inline XPCCallContext* GetPrevCallContext() const ;
|
|
1001
|
+
|
|
1002
|
+
inline JSObject* GetOperandJSObject() const ;
|
|
1003
|
+
inline JSObject* GetCurrentJSObject() const ;
|
|
1004
|
+
inline JSObject* GetFlattenedJSObject() const ;
|
|
1005
|
+
|
|
1006
|
+
inline nsISupports* GetIdentityObject() const ;
|
|
1007
|
+
inline XPCWrappedNative* GetWrapper() const ;
|
|
1008
|
+
|
|
1009
|
+
inline JSBool CanGetTearOff() const ;
|
|
1010
|
+
inline XPCWrappedNativeTearOff* GetTearOff() const ;
|
|
1011
|
+
|
|
1012
|
+
inline XPCNativeScriptableInfo* GetScriptableInfo() const ;
|
|
1013
|
+
inline JSBool CanGetSet() const ;
|
|
1014
|
+
inline XPCNativeSet* GetSet() const ;
|
|
1015
|
+
inline JSBool CanGetInterface() const ;
|
|
1016
|
+
inline XPCNativeInterface* GetInterface() const ;
|
|
1017
|
+
inline XPCNativeMember* GetMember() const ;
|
|
1018
|
+
inline JSBool HasInterfaceAndMember() const ;
|
|
1019
|
+
inline jsval GetName() const ;
|
|
1020
|
+
inline JSBool GetStaticMemberIsLocal() const ;
|
|
1021
|
+
inline uintN GetArgc() const ;
|
|
1022
|
+
inline jsval* GetArgv() const ;
|
|
1023
|
+
inline jsval* GetRetVal() const ;
|
|
1024
|
+
inline JSBool GetReturnValueWasSet() const ;
|
|
1025
|
+
|
|
1026
|
+
inline PRUint16 GetMethodIndex() const ;
|
|
1027
|
+
inline void SetMethodIndex(PRUint16 index) ;
|
|
1028
|
+
|
|
1029
|
+
inline JSBool GetDestroyJSContextInDestructor() const;
|
|
1030
|
+
inline void SetDestroyJSContextInDestructor(JSBool b);
|
|
1031
|
+
|
|
1032
|
+
inline jsval GetResolveName() const;
|
|
1033
|
+
inline jsval SetResolveName(jsval name);
|
|
1034
|
+
|
|
1035
|
+
inline XPCWrappedNative* GetResolvingWrapper() const;
|
|
1036
|
+
inline XPCWrappedNative* SetResolvingWrapper(XPCWrappedNative* w);
|
|
1037
|
+
|
|
1038
|
+
inline void SetRetVal(jsval val);
|
|
1039
|
+
|
|
1040
|
+
inline JSObject* GetCallee() const;
|
|
1041
|
+
inline void SetCallee(JSObject* callee);
|
|
1042
|
+
|
|
1043
|
+
void SetName(jsval name);
|
|
1044
|
+
void SetArgsAndResultPtr(uintN argc, jsval *argv, jsval *rval);
|
|
1045
|
+
void SetCallInfo(XPCNativeInterface* iface, XPCNativeMember* member,
|
|
1046
|
+
JSBool isSetter);
|
|
1047
|
+
|
|
1048
|
+
nsresult CanCallNow();
|
|
1049
|
+
|
|
1050
|
+
void SystemIsBeingShutDown();
|
|
1051
|
+
|
|
1052
|
+
operator JSContext*() const {return GetJSContext();}
|
|
1053
|
+
|
|
1054
|
+
XPCReadableJSStringWrapper *NewStringWrapper(PRUnichar *str, PRUint32 len);
|
|
1055
|
+
void DeleteString(nsAString *string);
|
|
1056
|
+
|
|
1057
|
+
#ifdef XPC_IDISPATCH_SUPPORT
|
|
1058
|
+
/**
|
|
1059
|
+
* Sets the IDispatch information for the context
|
|
1060
|
+
* This has to be void* because of icky Microsoft macros that
|
|
1061
|
+
* would be introduced if we included the DispatchInterface header
|
|
1062
|
+
*/
|
|
1063
|
+
void SetIDispatchInfo(XPCNativeInterface* iface, void * member);
|
|
1064
|
+
void* GetIDispatchMember() const { return mIDispatchMember; }
|
|
1065
|
+
#endif
|
|
1066
|
+
private:
|
|
1067
|
+
|
|
1068
|
+
// no copy ctor or assignment allowed
|
|
1069
|
+
XPCCallContext(const XPCCallContext& r); // not implemented
|
|
1070
|
+
XPCCallContext& operator= (const XPCCallContext& r); // not implemented
|
|
1071
|
+
|
|
1072
|
+
private:
|
|
1073
|
+
// posible values for mState
|
|
1074
|
+
enum State {
|
|
1075
|
+
INIT_FAILED,
|
|
1076
|
+
SYSTEM_SHUTDOWN,
|
|
1077
|
+
HAVE_CONTEXT,
|
|
1078
|
+
HAVE_OBJECT,
|
|
1079
|
+
HAVE_NAME,
|
|
1080
|
+
HAVE_ARGS,
|
|
1081
|
+
READY_TO_CALL,
|
|
1082
|
+
CALL_DONE
|
|
1083
|
+
};
|
|
1084
|
+
|
|
1085
|
+
#ifdef DEBUG
|
|
1086
|
+
inline void CHECK_STATE(int s) const {NS_ASSERTION(mState >= s, "bad state");}
|
|
1087
|
+
#else
|
|
1088
|
+
#define CHECK_STATE(s) ((void)0)
|
|
1089
|
+
#endif
|
|
1090
|
+
|
|
1091
|
+
private:
|
|
1092
|
+
State mState;
|
|
1093
|
+
|
|
1094
|
+
nsXPConnect* mXPC;
|
|
1095
|
+
|
|
1096
|
+
XPCPerThreadData* mThreadData;
|
|
1097
|
+
XPCContext* mXPCContext;
|
|
1098
|
+
JSContext* mJSContext;
|
|
1099
|
+
JSBool mContextPopRequired;
|
|
1100
|
+
JSBool mDestroyJSContextInDestructor;
|
|
1101
|
+
|
|
1102
|
+
XPCContext::LangType mCallerLanguage;
|
|
1103
|
+
|
|
1104
|
+
// ctor does not necessarily init the following. BEWARE!
|
|
1105
|
+
|
|
1106
|
+
XPCContext::LangType mPrevCallerLanguage;
|
|
1107
|
+
|
|
1108
|
+
XPCCallContext* mPrevCallContext;
|
|
1109
|
+
|
|
1110
|
+
JSObject* mOperandJSObject;
|
|
1111
|
+
JSObject* mCurrentJSObject;
|
|
1112
|
+
JSObject* mFlattenedJSObject;
|
|
1113
|
+
XPCWrappedNative* mWrapper;
|
|
1114
|
+
XPCWrappedNativeTearOff* mTearOff;
|
|
1115
|
+
|
|
1116
|
+
XPCNativeScriptableInfo* mScriptableInfo;
|
|
1117
|
+
|
|
1118
|
+
XPCNativeSet* mSet;
|
|
1119
|
+
XPCNativeInterface* mInterface;
|
|
1120
|
+
XPCNativeMember* mMember;
|
|
1121
|
+
|
|
1122
|
+
jsval mName;
|
|
1123
|
+
JSBool mStaticMemberIsLocal;
|
|
1124
|
+
|
|
1125
|
+
uintN mArgc;
|
|
1126
|
+
jsval* mArgv;
|
|
1127
|
+
jsval* mRetVal;
|
|
1128
|
+
|
|
1129
|
+
JSBool mReturnValueWasSet;
|
|
1130
|
+
#ifdef XPC_IDISPATCH_SUPPORT
|
|
1131
|
+
void* mIDispatchMember;
|
|
1132
|
+
#endif
|
|
1133
|
+
PRUint16 mMethodIndex;
|
|
1134
|
+
|
|
1135
|
+
// If not null, this is the function object of the function we're going to
|
|
1136
|
+
// call. This member only makes sense when CallerTypeIsNative() on our
|
|
1137
|
+
// XPCContext returns true. We're not responsible for rooting this object;
|
|
1138
|
+
// whoever sets it on us needs to deal with that.
|
|
1139
|
+
JSObject* mCallee;
|
|
1140
|
+
|
|
1141
|
+
#define XPCCCX_STRING_CACHE_SIZE 2
|
|
1142
|
+
|
|
1143
|
+
// String wrapper entry, holds a string, and a boolean that tells
|
|
1144
|
+
// whether the string is in use or not.
|
|
1145
|
+
struct StringWrapperEntry
|
|
1146
|
+
{
|
|
1147
|
+
StringWrapperEntry()
|
|
1148
|
+
: mInUse(PR_FALSE)
|
|
1149
|
+
{
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
XPCReadableJSStringWrapper mString;
|
|
1153
|
+
PRBool mInUse;
|
|
1154
|
+
};
|
|
1155
|
+
|
|
1156
|
+
// Reserve space for XPCCCX_STRING_CACHE_SIZE string wrapper
|
|
1157
|
+
// entries for use on demand. It's important to not make this be
|
|
1158
|
+
// string class members since we don't want to pay the cost of
|
|
1159
|
+
// calling the constructors and destructors when the strings
|
|
1160
|
+
// aren't being used.
|
|
1161
|
+
char mStringWrapperData[sizeof(StringWrapperEntry) * XPCCCX_STRING_CACHE_SIZE];
|
|
1162
|
+
};
|
|
1163
|
+
|
|
1164
|
+
/***************************************************************************
|
|
1165
|
+
****************************************************************************
|
|
1166
|
+
*
|
|
1167
|
+
* Core classes for wrapped native objects for use from JavaScript...
|
|
1168
|
+
*
|
|
1169
|
+
****************************************************************************
|
|
1170
|
+
***************************************************************************/
|
|
1171
|
+
|
|
1172
|
+
// These are the various JSClasses and callbacks whose use that required
|
|
1173
|
+
// visibility from more than one .cpp file.
|
|
1174
|
+
|
|
1175
|
+
extern JSExtendedClass XPC_WN_NoHelper_JSClass;
|
|
1176
|
+
extern JSClass XPC_WN_NoMods_WithCall_Proto_JSClass;
|
|
1177
|
+
extern JSClass XPC_WN_NoMods_NoCall_Proto_JSClass;
|
|
1178
|
+
extern JSClass XPC_WN_ModsAllowed_WithCall_Proto_JSClass;
|
|
1179
|
+
extern JSClass XPC_WN_ModsAllowed_NoCall_Proto_JSClass;
|
|
1180
|
+
extern JSClass XPC_WN_Tearoff_JSClass;
|
|
1181
|
+
extern JSClass XPC_WN_NoHelper_Proto_JSClass;
|
|
1182
|
+
|
|
1183
|
+
extern JSObjectOps *
|
|
1184
|
+
XPC_WN_GetObjectOpsNoCall(JSContext *cx, JSClass *clazz);
|
|
1185
|
+
|
|
1186
|
+
extern JSObjectOps *
|
|
1187
|
+
XPC_WN_GetObjectOpsWithCall(JSContext *cx, JSClass *clazz);
|
|
1188
|
+
|
|
1189
|
+
extern JSObjectOps *
|
|
1190
|
+
XPC_WN_Proto_GetObjectOps(JSContext *cx, JSClass *clazz);
|
|
1191
|
+
|
|
1192
|
+
extern JSBool
|
|
1193
|
+
XPC_WN_CallMethod(JSContext *cx, JSObject *obj,
|
|
1194
|
+
uintN argc, jsval *argv, jsval *vp);
|
|
1195
|
+
|
|
1196
|
+
extern JSBool
|
|
1197
|
+
XPC_WN_GetterSetter(JSContext *cx, JSObject *obj,
|
|
1198
|
+
uintN argc, jsval *argv, jsval *vp);
|
|
1199
|
+
|
|
1200
|
+
extern JSBool
|
|
1201
|
+
xpc_InitWrappedNativeJSOps();
|
|
1202
|
+
|
|
1203
|
+
// Maybe this macro should check for class->enumerate ==
|
|
1204
|
+
// XPC_WN_Shared_Proto_Enumerate or something rather than checking for
|
|
1205
|
+
// 4 classes?
|
|
1206
|
+
#define IS_PROTO_CLASS(clazz) \
|
|
1207
|
+
((clazz) == &XPC_WN_NoMods_WithCall_Proto_JSClass || \
|
|
1208
|
+
(clazz) == &XPC_WN_NoMods_NoCall_Proto_JSClass || \
|
|
1209
|
+
(clazz) == &XPC_WN_ModsAllowed_WithCall_Proto_JSClass || \
|
|
1210
|
+
(clazz) == &XPC_WN_ModsAllowed_NoCall_Proto_JSClass)
|
|
1211
|
+
|
|
1212
|
+
// Comes from xpcwrappednativeops.cpp
|
|
1213
|
+
extern void
|
|
1214
|
+
xpc_TraceForValidWrapper(JSTracer *trc, XPCWrappedNative* wrapper);
|
|
1215
|
+
|
|
1216
|
+
/***************************************************************************/
|
|
1217
|
+
|
|
1218
|
+
/***************************************************************************/
|
|
1219
|
+
// XPCWrappedNativeScope is one-to-one with a JS global object.
|
|
1220
|
+
|
|
1221
|
+
class XPCWrappedNativeScope : public PRCList
|
|
1222
|
+
{
|
|
1223
|
+
public:
|
|
1224
|
+
|
|
1225
|
+
static XPCWrappedNativeScope*
|
|
1226
|
+
GetNewOrUsed(XPCCallContext& ccx, JSObject* aGlobal);
|
|
1227
|
+
|
|
1228
|
+
XPCJSRuntime*
|
|
1229
|
+
GetRuntime() const {return mRuntime;}
|
|
1230
|
+
|
|
1231
|
+
Native2WrappedNativeMap*
|
|
1232
|
+
GetWrappedNativeMap() const {return mWrappedNativeMap;}
|
|
1233
|
+
|
|
1234
|
+
WrappedNative2WrapperMap*
|
|
1235
|
+
GetWrapperMap() const {return mWrapperMap;}
|
|
1236
|
+
|
|
1237
|
+
ClassInfo2WrappedNativeProtoMap*
|
|
1238
|
+
GetWrappedNativeProtoMap() const {return mWrappedNativeProtoMap;}
|
|
1239
|
+
|
|
1240
|
+
nsXPCComponents*
|
|
1241
|
+
GetComponents() const {return mComponents;}
|
|
1242
|
+
|
|
1243
|
+
JSObject*
|
|
1244
|
+
GetGlobalJSObject() const {return mGlobalJSObject;}
|
|
1245
|
+
|
|
1246
|
+
JSObject*
|
|
1247
|
+
GetPrototypeJSObject() const {return mPrototypeJSObject;}
|
|
1248
|
+
|
|
1249
|
+
// Getter for the prototype that we use for wrappers that have no
|
|
1250
|
+
// helper.
|
|
1251
|
+
JSObject*
|
|
1252
|
+
GetPrototypeNoHelper(XPCCallContext& ccx);
|
|
1253
|
+
|
|
1254
|
+
#ifndef XPCONNECT_STANDALONE
|
|
1255
|
+
nsIPrincipal*
|
|
1256
|
+
GetPrincipal() const
|
|
1257
|
+
{return mScriptObjectPrincipal ?
|
|
1258
|
+
mScriptObjectPrincipal->GetPrincipal() : nsnull;}
|
|
1259
|
+
#endif
|
|
1260
|
+
|
|
1261
|
+
JSObject*
|
|
1262
|
+
GetPrototypeJSFunction() const {return mPrototypeJSFunction;}
|
|
1263
|
+
|
|
1264
|
+
void RemoveWrappedNativeProtos();
|
|
1265
|
+
|
|
1266
|
+
static XPCWrappedNativeScope*
|
|
1267
|
+
FindInJSObjectScope(JSContext* cx, JSObject* obj,
|
|
1268
|
+
JSBool OKIfNotInitialized = JS_FALSE,
|
|
1269
|
+
XPCJSRuntime* runtime = nsnull);
|
|
1270
|
+
|
|
1271
|
+
static XPCWrappedNativeScope*
|
|
1272
|
+
FindInJSObjectScope(XPCCallContext& ccx, JSObject* obj,
|
|
1273
|
+
JSBool OKIfNotInitialized = JS_FALSE)
|
|
1274
|
+
{
|
|
1275
|
+
return FindInJSObjectScope(ccx, obj, OKIfNotInitialized,
|
|
1276
|
+
ccx.GetRuntime());
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1279
|
+
static void
|
|
1280
|
+
SystemIsBeingShutDown(JSContext* cx);
|
|
1281
|
+
|
|
1282
|
+
static void
|
|
1283
|
+
TraceJS(JSTracer* trc, XPCJSRuntime* rt);
|
|
1284
|
+
|
|
1285
|
+
static void
|
|
1286
|
+
SuspectAllWrappers(XPCJSRuntime* rt, JSContext* cx,
|
|
1287
|
+
nsCycleCollectionTraversalCallback &cb);
|
|
1288
|
+
|
|
1289
|
+
static void
|
|
1290
|
+
FinishedMarkPhaseOfGC(JSContext* cx, XPCJSRuntime* rt);
|
|
1291
|
+
|
|
1292
|
+
static void
|
|
1293
|
+
FinishedFinalizationPhaseOfGC(JSContext* cx);
|
|
1294
|
+
|
|
1295
|
+
static void
|
|
1296
|
+
MarkAllWrappedNativesAndProtos();
|
|
1297
|
+
|
|
1298
|
+
static nsresult
|
|
1299
|
+
ClearAllWrappedNativeSecurityPolicies(XPCCallContext& ccx);
|
|
1300
|
+
|
|
1301
|
+
#ifdef DEBUG
|
|
1302
|
+
static void
|
|
1303
|
+
ASSERT_NoInterfaceSetsAreMarked();
|
|
1304
|
+
#endif
|
|
1305
|
+
|
|
1306
|
+
static void
|
|
1307
|
+
SweepAllWrappedNativeTearOffs();
|
|
1308
|
+
|
|
1309
|
+
static void
|
|
1310
|
+
DebugDumpAllScopes(PRInt16 depth);
|
|
1311
|
+
|
|
1312
|
+
void
|
|
1313
|
+
DebugDump(PRInt16 depth);
|
|
1314
|
+
|
|
1315
|
+
JSBool
|
|
1316
|
+
IsValid() const {return mRuntime != nsnull;}
|
|
1317
|
+
|
|
1318
|
+
static JSBool
|
|
1319
|
+
IsDyingScope(XPCWrappedNativeScope *scope);
|
|
1320
|
+
|
|
1321
|
+
void SetComponents(nsXPCComponents* aComponents);
|
|
1322
|
+
void SetGlobal(XPCCallContext& ccx, JSObject* aGlobal);
|
|
1323
|
+
|
|
1324
|
+
static void InitStatics() { gScopes = nsnull; gDyingScopes = nsnull; }
|
|
1325
|
+
|
|
1326
|
+
XPCContext *GetContext() { return mContext; }
|
|
1327
|
+
void SetContext(XPCContext *xpcc) { mContext = nsnull; }
|
|
1328
|
+
|
|
1329
|
+
#ifndef XPCONNECT_STANDALONE
|
|
1330
|
+
/**
|
|
1331
|
+
* Fills the hash mapping global object to principal.
|
|
1332
|
+
*/
|
|
1333
|
+
static void TraverseScopes(XPCCallContext& ccx);
|
|
1334
|
+
#endif
|
|
1335
|
+
|
|
1336
|
+
protected:
|
|
1337
|
+
XPCWrappedNativeScope(XPCCallContext& ccx, JSObject* aGlobal);
|
|
1338
|
+
virtual ~XPCWrappedNativeScope();
|
|
1339
|
+
|
|
1340
|
+
static void KillDyingScopes();
|
|
1341
|
+
|
|
1342
|
+
XPCWrappedNativeScope(); // not implemented
|
|
1343
|
+
|
|
1344
|
+
private:
|
|
1345
|
+
static XPCWrappedNativeScope* gScopes;
|
|
1346
|
+
static XPCWrappedNativeScope* gDyingScopes;
|
|
1347
|
+
|
|
1348
|
+
XPCJSRuntime* mRuntime;
|
|
1349
|
+
Native2WrappedNativeMap* mWrappedNativeMap;
|
|
1350
|
+
ClassInfo2WrappedNativeProtoMap* mWrappedNativeProtoMap;
|
|
1351
|
+
WrappedNative2WrapperMap* mWrapperMap;
|
|
1352
|
+
nsXPCComponents* mComponents;
|
|
1353
|
+
XPCWrappedNativeScope* mNext;
|
|
1354
|
+
// The JS global object for this scope. If non-null, this will be the
|
|
1355
|
+
// default parent for the XPCWrappedNatives that have us as the scope,
|
|
1356
|
+
// unless a PreCreate hook overrides it. Note that this _may_ be null (see
|
|
1357
|
+
// constructor).
|
|
1358
|
+
JSObject* mGlobalJSObject;
|
|
1359
|
+
|
|
1360
|
+
// Cached value of Object.prototype
|
|
1361
|
+
JSObject* mPrototypeJSObject;
|
|
1362
|
+
// Cached value of Function.prototype
|
|
1363
|
+
JSObject* mPrototypeJSFunction;
|
|
1364
|
+
// Prototype to use for wrappers with no helper.
|
|
1365
|
+
JSObject* mPrototypeNoHelper;
|
|
1366
|
+
|
|
1367
|
+
XPCContext* mContext;
|
|
1368
|
+
|
|
1369
|
+
#ifndef XPCONNECT_STANDALONE
|
|
1370
|
+
// The script object principal instance corresponding to our current global
|
|
1371
|
+
// JS object.
|
|
1372
|
+
// XXXbz what happens if someone calls JS_SetPrivate on mGlobalJSObject.
|
|
1373
|
+
// How do we deal? Do we need to? I suspect this isn't worth worrying
|
|
1374
|
+
// about, since all of our scope objects are verified as not doing that.
|
|
1375
|
+
nsCOMPtr<nsIScriptObjectPrincipal> mScriptObjectPrincipal;
|
|
1376
|
+
#endif
|
|
1377
|
+
};
|
|
1378
|
+
|
|
1379
|
+
JSObject* xpc_CloneJSFunction(XPCCallContext &ccx, JSObject *funobj,
|
|
1380
|
+
JSObject *parent);
|
|
1381
|
+
|
|
1382
|
+
/***************************************************************************/
|
|
1383
|
+
// XPCNativeMember represents a single idl declared method, attribute or
|
|
1384
|
+
// constant.
|
|
1385
|
+
|
|
1386
|
+
// Tight. No virtual methods. Can be bitwise copied (until any resolution done).
|
|
1387
|
+
|
|
1388
|
+
class XPCNativeMember
|
|
1389
|
+
{
|
|
1390
|
+
public:
|
|
1391
|
+
static JSBool GetCallInfo(XPCCallContext& ccx,
|
|
1392
|
+
JSObject* funobj,
|
|
1393
|
+
XPCNativeInterface** pInterface,
|
|
1394
|
+
XPCNativeMember** pMember);
|
|
1395
|
+
|
|
1396
|
+
jsval GetName() const {return mName;}
|
|
1397
|
+
|
|
1398
|
+
PRUint16 GetIndex() const {return mIndex;}
|
|
1399
|
+
|
|
1400
|
+
JSBool GetConstantValue(XPCCallContext& ccx, XPCNativeInterface* iface,
|
|
1401
|
+
jsval* pval)
|
|
1402
|
+
{NS_ASSERTION(IsConstant(),
|
|
1403
|
+
"Only call this if you're sure this is a constant!");
|
|
1404
|
+
if(!IsResolved() && !Resolve(ccx, iface)) return JS_FALSE;
|
|
1405
|
+
*pval = mVal; return JS_TRUE;}
|
|
1406
|
+
|
|
1407
|
+
JSBool NewFunctionObject(XPCCallContext& ccx, XPCNativeInterface* iface,
|
|
1408
|
+
JSObject *parent, jsval* pval);
|
|
1409
|
+
|
|
1410
|
+
JSBool IsMethod() const
|
|
1411
|
+
{return 0 != (mFlags & METHOD);}
|
|
1412
|
+
|
|
1413
|
+
JSBool IsConstant() const
|
|
1414
|
+
{return 0 != (mFlags & CONSTANT);}
|
|
1415
|
+
|
|
1416
|
+
JSBool IsAttribute() const
|
|
1417
|
+
{return 0 != (mFlags & GETTER);}
|
|
1418
|
+
|
|
1419
|
+
JSBool IsWritableAttribute() const
|
|
1420
|
+
{return 0 != (mFlags & SETTER_TOO);}
|
|
1421
|
+
|
|
1422
|
+
JSBool IsReadOnlyAttribute() const
|
|
1423
|
+
{return IsAttribute() && !IsWritableAttribute();}
|
|
1424
|
+
|
|
1425
|
+
|
|
1426
|
+
void SetName(jsval a) {mName = a;}
|
|
1427
|
+
|
|
1428
|
+
void SetMethod(PRUint16 index)
|
|
1429
|
+
{mVal = JSVAL_NULL; mFlags = METHOD; mIndex = index;}
|
|
1430
|
+
|
|
1431
|
+
void SetConstant(PRUint16 index)
|
|
1432
|
+
{mVal = JSVAL_NULL; mFlags = CONSTANT; mIndex = index;}
|
|
1433
|
+
|
|
1434
|
+
void SetReadOnlyAttribute(PRUint16 index)
|
|
1435
|
+
{mVal = JSVAL_NULL; mFlags = GETTER; mIndex = index;}
|
|
1436
|
+
|
|
1437
|
+
void SetWritableAttribute()
|
|
1438
|
+
{NS_ASSERTION(mFlags == GETTER,"bad"); mFlags = GETTER | SETTER_TOO;}
|
|
1439
|
+
|
|
1440
|
+
/* default ctor - leave random contents */
|
|
1441
|
+
XPCNativeMember() {MOZ_COUNT_CTOR(XPCNativeMember);}
|
|
1442
|
+
~XPCNativeMember() {MOZ_COUNT_DTOR(XPCNativeMember);}
|
|
1443
|
+
|
|
1444
|
+
void DealWithDyingGCThings(JSContext* cx, XPCJSRuntime* rt)
|
|
1445
|
+
{if(IsResolved() && JSVAL_IS_GCTHING(mVal) &&
|
|
1446
|
+
JS_IsAboutToBeFinalized(cx, JSVAL_TO_GCTHING(mVal)))
|
|
1447
|
+
{mVal = JSVAL_NULL; mFlags &= ~RESOLVED;}}
|
|
1448
|
+
|
|
1449
|
+
private:
|
|
1450
|
+
JSBool IsResolved() const {return mFlags & RESOLVED;}
|
|
1451
|
+
JSBool Resolve(XPCCallContext& ccx, XPCNativeInterface* iface);
|
|
1452
|
+
|
|
1453
|
+
enum {
|
|
1454
|
+
RESOLVED = 0x01,
|
|
1455
|
+
METHOD = 0x02,
|
|
1456
|
+
CONSTANT = 0x04,
|
|
1457
|
+
GETTER = 0x08,
|
|
1458
|
+
SETTER_TOO = 0x10
|
|
1459
|
+
};
|
|
1460
|
+
|
|
1461
|
+
private:
|
|
1462
|
+
// our only data...
|
|
1463
|
+
jsval mName;
|
|
1464
|
+
jsval mVal;
|
|
1465
|
+
PRUint16 mIndex;
|
|
1466
|
+
PRUint16 mFlags;
|
|
1467
|
+
};
|
|
1468
|
+
|
|
1469
|
+
/***************************************************************************/
|
|
1470
|
+
// XPCNativeInterface represents a single idl declared interface. This is
|
|
1471
|
+
// primarily the set of XPCNativeMembers.
|
|
1472
|
+
|
|
1473
|
+
// Tight. No virtual methods.
|
|
1474
|
+
|
|
1475
|
+
class XPCNativeInterface
|
|
1476
|
+
{
|
|
1477
|
+
public:
|
|
1478
|
+
static XPCNativeInterface* GetNewOrUsed(XPCCallContext& ccx,
|
|
1479
|
+
const nsIID* iid);
|
|
1480
|
+
static XPCNativeInterface* GetNewOrUsed(XPCCallContext& ccx,
|
|
1481
|
+
nsIInterfaceInfo* info);
|
|
1482
|
+
static XPCNativeInterface* GetNewOrUsed(XPCCallContext& ccx,
|
|
1483
|
+
const char* name);
|
|
1484
|
+
static XPCNativeInterface* GetISupports(XPCCallContext& ccx);
|
|
1485
|
+
|
|
1486
|
+
inline nsIInterfaceInfo* GetInterfaceInfo() const {return mInfo.get();}
|
|
1487
|
+
inline jsval GetName() const {return mName;}
|
|
1488
|
+
|
|
1489
|
+
inline const nsIID* GetIID() const;
|
|
1490
|
+
inline const char* GetNameString() const;
|
|
1491
|
+
inline XPCNativeMember* FindMember(jsval name) const;
|
|
1492
|
+
|
|
1493
|
+
inline JSBool HasAncestor(const nsIID* iid) const;
|
|
1494
|
+
|
|
1495
|
+
const char* GetMemberName(XPCCallContext& ccx,
|
|
1496
|
+
const XPCNativeMember* member) const;
|
|
1497
|
+
|
|
1498
|
+
PRUint16 GetMemberCount() const
|
|
1499
|
+
{NS_ASSERTION(!IsMarked(), "bad"); return mMemberCount;}
|
|
1500
|
+
XPCNativeMember* GetMemberAt(PRUint16 i)
|
|
1501
|
+
{NS_ASSERTION(i < mMemberCount, "bad index"); return &mMembers[i];}
|
|
1502
|
+
|
|
1503
|
+
inline void DealWithDyingGCThings(JSContext* cx, XPCJSRuntime* rt);
|
|
1504
|
+
|
|
1505
|
+
void DebugDump(PRInt16 depth);
|
|
1506
|
+
|
|
1507
|
+
#define XPC_NATIVE_IFACE_MARK_FLAG ((PRUint16)JS_BIT(15)) // only high bit of 16 is set
|
|
1508
|
+
|
|
1509
|
+
void Mark() {mMemberCount |= XPC_NATIVE_IFACE_MARK_FLAG;}
|
|
1510
|
+
void Unmark() {mMemberCount &= ~XPC_NATIVE_IFACE_MARK_FLAG;}
|
|
1511
|
+
JSBool IsMarked() const
|
|
1512
|
+
{return 0 != (mMemberCount & XPC_NATIVE_IFACE_MARK_FLAG);}
|
|
1513
|
+
|
|
1514
|
+
// NOP. This is just here to make the AutoMarkingPtr code compile.
|
|
1515
|
+
inline void TraceJS(JSTracer* trc) {}
|
|
1516
|
+
inline void AutoTrace(JSTracer* trc) {}
|
|
1517
|
+
|
|
1518
|
+
static void DestroyInstance(JSContext* cx, XPCJSRuntime* rt,
|
|
1519
|
+
XPCNativeInterface* inst);
|
|
1520
|
+
|
|
1521
|
+
protected:
|
|
1522
|
+
static XPCNativeInterface* NewInstance(XPCCallContext& ccx,
|
|
1523
|
+
nsIInterfaceInfo* aInfo);
|
|
1524
|
+
|
|
1525
|
+
XPCNativeInterface(); // not implemented
|
|
1526
|
+
XPCNativeInterface(nsIInterfaceInfo* aInfo, jsval aName)
|
|
1527
|
+
: mInfo(aInfo), mName(aName), mMemberCount(0)
|
|
1528
|
+
{MOZ_COUNT_CTOR(XPCNativeInterface);}
|
|
1529
|
+
~XPCNativeInterface() {MOZ_COUNT_DTOR(XPCNativeInterface);}
|
|
1530
|
+
|
|
1531
|
+
void* operator new(size_t, void* p) CPP_THROW_NEW {return p;}
|
|
1532
|
+
|
|
1533
|
+
XPCNativeInterface(const XPCNativeInterface& r); // not implemented
|
|
1534
|
+
XPCNativeInterface& operator= (const XPCNativeInterface& r); // not implemented
|
|
1535
|
+
|
|
1536
|
+
private:
|
|
1537
|
+
nsCOMPtr<nsIInterfaceInfo> mInfo;
|
|
1538
|
+
jsval mName;
|
|
1539
|
+
PRUint16 mMemberCount;
|
|
1540
|
+
XPCNativeMember mMembers[1]; // always last - object sized for array
|
|
1541
|
+
};
|
|
1542
|
+
|
|
1543
|
+
/***************************************************************************/
|
|
1544
|
+
// XPCNativeSetKey is used to key a XPCNativeSet in a NativeSetMap.
|
|
1545
|
+
|
|
1546
|
+
class XPCNativeSetKey
|
|
1547
|
+
{
|
|
1548
|
+
public:
|
|
1549
|
+
XPCNativeSetKey(XPCNativeSet* BaseSet = nsnull,
|
|
1550
|
+
XPCNativeInterface* Addition = nsnull,
|
|
1551
|
+
PRUint16 Position = 0)
|
|
1552
|
+
: mIsAKey(IS_A_KEY), mPosition(Position), mBaseSet(BaseSet),
|
|
1553
|
+
mAddition(Addition) {}
|
|
1554
|
+
~XPCNativeSetKey() {}
|
|
1555
|
+
|
|
1556
|
+
XPCNativeSet* GetBaseSet() const {return mBaseSet;}
|
|
1557
|
+
XPCNativeInterface* GetAddition() const {return mAddition;}
|
|
1558
|
+
PRUint16 GetPosition() const {return mPosition;}
|
|
1559
|
+
|
|
1560
|
+
// This is a fun little hack...
|
|
1561
|
+
// We build these keys only on the stack. We use them for lookup in
|
|
1562
|
+
// NativeSetMap. Becasue we don't want to pay the cost of cloning a key and
|
|
1563
|
+
// sticking it into the hashtable, when the XPCNativeSet actually
|
|
1564
|
+
// gets added to the table the 'key' in the table is a pointer to the
|
|
1565
|
+
// set itself and not this key. Our key compare function expects to get
|
|
1566
|
+
// a key and a set. When we do external lookups in the map we pass in one
|
|
1567
|
+
// of these keys and our compare function gets passed a key and a set.
|
|
1568
|
+
// (see compare_NativeKeyToSet in xpcmaps.cpp). This is all well and good.
|
|
1569
|
+
// Except, when the table decides to resize itself. Then it tries to use
|
|
1570
|
+
// our compare function with the 'keys' that are in the hashtable (which are
|
|
1571
|
+
// really XPCNativeSet objects and not XPCNativeSetKey objects!
|
|
1572
|
+
//
|
|
1573
|
+
// So, the hack is to have the compare function assume it is getting a
|
|
1574
|
+
// XPCNativeSetKey pointer and call this IsAKey method. If that fails then
|
|
1575
|
+
// it realises that it really has a XPCNativeSet pointer and deals with that
|
|
1576
|
+
// fact. This is safe because we know that both of these classes have no
|
|
1577
|
+
// virtual methods and their first data member is a PRUint16. We are
|
|
1578
|
+
// confident that XPCNativeSet->mMemberCount will never be 0xffff.
|
|
1579
|
+
|
|
1580
|
+
JSBool IsAKey() const {return mIsAKey == IS_A_KEY;}
|
|
1581
|
+
|
|
1582
|
+
enum {IS_A_KEY = 0xffff};
|
|
1583
|
+
|
|
1584
|
+
// Allow shallow copy
|
|
1585
|
+
|
|
1586
|
+
private:
|
|
1587
|
+
PRUint16 mIsAKey; // must be first data member
|
|
1588
|
+
PRUint16 mPosition;
|
|
1589
|
+
XPCNativeSet* mBaseSet;
|
|
1590
|
+
XPCNativeInterface* mAddition;
|
|
1591
|
+
};
|
|
1592
|
+
|
|
1593
|
+
/***************************************************************************/
|
|
1594
|
+
// XPCNativeSet represents an ordered collection of XPCNativeInterface pointers.
|
|
1595
|
+
|
|
1596
|
+
class XPCNativeSet
|
|
1597
|
+
{
|
|
1598
|
+
public:
|
|
1599
|
+
static XPCNativeSet* GetNewOrUsed(XPCCallContext& ccx, const nsIID* iid);
|
|
1600
|
+
static XPCNativeSet* GetNewOrUsed(XPCCallContext& ccx,
|
|
1601
|
+
nsIClassInfo* classInfo);
|
|
1602
|
+
static XPCNativeSet* GetNewOrUsed(XPCCallContext& ccx,
|
|
1603
|
+
XPCNativeSet* otherSet,
|
|
1604
|
+
XPCNativeInterface* newInterface,
|
|
1605
|
+
PRUint16 position);
|
|
1606
|
+
|
|
1607
|
+
static void ClearCacheEntryForClassInfo(nsIClassInfo* classInfo);
|
|
1608
|
+
|
|
1609
|
+
inline JSBool FindMember(jsval name, XPCNativeMember** pMember,
|
|
1610
|
+
PRUint16* pInterfaceIndex) const;
|
|
1611
|
+
|
|
1612
|
+
inline JSBool FindMember(jsval name, XPCNativeMember** pMember,
|
|
1613
|
+
XPCNativeInterface** pInterface) const;
|
|
1614
|
+
|
|
1615
|
+
inline JSBool FindMember(jsval name,
|
|
1616
|
+
XPCNativeMember** pMember,
|
|
1617
|
+
XPCNativeInterface** pInterface,
|
|
1618
|
+
XPCNativeSet* protoSet,
|
|
1619
|
+
JSBool* pIsLocal) const;
|
|
1620
|
+
|
|
1621
|
+
inline JSBool HasInterface(XPCNativeInterface* aInterface) const;
|
|
1622
|
+
inline JSBool HasInterfaceWithAncestor(XPCNativeInterface* aInterface) const;
|
|
1623
|
+
|
|
1624
|
+
inline XPCNativeInterface* FindInterfaceWithIID(const nsIID& iid) const;
|
|
1625
|
+
|
|
1626
|
+
inline XPCNativeInterface* FindNamedInterface(jsval name) const;
|
|
1627
|
+
|
|
1628
|
+
PRUint16 GetMemberCount() const {return mMemberCount;}
|
|
1629
|
+
PRUint16 GetInterfaceCount() const
|
|
1630
|
+
{NS_ASSERTION(!IsMarked(), "bad"); return mInterfaceCount;}
|
|
1631
|
+
XPCNativeInterface** GetInterfaceArray() {return mInterfaces;}
|
|
1632
|
+
|
|
1633
|
+
XPCNativeInterface* GetInterfaceAt(PRUint16 i)
|
|
1634
|
+
{NS_ASSERTION(i < mInterfaceCount, "bad index"); return mInterfaces[i];}
|
|
1635
|
+
|
|
1636
|
+
inline JSBool MatchesSetUpToInterface(const XPCNativeSet* other,
|
|
1637
|
+
XPCNativeInterface* iface) const;
|
|
1638
|
+
|
|
1639
|
+
#define XPC_NATIVE_SET_MARK_FLAG ((PRUint16)JS_BIT(15)) // only high bit of 16 is set
|
|
1640
|
+
|
|
1641
|
+
inline void Mark();
|
|
1642
|
+
|
|
1643
|
+
// NOP. This is just here to make the AutoMarkingPtr code compile.
|
|
1644
|
+
inline void TraceJS(JSTracer* trc) {}
|
|
1645
|
+
inline void AutoTrace(JSTracer* trc) {}
|
|
1646
|
+
|
|
1647
|
+
private:
|
|
1648
|
+
void MarkSelfOnly() {mInterfaceCount |= XPC_NATIVE_SET_MARK_FLAG;}
|
|
1649
|
+
public:
|
|
1650
|
+
void Unmark() {mInterfaceCount &= ~XPC_NATIVE_SET_MARK_FLAG;}
|
|
1651
|
+
JSBool IsMarked() const
|
|
1652
|
+
{return 0 != (mInterfaceCount & XPC_NATIVE_SET_MARK_FLAG);}
|
|
1653
|
+
|
|
1654
|
+
#ifdef DEBUG
|
|
1655
|
+
inline void ASSERT_NotMarked();
|
|
1656
|
+
#endif
|
|
1657
|
+
|
|
1658
|
+
void DebugDump(PRInt16 depth);
|
|
1659
|
+
|
|
1660
|
+
static void DestroyInstance(XPCNativeSet* inst);
|
|
1661
|
+
|
|
1662
|
+
protected:
|
|
1663
|
+
static XPCNativeSet* NewInstance(XPCCallContext& ccx,
|
|
1664
|
+
XPCNativeInterface** array,
|
|
1665
|
+
PRUint16 count);
|
|
1666
|
+
static XPCNativeSet* NewInstanceMutate(XPCNativeSet* otherSet,
|
|
1667
|
+
XPCNativeInterface* newInterface,
|
|
1668
|
+
PRUint16 position);
|
|
1669
|
+
XPCNativeSet() {MOZ_COUNT_CTOR(XPCNativeSet);}
|
|
1670
|
+
~XPCNativeSet() {MOZ_COUNT_DTOR(XPCNativeSet);}
|
|
1671
|
+
void* operator new(size_t, void* p) CPP_THROW_NEW {return p;}
|
|
1672
|
+
|
|
1673
|
+
private:
|
|
1674
|
+
PRUint16 mMemberCount;
|
|
1675
|
+
PRUint16 mInterfaceCount;
|
|
1676
|
+
XPCNativeInterface* mInterfaces[1]; // always last - object sized for array
|
|
1677
|
+
};
|
|
1678
|
+
|
|
1679
|
+
/***************************************************************************/
|
|
1680
|
+
// XPCNativeScriptableFlags is a wrapper class that holds the flags returned
|
|
1681
|
+
// from calls to nsIXPCScriptable::GetScriptableFlags(). It has convenience
|
|
1682
|
+
// methods to check for particular bitflags. Since we also use this class as
|
|
1683
|
+
// a member of the gc'd class XPCNativeScriptableShared, this class holds the
|
|
1684
|
+
// bit and exposes the inlined methods to support marking.
|
|
1685
|
+
|
|
1686
|
+
#define XPC_WN_SJSFLAGS_MARK_FLAG JS_BIT(31) // only high bit of 32 is set
|
|
1687
|
+
|
|
1688
|
+
class XPCNativeScriptableFlags
|
|
1689
|
+
{
|
|
1690
|
+
private:
|
|
1691
|
+
JSUint32 mFlags;
|
|
1692
|
+
|
|
1693
|
+
public:
|
|
1694
|
+
|
|
1695
|
+
XPCNativeScriptableFlags(JSUint32 flags = 0) : mFlags(flags) {}
|
|
1696
|
+
|
|
1697
|
+
JSUint32 GetFlags() const {return mFlags & ~XPC_WN_SJSFLAGS_MARK_FLAG;}
|
|
1698
|
+
void SetFlags(JSUint32 flags) {mFlags = flags;}
|
|
1699
|
+
|
|
1700
|
+
operator JSUint32() const {return GetFlags();}
|
|
1701
|
+
|
|
1702
|
+
XPCNativeScriptableFlags(const XPCNativeScriptableFlags& r)
|
|
1703
|
+
{mFlags = r.GetFlags();}
|
|
1704
|
+
|
|
1705
|
+
XPCNativeScriptableFlags& operator= (const XPCNativeScriptableFlags& r)
|
|
1706
|
+
{mFlags = r.GetFlags(); return *this;}
|
|
1707
|
+
|
|
1708
|
+
void Mark() {mFlags |= XPC_WN_SJSFLAGS_MARK_FLAG;}
|
|
1709
|
+
void Unmark() {mFlags &= ~XPC_WN_SJSFLAGS_MARK_FLAG;}
|
|
1710
|
+
JSBool IsMarked() const {return 0 != (mFlags & XPC_WN_SJSFLAGS_MARK_FLAG);}
|
|
1711
|
+
|
|
1712
|
+
#ifdef GET_IT
|
|
1713
|
+
#undef GET_IT
|
|
1714
|
+
#endif
|
|
1715
|
+
#define GET_IT(f_) const {return 0 != (mFlags & nsIXPCScriptable:: f_ );}
|
|
1716
|
+
|
|
1717
|
+
JSBool WantPreCreate() GET_IT(WANT_PRECREATE)
|
|
1718
|
+
JSBool WantCreate() GET_IT(WANT_CREATE)
|
|
1719
|
+
JSBool WantPostCreate() GET_IT(WANT_POSTCREATE)
|
|
1720
|
+
JSBool WantAddProperty() GET_IT(WANT_ADDPROPERTY)
|
|
1721
|
+
JSBool WantDelProperty() GET_IT(WANT_DELPROPERTY)
|
|
1722
|
+
JSBool WantGetProperty() GET_IT(WANT_GETPROPERTY)
|
|
1723
|
+
JSBool WantSetProperty() GET_IT(WANT_SETPROPERTY)
|
|
1724
|
+
JSBool WantEnumerate() GET_IT(WANT_ENUMERATE)
|
|
1725
|
+
JSBool WantNewEnumerate() GET_IT(WANT_NEWENUMERATE)
|
|
1726
|
+
JSBool WantNewResolve() GET_IT(WANT_NEWRESOLVE)
|
|
1727
|
+
JSBool WantConvert() GET_IT(WANT_CONVERT)
|
|
1728
|
+
JSBool WantFinalize() GET_IT(WANT_FINALIZE)
|
|
1729
|
+
JSBool WantCheckAccess() GET_IT(WANT_CHECKACCESS)
|
|
1730
|
+
JSBool WantCall() GET_IT(WANT_CALL)
|
|
1731
|
+
JSBool WantConstruct() GET_IT(WANT_CONSTRUCT)
|
|
1732
|
+
JSBool WantHasInstance() GET_IT(WANT_HASINSTANCE)
|
|
1733
|
+
JSBool WantTrace() GET_IT(WANT_TRACE)
|
|
1734
|
+
JSBool WantEquality() GET_IT(WANT_EQUALITY)
|
|
1735
|
+
JSBool WantOuterObject() GET_IT(WANT_OUTER_OBJECT)
|
|
1736
|
+
JSBool WantInnerObject() GET_IT(WANT_INNER_OBJECT)
|
|
1737
|
+
JSBool UseJSStubForAddProperty() GET_IT(USE_JSSTUB_FOR_ADDPROPERTY)
|
|
1738
|
+
JSBool UseJSStubForDelProperty() GET_IT(USE_JSSTUB_FOR_DELPROPERTY)
|
|
1739
|
+
JSBool UseJSStubForSetProperty() GET_IT(USE_JSSTUB_FOR_SETPROPERTY)
|
|
1740
|
+
JSBool DontEnumStaticProps() GET_IT(DONT_ENUM_STATIC_PROPS)
|
|
1741
|
+
JSBool DontEnumQueryInterface() GET_IT(DONT_ENUM_QUERY_INTERFACE)
|
|
1742
|
+
JSBool DontAskInstanceForScriptable() GET_IT(DONT_ASK_INSTANCE_FOR_SCRIPTABLE)
|
|
1743
|
+
JSBool ClassInfoInterfacesOnly() GET_IT(CLASSINFO_INTERFACES_ONLY)
|
|
1744
|
+
JSBool AllowPropModsDuringResolve() GET_IT(ALLOW_PROP_MODS_DURING_RESOLVE)
|
|
1745
|
+
JSBool AllowPropModsToPrototype() GET_IT(ALLOW_PROP_MODS_TO_PROTOTYPE)
|
|
1746
|
+
JSBool DontSharePrototype() GET_IT(DONT_SHARE_PROTOTYPE)
|
|
1747
|
+
JSBool DontReflectInterfaceNames() GET_IT(DONT_REFLECT_INTERFACE_NAMES)
|
|
1748
|
+
|
|
1749
|
+
#undef GET_IT
|
|
1750
|
+
};
|
|
1751
|
+
|
|
1752
|
+
/***************************************************************************/
|
|
1753
|
+
|
|
1754
|
+
// XPCNativeScriptableShared is used to hold the JSClass and the
|
|
1755
|
+
// associated scriptable flags for XPCWrappedNatives. These are shared across
|
|
1756
|
+
// the runtime and are garbage collected by xpconnect. We *used* to just store
|
|
1757
|
+
// this inside the XPCNativeScriptableInfo (usually owned by instances of
|
|
1758
|
+
// XPCWrappedNativeProto. This had two problems... It was wasteful, and it
|
|
1759
|
+
// was a big problem when wrappers are reparented to different scopes (and
|
|
1760
|
+
// thus different protos (the DOM does this).
|
|
1761
|
+
|
|
1762
|
+
class XPCNativeScriptableShared
|
|
1763
|
+
{
|
|
1764
|
+
public:
|
|
1765
|
+
const XPCNativeScriptableFlags& GetFlags() const {return mFlags;}
|
|
1766
|
+
JSClass* GetJSClass() {return &mJSClass.base;}
|
|
1767
|
+
|
|
1768
|
+
XPCNativeScriptableShared(JSUint32 aFlags = 0, char* aName = nsnull)
|
|
1769
|
+
: mFlags(aFlags)
|
|
1770
|
+
{memset(&mJSClass, 0, sizeof(mJSClass));
|
|
1771
|
+
mJSClass.base.name = aName; // take ownership
|
|
1772
|
+
MOZ_COUNT_CTOR(XPCNativeScriptableShared);}
|
|
1773
|
+
|
|
1774
|
+
~XPCNativeScriptableShared()
|
|
1775
|
+
{if(mJSClass.base.name)nsMemory::Free((void*)mJSClass.base.name);
|
|
1776
|
+
MOZ_COUNT_DTOR(XPCNativeScriptableShared);}
|
|
1777
|
+
|
|
1778
|
+
char* TransferNameOwnership()
|
|
1779
|
+
{char* name=(char*)mJSClass.base.name; mJSClass.base.name = nsnull;
|
|
1780
|
+
return name;}
|
|
1781
|
+
|
|
1782
|
+
void PopulateJSClass(JSBool isGlobal);
|
|
1783
|
+
|
|
1784
|
+
void Mark() {mFlags.Mark();}
|
|
1785
|
+
void Unmark() {mFlags.Unmark();}
|
|
1786
|
+
JSBool IsMarked() const {return mFlags.IsMarked();}
|
|
1787
|
+
|
|
1788
|
+
private:
|
|
1789
|
+
XPCNativeScriptableFlags mFlags;
|
|
1790
|
+
JSExtendedClass mJSClass;
|
|
1791
|
+
};
|
|
1792
|
+
|
|
1793
|
+
/***************************************************************************/
|
|
1794
|
+
// XPCNativeScriptableInfo is used to hold the nsIXPCScriptable state for a
|
|
1795
|
+
// given class or instance.
|
|
1796
|
+
|
|
1797
|
+
class XPCNativeScriptableInfo
|
|
1798
|
+
{
|
|
1799
|
+
public:
|
|
1800
|
+
static XPCNativeScriptableInfo*
|
|
1801
|
+
Construct(XPCCallContext& ccx, JSBool isGlobal,
|
|
1802
|
+
const XPCNativeScriptableCreateInfo* sci);
|
|
1803
|
+
|
|
1804
|
+
nsIXPCScriptable*
|
|
1805
|
+
GetCallback() const {return mCallback;}
|
|
1806
|
+
|
|
1807
|
+
const XPCNativeScriptableFlags&
|
|
1808
|
+
GetFlags() const {return mShared->GetFlags();}
|
|
1809
|
+
|
|
1810
|
+
JSClass*
|
|
1811
|
+
GetJSClass() {return mShared->GetJSClass();}
|
|
1812
|
+
|
|
1813
|
+
XPCNativeScriptableShared*
|
|
1814
|
+
GetScriptableShared() {return mShared;}
|
|
1815
|
+
|
|
1816
|
+
void
|
|
1817
|
+
SetCallback(nsIXPCScriptable* s) {mCallback = s;}
|
|
1818
|
+
|
|
1819
|
+
void
|
|
1820
|
+
SetScriptableShared(XPCNativeScriptableShared* shared) {mShared = shared;}
|
|
1821
|
+
|
|
1822
|
+
void Mark() {if(mShared) mShared->Mark();}
|
|
1823
|
+
|
|
1824
|
+
protected:
|
|
1825
|
+
XPCNativeScriptableInfo(nsIXPCScriptable* scriptable = nsnull,
|
|
1826
|
+
XPCNativeScriptableShared* shared = nsnull)
|
|
1827
|
+
: mCallback(scriptable), mShared(shared)
|
|
1828
|
+
{MOZ_COUNT_CTOR(XPCNativeScriptableInfo);}
|
|
1829
|
+
public:
|
|
1830
|
+
~XPCNativeScriptableInfo() {MOZ_COUNT_DTOR(XPCNativeScriptableInfo);}
|
|
1831
|
+
private:
|
|
1832
|
+
|
|
1833
|
+
// disable copy ctor and assignment
|
|
1834
|
+
XPCNativeScriptableInfo(const XPCNativeScriptableInfo& r); // not implemented
|
|
1835
|
+
XPCNativeScriptableInfo& operator= (const XPCNativeScriptableInfo& r); // not implemented
|
|
1836
|
+
|
|
1837
|
+
private:
|
|
1838
|
+
nsCOMPtr<nsIXPCScriptable> mCallback;
|
|
1839
|
+
XPCNativeScriptableShared* mShared;
|
|
1840
|
+
};
|
|
1841
|
+
|
|
1842
|
+
/***************************************************************************/
|
|
1843
|
+
// XPCNativeScriptableCreateInfo is used in creating new wrapper and protos.
|
|
1844
|
+
// it abstracts out the scriptable interface pointer and the flags. After
|
|
1845
|
+
// creation these are factored differently using XPCNativeScriptableInfo.
|
|
1846
|
+
|
|
1847
|
+
class XPCNativeScriptableCreateInfo
|
|
1848
|
+
{
|
|
1849
|
+
public:
|
|
1850
|
+
|
|
1851
|
+
XPCNativeScriptableCreateInfo(const XPCNativeScriptableInfo& si)
|
|
1852
|
+
: mCallback(si.GetCallback()), mFlags(si.GetFlags()) {}
|
|
1853
|
+
|
|
1854
|
+
XPCNativeScriptableCreateInfo(nsIXPCScriptable* callback = nsnull,
|
|
1855
|
+
XPCNativeScriptableFlags flags = 0)
|
|
1856
|
+
: mCallback(callback), mFlags(flags) {}
|
|
1857
|
+
|
|
1858
|
+
nsIXPCScriptable*
|
|
1859
|
+
GetCallback() const {return mCallback;}
|
|
1860
|
+
|
|
1861
|
+
const XPCNativeScriptableFlags&
|
|
1862
|
+
GetFlags() const {return mFlags;}
|
|
1863
|
+
|
|
1864
|
+
void
|
|
1865
|
+
SetCallback(nsIXPCScriptable* callback) {mCallback = callback;}
|
|
1866
|
+
|
|
1867
|
+
void
|
|
1868
|
+
SetFlags(const XPCNativeScriptableFlags& flags) {mFlags = flags;}
|
|
1869
|
+
|
|
1870
|
+
private:
|
|
1871
|
+
nsCOMPtr<nsIXPCScriptable> mCallback;
|
|
1872
|
+
XPCNativeScriptableFlags mFlags;
|
|
1873
|
+
};
|
|
1874
|
+
|
|
1875
|
+
/***********************************************/
|
|
1876
|
+
// XPCWrappedNativeProto hold the additional (potentially shared) wrapper data
|
|
1877
|
+
// for XPCWrappedNative whose native objects expose nsIClassInfo.
|
|
1878
|
+
|
|
1879
|
+
#define UNKNOWN_OFFSETS ((QITableEntry*)1)
|
|
1880
|
+
|
|
1881
|
+
class XPCWrappedNativeProto
|
|
1882
|
+
{
|
|
1883
|
+
public:
|
|
1884
|
+
static XPCWrappedNativeProto*
|
|
1885
|
+
GetNewOrUsed(XPCCallContext& ccx,
|
|
1886
|
+
XPCWrappedNativeScope* Scope,
|
|
1887
|
+
nsIClassInfo* ClassInfo,
|
|
1888
|
+
const XPCNativeScriptableCreateInfo* ScriptableCreateInfo,
|
|
1889
|
+
JSBool ForceNoSharing,
|
|
1890
|
+
JSBool isGlobal,
|
|
1891
|
+
QITableEntry* offsets = UNKNOWN_OFFSETS);
|
|
1892
|
+
|
|
1893
|
+
XPCWrappedNativeScope*
|
|
1894
|
+
GetScope() const {return mScope;}
|
|
1895
|
+
|
|
1896
|
+
XPCJSRuntime*
|
|
1897
|
+
GetRuntime() const {return mScope->GetRuntime();}
|
|
1898
|
+
|
|
1899
|
+
JSObject*
|
|
1900
|
+
GetJSProtoObject() const {return mJSProtoObject;}
|
|
1901
|
+
|
|
1902
|
+
nsIClassInfo*
|
|
1903
|
+
GetClassInfo() const {return mClassInfo;}
|
|
1904
|
+
|
|
1905
|
+
XPCNativeSet*
|
|
1906
|
+
GetSet() const {return mSet;}
|
|
1907
|
+
|
|
1908
|
+
XPCNativeScriptableInfo*
|
|
1909
|
+
GetScriptableInfo() {return mScriptableInfo;}
|
|
1910
|
+
|
|
1911
|
+
void**
|
|
1912
|
+
GetSecurityInfoAddr() {return &mSecurityInfo;}
|
|
1913
|
+
|
|
1914
|
+
JSUint32
|
|
1915
|
+
GetClassInfoFlags() const {return mClassInfoFlags;}
|
|
1916
|
+
|
|
1917
|
+
QITableEntry*
|
|
1918
|
+
GetOffsets()
|
|
1919
|
+
{
|
|
1920
|
+
return InitedOffsets() ? mOffsets : nsnull;
|
|
1921
|
+
}
|
|
1922
|
+
QITableEntry*
|
|
1923
|
+
GetOffsetsMasked()
|
|
1924
|
+
{
|
|
1925
|
+
return mOffsets;
|
|
1926
|
+
}
|
|
1927
|
+
void
|
|
1928
|
+
CacheOffsets(nsISupports* identity)
|
|
1929
|
+
{
|
|
1930
|
+
static NS_DEFINE_IID(kThisPtrOffsetsSID, NS_THISPTROFFSETS_SID);
|
|
1931
|
+
|
|
1932
|
+
#ifdef DEBUG
|
|
1933
|
+
if(InitedOffsets() && mOffsets)
|
|
1934
|
+
{
|
|
1935
|
+
QITableEntry* offsets;
|
|
1936
|
+
identity->QueryInterface(kThisPtrOffsetsSID, (void**)&offsets);
|
|
1937
|
+
NS_ASSERTION(offsets == mOffsets,
|
|
1938
|
+
"We can't deal with objects that have the same "
|
|
1939
|
+
"classinfo but different offset tables.");
|
|
1940
|
+
}
|
|
1941
|
+
#endif
|
|
1942
|
+
|
|
1943
|
+
if(!InitedOffsets())
|
|
1944
|
+
{
|
|
1945
|
+
if(mClassInfoFlags & nsIClassInfo::CONTENT_NODE)
|
|
1946
|
+
{
|
|
1947
|
+
identity->QueryInterface(kThisPtrOffsetsSID, (void**)&mOffsets);
|
|
1948
|
+
}
|
|
1949
|
+
else
|
|
1950
|
+
{
|
|
1951
|
+
mOffsets = nsnull;
|
|
1952
|
+
}
|
|
1953
|
+
}
|
|
1954
|
+
}
|
|
1955
|
+
|
|
1956
|
+
#ifdef GET_IT
|
|
1957
|
+
#undef GET_IT
|
|
1958
|
+
#endif
|
|
1959
|
+
#define GET_IT(f_) const {return !!(mClassInfoFlags & nsIClassInfo:: f_ );}
|
|
1960
|
+
|
|
1961
|
+
JSBool ClassIsSingleton() GET_IT(SINGLETON)
|
|
1962
|
+
JSBool ClassIsThreadSafe() GET_IT(THREADSAFE)
|
|
1963
|
+
JSBool ClassIsMainThreadOnly() GET_IT(MAIN_THREAD_ONLY)
|
|
1964
|
+
JSBool ClassIsDOMObject() GET_IT(DOM_OBJECT)
|
|
1965
|
+
JSBool ClassIsPluginObject() GET_IT(PLUGIN_OBJECT)
|
|
1966
|
+
|
|
1967
|
+
#undef GET_IT
|
|
1968
|
+
|
|
1969
|
+
#define XPC_PROTO_DONT_SHARE JS_BIT(31) // only high bit of 32 is set
|
|
1970
|
+
|
|
1971
|
+
JSBool
|
|
1972
|
+
IsShared() const {return !(mClassInfoFlags & XPC_PROTO_DONT_SHARE);}
|
|
1973
|
+
|
|
1974
|
+
XPCLock* GetLock() const
|
|
1975
|
+
{return ClassIsThreadSafe() ? GetRuntime()->GetMapLock() : nsnull;}
|
|
1976
|
+
|
|
1977
|
+
void SetScriptableInfo(XPCNativeScriptableInfo* si)
|
|
1978
|
+
{NS_ASSERTION(!mScriptableInfo, "leak here!"); mScriptableInfo = si;}
|
|
1979
|
+
|
|
1980
|
+
void JSProtoObjectFinalized(JSContext *cx, JSObject *obj);
|
|
1981
|
+
|
|
1982
|
+
void SystemIsBeingShutDown(JSContext* cx);
|
|
1983
|
+
|
|
1984
|
+
void DebugDump(PRInt16 depth);
|
|
1985
|
+
|
|
1986
|
+
void TraceJS(JSTracer* trc)
|
|
1987
|
+
{
|
|
1988
|
+
if(mJSProtoObject)
|
|
1989
|
+
{
|
|
1990
|
+
JS_CALL_OBJECT_TRACER(trc, mJSProtoObject,
|
|
1991
|
+
"XPCWrappedNativeProto::mJSProtoObject");
|
|
1992
|
+
}
|
|
1993
|
+
if(mScriptableInfo && JS_IsGCMarkingTracer(trc))
|
|
1994
|
+
mScriptableInfo->Mark();
|
|
1995
|
+
}
|
|
1996
|
+
|
|
1997
|
+
// NOP. This is just here to make the AutoMarkingPtr code compile.
|
|
1998
|
+
inline void AutoTrace(JSTracer* trc) {}
|
|
1999
|
+
|
|
2000
|
+
// Yes, we *do* need to mark the mScriptableInfo in both cases.
|
|
2001
|
+
void Mark() const
|
|
2002
|
+
{mSet->Mark();
|
|
2003
|
+
if(mScriptableInfo) mScriptableInfo->Mark();}
|
|
2004
|
+
|
|
2005
|
+
#ifdef DEBUG
|
|
2006
|
+
void ASSERT_SetNotMarked() const {mSet->ASSERT_NotMarked();}
|
|
2007
|
+
#endif
|
|
2008
|
+
|
|
2009
|
+
~XPCWrappedNativeProto();
|
|
2010
|
+
|
|
2011
|
+
protected:
|
|
2012
|
+
// disable copy ctor and assignment
|
|
2013
|
+
XPCWrappedNativeProto(const XPCWrappedNativeProto& r); // not implemented
|
|
2014
|
+
XPCWrappedNativeProto& operator= (const XPCWrappedNativeProto& r); // not implemented
|
|
2015
|
+
|
|
2016
|
+
// hide ctor
|
|
2017
|
+
XPCWrappedNativeProto(XPCWrappedNativeScope* Scope,
|
|
2018
|
+
nsIClassInfo* ClassInfo,
|
|
2019
|
+
PRUint32 ClassInfoFlags,
|
|
2020
|
+
XPCNativeSet* Set,
|
|
2021
|
+
QITableEntry* offsets);
|
|
2022
|
+
|
|
2023
|
+
JSBool Init(XPCCallContext& ccx, JSBool isGlobal,
|
|
2024
|
+
const XPCNativeScriptableCreateInfo* scriptableCreateInfo);
|
|
2025
|
+
|
|
2026
|
+
private:
|
|
2027
|
+
#if defined(DEBUG_xpc_hacker) || defined(DEBUG)
|
|
2028
|
+
static PRInt32 gDEBUG_LiveProtoCount;
|
|
2029
|
+
#endif
|
|
2030
|
+
|
|
2031
|
+
private:
|
|
2032
|
+
PRBool
|
|
2033
|
+
InitedOffsets()
|
|
2034
|
+
{
|
|
2035
|
+
return mOffsets != UNKNOWN_OFFSETS;
|
|
2036
|
+
}
|
|
2037
|
+
|
|
2038
|
+
XPCWrappedNativeScope* mScope;
|
|
2039
|
+
JSObject* mJSProtoObject;
|
|
2040
|
+
nsCOMPtr<nsIClassInfo> mClassInfo;
|
|
2041
|
+
PRUint32 mClassInfoFlags;
|
|
2042
|
+
XPCNativeSet* mSet;
|
|
2043
|
+
void* mSecurityInfo;
|
|
2044
|
+
XPCNativeScriptableInfo* mScriptableInfo;
|
|
2045
|
+
QITableEntry* mOffsets;
|
|
2046
|
+
};
|
|
2047
|
+
|
|
2048
|
+
|
|
2049
|
+
/***********************************************/
|
|
2050
|
+
// XPCWrappedNativeTearOff represents the info needed to make calls to one
|
|
2051
|
+
// interface on the underlying native object of a XPCWrappedNative.
|
|
2052
|
+
|
|
2053
|
+
class XPCWrappedNativeTearOff
|
|
2054
|
+
{
|
|
2055
|
+
public:
|
|
2056
|
+
JSBool IsAvailable() const {return mInterface == nsnull;}
|
|
2057
|
+
JSBool IsReserved() const {return mInterface == (XPCNativeInterface*)1;}
|
|
2058
|
+
JSBool IsValid() const {return !IsAvailable() && !IsReserved();}
|
|
2059
|
+
void SetReserved() {mInterface = (XPCNativeInterface*)1;}
|
|
2060
|
+
|
|
2061
|
+
XPCNativeInterface* GetInterface() const {return mInterface;}
|
|
2062
|
+
nsISupports* GetNative() const {return mNative;}
|
|
2063
|
+
JSObject* GetJSObject() const;
|
|
2064
|
+
void SetInterface(XPCNativeInterface* Interface) {mInterface = Interface;}
|
|
2065
|
+
void SetNative(nsISupports* Native) {mNative = Native;}
|
|
2066
|
+
void SetJSObject(JSObject* JSObj);
|
|
2067
|
+
|
|
2068
|
+
void JSObjectFinalized() {SetJSObject(nsnull);}
|
|
2069
|
+
|
|
2070
|
+
XPCWrappedNativeTearOff()
|
|
2071
|
+
: mInterface(nsnull), mNative(nsnull), mJSObject(nsnull) {}
|
|
2072
|
+
~XPCWrappedNativeTearOff();
|
|
2073
|
+
|
|
2074
|
+
// NOP. This is just here to make the AutoMarkingPtr code compile.
|
|
2075
|
+
inline void TraceJS(JSTracer* trc) {}
|
|
2076
|
+
inline void AutoTrace(JSTracer* trc) {}
|
|
2077
|
+
|
|
2078
|
+
void Mark() {mJSObject = (JSObject*)(((jsword)mJSObject) | 1);}
|
|
2079
|
+
void Unmark() {mJSObject = (JSObject*)(((jsword)mJSObject) & ~1);}
|
|
2080
|
+
JSBool IsMarked() const {return (JSBool)(((jsword)mJSObject) & 1);}
|
|
2081
|
+
|
|
2082
|
+
#ifdef XPC_IDISPATCH_SUPPORT
|
|
2083
|
+
enum JSObject_flags
|
|
2084
|
+
{
|
|
2085
|
+
IDISPATCH_BIT = 2,
|
|
2086
|
+
JSOBJECT_MASK = 3
|
|
2087
|
+
};
|
|
2088
|
+
void SetIDispatch(JSContext* cx);
|
|
2089
|
+
JSBool IsIDispatch() const;
|
|
2090
|
+
XPCDispInterface* GetIDispatchInfo() const;
|
|
2091
|
+
#endif
|
|
2092
|
+
private:
|
|
2093
|
+
XPCWrappedNativeTearOff(const XPCWrappedNativeTearOff& r); // not implemented
|
|
2094
|
+
XPCWrappedNativeTearOff& operator= (const XPCWrappedNativeTearOff& r); // not implemented
|
|
2095
|
+
|
|
2096
|
+
private:
|
|
2097
|
+
XPCNativeInterface* mInterface;
|
|
2098
|
+
nsISupports* mNative;
|
|
2099
|
+
JSObject* mJSObject;
|
|
2100
|
+
};
|
|
2101
|
+
|
|
2102
|
+
/***********************************************/
|
|
2103
|
+
// XPCWrappedNativeTearOffChunk is a collections of XPCWrappedNativeTearOff
|
|
2104
|
+
// objects. It lets us allocate a set of XPCWrappedNativeTearOff objects and
|
|
2105
|
+
// link the sets - rather than only having the option of linking single
|
|
2106
|
+
// XPCWrappedNativeTearOff objects.
|
|
2107
|
+
//
|
|
2108
|
+
// The value of XPC_WRAPPED_NATIVE_TEAROFFS_PER_CHUNK can be tuned at buildtime
|
|
2109
|
+
// to balance between the code of allocations of additional chunks and the waste
|
|
2110
|
+
// of space for ununsed XPCWrappedNativeTearOff objects.
|
|
2111
|
+
|
|
2112
|
+
#define XPC_WRAPPED_NATIVE_TEAROFFS_PER_CHUNK 1
|
|
2113
|
+
|
|
2114
|
+
class XPCWrappedNativeTearOffChunk
|
|
2115
|
+
{
|
|
2116
|
+
friend class XPCWrappedNative;
|
|
2117
|
+
private:
|
|
2118
|
+
XPCWrappedNativeTearOffChunk() : mNextChunk(nsnull) {}
|
|
2119
|
+
~XPCWrappedNativeTearOffChunk() {delete mNextChunk;}
|
|
2120
|
+
|
|
2121
|
+
private:
|
|
2122
|
+
XPCWrappedNativeTearOff mTearOffs[XPC_WRAPPED_NATIVE_TEAROFFS_PER_CHUNK];
|
|
2123
|
+
XPCWrappedNativeTearOffChunk* mNextChunk;
|
|
2124
|
+
};
|
|
2125
|
+
|
|
2126
|
+
/***************************************************************************/
|
|
2127
|
+
// XPCWrappedNative the wrapper around one instance of a native xpcom object
|
|
2128
|
+
// to be used from JavaScript.
|
|
2129
|
+
|
|
2130
|
+
class XPCWrappedNative : public nsIXPConnectWrappedNative
|
|
2131
|
+
{
|
|
2132
|
+
public:
|
|
2133
|
+
NS_DECL_ISUPPORTS
|
|
2134
|
+
NS_DECL_NSIXPCONNECTJSOBJECTHOLDER
|
|
2135
|
+
NS_DECL_NSIXPCONNECTWRAPPEDNATIVE
|
|
2136
|
+
// No need to unlink the JS objects, if the XPCWrappedNative will be cycle
|
|
2137
|
+
// collected then its mFlatJSObject will be cycle collected too and
|
|
2138
|
+
// finalization of the mFlatJSObject will unlink the js objects (see
|
|
2139
|
+
// XPC_WN_NoHelper_Finalize and FlatJSObjectFinalized).
|
|
2140
|
+
// We also rely on NS_DECL_CYCLE_COLLECTION_CLASS_NO_UNLINK having empty
|
|
2141
|
+
// Root/Unroot methods, to avoid root/unrooting the JS objects from
|
|
2142
|
+
// addrefing/releasing the XPCWrappedNative during unlinking, which would
|
|
2143
|
+
// make the JS objects uncollectable to the JS GC.
|
|
2144
|
+
class NS_CYCLE_COLLECTION_INNERCLASS
|
|
2145
|
+
: public nsXPCOMCycleCollectionParticipant
|
|
2146
|
+
{
|
|
2147
|
+
NS_DECL_CYCLE_COLLECTION_CLASS_BODY_NO_UNLINK(XPCWrappedNative,
|
|
2148
|
+
XPCWrappedNative)
|
|
2149
|
+
NS_IMETHOD RootAndUnlinkJSObjects(void *p);
|
|
2150
|
+
NS_IMETHOD Unlink(void *p) { return NS_OK; }
|
|
2151
|
+
NS_IMETHOD Unroot(void *p) { return NS_OK; }
|
|
2152
|
+
};
|
|
2153
|
+
NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE
|
|
2154
|
+
NS_DECL_CYCLE_COLLECTION_UNMARK_PURPLE_STUB(XPCWrappedNative)
|
|
2155
|
+
|
|
2156
|
+
#ifndef XPCONNECT_STANDALONE
|
|
2157
|
+
virtual nsIPrincipal* GetObjectPrincipal() const;
|
|
2158
|
+
#endif
|
|
2159
|
+
|
|
2160
|
+
JSBool
|
|
2161
|
+
IsValid() const {return nsnull != mFlatJSObject;}
|
|
2162
|
+
|
|
2163
|
+
#define XPC_SCOPE_WORD(s) ((jsword)(s))
|
|
2164
|
+
#define XPC_SCOPE_MASK ((jsword)0x3)
|
|
2165
|
+
#define XPC_SCOPE_TAG ((jsword)0x1)
|
|
2166
|
+
#define XPC_WRAPPER_EXPIRED ((jsword)0x2)
|
|
2167
|
+
|
|
2168
|
+
static inline JSBool
|
|
2169
|
+
IsTaggedScope(XPCWrappedNativeScope* s)
|
|
2170
|
+
{return XPC_SCOPE_WORD(s) & XPC_SCOPE_TAG;}
|
|
2171
|
+
|
|
2172
|
+
static inline XPCWrappedNativeScope*
|
|
2173
|
+
TagScope(XPCWrappedNativeScope* s)
|
|
2174
|
+
{NS_ASSERTION(!IsTaggedScope(s), "bad pointer!");
|
|
2175
|
+
return (XPCWrappedNativeScope*)(XPC_SCOPE_WORD(s) | XPC_SCOPE_TAG);}
|
|
2176
|
+
|
|
2177
|
+
static inline XPCWrappedNativeScope*
|
|
2178
|
+
UnTagScope(XPCWrappedNativeScope* s)
|
|
2179
|
+
{return (XPCWrappedNativeScope*)(XPC_SCOPE_WORD(s) & ~XPC_SCOPE_TAG);}
|
|
2180
|
+
|
|
2181
|
+
inline JSBool
|
|
2182
|
+
IsWrapperExpired() const
|
|
2183
|
+
{return XPC_SCOPE_WORD(mMaybeScope) & XPC_WRAPPER_EXPIRED;}
|
|
2184
|
+
|
|
2185
|
+
JSBool
|
|
2186
|
+
HasProto() const {return !IsTaggedScope(mMaybeScope);}
|
|
2187
|
+
|
|
2188
|
+
XPCWrappedNativeProto*
|
|
2189
|
+
GetProto() const
|
|
2190
|
+
{return HasProto() ?
|
|
2191
|
+
(XPCWrappedNativeProto*)
|
|
2192
|
+
(XPC_SCOPE_WORD(mMaybeProto) & ~XPC_SCOPE_MASK) : nsnull;}
|
|
2193
|
+
|
|
2194
|
+
void
|
|
2195
|
+
SetProto(XPCWrappedNativeProto* p)
|
|
2196
|
+
{NS_ASSERTION(!IsWrapperExpired(), "bad ptr!");
|
|
2197
|
+
mMaybeProto = p;}
|
|
2198
|
+
|
|
2199
|
+
XPCWrappedNativeScope*
|
|
2200
|
+
GetScope() const
|
|
2201
|
+
{return GetProto() ? GetProto()->GetScope() :
|
|
2202
|
+
(XPCWrappedNativeScope*)
|
|
2203
|
+
(XPC_SCOPE_WORD(mMaybeScope) & ~XPC_SCOPE_MASK);}
|
|
2204
|
+
|
|
2205
|
+
nsISupports*
|
|
2206
|
+
GetIdentityObject() const {return mIdentity;}
|
|
2207
|
+
|
|
2208
|
+
JSObject*
|
|
2209
|
+
GetFlatJSObject() const {return mFlatJSObject;}
|
|
2210
|
+
|
|
2211
|
+
XPCLock*
|
|
2212
|
+
GetLock() const {return IsValid() && HasProto() ?
|
|
2213
|
+
GetProto()->GetLock() : nsnull;}
|
|
2214
|
+
|
|
2215
|
+
XPCNativeSet*
|
|
2216
|
+
GetSet() const {XPCAutoLock al(GetLock()); return mSet;}
|
|
2217
|
+
|
|
2218
|
+
private:
|
|
2219
|
+
void
|
|
2220
|
+
SetSet(XPCNativeSet* set) {XPCAutoLock al(GetLock()); mSet = set;}
|
|
2221
|
+
|
|
2222
|
+
inline void
|
|
2223
|
+
ExpireWrapper()
|
|
2224
|
+
{mMaybeScope = (XPCWrappedNativeScope*)
|
|
2225
|
+
(XPC_SCOPE_WORD(mMaybeScope) | XPC_WRAPPER_EXPIRED);}
|
|
2226
|
+
|
|
2227
|
+
public:
|
|
2228
|
+
|
|
2229
|
+
XPCNativeScriptableInfo*
|
|
2230
|
+
GetScriptableInfo() const {return mScriptableInfo;}
|
|
2231
|
+
|
|
2232
|
+
nsIXPCScriptable* // call this wrong and you deserve to crash
|
|
2233
|
+
GetScriptableCallback() const {return mScriptableInfo->GetCallback();}
|
|
2234
|
+
|
|
2235
|
+
void**
|
|
2236
|
+
GetSecurityInfoAddr() {return HasProto() ?
|
|
2237
|
+
GetProto()->GetSecurityInfoAddr() : nsnull;}
|
|
2238
|
+
|
|
2239
|
+
nsIClassInfo*
|
|
2240
|
+
GetClassInfo() const {return IsValid() && HasProto() ?
|
|
2241
|
+
GetProto()->GetClassInfo() : nsnull;}
|
|
2242
|
+
|
|
2243
|
+
JSBool
|
|
2244
|
+
HasSharedProto() const {return IsValid() && HasProto() &&
|
|
2245
|
+
GetProto()->IsShared();}
|
|
2246
|
+
|
|
2247
|
+
JSBool
|
|
2248
|
+
HasMutatedSet() const {return IsValid() &&
|
|
2249
|
+
(!HasProto() ||
|
|
2250
|
+
GetSet() != GetProto()->GetSet());}
|
|
2251
|
+
|
|
2252
|
+
XPCJSRuntime*
|
|
2253
|
+
GetRuntime() const {XPCWrappedNativeScope* scope = GetScope();
|
|
2254
|
+
return scope ? scope->GetRuntime() : nsnull;}
|
|
2255
|
+
|
|
2256
|
+
/**
|
|
2257
|
+
* If Object has a nsWrapperCache it should be passed in. If a cache is
|
|
2258
|
+
* passed in then cache->GetWrapper() must be null.
|
|
2259
|
+
*/
|
|
2260
|
+
static nsresult
|
|
2261
|
+
GetNewOrUsed(XPCCallContext& ccx,
|
|
2262
|
+
nsISupports* Object,
|
|
2263
|
+
XPCWrappedNativeScope* Scope,
|
|
2264
|
+
XPCNativeInterface* Interface,
|
|
2265
|
+
nsWrapperCache* cache,
|
|
2266
|
+
JSBool isGlobal,
|
|
2267
|
+
XPCWrappedNative** wrapper);
|
|
2268
|
+
|
|
2269
|
+
public:
|
|
2270
|
+
static nsresult
|
|
2271
|
+
GetUsedOnly(XPCCallContext& ccx,
|
|
2272
|
+
nsISupports* Object,
|
|
2273
|
+
XPCWrappedNativeScope* Scope,
|
|
2274
|
+
XPCNativeInterface* Interface,
|
|
2275
|
+
XPCWrappedNative** wrapper);
|
|
2276
|
+
|
|
2277
|
+
static XPCWrappedNative*
|
|
2278
|
+
GetWrappedNativeOfJSObject(JSContext* cx, JSObject* obj,
|
|
2279
|
+
JSObject* funobj = nsnull,
|
|
2280
|
+
JSObject** pobj2 = nsnull,
|
|
2281
|
+
XPCWrappedNativeTearOff** pTearOff = nsnull);
|
|
2282
|
+
|
|
2283
|
+
static nsresult
|
|
2284
|
+
ReparentWrapperIfFound(XPCCallContext& ccx,
|
|
2285
|
+
XPCWrappedNativeScope* aOldScope,
|
|
2286
|
+
XPCWrappedNativeScope* aNewScope,
|
|
2287
|
+
JSObject* aNewParent,
|
|
2288
|
+
nsISupports* aCOMObj,
|
|
2289
|
+
XPCWrappedNative** aWrapper);
|
|
2290
|
+
|
|
2291
|
+
void FlatJSObjectFinalized(JSContext *cx);
|
|
2292
|
+
|
|
2293
|
+
void SystemIsBeingShutDown(JSContext* cx);
|
|
2294
|
+
|
|
2295
|
+
#ifdef XPC_DETECT_LEADING_UPPERCASE_ACCESS_ERRORS
|
|
2296
|
+
// This will try to find a member that is of the form "camelCased"
|
|
2297
|
+
// but was accessed from JS using "CamelCased". This is here to catch
|
|
2298
|
+
// mistakes caused by the confusion magnet that JS methods are by
|
|
2299
|
+
// convention 'foo' while C++ members are by convention 'Foo'.
|
|
2300
|
+
static void
|
|
2301
|
+
HandlePossibleNameCaseError(XPCCallContext& ccx,
|
|
2302
|
+
XPCNativeSet* set,
|
|
2303
|
+
XPCNativeInterface* iface,
|
|
2304
|
+
jsval name);
|
|
2305
|
+
static void
|
|
2306
|
+
HandlePossibleNameCaseError(JSContext* cx,
|
|
2307
|
+
XPCNativeSet* set,
|
|
2308
|
+
XPCNativeInterface* iface,
|
|
2309
|
+
jsval name);
|
|
2310
|
+
|
|
2311
|
+
#define HANDLE_POSSIBLE_NAME_CASE_ERROR(context, set, iface, name) \
|
|
2312
|
+
XPCWrappedNative::HandlePossibleNameCaseError(context, set, iface, name)
|
|
2313
|
+
#else
|
|
2314
|
+
#define HANDLE_POSSIBLE_NAME_CASE_ERROR(context, set, iface, name) ((void)0)
|
|
2315
|
+
#endif
|
|
2316
|
+
|
|
2317
|
+
enum CallMode {CALL_METHOD, CALL_GETTER, CALL_SETTER};
|
|
2318
|
+
|
|
2319
|
+
static JSBool CallMethod(XPCCallContext& ccx,
|
|
2320
|
+
CallMode mode = CALL_METHOD);
|
|
2321
|
+
|
|
2322
|
+
static JSBool GetAttribute(XPCCallContext& ccx)
|
|
2323
|
+
{return CallMethod(ccx, CALL_GETTER);}
|
|
2324
|
+
|
|
2325
|
+
static JSBool SetAttribute(XPCCallContext& ccx)
|
|
2326
|
+
{return CallMethod(ccx, CALL_SETTER);}
|
|
2327
|
+
|
|
2328
|
+
inline JSBool HasInterfaceNoQI(XPCNativeInterface* aInterface);
|
|
2329
|
+
inline JSBool HasInterfaceNoQI(const nsIID& iid);
|
|
2330
|
+
|
|
2331
|
+
XPCWrappedNativeTearOff* LocateTearOff(XPCCallContext& ccx,
|
|
2332
|
+
XPCNativeInterface* aInterface);
|
|
2333
|
+
XPCWrappedNativeTearOff* FindTearOff(XPCCallContext& ccx,
|
|
2334
|
+
XPCNativeInterface* aInterface,
|
|
2335
|
+
JSBool needJSObject = JS_FALSE,
|
|
2336
|
+
nsresult* pError = nsnull);
|
|
2337
|
+
void Mark() const
|
|
2338
|
+
{
|
|
2339
|
+
mSet->Mark();
|
|
2340
|
+
if(mScriptableInfo) mScriptableInfo->Mark();
|
|
2341
|
+
if(HasProto()) GetProto()->Mark();
|
|
2342
|
+
}
|
|
2343
|
+
|
|
2344
|
+
// Yes, we *do* need to mark the mScriptableInfo in both cases.
|
|
2345
|
+
inline void TraceJS(JSTracer* trc)
|
|
2346
|
+
{
|
|
2347
|
+
if(mScriptableInfo && JS_IsGCMarkingTracer(trc))
|
|
2348
|
+
mScriptableInfo->Mark();
|
|
2349
|
+
if(HasProto()) GetProto()->TraceJS(trc);
|
|
2350
|
+
JSObject* wrapper = GetWrapper();
|
|
2351
|
+
if(wrapper)
|
|
2352
|
+
JS_CALL_OBJECT_TRACER(trc, wrapper, "XPCWrappedNative::mWrapper");
|
|
2353
|
+
TraceOtherWrapper(trc);
|
|
2354
|
+
}
|
|
2355
|
+
|
|
2356
|
+
inline void AutoTrace(JSTracer* trc)
|
|
2357
|
+
{
|
|
2358
|
+
// If this got called, we're being kept alive by someone who really
|
|
2359
|
+
// needs us alive and whole. Do not let our mFlatJSObject go away.
|
|
2360
|
+
// This is the only time we should be tracing our mFlatJSObject,
|
|
2361
|
+
// normally somebody else is doing that. Be careful not to trace the
|
|
2362
|
+
// bogus JSVAL_ONE value we can have during init, though.
|
|
2363
|
+
if(mFlatJSObject && mFlatJSObject != (JSObject*)JSVAL_ONE)
|
|
2364
|
+
{
|
|
2365
|
+
JS_CALL_OBJECT_TRACER(trc, mFlatJSObject,
|
|
2366
|
+
"XPCWrappedNative::mFlatJSObject");
|
|
2367
|
+
}
|
|
2368
|
+
}
|
|
2369
|
+
|
|
2370
|
+
#ifdef DEBUG
|
|
2371
|
+
void ASSERT_SetsNotMarked() const
|
|
2372
|
+
{mSet->ASSERT_NotMarked();
|
|
2373
|
+
if(HasProto()){GetProto()->ASSERT_SetNotMarked();}}
|
|
2374
|
+
|
|
2375
|
+
int DEBUG_CountOfTearoffChunks() const
|
|
2376
|
+
{int i = 0; const XPCWrappedNativeTearOffChunk* to;
|
|
2377
|
+
for(to = &mFirstChunk; to; to = to->mNextChunk) {i++;} return i;}
|
|
2378
|
+
#endif
|
|
2379
|
+
|
|
2380
|
+
inline void SweepTearOffs();
|
|
2381
|
+
|
|
2382
|
+
// Returns a string that shuld be free'd using JS_smprintf_free (or null).
|
|
2383
|
+
char* ToString(XPCCallContext& ccx,
|
|
2384
|
+
XPCWrappedNativeTearOff* to = nsnull) const;
|
|
2385
|
+
|
|
2386
|
+
static nsresult GatherProtoScriptableCreateInfo(
|
|
2387
|
+
nsIClassInfo* classInfo,
|
|
2388
|
+
XPCNativeScriptableCreateInfo* sciProto);
|
|
2389
|
+
|
|
2390
|
+
JSBool HasExternalReference() const {return mRefCnt > 1;}
|
|
2391
|
+
|
|
2392
|
+
JSBool NeedsChromeWrapper() { return !!(mWrapper & 1); }
|
|
2393
|
+
void SetNeedsChromeWrapper() { mWrapper |= 1; }
|
|
2394
|
+
JSObject* GetWrapper()
|
|
2395
|
+
{
|
|
2396
|
+
return (JSObject *)(mWrapper & ~1);
|
|
2397
|
+
}
|
|
2398
|
+
void SetWrapper(JSObject *obj)
|
|
2399
|
+
{
|
|
2400
|
+
JSBool reset = NeedsChromeWrapper();
|
|
2401
|
+
mWrapper = PRWord(obj) | reset;
|
|
2402
|
+
}
|
|
2403
|
+
|
|
2404
|
+
void NoteTearoffs(nsCycleCollectionTraversalCallback& cb);
|
|
2405
|
+
|
|
2406
|
+
QITableEntry* GetOffsets()
|
|
2407
|
+
{
|
|
2408
|
+
if(!HasProto() || !GetProto()->ClassIsDOMObject())
|
|
2409
|
+
return nsnull;
|
|
2410
|
+
|
|
2411
|
+
XPCWrappedNativeProto* proto = GetProto();
|
|
2412
|
+
QITableEntry* offsets = proto->GetOffsets();
|
|
2413
|
+
if(!offsets)
|
|
2414
|
+
{
|
|
2415
|
+
static NS_DEFINE_IID(kThisPtrOffsetsSID, NS_THISPTROFFSETS_SID);
|
|
2416
|
+
mIdentity->QueryInterface(kThisPtrOffsetsSID, (void**)&offsets);
|
|
2417
|
+
}
|
|
2418
|
+
return offsets;
|
|
2419
|
+
}
|
|
2420
|
+
|
|
2421
|
+
// Make ctor and dtor protected (rather than private) to placate nsCOMPtr.
|
|
2422
|
+
protected:
|
|
2423
|
+
XPCWrappedNative(); // not implemented
|
|
2424
|
+
|
|
2425
|
+
// This ctor is used if this object will have a proto.
|
|
2426
|
+
XPCWrappedNative(nsISupports* aIdentity,
|
|
2427
|
+
XPCWrappedNativeProto* aProto);
|
|
2428
|
+
|
|
2429
|
+
// This ctor is used if this object will NOT have a proto.
|
|
2430
|
+
XPCWrappedNative(nsISupports* aIdentity,
|
|
2431
|
+
XPCWrappedNativeScope* aScope,
|
|
2432
|
+
XPCNativeSet* aSet);
|
|
2433
|
+
|
|
2434
|
+
virtual ~XPCWrappedNative();
|
|
2435
|
+
|
|
2436
|
+
private:
|
|
2437
|
+
void TraceOtherWrapper(JSTracer* trc);
|
|
2438
|
+
JSBool Init(XPCCallContext& ccx, JSObject* parent, JSBool isGlobal,
|
|
2439
|
+
const XPCNativeScriptableCreateInfo* sci);
|
|
2440
|
+
|
|
2441
|
+
JSBool ExtendSet(XPCCallContext& ccx, XPCNativeInterface* aInterface);
|
|
2442
|
+
|
|
2443
|
+
nsresult InitTearOff(XPCCallContext& ccx,
|
|
2444
|
+
XPCWrappedNativeTearOff* aTearOff,
|
|
2445
|
+
XPCNativeInterface* aInterface,
|
|
2446
|
+
JSBool needJSObject);
|
|
2447
|
+
|
|
2448
|
+
JSBool InitTearOffJSObject(XPCCallContext& ccx,
|
|
2449
|
+
XPCWrappedNativeTearOff* to);
|
|
2450
|
+
|
|
2451
|
+
public:
|
|
2452
|
+
static nsresult GatherScriptableCreateInfo(
|
|
2453
|
+
nsISupports* obj,
|
|
2454
|
+
nsIClassInfo* classInfo,
|
|
2455
|
+
XPCNativeScriptableCreateInfo* sciProto,
|
|
2456
|
+
XPCNativeScriptableCreateInfo* sciWrapper);
|
|
2457
|
+
|
|
2458
|
+
private:
|
|
2459
|
+
union
|
|
2460
|
+
{
|
|
2461
|
+
XPCWrappedNativeScope* mMaybeScope;
|
|
2462
|
+
XPCWrappedNativeProto* mMaybeProto;
|
|
2463
|
+
};
|
|
2464
|
+
XPCNativeSet* mSet;
|
|
2465
|
+
JSObject* mFlatJSObject;
|
|
2466
|
+
XPCNativeScriptableInfo* mScriptableInfo;
|
|
2467
|
+
XPCWrappedNativeTearOffChunk mFirstChunk;
|
|
2468
|
+
PRWord mWrapper;
|
|
2469
|
+
|
|
2470
|
+
#ifdef XPC_CHECK_WRAPPER_THREADSAFETY
|
|
2471
|
+
public:
|
|
2472
|
+
nsCOMPtr<nsIThread> mThread; // Don't want to overload _mOwningThread
|
|
2473
|
+
#endif
|
|
2474
|
+
};
|
|
2475
|
+
|
|
2476
|
+
/***************************************************************************
|
|
2477
|
+
****************************************************************************
|
|
2478
|
+
*
|
|
2479
|
+
* Core classes for wrapped JSObject for use from native code...
|
|
2480
|
+
*
|
|
2481
|
+
****************************************************************************
|
|
2482
|
+
***************************************************************************/
|
|
2483
|
+
|
|
2484
|
+
// this interfaces exists so we can refcount nsXPCWrappedJSClass
|
|
2485
|
+
// {2453EBA0-A9B8-11d2-BA64-00805F8A5DD7}
|
|
2486
|
+
#define NS_IXPCONNECT_WRAPPED_JS_CLASS_IID \
|
|
2487
|
+
{ 0x2453eba0, 0xa9b8, 0x11d2, \
|
|
2488
|
+
{ 0xba, 0x64, 0x0, 0x80, 0x5f, 0x8a, 0x5d, 0xd7 } }
|
|
2489
|
+
|
|
2490
|
+
class nsIXPCWrappedJSClass : public nsISupports
|
|
2491
|
+
{
|
|
2492
|
+
public:
|
|
2493
|
+
NS_DECLARE_STATIC_IID_ACCESSOR(NS_IXPCONNECT_WRAPPED_JS_CLASS_IID)
|
|
2494
|
+
NS_IMETHOD DebugDump(PRInt16 depth) = 0;
|
|
2495
|
+
};
|
|
2496
|
+
|
|
2497
|
+
NS_DEFINE_STATIC_IID_ACCESSOR(nsIXPCWrappedJSClass,
|
|
2498
|
+
NS_IXPCONNECT_WRAPPED_JS_CLASS_IID)
|
|
2499
|
+
|
|
2500
|
+
/*************************/
|
|
2501
|
+
// nsXPCWrappedJSClass represents the sharable factored out common code and
|
|
2502
|
+
// data for nsXPCWrappedJS instances for the same interface type.
|
|
2503
|
+
|
|
2504
|
+
class nsXPCWrappedJSClass : public nsIXPCWrappedJSClass
|
|
2505
|
+
{
|
|
2506
|
+
// all the interface method declarations...
|
|
2507
|
+
NS_DECL_ISUPPORTS
|
|
2508
|
+
NS_IMETHOD DebugDump(PRInt16 depth);
|
|
2509
|
+
public:
|
|
2510
|
+
|
|
2511
|
+
static nsresult
|
|
2512
|
+
GetNewOrUsed(XPCCallContext& ccx,
|
|
2513
|
+
REFNSIID aIID,
|
|
2514
|
+
nsXPCWrappedJSClass** clazz);
|
|
2515
|
+
|
|
2516
|
+
REFNSIID GetIID() const {return mIID;}
|
|
2517
|
+
XPCJSRuntime* GetRuntime() const {return mRuntime;}
|
|
2518
|
+
nsIInterfaceInfo* GetInterfaceInfo() const {return mInfo;}
|
|
2519
|
+
const char* GetInterfaceName();
|
|
2520
|
+
|
|
2521
|
+
static JSBool IsWrappedJS(nsISupports* aPtr);
|
|
2522
|
+
|
|
2523
|
+
NS_IMETHOD DelegatedQueryInterface(nsXPCWrappedJS* self, REFNSIID aIID,
|
|
2524
|
+
void** aInstancePtr);
|
|
2525
|
+
|
|
2526
|
+
JSObject* GetRootJSObject(XPCCallContext& ccx, JSObject* aJSObj);
|
|
2527
|
+
|
|
2528
|
+
NS_IMETHOD CallMethod(nsXPCWrappedJS* wrapper, uint16 methodIndex,
|
|
2529
|
+
const XPTMethodDescriptor* info,
|
|
2530
|
+
nsXPTCMiniVariant* params);
|
|
2531
|
+
|
|
2532
|
+
JSObject* CallQueryInterfaceOnJSObject(XPCCallContext& ccx,
|
|
2533
|
+
JSObject* jsobj, REFNSIID aIID);
|
|
2534
|
+
|
|
2535
|
+
static nsresult BuildPropertyEnumerator(XPCCallContext& ccx,
|
|
2536
|
+
JSObject* aJSObj,
|
|
2537
|
+
nsISimpleEnumerator** aEnumerate);
|
|
2538
|
+
|
|
2539
|
+
static nsresult GetNamedPropertyAsVariant(XPCCallContext& ccx,
|
|
2540
|
+
JSObject* aJSObj,
|
|
2541
|
+
jsval aName,
|
|
2542
|
+
nsIVariant** aResult);
|
|
2543
|
+
|
|
2544
|
+
virtual ~nsXPCWrappedJSClass();
|
|
2545
|
+
|
|
2546
|
+
static nsresult CheckForException(XPCCallContext & ccx,
|
|
2547
|
+
const char * aPropertyName,
|
|
2548
|
+
const char * anInterfaceName,
|
|
2549
|
+
PRBool aForceReport);
|
|
2550
|
+
private:
|
|
2551
|
+
nsXPCWrappedJSClass(); // not implemented
|
|
2552
|
+
nsXPCWrappedJSClass(XPCCallContext& ccx, REFNSIID aIID,
|
|
2553
|
+
nsIInterfaceInfo* aInfo);
|
|
2554
|
+
|
|
2555
|
+
JSObject* NewOutObject(JSContext* cx, JSObject* scope);
|
|
2556
|
+
|
|
2557
|
+
JSBool IsReflectable(uint16 i) const
|
|
2558
|
+
{return (JSBool)(mDescriptors[i/32] & (1 << (i%32)));}
|
|
2559
|
+
void SetReflectable(uint16 i, JSBool b)
|
|
2560
|
+
{if(b) mDescriptors[i/32] |= (1 << (i%32));
|
|
2561
|
+
else mDescriptors[i/32] &= ~(1 << (i%32));}
|
|
2562
|
+
|
|
2563
|
+
enum SizeMode {GET_SIZE, GET_LENGTH};
|
|
2564
|
+
|
|
2565
|
+
JSBool GetArraySizeFromParam(JSContext* cx,
|
|
2566
|
+
const XPTMethodDescriptor* method,
|
|
2567
|
+
const nsXPTParamInfo& param,
|
|
2568
|
+
uint16 methodIndex,
|
|
2569
|
+
uint8 paramIndex,
|
|
2570
|
+
SizeMode mode,
|
|
2571
|
+
nsXPTCMiniVariant* params,
|
|
2572
|
+
JSUint32* result);
|
|
2573
|
+
|
|
2574
|
+
JSBool GetInterfaceTypeFromParam(JSContext* cx,
|
|
2575
|
+
const XPTMethodDescriptor* method,
|
|
2576
|
+
const nsXPTParamInfo& param,
|
|
2577
|
+
uint16 methodIndex,
|
|
2578
|
+
const nsXPTType& type,
|
|
2579
|
+
nsXPTCMiniVariant* params,
|
|
2580
|
+
nsID* result);
|
|
2581
|
+
|
|
2582
|
+
void CleanupPointerArray(const nsXPTType& datum_type,
|
|
2583
|
+
JSUint32 array_count,
|
|
2584
|
+
void** arrayp);
|
|
2585
|
+
|
|
2586
|
+
void CleanupPointerTypeObject(const nsXPTType& type,
|
|
2587
|
+
void** pp);
|
|
2588
|
+
|
|
2589
|
+
private:
|
|
2590
|
+
XPCJSRuntime* mRuntime;
|
|
2591
|
+
nsIInterfaceInfo* mInfo;
|
|
2592
|
+
char* mName;
|
|
2593
|
+
nsIID mIID;
|
|
2594
|
+
uint32* mDescriptors;
|
|
2595
|
+
};
|
|
2596
|
+
|
|
2597
|
+
/*************************/
|
|
2598
|
+
// nsXPCWrappedJS is a wrapper for a single JSObject for use from native code.
|
|
2599
|
+
// nsXPCWrappedJS objects are chained together to represent the various
|
|
2600
|
+
// interface on the single underlying (possibly aggregate) JSObject.
|
|
2601
|
+
|
|
2602
|
+
class nsXPCWrappedJS : protected nsAutoXPTCStub,
|
|
2603
|
+
public nsIXPConnectWrappedJS,
|
|
2604
|
+
public nsSupportsWeakReference,
|
|
2605
|
+
public nsIPropertyBag,
|
|
2606
|
+
public XPCRootSetElem
|
|
2607
|
+
{
|
|
2608
|
+
public:
|
|
2609
|
+
NS_DECL_ISUPPORTS
|
|
2610
|
+
NS_DECL_NSIXPCONNECTJSOBJECTHOLDER
|
|
2611
|
+
NS_DECL_NSIXPCONNECTWRAPPEDJS
|
|
2612
|
+
NS_DECL_NSISUPPORTSWEAKREFERENCE
|
|
2613
|
+
NS_DECL_NSIPROPERTYBAG
|
|
2614
|
+
|
|
2615
|
+
class NS_CYCLE_COLLECTION_INNERCLASS
|
|
2616
|
+
: public nsXPCOMCycleCollectionParticipant
|
|
2617
|
+
{
|
|
2618
|
+
NS_IMETHOD RootAndUnlinkJSObjects(void *p);
|
|
2619
|
+
NS_DECL_CYCLE_COLLECTION_CLASS_BODY(nsXPCWrappedJS, nsIXPConnectWrappedJS)
|
|
2620
|
+
};
|
|
2621
|
+
NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE
|
|
2622
|
+
NS_DECL_CYCLE_COLLECTION_UNMARK_PURPLE_STUB(nsXPCWrappedJS)
|
|
2623
|
+
|
|
2624
|
+
NS_IMETHOD CallMethod(PRUint16 methodIndex,
|
|
2625
|
+
const XPTMethodDescriptor *info,
|
|
2626
|
+
nsXPTCMiniVariant* params);
|
|
2627
|
+
|
|
2628
|
+
/*
|
|
2629
|
+
* This is rarely called directly. Instead one usually calls
|
|
2630
|
+
* XPCConvert::JSObject2NativeInterface which will handles cases where the
|
|
2631
|
+
* JS object is already a wrapped native or a DOM object.
|
|
2632
|
+
*/
|
|
2633
|
+
|
|
2634
|
+
static nsresult
|
|
2635
|
+
GetNewOrUsed(XPCCallContext& ccx,
|
|
2636
|
+
JSObject* aJSObj,
|
|
2637
|
+
REFNSIID aIID,
|
|
2638
|
+
nsISupports* aOuter,
|
|
2639
|
+
nsXPCWrappedJS** wrapper);
|
|
2640
|
+
|
|
2641
|
+
nsISomeInterface* GetXPTCStub() { return mXPTCStub; }
|
|
2642
|
+
JSObject* GetJSObject() const {return mJSObj;}
|
|
2643
|
+
nsXPCWrappedJSClass* GetClass() const {return mClass;}
|
|
2644
|
+
REFNSIID GetIID() const {return GetClass()->GetIID();}
|
|
2645
|
+
nsXPCWrappedJS* GetRootWrapper() const {return mRoot;}
|
|
2646
|
+
nsXPCWrappedJS* GetNextWrapper() const {return mNext;}
|
|
2647
|
+
|
|
2648
|
+
nsXPCWrappedJS* Find(REFNSIID aIID);
|
|
2649
|
+
nsXPCWrappedJS* FindInherited(REFNSIID aIID);
|
|
2650
|
+
|
|
2651
|
+
JSBool IsValid() const {return mJSObj != nsnull;}
|
|
2652
|
+
void SystemIsBeingShutDown(JSRuntime* rt);
|
|
2653
|
+
|
|
2654
|
+
// This is used by XPCJSRuntime::GCCallback to find wrappers that no
|
|
2655
|
+
// longer root their JSObject and are only still alive because they
|
|
2656
|
+
// were being used via nsSupportsWeakReference at the time when their
|
|
2657
|
+
// last (outside) reference was released. Wrappers that fit into that
|
|
2658
|
+
// category are only deleted when we see that their corresponding JSObject
|
|
2659
|
+
// is to be finalized.
|
|
2660
|
+
JSBool IsSubjectToFinalization() const {return IsValid() && mRefCnt == 1;}
|
|
2661
|
+
|
|
2662
|
+
JSBool IsAggregatedToNative() const {return mRoot->mOuter != nsnull;}
|
|
2663
|
+
nsISupports* GetAggregatedNativeObject() const {return mRoot->mOuter;}
|
|
2664
|
+
|
|
2665
|
+
void TraceJS(JSTracer* trc);
|
|
2666
|
+
#ifdef DEBUG
|
|
2667
|
+
static void PrintTraceName(JSTracer* trc, char *buf, size_t bufsize);
|
|
2668
|
+
#endif
|
|
2669
|
+
|
|
2670
|
+
virtual ~nsXPCWrappedJS();
|
|
2671
|
+
protected:
|
|
2672
|
+
nsXPCWrappedJS(); // not implemented
|
|
2673
|
+
nsXPCWrappedJS(XPCCallContext& ccx,
|
|
2674
|
+
JSObject* aJSObj,
|
|
2675
|
+
nsXPCWrappedJSClass* aClass,
|
|
2676
|
+
nsXPCWrappedJS* root,
|
|
2677
|
+
nsISupports* aOuter);
|
|
2678
|
+
|
|
2679
|
+
void Unlink();
|
|
2680
|
+
|
|
2681
|
+
private:
|
|
2682
|
+
JSObject* mJSObj;
|
|
2683
|
+
nsXPCWrappedJSClass* mClass;
|
|
2684
|
+
nsXPCWrappedJS* mRoot;
|
|
2685
|
+
nsXPCWrappedJS* mNext;
|
|
2686
|
+
nsISupports* mOuter; // only set in root
|
|
2687
|
+
};
|
|
2688
|
+
|
|
2689
|
+
/***************************************************************************/
|
|
2690
|
+
|
|
2691
|
+
class XPCJSObjectHolder : public nsIXPConnectJSObjectHolder,
|
|
2692
|
+
public XPCRootSetElem
|
|
2693
|
+
{
|
|
2694
|
+
public:
|
|
2695
|
+
// all the interface method declarations...
|
|
2696
|
+
NS_DECL_ISUPPORTS
|
|
2697
|
+
NS_DECL_NSIXPCONNECTJSOBJECTHOLDER
|
|
2698
|
+
|
|
2699
|
+
// non-interface implementation
|
|
2700
|
+
|
|
2701
|
+
public:
|
|
2702
|
+
static XPCJSObjectHolder* newHolder(XPCCallContext& ccx, JSObject* obj);
|
|
2703
|
+
|
|
2704
|
+
virtual ~XPCJSObjectHolder();
|
|
2705
|
+
|
|
2706
|
+
void TraceJS(JSTracer *trc);
|
|
2707
|
+
#ifdef DEBUG
|
|
2708
|
+
static void PrintTraceName(JSTracer* trc, char *buf, size_t bufsize);
|
|
2709
|
+
#endif
|
|
2710
|
+
|
|
2711
|
+
private:
|
|
2712
|
+
XPCJSObjectHolder(XPCCallContext& ccx, JSObject* obj);
|
|
2713
|
+
XPCJSObjectHolder(); // not implemented
|
|
2714
|
+
|
|
2715
|
+
JSObject* mJSObj;
|
|
2716
|
+
};
|
|
2717
|
+
|
|
2718
|
+
/***************************************************************************
|
|
2719
|
+
****************************************************************************
|
|
2720
|
+
*
|
|
2721
|
+
* All manner of utility classes follow...
|
|
2722
|
+
*
|
|
2723
|
+
****************************************************************************
|
|
2724
|
+
***************************************************************************/
|
|
2725
|
+
|
|
2726
|
+
class xpcProperty : public nsIProperty
|
|
2727
|
+
{
|
|
2728
|
+
public:
|
|
2729
|
+
NS_DECL_ISUPPORTS
|
|
2730
|
+
NS_DECL_NSIPROPERTY
|
|
2731
|
+
|
|
2732
|
+
xpcProperty(const PRUnichar* aName, PRUint32 aNameLen, nsIVariant* aValue);
|
|
2733
|
+
virtual ~xpcProperty() {}
|
|
2734
|
+
|
|
2735
|
+
private:
|
|
2736
|
+
nsString mName;
|
|
2737
|
+
nsCOMPtr<nsIVariant> mValue;
|
|
2738
|
+
};
|
|
2739
|
+
|
|
2740
|
+
class xpcPropertyBagEnumerator : public nsISimpleEnumerator
|
|
2741
|
+
{
|
|
2742
|
+
public:
|
|
2743
|
+
NS_DECL_ISUPPORTS
|
|
2744
|
+
NS_DECL_NSISIMPLEENUMERATOR
|
|
2745
|
+
|
|
2746
|
+
xpcPropertyBagEnumerator(PRUint32 count);
|
|
2747
|
+
virtual ~xpcPropertyBagEnumerator() {}
|
|
2748
|
+
|
|
2749
|
+
JSBool AppendElement(nsISupports* element);
|
|
2750
|
+
|
|
2751
|
+
private:
|
|
2752
|
+
nsSupportsArray mArray;
|
|
2753
|
+
PRUint32 mIndex;
|
|
2754
|
+
PRUint32 mCount;
|
|
2755
|
+
};
|
|
2756
|
+
|
|
2757
|
+
/***************************************************************************/
|
|
2758
|
+
// data conversion
|
|
2759
|
+
|
|
2760
|
+
// class here just for static methods
|
|
2761
|
+
class XPCConvert
|
|
2762
|
+
{
|
|
2763
|
+
public:
|
|
2764
|
+
static JSBool IsMethodReflectable(const XPTMethodDescriptor& info);
|
|
2765
|
+
|
|
2766
|
+
/**
|
|
2767
|
+
* Convert a native object into a jsval.
|
|
2768
|
+
*
|
|
2769
|
+
* @param ccx the context for the whole procedure
|
|
2770
|
+
* @param d [out] the resulting jsval
|
|
2771
|
+
* @param s the native object we're working with
|
|
2772
|
+
* @param type the type of object that s is
|
|
2773
|
+
* @param iid the interface of s that we want
|
|
2774
|
+
* @param scope the default scope to put on the new JSObject's __parent__
|
|
2775
|
+
* chain
|
|
2776
|
+
* @param pErr [out] relevant error code, if any.
|
|
2777
|
+
*/
|
|
2778
|
+
static JSBool NativeData2JS(XPCCallContext& ccx, jsval* d, const void* s,
|
|
2779
|
+
const nsXPTType& type, const nsID* iid,
|
|
2780
|
+
JSObject* scope, nsresult* pErr);
|
|
2781
|
+
|
|
2782
|
+
static JSBool JSData2Native(XPCCallContext& ccx, void* d, jsval s,
|
|
2783
|
+
const nsXPTType& type,
|
|
2784
|
+
JSBool useAllocator, const nsID* iid,
|
|
2785
|
+
nsresult* pErr);
|
|
2786
|
+
|
|
2787
|
+
/**
|
|
2788
|
+
* Convert a native nsISupports into a JSObject.
|
|
2789
|
+
*
|
|
2790
|
+
* @param ccx the context for the whole procedure
|
|
2791
|
+
* @param dest [out] the resulting JSObject
|
|
2792
|
+
* @param src the native object we're working with
|
|
2793
|
+
* @param iid the interface of src that we want
|
|
2794
|
+
* @param scope the default scope to put on the new JSObject's __parent__
|
|
2795
|
+
* chain
|
|
2796
|
+
* @param allowNativeWrapper if true, this method may wrap the resulting
|
|
2797
|
+
* JSObject in an XPCNativeWrapper and return that, as needed.
|
|
2798
|
+
* @param pErr [out] relevant error code, if any.
|
|
2799
|
+
*/
|
|
2800
|
+
static JSBool NativeInterface2JSObject(XPCCallContext& ccx,
|
|
2801
|
+
jsval* d,
|
|
2802
|
+
nsIXPConnectJSObjectHolder** dest,
|
|
2803
|
+
nsISupports* src,
|
|
2804
|
+
const nsID* iid,
|
|
2805
|
+
XPCNativeInterface* Interface,
|
|
2806
|
+
nsWrapperCache *cache,
|
|
2807
|
+
JSObject* scope,
|
|
2808
|
+
PRBool allowNativeWrapper,
|
|
2809
|
+
PRBool isGlobal,
|
|
2810
|
+
nsresult* pErr);
|
|
2811
|
+
|
|
2812
|
+
static JSBool GetNativeInterfaceFromJSObject(XPCCallContext& ccx,
|
|
2813
|
+
void** dest, JSObject* src,
|
|
2814
|
+
const nsID* iid,
|
|
2815
|
+
nsresult* pErr);
|
|
2816
|
+
static JSBool JSObject2NativeInterface(XPCCallContext& ccx,
|
|
2817
|
+
void** dest, JSObject* src,
|
|
2818
|
+
const nsID* iid,
|
|
2819
|
+
nsISupports* aOuter,
|
|
2820
|
+
nsresult* pErr);
|
|
2821
|
+
static JSBool GetISupportsFromJSObject(JSObject* obj, nsISupports** iface);
|
|
2822
|
+
|
|
2823
|
+
/**
|
|
2824
|
+
* Convert a native array into a jsval.
|
|
2825
|
+
*
|
|
2826
|
+
* @param ccx the context for the whole procedure
|
|
2827
|
+
* @param d [out] the resulting jsval
|
|
2828
|
+
* @param s the native array we're working with
|
|
2829
|
+
* @param type the type of objects in the array
|
|
2830
|
+
* @param iid the interface of each object in the array that we want
|
|
2831
|
+
* @param count the number of items in the array
|
|
2832
|
+
* @param scope the default scope to put on the new JSObjects' __parent__
|
|
2833
|
+
* chain
|
|
2834
|
+
* @param pErr [out] relevant error code, if any.
|
|
2835
|
+
*/
|
|
2836
|
+
static JSBool NativeArray2JS(XPCCallContext& ccx,
|
|
2837
|
+
jsval* d, const void** s,
|
|
2838
|
+
const nsXPTType& type, const nsID* iid,
|
|
2839
|
+
JSUint32 count, JSObject* scope,
|
|
2840
|
+
nsresult* pErr);
|
|
2841
|
+
|
|
2842
|
+
static JSBool JSArray2Native(XPCCallContext& ccx, void** d, jsval s,
|
|
2843
|
+
JSUint32 count, JSUint32 capacity,
|
|
2844
|
+
const nsXPTType& type,
|
|
2845
|
+
JSBool useAllocator, const nsID* iid,
|
|
2846
|
+
uintN* pErr);
|
|
2847
|
+
|
|
2848
|
+
static JSBool NativeStringWithSize2JS(XPCCallContext& ccx,
|
|
2849
|
+
jsval* d, const void* s,
|
|
2850
|
+
const nsXPTType& type,
|
|
2851
|
+
JSUint32 count,
|
|
2852
|
+
nsresult* pErr);
|
|
2853
|
+
|
|
2854
|
+
static JSBool JSStringWithSize2Native(XPCCallContext& ccx, void* d, jsval s,
|
|
2855
|
+
JSUint32 count, JSUint32 capacity,
|
|
2856
|
+
const nsXPTType& type,
|
|
2857
|
+
JSBool useAllocator,
|
|
2858
|
+
uintN* pErr);
|
|
2859
|
+
|
|
2860
|
+
static nsresult JSValToXPCException(XPCCallContext& ccx,
|
|
2861
|
+
jsval s,
|
|
2862
|
+
const char* ifaceName,
|
|
2863
|
+
const char* methodName,
|
|
2864
|
+
nsIException** exception);
|
|
2865
|
+
|
|
2866
|
+
static nsresult JSErrorToXPCException(XPCCallContext& ccx,
|
|
2867
|
+
const char* message,
|
|
2868
|
+
const char* ifaceName,
|
|
2869
|
+
const char* methodName,
|
|
2870
|
+
const JSErrorReport* report,
|
|
2871
|
+
nsIException** exception);
|
|
2872
|
+
|
|
2873
|
+
static nsresult ConstructException(nsresult rv, const char* message,
|
|
2874
|
+
const char* ifaceName,
|
|
2875
|
+
const char* methodName,
|
|
2876
|
+
nsISupports* data,
|
|
2877
|
+
nsIException** exception,
|
|
2878
|
+
JSContext* cx,
|
|
2879
|
+
jsval *jsExceptionPtr);
|
|
2880
|
+
|
|
2881
|
+
static void RemoveXPCOMUCStringFinalizer();
|
|
2882
|
+
|
|
2883
|
+
private:
|
|
2884
|
+
XPCConvert(); // not implemented
|
|
2885
|
+
|
|
2886
|
+
};
|
|
2887
|
+
|
|
2888
|
+
/***************************************************************************/
|
|
2889
|
+
|
|
2890
|
+
// readable string conversions, static methods only
|
|
2891
|
+
class XPCStringConvert
|
|
2892
|
+
{
|
|
2893
|
+
public:
|
|
2894
|
+
|
|
2895
|
+
static JSString *ReadableToJSString(JSContext *cx,
|
|
2896
|
+
const nsAString &readable);
|
|
2897
|
+
|
|
2898
|
+
static XPCReadableJSStringWrapper *JSStringToReadable(XPCCallContext& ccx,
|
|
2899
|
+
JSString *str);
|
|
2900
|
+
|
|
2901
|
+
static void ShutdownDOMStringFinalizer();
|
|
2902
|
+
|
|
2903
|
+
private:
|
|
2904
|
+
XPCStringConvert(); // not implemented
|
|
2905
|
+
};
|
|
2906
|
+
|
|
2907
|
+
extern JSBool
|
|
2908
|
+
XPC_JSArgumentFormatter(JSContext *cx, const char *format,
|
|
2909
|
+
JSBool fromJS, jsval **vpp, va_list *app);
|
|
2910
|
+
|
|
2911
|
+
|
|
2912
|
+
/***************************************************************************/
|
|
2913
|
+
// code for throwing exceptions into JS
|
|
2914
|
+
|
|
2915
|
+
class XPCThrower
|
|
2916
|
+
{
|
|
2917
|
+
public:
|
|
2918
|
+
static void Throw(nsresult rv, JSContext* cx);
|
|
2919
|
+
static void Throw(nsresult rv, XPCCallContext& ccx);
|
|
2920
|
+
static void ThrowBadResult(nsresult rv, nsresult result, XPCCallContext& ccx);
|
|
2921
|
+
static void ThrowBadParam(nsresult rv, uintN paramNum, XPCCallContext& ccx);
|
|
2922
|
+
#ifdef XPC_IDISPATCH_SUPPORT
|
|
2923
|
+
static void ThrowCOMError(JSContext* cx, unsigned long COMErrorCode,
|
|
2924
|
+
nsresult rv = NS_ERROR_XPC_COM_ERROR,
|
|
2925
|
+
const EXCEPINFO * exception = nsnull);
|
|
2926
|
+
#endif
|
|
2927
|
+
static JSBool SetVerbosity(JSBool state)
|
|
2928
|
+
{JSBool old = sVerbose; sVerbose = state; return old;}
|
|
2929
|
+
|
|
2930
|
+
static void BuildAndThrowException(JSContext* cx, nsresult rv, const char* sz);
|
|
2931
|
+
static JSBool CheckForPendingException(nsresult result, JSContext *cx);
|
|
2932
|
+
|
|
2933
|
+
private:
|
|
2934
|
+
static void Verbosify(XPCCallContext& ccx,
|
|
2935
|
+
char** psz, PRBool own);
|
|
2936
|
+
|
|
2937
|
+
static JSBool ThrowExceptionObject(JSContext* cx, nsIException* e);
|
|
2938
|
+
|
|
2939
|
+
private:
|
|
2940
|
+
static JSBool sVerbose;
|
|
2941
|
+
};
|
|
2942
|
+
|
|
2943
|
+
|
|
2944
|
+
/***************************************************************************/
|
|
2945
|
+
|
|
2946
|
+
class XPCJSStack
|
|
2947
|
+
{
|
|
2948
|
+
public:
|
|
2949
|
+
static nsresult
|
|
2950
|
+
CreateStack(JSContext* cx, nsIStackFrame** stack);
|
|
2951
|
+
|
|
2952
|
+
static nsresult
|
|
2953
|
+
CreateStackFrameLocation(PRUint32 aLanguage,
|
|
2954
|
+
const char* aFilename,
|
|
2955
|
+
const char* aFunctionName,
|
|
2956
|
+
PRInt32 aLineNumber,
|
|
2957
|
+
nsIStackFrame* aCaller,
|
|
2958
|
+
nsIStackFrame** stack);
|
|
2959
|
+
private:
|
|
2960
|
+
XPCJSStack(); // not implemented
|
|
2961
|
+
};
|
|
2962
|
+
|
|
2963
|
+
/***************************************************************************/
|
|
2964
|
+
|
|
2965
|
+
class nsXPCException :
|
|
2966
|
+
public nsIXPCException
|
|
2967
|
+
{
|
|
2968
|
+
public:
|
|
2969
|
+
NS_DEFINE_STATIC_CID_ACCESSOR(NS_XPCEXCEPTION_CID)
|
|
2970
|
+
|
|
2971
|
+
NS_DECL_ISUPPORTS
|
|
2972
|
+
NS_DECL_NSIEXCEPTION
|
|
2973
|
+
NS_DECL_NSIXPCEXCEPTION
|
|
2974
|
+
|
|
2975
|
+
static nsresult NewException(const char *aMessage,
|
|
2976
|
+
nsresult aResult,
|
|
2977
|
+
nsIStackFrame *aLocation,
|
|
2978
|
+
nsISupports *aData,
|
|
2979
|
+
nsIException** exception);
|
|
2980
|
+
|
|
2981
|
+
static JSBool NameAndFormatForNSResult(nsresult rv,
|
|
2982
|
+
const char** name,
|
|
2983
|
+
const char** format);
|
|
2984
|
+
|
|
2985
|
+
static void* IterateNSResults(nsresult* rv,
|
|
2986
|
+
const char** name,
|
|
2987
|
+
const char** format,
|
|
2988
|
+
void** iterp);
|
|
2989
|
+
|
|
2990
|
+
static PRUint32 GetNSResultCount();
|
|
2991
|
+
|
|
2992
|
+
nsXPCException();
|
|
2993
|
+
virtual ~nsXPCException();
|
|
2994
|
+
|
|
2995
|
+
static void InitStatics() { sEverMadeOneFromFactory = JS_FALSE; }
|
|
2996
|
+
|
|
2997
|
+
PRBool StealThrownJSVal(jsval* vp);
|
|
2998
|
+
void StowThrownJSVal(JSContext* cx, jsval v);
|
|
2999
|
+
|
|
3000
|
+
protected:
|
|
3001
|
+
void Reset();
|
|
3002
|
+
private:
|
|
3003
|
+
char* mMessage;
|
|
3004
|
+
nsresult mResult;
|
|
3005
|
+
char* mName;
|
|
3006
|
+
nsIStackFrame* mLocation;
|
|
3007
|
+
nsISupports* mData;
|
|
3008
|
+
char* mFilename;
|
|
3009
|
+
int mLineNumber;
|
|
3010
|
+
nsIException* mInner;
|
|
3011
|
+
PRBool mInitialized;
|
|
3012
|
+
|
|
3013
|
+
nsAutoJSValHolder mThrownJSVal;
|
|
3014
|
+
|
|
3015
|
+
static JSBool sEverMadeOneFromFactory;
|
|
3016
|
+
};
|
|
3017
|
+
|
|
3018
|
+
/***************************************************************************/
|
|
3019
|
+
/*
|
|
3020
|
+
* nsJSID implements nsIJSID. It is also used by nsJSIID and nsJSCID as a
|
|
3021
|
+
* member (as a hidden implementaion detail) to which they delegate many calls.
|
|
3022
|
+
*/
|
|
3023
|
+
|
|
3024
|
+
extern JSBool xpc_InitJSxIDClassObjects();
|
|
3025
|
+
extern void xpc_DestroyJSxIDClassObjects();
|
|
3026
|
+
|
|
3027
|
+
|
|
3028
|
+
class nsJSID : public nsIJSID
|
|
3029
|
+
{
|
|
3030
|
+
public:
|
|
3031
|
+
NS_DEFINE_STATIC_CID_ACCESSOR(NS_JS_ID_CID)
|
|
3032
|
+
|
|
3033
|
+
NS_DECL_ISUPPORTS
|
|
3034
|
+
NS_DECL_NSIJSID
|
|
3035
|
+
|
|
3036
|
+
PRBool InitWithName(const nsID& id, const char *nameString);
|
|
3037
|
+
PRBool SetName(const char* name);
|
|
3038
|
+
void SetNameToNoString()
|
|
3039
|
+
{NS_ASSERTION(!mName, "name already set"); mName = gNoString;}
|
|
3040
|
+
PRBool NameIsSet() const {return nsnull != mName;}
|
|
3041
|
+
const nsID& ID() const {return mID;}
|
|
3042
|
+
PRBool IsValid() const {return !mID.Equals(GetInvalidIID());}
|
|
3043
|
+
|
|
3044
|
+
static nsJSID* NewID(const char* str);
|
|
3045
|
+
static nsJSID* NewID(const nsID& id);
|
|
3046
|
+
|
|
3047
|
+
nsJSID();
|
|
3048
|
+
virtual ~nsJSID();
|
|
3049
|
+
protected:
|
|
3050
|
+
|
|
3051
|
+
void Reset();
|
|
3052
|
+
const nsID& GetInvalidIID() const;
|
|
3053
|
+
|
|
3054
|
+
protected:
|
|
3055
|
+
static char gNoString[];
|
|
3056
|
+
nsID mID;
|
|
3057
|
+
char* mNumber;
|
|
3058
|
+
char* mName;
|
|
3059
|
+
};
|
|
3060
|
+
|
|
3061
|
+
// nsJSIID
|
|
3062
|
+
|
|
3063
|
+
class nsJSIID : public nsIJSIID, public nsIXPCScriptable
|
|
3064
|
+
#ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
|
|
3065
|
+
, public nsISecurityCheckedComponent
|
|
3066
|
+
#endif
|
|
3067
|
+
{
|
|
3068
|
+
public:
|
|
3069
|
+
NS_DECL_ISUPPORTS
|
|
3070
|
+
|
|
3071
|
+
// we manually delagate these to nsJSID
|
|
3072
|
+
NS_DECL_NSIJSID
|
|
3073
|
+
|
|
3074
|
+
// we implement the rest...
|
|
3075
|
+
NS_DECL_NSIJSIID
|
|
3076
|
+
NS_DECL_NSIXPCSCRIPTABLE
|
|
3077
|
+
#ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
|
|
3078
|
+
NS_DECL_NSISECURITYCHECKEDCOMPONENT
|
|
3079
|
+
#endif
|
|
3080
|
+
|
|
3081
|
+
static nsJSIID* NewID(nsIInterfaceInfo* aInfo);
|
|
3082
|
+
|
|
3083
|
+
nsJSIID(nsIInterfaceInfo* aInfo);
|
|
3084
|
+
nsJSIID(); // not implemented
|
|
3085
|
+
virtual ~nsJSIID();
|
|
3086
|
+
|
|
3087
|
+
private:
|
|
3088
|
+
nsCOMPtr<nsIInterfaceInfo> mInfo;
|
|
3089
|
+
};
|
|
3090
|
+
|
|
3091
|
+
// nsJSCID
|
|
3092
|
+
|
|
3093
|
+
class nsJSCID : public nsIJSCID, public nsIXPCScriptable
|
|
3094
|
+
{
|
|
3095
|
+
public:
|
|
3096
|
+
NS_DECL_ISUPPORTS
|
|
3097
|
+
|
|
3098
|
+
// we manually delagate these to nsJSID
|
|
3099
|
+
NS_DECL_NSIJSID
|
|
3100
|
+
|
|
3101
|
+
// we implement the rest...
|
|
3102
|
+
NS_DECL_NSIJSCID
|
|
3103
|
+
NS_DECL_NSIXPCSCRIPTABLE
|
|
3104
|
+
|
|
3105
|
+
static nsJSCID* NewID(const char* str);
|
|
3106
|
+
|
|
3107
|
+
nsJSCID();
|
|
3108
|
+
virtual ~nsJSCID();
|
|
3109
|
+
|
|
3110
|
+
private:
|
|
3111
|
+
void ResolveName();
|
|
3112
|
+
|
|
3113
|
+
private:
|
|
3114
|
+
nsJSID mDetails;
|
|
3115
|
+
};
|
|
3116
|
+
|
|
3117
|
+
|
|
3118
|
+
/***************************************************************************/
|
|
3119
|
+
// XPCJSContextStack is not actually an xpcom object, but xpcom calls are
|
|
3120
|
+
// delegated to it as an implementation detail.
|
|
3121
|
+
struct XPCJSContextInfo {
|
|
3122
|
+
XPCJSContextInfo(JSContext* aCx) :
|
|
3123
|
+
cx(aCx),
|
|
3124
|
+
frame(nsnull),
|
|
3125
|
+
requestDepth(0)
|
|
3126
|
+
{}
|
|
3127
|
+
JSContext* cx;
|
|
3128
|
+
|
|
3129
|
+
// Frame to be restored when this JSContext becomes the topmost
|
|
3130
|
+
// one.
|
|
3131
|
+
JSStackFrame* frame;
|
|
3132
|
+
|
|
3133
|
+
// Greater than 0 if a request was suspended
|
|
3134
|
+
jsrefcount requestDepth;
|
|
3135
|
+
};
|
|
3136
|
+
|
|
3137
|
+
class XPCJSContextStack
|
|
3138
|
+
{
|
|
3139
|
+
public:
|
|
3140
|
+
NS_DECL_NSIJSCONTEXTSTACK
|
|
3141
|
+
NS_DECL_NSITHREADJSCONTEXTSTACK
|
|
3142
|
+
|
|
3143
|
+
XPCJSContextStack();
|
|
3144
|
+
virtual ~XPCJSContextStack();
|
|
3145
|
+
|
|
3146
|
+
#ifdef DEBUG
|
|
3147
|
+
JSBool DEBUG_StackHasJSContext(JSContext* aJSContext);
|
|
3148
|
+
#endif
|
|
3149
|
+
|
|
3150
|
+
const nsTArray<XPCJSContextInfo>* GetStack()
|
|
3151
|
+
{ return &mStack; }
|
|
3152
|
+
|
|
3153
|
+
private:
|
|
3154
|
+
nsAutoTArray<XPCJSContextInfo, 16> mStack;
|
|
3155
|
+
JSContext* mSafeJSContext;
|
|
3156
|
+
|
|
3157
|
+
// If non-null, we own it; same as mSafeJSContext if SetSafeJSContext
|
|
3158
|
+
// not called.
|
|
3159
|
+
JSContext* mOwnSafeJSContext;
|
|
3160
|
+
};
|
|
3161
|
+
|
|
3162
|
+
/***************************************************************************/
|
|
3163
|
+
|
|
3164
|
+
#define NS_XPC_JSCONTEXT_STACK_ITERATOR_CID \
|
|
3165
|
+
{ 0x05bae29d, 0x8aef, 0x486d, \
|
|
3166
|
+
{ 0x84, 0xaa, 0x53, 0xf4, 0x8f, 0x14, 0x68, 0x11 } }
|
|
3167
|
+
|
|
3168
|
+
class nsXPCJSContextStackIterator : public nsIJSContextStackIterator
|
|
3169
|
+
{
|
|
3170
|
+
public:
|
|
3171
|
+
NS_DECL_ISUPPORTS
|
|
3172
|
+
NS_DECL_NSIJSCONTEXTSTACKITERATOR
|
|
3173
|
+
|
|
3174
|
+
private:
|
|
3175
|
+
const nsTArray<XPCJSContextInfo> *mStack;
|
|
3176
|
+
PRUint32 mPosition;
|
|
3177
|
+
};
|
|
3178
|
+
|
|
3179
|
+
/**************************************************************/
|
|
3180
|
+
// All of our thread local storage.
|
|
3181
|
+
|
|
3182
|
+
#define BAD_TLS_INDEX ((PRUint32) -1)
|
|
3183
|
+
|
|
3184
|
+
class XPCPerThreadData
|
|
3185
|
+
{
|
|
3186
|
+
public:
|
|
3187
|
+
// Get the instance of this object for the current thread
|
|
3188
|
+
static inline XPCPerThreadData* GetData(JSContext *cx)
|
|
3189
|
+
{
|
|
3190
|
+
if(cx)
|
|
3191
|
+
{
|
|
3192
|
+
NS_ASSERTION(cx->thread, "Uh, JS context w/o a thread?");
|
|
3193
|
+
|
|
3194
|
+
if(cx->thread == sMainJSThread)
|
|
3195
|
+
return sMainThreadData;
|
|
3196
|
+
}
|
|
3197
|
+
else if(sMainThreadData && sMainThreadData->mThread == PR_GetCurrentThread())
|
|
3198
|
+
{
|
|
3199
|
+
return sMainThreadData;
|
|
3200
|
+
}
|
|
3201
|
+
|
|
3202
|
+
return GetDataImpl(cx);
|
|
3203
|
+
}
|
|
3204
|
+
|
|
3205
|
+
static void CleanupAllThreads();
|
|
3206
|
+
|
|
3207
|
+
~XPCPerThreadData();
|
|
3208
|
+
|
|
3209
|
+
nsresult GetException(nsIException** aException)
|
|
3210
|
+
{
|
|
3211
|
+
if(EnsureExceptionManager())
|
|
3212
|
+
return mExceptionManager->GetCurrentException(aException);
|
|
3213
|
+
|
|
3214
|
+
NS_IF_ADDREF(mException);
|
|
3215
|
+
*aException = mException;
|
|
3216
|
+
return NS_OK;
|
|
3217
|
+
}
|
|
3218
|
+
|
|
3219
|
+
nsresult SetException(nsIException* aException)
|
|
3220
|
+
{
|
|
3221
|
+
if(EnsureExceptionManager())
|
|
3222
|
+
return mExceptionManager->SetCurrentException(aException);
|
|
3223
|
+
|
|
3224
|
+
NS_IF_ADDREF(aException);
|
|
3225
|
+
NS_IF_RELEASE(mException);
|
|
3226
|
+
mException = aException;
|
|
3227
|
+
return NS_OK;
|
|
3228
|
+
}
|
|
3229
|
+
|
|
3230
|
+
nsIExceptionManager* GetExceptionManager()
|
|
3231
|
+
{
|
|
3232
|
+
if(EnsureExceptionManager())
|
|
3233
|
+
return mExceptionManager;
|
|
3234
|
+
return nsnull;
|
|
3235
|
+
}
|
|
3236
|
+
|
|
3237
|
+
JSBool EnsureExceptionManager()
|
|
3238
|
+
{
|
|
3239
|
+
if(mExceptionManager)
|
|
3240
|
+
return JS_TRUE;
|
|
3241
|
+
|
|
3242
|
+
if(mExceptionManagerNotAvailable)
|
|
3243
|
+
return JS_FALSE;
|
|
3244
|
+
|
|
3245
|
+
nsCOMPtr<nsIExceptionService> xs =
|
|
3246
|
+
do_GetService(NS_EXCEPTIONSERVICE_CONTRACTID);
|
|
3247
|
+
if(xs)
|
|
3248
|
+
xs->GetCurrentExceptionManager(&mExceptionManager);
|
|
3249
|
+
if(mExceptionManager)
|
|
3250
|
+
return JS_TRUE;
|
|
3251
|
+
|
|
3252
|
+
mExceptionManagerNotAvailable = JS_TRUE;
|
|
3253
|
+
return JS_FALSE;
|
|
3254
|
+
}
|
|
3255
|
+
|
|
3256
|
+
XPCJSContextStack* GetJSContextStack() {return mJSContextStack;}
|
|
3257
|
+
|
|
3258
|
+
XPCCallContext* GetCallContext() const {return mCallContext;}
|
|
3259
|
+
XPCCallContext* SetCallContext(XPCCallContext* ccx)
|
|
3260
|
+
{XPCCallContext* old = mCallContext; mCallContext = ccx; return old;}
|
|
3261
|
+
|
|
3262
|
+
jsval GetResolveName() const {return mResolveName;}
|
|
3263
|
+
jsval SetResolveName(jsval name)
|
|
3264
|
+
{jsval old = mResolveName; mResolveName = name; return old;}
|
|
3265
|
+
|
|
3266
|
+
XPCWrappedNative* GetResolvingWrapper() const {return mResolvingWrapper;}
|
|
3267
|
+
XPCWrappedNative* SetResolvingWrapper(XPCWrappedNative* w)
|
|
3268
|
+
{XPCWrappedNative* old = mResolvingWrapper;
|
|
3269
|
+
mResolvingWrapper = w; return old;}
|
|
3270
|
+
|
|
3271
|
+
void Cleanup();
|
|
3272
|
+
void ReleaseNatives();
|
|
3273
|
+
|
|
3274
|
+
PRBool IsValid() const {return mJSContextStack != nsnull;}
|
|
3275
|
+
|
|
3276
|
+
static PRLock* GetLock() {return gLock;}
|
|
3277
|
+
// Must be called with the threads locked.
|
|
3278
|
+
static XPCPerThreadData* IterateThreads(XPCPerThreadData** iteratorp);
|
|
3279
|
+
|
|
3280
|
+
AutoMarkingPtr** GetAutoRootsAdr() {return &mAutoRoots;}
|
|
3281
|
+
|
|
3282
|
+
void TraceJS(JSTracer* trc);
|
|
3283
|
+
void MarkAutoRootsAfterJSFinalize();
|
|
3284
|
+
|
|
3285
|
+
jsuword GetStackLimit() const { return mStackLimit; }
|
|
3286
|
+
|
|
3287
|
+
static void InitStatics()
|
|
3288
|
+
{ gLock = nsnull; gThreads = nsnull; gTLSIndex = BAD_TLS_INDEX; }
|
|
3289
|
+
|
|
3290
|
+
#ifdef XPC_CHECK_WRAPPER_THREADSAFETY
|
|
3291
|
+
JSUint32 IncrementWrappedNativeThreadsafetyReportDepth()
|
|
3292
|
+
{return ++mWrappedNativeThreadsafetyReportDepth;}
|
|
3293
|
+
void ClearWrappedNativeThreadsafetyReportDepth()
|
|
3294
|
+
{mWrappedNativeThreadsafetyReportDepth = 0;}
|
|
3295
|
+
#endif
|
|
3296
|
+
|
|
3297
|
+
static void ShutDown()
|
|
3298
|
+
{sMainJSThread = nsnull; sMainThreadData = nsnull;}
|
|
3299
|
+
|
|
3300
|
+
static PRBool IsMainThread(JSContext *cx)
|
|
3301
|
+
{ return cx->thread == sMainJSThread; }
|
|
3302
|
+
|
|
3303
|
+
private:
|
|
3304
|
+
XPCPerThreadData();
|
|
3305
|
+
static XPCPerThreadData* GetDataImpl(JSContext *cx);
|
|
3306
|
+
|
|
3307
|
+
private:
|
|
3308
|
+
XPCJSContextStack* mJSContextStack;
|
|
3309
|
+
XPCPerThreadData* mNextThread;
|
|
3310
|
+
XPCCallContext* mCallContext;
|
|
3311
|
+
jsval mResolveName;
|
|
3312
|
+
XPCWrappedNative* mResolvingWrapper;
|
|
3313
|
+
|
|
3314
|
+
nsIExceptionManager* mExceptionManager;
|
|
3315
|
+
nsIException* mException;
|
|
3316
|
+
JSBool mExceptionManagerNotAvailable;
|
|
3317
|
+
AutoMarkingPtr* mAutoRoots;
|
|
3318
|
+
|
|
3319
|
+
jsuword mStackLimit;
|
|
3320
|
+
|
|
3321
|
+
#ifdef XPC_CHECK_WRAPPER_THREADSAFETY
|
|
3322
|
+
JSUint32 mWrappedNativeThreadsafetyReportDepth;
|
|
3323
|
+
#endif
|
|
3324
|
+
PRThread* mThread;
|
|
3325
|
+
|
|
3326
|
+
static PRLock* gLock;
|
|
3327
|
+
static XPCPerThreadData* gThreads;
|
|
3328
|
+
static PRUintn gTLSIndex;
|
|
3329
|
+
|
|
3330
|
+
// Cached value of cx->thread on the main thread.
|
|
3331
|
+
static void *sMainJSThread;
|
|
3332
|
+
|
|
3333
|
+
// Cached per thread data for the main thread. Only safe to access
|
|
3334
|
+
// if cx->thread == sMainJSThread.
|
|
3335
|
+
static XPCPerThreadData *sMainThreadData;
|
|
3336
|
+
};
|
|
3337
|
+
|
|
3338
|
+
/***************************************************************************/
|
|
3339
|
+
#ifndef XPCONNECT_STANDALONE
|
|
3340
|
+
#include "nsIScriptSecurityManager.h"
|
|
3341
|
+
|
|
3342
|
+
class BackstagePass : public nsIScriptObjectPrincipal,
|
|
3343
|
+
public nsIXPCScriptable,
|
|
3344
|
+
public nsIClassInfo
|
|
3345
|
+
{
|
|
3346
|
+
public:
|
|
3347
|
+
NS_DECL_ISUPPORTS
|
|
3348
|
+
NS_DECL_NSIXPCSCRIPTABLE
|
|
3349
|
+
NS_DECL_NSICLASSINFO
|
|
3350
|
+
|
|
3351
|
+
virtual nsIPrincipal* GetPrincipal() {
|
|
3352
|
+
return mPrincipal;
|
|
3353
|
+
}
|
|
3354
|
+
|
|
3355
|
+
BackstagePass(nsIPrincipal *prin) :
|
|
3356
|
+
mPrincipal(prin)
|
|
3357
|
+
{
|
|
3358
|
+
}
|
|
3359
|
+
|
|
3360
|
+
virtual ~BackstagePass() { }
|
|
3361
|
+
|
|
3362
|
+
private:
|
|
3363
|
+
nsCOMPtr<nsIPrincipal> mPrincipal;
|
|
3364
|
+
};
|
|
3365
|
+
|
|
3366
|
+
#else
|
|
3367
|
+
|
|
3368
|
+
class BackstagePass : public nsIXPCScriptable, public nsIClassInfo
|
|
3369
|
+
{
|
|
3370
|
+
public:
|
|
3371
|
+
NS_DECL_ISUPPORTS
|
|
3372
|
+
NS_DECL_NSIXPCSCRIPTABLE
|
|
3373
|
+
NS_DECL_NSICLASSINFO
|
|
3374
|
+
|
|
3375
|
+
BackstagePass()
|
|
3376
|
+
{
|
|
3377
|
+
}
|
|
3378
|
+
|
|
3379
|
+
virtual ~BackstagePass() { }
|
|
3380
|
+
};
|
|
3381
|
+
|
|
3382
|
+
#endif
|
|
3383
|
+
|
|
3384
|
+
class nsJSRuntimeServiceImpl : public nsIJSRuntimeService,
|
|
3385
|
+
public nsSupportsWeakReference
|
|
3386
|
+
{
|
|
3387
|
+
public:
|
|
3388
|
+
NS_DECL_ISUPPORTS
|
|
3389
|
+
NS_DECL_NSIJSRUNTIMESERVICE
|
|
3390
|
+
|
|
3391
|
+
// This returns an AddRef'd pointer. It does not do this with an out param
|
|
3392
|
+
// only because this form is required by generic module macro:
|
|
3393
|
+
// NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR
|
|
3394
|
+
static nsJSRuntimeServiceImpl* GetSingleton();
|
|
3395
|
+
|
|
3396
|
+
static void FreeSingleton();
|
|
3397
|
+
|
|
3398
|
+
nsJSRuntimeServiceImpl();
|
|
3399
|
+
virtual ~nsJSRuntimeServiceImpl();
|
|
3400
|
+
|
|
3401
|
+
static void InitStatics() { gJSRuntimeService = nsnull; }
|
|
3402
|
+
protected:
|
|
3403
|
+
static nsJSRuntimeServiceImpl* gJSRuntimeService;
|
|
3404
|
+
nsCOMPtr<nsIXPCScriptable> mBackstagePass;
|
|
3405
|
+
};
|
|
3406
|
+
|
|
3407
|
+
/***************************************************************************/
|
|
3408
|
+
// 'Components' object
|
|
3409
|
+
|
|
3410
|
+
class nsXPCComponents : public nsIXPCComponents,
|
|
3411
|
+
public nsIXPCScriptable,
|
|
3412
|
+
public nsIClassInfo
|
|
3413
|
+
#ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
|
|
3414
|
+
, public nsISecurityCheckedComponent
|
|
3415
|
+
#endif
|
|
3416
|
+
{
|
|
3417
|
+
public:
|
|
3418
|
+
NS_DECL_ISUPPORTS
|
|
3419
|
+
NS_DECL_NSIXPCCOMPONENTS
|
|
3420
|
+
NS_DECL_NSIXPCSCRIPTABLE
|
|
3421
|
+
NS_DECL_NSICLASSINFO
|
|
3422
|
+
|
|
3423
|
+
#ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
|
|
3424
|
+
NS_DECL_NSISECURITYCHECKEDCOMPONENT
|
|
3425
|
+
#endif
|
|
3426
|
+
|
|
3427
|
+
public:
|
|
3428
|
+
static JSBool
|
|
3429
|
+
AttachNewComponentsObject(XPCCallContext& ccx,
|
|
3430
|
+
XPCWrappedNativeScope* aScope,
|
|
3431
|
+
JSObject* aGlobal);
|
|
3432
|
+
|
|
3433
|
+
void SystemIsBeingShutDown() {ClearMembers();}
|
|
3434
|
+
|
|
3435
|
+
virtual ~nsXPCComponents();
|
|
3436
|
+
|
|
3437
|
+
private:
|
|
3438
|
+
nsXPCComponents();
|
|
3439
|
+
void ClearMembers();
|
|
3440
|
+
|
|
3441
|
+
private:
|
|
3442
|
+
nsXPCComponents_Interfaces* mInterfaces;
|
|
3443
|
+
nsXPCComponents_InterfacesByID* mInterfacesByID;
|
|
3444
|
+
nsXPCComponents_Classes* mClasses;
|
|
3445
|
+
nsXPCComponents_ClassesByID* mClassesByID;
|
|
3446
|
+
nsXPCComponents_Results* mResults;
|
|
3447
|
+
nsXPCComponents_ID* mID;
|
|
3448
|
+
nsXPCComponents_Exception* mException;
|
|
3449
|
+
nsXPCComponents_Constructor* mConstructor;
|
|
3450
|
+
nsXPCComponents_Utils* mUtils;
|
|
3451
|
+
};
|
|
3452
|
+
|
|
3453
|
+
/***************************************************************************/
|
|
3454
|
+
|
|
3455
|
+
class nsXPCComponents_Interfaces :
|
|
3456
|
+
public nsIScriptableInterfaces,
|
|
3457
|
+
public nsIXPCScriptable,
|
|
3458
|
+
public nsIClassInfo
|
|
3459
|
+
#ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
|
|
3460
|
+
, public nsISecurityCheckedComponent
|
|
3461
|
+
#endif
|
|
3462
|
+
{
|
|
3463
|
+
public:
|
|
3464
|
+
// all the interface method declarations...
|
|
3465
|
+
NS_DECL_ISUPPORTS
|
|
3466
|
+
NS_DECL_NSISCRIPTABLEINTERFACES
|
|
3467
|
+
NS_DECL_NSIXPCSCRIPTABLE
|
|
3468
|
+
NS_DECL_NSICLASSINFO
|
|
3469
|
+
#ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
|
|
3470
|
+
NS_DECL_NSISECURITYCHECKEDCOMPONENT
|
|
3471
|
+
#endif
|
|
3472
|
+
|
|
3473
|
+
public:
|
|
3474
|
+
nsXPCComponents_Interfaces();
|
|
3475
|
+
virtual ~nsXPCComponents_Interfaces();
|
|
3476
|
+
|
|
3477
|
+
private:
|
|
3478
|
+
nsCOMPtr<nsIInterfaceInfoManager> mManager;
|
|
3479
|
+
};
|
|
3480
|
+
|
|
3481
|
+
|
|
3482
|
+
/***************************************************************************/
|
|
3483
|
+
|
|
3484
|
+
extern JSObject*
|
|
3485
|
+
xpc_NewIDObject(JSContext *cx, JSObject* jsobj, const nsID& aID);
|
|
3486
|
+
|
|
3487
|
+
extern const nsID*
|
|
3488
|
+
xpc_JSObjectToID(JSContext *cx, JSObject* obj);
|
|
3489
|
+
|
|
3490
|
+
extern JSBool
|
|
3491
|
+
xpc_JSObjectIsID(JSContext *cx, JSObject* obj);
|
|
3492
|
+
|
|
3493
|
+
/***************************************************************************/
|
|
3494
|
+
// in xpcdebug.cpp
|
|
3495
|
+
|
|
3496
|
+
extern JSBool
|
|
3497
|
+
xpc_DumpJSStack(JSContext* cx, JSBool showArgs, JSBool showLocals,
|
|
3498
|
+
JSBool showThisProps);
|
|
3499
|
+
|
|
3500
|
+
extern JSBool
|
|
3501
|
+
xpc_DumpEvalInJSStackFrame(JSContext* cx, JSUint32 frameno, const char* text);
|
|
3502
|
+
|
|
3503
|
+
extern JSBool
|
|
3504
|
+
xpc_DumpJSObject(JSObject* obj);
|
|
3505
|
+
|
|
3506
|
+
extern JSBool
|
|
3507
|
+
xpc_InstallJSDebuggerKeywordHandler(JSRuntime* rt);
|
|
3508
|
+
|
|
3509
|
+
/***************************************************************************/
|
|
3510
|
+
|
|
3511
|
+
// Definition of nsScriptError, defined here because we lack a place to put
|
|
3512
|
+
// XPCOM objects associated with the JavaScript engine.
|
|
3513
|
+
class nsScriptError : public nsIScriptError {
|
|
3514
|
+
public:
|
|
3515
|
+
nsScriptError();
|
|
3516
|
+
|
|
3517
|
+
virtual ~nsScriptError();
|
|
3518
|
+
|
|
3519
|
+
// TODO - do something reasonable on getting null from these babies.
|
|
3520
|
+
|
|
3521
|
+
NS_DECL_ISUPPORTS
|
|
3522
|
+
NS_DECL_NSICONSOLEMESSAGE
|
|
3523
|
+
NS_DECL_NSISCRIPTERROR
|
|
3524
|
+
|
|
3525
|
+
private:
|
|
3526
|
+
nsString mMessage;
|
|
3527
|
+
nsString mSourceName;
|
|
3528
|
+
PRUint32 mLineNumber;
|
|
3529
|
+
nsString mSourceLine;
|
|
3530
|
+
PRUint32 mColumnNumber;
|
|
3531
|
+
PRUint32 mFlags;
|
|
3532
|
+
nsCString mCategory;
|
|
3533
|
+
};
|
|
3534
|
+
|
|
3535
|
+
/***************************************************************************/
|
|
3536
|
+
// XXX allowing for future notifications to XPCCallContext
|
|
3537
|
+
|
|
3538
|
+
class AutoJSRequest
|
|
3539
|
+
{
|
|
3540
|
+
public:
|
|
3541
|
+
AutoJSRequest(XPCCallContext& aCCX)
|
|
3542
|
+
: mCCX(aCCX), mCX(aCCX.GetJSContext()) {BeginRequest();}
|
|
3543
|
+
~AutoJSRequest() {EndRequest();}
|
|
3544
|
+
|
|
3545
|
+
void EndRequest() {
|
|
3546
|
+
if(mCX) {
|
|
3547
|
+
JS_EndRequest(mCX);
|
|
3548
|
+
mCX = nsnull;
|
|
3549
|
+
}
|
|
3550
|
+
}
|
|
3551
|
+
private:
|
|
3552
|
+
void BeginRequest() {
|
|
3553
|
+
if(JS_GetContextThread(mCX))
|
|
3554
|
+
JS_BeginRequest(mCX);
|
|
3555
|
+
else
|
|
3556
|
+
mCX = nsnull;
|
|
3557
|
+
}
|
|
3558
|
+
private:
|
|
3559
|
+
XPCCallContext& mCCX;
|
|
3560
|
+
JSContext* mCX;
|
|
3561
|
+
};
|
|
3562
|
+
|
|
3563
|
+
class AutoJSSuspendRequest
|
|
3564
|
+
{
|
|
3565
|
+
public:
|
|
3566
|
+
AutoJSSuspendRequest(XPCCallContext& aCCX)
|
|
3567
|
+
: mCX(aCCX.GetJSContext()) {SuspendRequest();}
|
|
3568
|
+
~AutoJSSuspendRequest() {ResumeRequest();}
|
|
3569
|
+
|
|
3570
|
+
void ResumeRequest() {
|
|
3571
|
+
if(mCX) {
|
|
3572
|
+
JS_ResumeRequest(mCX, mDepth);
|
|
3573
|
+
mCX = nsnull;
|
|
3574
|
+
}
|
|
3575
|
+
}
|
|
3576
|
+
private:
|
|
3577
|
+
void SuspendRequest() {
|
|
3578
|
+
if(JS_GetContextThread(mCX))
|
|
3579
|
+
mDepth = JS_SuspendRequest(mCX);
|
|
3580
|
+
else
|
|
3581
|
+
mCX = nsnull;
|
|
3582
|
+
}
|
|
3583
|
+
private:
|
|
3584
|
+
JSContext* mCX;
|
|
3585
|
+
jsrefcount mDepth;
|
|
3586
|
+
};
|
|
3587
|
+
|
|
3588
|
+
class AutoJSSuspendRequestWithNoCallContext
|
|
3589
|
+
{
|
|
3590
|
+
public:
|
|
3591
|
+
AutoJSSuspendRequestWithNoCallContext(JSContext *aCX)
|
|
3592
|
+
: mCX(aCX) {SuspendRequest();}
|
|
3593
|
+
~AutoJSSuspendRequestWithNoCallContext() {ResumeRequest();}
|
|
3594
|
+
|
|
3595
|
+
void ResumeRequest() {
|
|
3596
|
+
if(mCX) {
|
|
3597
|
+
JS_ResumeRequest(mCX, mDepth);
|
|
3598
|
+
mCX = nsnull;
|
|
3599
|
+
}
|
|
3600
|
+
}
|
|
3601
|
+
private:
|
|
3602
|
+
void SuspendRequest() {
|
|
3603
|
+
if(JS_GetContextThread(mCX))
|
|
3604
|
+
mDepth = JS_SuspendRequest(mCX);
|
|
3605
|
+
else
|
|
3606
|
+
mCX = nsnull;
|
|
3607
|
+
}
|
|
3608
|
+
private:
|
|
3609
|
+
JSContext* mCX;
|
|
3610
|
+
jsrefcount mDepth;
|
|
3611
|
+
};
|
|
3612
|
+
|
|
3613
|
+
class AutoJSSuspendNonMainThreadRequest
|
|
3614
|
+
{
|
|
3615
|
+
public:
|
|
3616
|
+
AutoJSSuspendNonMainThreadRequest(JSContext *aCX)
|
|
3617
|
+
: mCX(aCX) {SuspendRequest();}
|
|
3618
|
+
~AutoJSSuspendNonMainThreadRequest() {ResumeRequest();}
|
|
3619
|
+
|
|
3620
|
+
void ResumeRequest() {
|
|
3621
|
+
if (mCX) {
|
|
3622
|
+
JS_ResumeRequest(mCX, mDepth);
|
|
3623
|
+
mCX = nsnull;
|
|
3624
|
+
}
|
|
3625
|
+
}
|
|
3626
|
+
|
|
3627
|
+
private:
|
|
3628
|
+
void SuspendRequest() {
|
|
3629
|
+
if (mCX && !XPCPerThreadData::IsMainThread(mCX))
|
|
3630
|
+
mDepth = JS_SuspendRequest(mCX);
|
|
3631
|
+
else
|
|
3632
|
+
mCX = nsnull;
|
|
3633
|
+
}
|
|
3634
|
+
|
|
3635
|
+
JSContext *mCX;
|
|
3636
|
+
jsrefcount mDepth;
|
|
3637
|
+
};
|
|
3638
|
+
|
|
3639
|
+
|
|
3640
|
+
/*****************************************/
|
|
3641
|
+
|
|
3642
|
+
class AutoJSRequestWithNoCallContext
|
|
3643
|
+
{
|
|
3644
|
+
public:
|
|
3645
|
+
AutoJSRequestWithNoCallContext(JSContext* aCX) : mCX(aCX) {BeginRequest();}
|
|
3646
|
+
~AutoJSRequestWithNoCallContext() {EndRequest();}
|
|
3647
|
+
|
|
3648
|
+
void EndRequest() {
|
|
3649
|
+
if(mCX) {
|
|
3650
|
+
JS_EndRequest(mCX);
|
|
3651
|
+
mCX = nsnull;
|
|
3652
|
+
}
|
|
3653
|
+
}
|
|
3654
|
+
private:
|
|
3655
|
+
void BeginRequest() {
|
|
3656
|
+
if(JS_GetContextThread(mCX))
|
|
3657
|
+
JS_BeginRequest(mCX);
|
|
3658
|
+
else
|
|
3659
|
+
mCX = nsnull;
|
|
3660
|
+
}
|
|
3661
|
+
private:
|
|
3662
|
+
JSContext* mCX;
|
|
3663
|
+
};
|
|
3664
|
+
|
|
3665
|
+
/***************************************************************************/
|
|
3666
|
+
class AutoJSErrorAndExceptionEater
|
|
3667
|
+
{
|
|
3668
|
+
public:
|
|
3669
|
+
AutoJSErrorAndExceptionEater(JSContext* aCX)
|
|
3670
|
+
: mCX(aCX),
|
|
3671
|
+
mOldErrorReporter(JS_SetErrorReporter(mCX, nsnull)),
|
|
3672
|
+
mOldExceptionState(JS_SaveExceptionState(mCX)) {}
|
|
3673
|
+
~AutoJSErrorAndExceptionEater()
|
|
3674
|
+
{
|
|
3675
|
+
JS_SetErrorReporter(mCX, mOldErrorReporter);
|
|
3676
|
+
JS_RestoreExceptionState(mCX, mOldExceptionState);
|
|
3677
|
+
}
|
|
3678
|
+
private:
|
|
3679
|
+
JSContext* mCX;
|
|
3680
|
+
JSErrorReporter mOldErrorReporter;
|
|
3681
|
+
JSExceptionState* mOldExceptionState;
|
|
3682
|
+
};
|
|
3683
|
+
|
|
3684
|
+
/******************************************************************************
|
|
3685
|
+
* Handles pre/post script processing and the setting/resetting the error
|
|
3686
|
+
* reporter
|
|
3687
|
+
*/
|
|
3688
|
+
class AutoScriptEvaluate
|
|
3689
|
+
{
|
|
3690
|
+
public:
|
|
3691
|
+
/**
|
|
3692
|
+
* Saves the JSContext as well as initializing our state
|
|
3693
|
+
* @param cx The JSContext, this can be null, we don't do anything then
|
|
3694
|
+
*/
|
|
3695
|
+
AutoScriptEvaluate(JSContext * cx)
|
|
3696
|
+
: mJSContext(cx), mState(0), mErrorReporterSet(PR_FALSE),
|
|
3697
|
+
mEvaluated(PR_FALSE), mContextHasThread(0) {}
|
|
3698
|
+
|
|
3699
|
+
/**
|
|
3700
|
+
* Does the pre script evaluation and sets the error reporter if given
|
|
3701
|
+
* This function should only be called once, and will assert if called
|
|
3702
|
+
* more than once
|
|
3703
|
+
* @param errorReporter the error reporter callback function to set
|
|
3704
|
+
*/
|
|
3705
|
+
|
|
3706
|
+
void StartEvaluating(JSErrorReporter errorReporter = nsnull);
|
|
3707
|
+
/**
|
|
3708
|
+
* Does the post script evaluation and resets the error reporter
|
|
3709
|
+
*/
|
|
3710
|
+
~AutoScriptEvaluate();
|
|
3711
|
+
private:
|
|
3712
|
+
JSContext* mJSContext;
|
|
3713
|
+
JSExceptionState* mState;
|
|
3714
|
+
PRBool mErrorReporterSet;
|
|
3715
|
+
PRBool mEvaluated;
|
|
3716
|
+
jsword mContextHasThread;
|
|
3717
|
+
|
|
3718
|
+
// No copying or assignment allowed
|
|
3719
|
+
AutoScriptEvaluate(const AutoScriptEvaluate &);
|
|
3720
|
+
AutoScriptEvaluate & operator =(const AutoScriptEvaluate &);
|
|
3721
|
+
};
|
|
3722
|
+
|
|
3723
|
+
/***************************************************************************/
|
|
3724
|
+
class AutoResolveName
|
|
3725
|
+
{
|
|
3726
|
+
public:
|
|
3727
|
+
AutoResolveName(XPCCallContext& ccx, jsval name)
|
|
3728
|
+
: mTLS(ccx.GetThreadData()),
|
|
3729
|
+
mOld(mTLS->SetResolveName(name)),
|
|
3730
|
+
mCheck(name) {}
|
|
3731
|
+
~AutoResolveName()
|
|
3732
|
+
{
|
|
3733
|
+
#ifdef DEBUG
|
|
3734
|
+
jsval old =
|
|
3735
|
+
#endif
|
|
3736
|
+
mTLS->SetResolveName(mOld);
|
|
3737
|
+
NS_ASSERTION(old == mCheck, "Bad Nesting!");
|
|
3738
|
+
}
|
|
3739
|
+
|
|
3740
|
+
private:
|
|
3741
|
+
XPCPerThreadData* mTLS;
|
|
3742
|
+
jsval mOld;
|
|
3743
|
+
jsval mCheck;
|
|
3744
|
+
};
|
|
3745
|
+
|
|
3746
|
+
/***************************************************************************/
|
|
3747
|
+
class XPCMarkableJSVal
|
|
3748
|
+
{
|
|
3749
|
+
public:
|
|
3750
|
+
XPCMarkableJSVal(jsval val) : mVal(val), mValPtr(&mVal) {}
|
|
3751
|
+
XPCMarkableJSVal(jsval *pval) : mVal(0), mValPtr(pval) {}
|
|
3752
|
+
~XPCMarkableJSVal() {}
|
|
3753
|
+
void Mark() {}
|
|
3754
|
+
void TraceJS(JSTracer* trc)
|
|
3755
|
+
{
|
|
3756
|
+
JS_CALL_VALUE_TRACER(trc, *mValPtr, "XPCMarkableJSVal");
|
|
3757
|
+
}
|
|
3758
|
+
void AutoTrace(JSTracer* trc) {}
|
|
3759
|
+
private:
|
|
3760
|
+
XPCMarkableJSVal(); // not implemented
|
|
3761
|
+
jsval mVal;
|
|
3762
|
+
jsval* mValPtr;
|
|
3763
|
+
};
|
|
3764
|
+
|
|
3765
|
+
/***************************************************************************/
|
|
3766
|
+
// AutoMarkingPtr is the base class for the various AutoMarking pointer types
|
|
3767
|
+
// below. This system allows us to temporarily protect instances of our garbage
|
|
3768
|
+
// collected types after they are constructed but before they are safely
|
|
3769
|
+
// attached to other rooted objects.
|
|
3770
|
+
// This base class has pure virtual support for marking.
|
|
3771
|
+
|
|
3772
|
+
class AutoMarkingPtr
|
|
3773
|
+
{
|
|
3774
|
+
public:
|
|
3775
|
+
AutoMarkingPtr(XPCCallContext& ccx)
|
|
3776
|
+
: mNext(nsnull), mTLS(ccx.GetThreadData()) {Link();}
|
|
3777
|
+
|
|
3778
|
+
virtual ~AutoMarkingPtr() {Unlink();}
|
|
3779
|
+
|
|
3780
|
+
void Link()
|
|
3781
|
+
{if(!mTLS) return;
|
|
3782
|
+
AutoMarkingPtr** list = mTLS->GetAutoRootsAdr();
|
|
3783
|
+
mNext = *list; *list = this;}
|
|
3784
|
+
|
|
3785
|
+
void Unlink()
|
|
3786
|
+
{if(!mTLS) return;
|
|
3787
|
+
AutoMarkingPtr** cur = mTLS->GetAutoRootsAdr();
|
|
3788
|
+
while(*cur != this) {
|
|
3789
|
+
NS_ASSERTION(*cur, "This object not in list!");
|
|
3790
|
+
cur = &(*cur)->mNext;
|
|
3791
|
+
}
|
|
3792
|
+
*cur = mNext;
|
|
3793
|
+
mTLS = nsnull;
|
|
3794
|
+
}
|
|
3795
|
+
|
|
3796
|
+
AutoMarkingPtr* GetNext() {return mNext;}
|
|
3797
|
+
|
|
3798
|
+
virtual void TraceJS(JSTracer* trc) = 0;
|
|
3799
|
+
virtual void MarkAfterJSFinalize() = 0;
|
|
3800
|
+
|
|
3801
|
+
protected:
|
|
3802
|
+
AutoMarkingPtr* mNext;
|
|
3803
|
+
XPCPerThreadData* mTLS;
|
|
3804
|
+
};
|
|
3805
|
+
|
|
3806
|
+
// More joy of macros...
|
|
3807
|
+
|
|
3808
|
+
#define DEFINE_AUTO_MARKING_PTR_TYPE(class_, type_) \
|
|
3809
|
+
class class_ : public AutoMarkingPtr \
|
|
3810
|
+
{ \
|
|
3811
|
+
public: \
|
|
3812
|
+
class_ (XPCCallContext& ccx, type_ * ptr = nsnull) \
|
|
3813
|
+
: AutoMarkingPtr(ccx), mPtr(ptr) {} \
|
|
3814
|
+
virtual ~ class_ () {} \
|
|
3815
|
+
\
|
|
3816
|
+
virtual void TraceJS(JSTracer* trc) \
|
|
3817
|
+
{if(mPtr) { \
|
|
3818
|
+
mPtr->TraceJS(trc); \
|
|
3819
|
+
mPtr->AutoTrace(trc); \
|
|
3820
|
+
} \
|
|
3821
|
+
if(mNext) mNext->TraceJS(trc);} \
|
|
3822
|
+
\
|
|
3823
|
+
virtual void MarkAfterJSFinalize() \
|
|
3824
|
+
{if(mPtr) mPtr->Mark(); \
|
|
3825
|
+
if(mNext) mNext->MarkAfterJSFinalize();} \
|
|
3826
|
+
\
|
|
3827
|
+
type_ * get() const {return mPtr;} \
|
|
3828
|
+
operator type_ *() const {return mPtr;} \
|
|
3829
|
+
type_ * operator->() const {return mPtr;} \
|
|
3830
|
+
\
|
|
3831
|
+
class_ & operator =(type_ * p) \
|
|
3832
|
+
{mPtr = p; return *this;} \
|
|
3833
|
+
\
|
|
3834
|
+
protected: \
|
|
3835
|
+
type_ * mPtr; \
|
|
3836
|
+
};
|
|
3837
|
+
|
|
3838
|
+
// Use the macro above to define our AutoMarking types...
|
|
3839
|
+
|
|
3840
|
+
DEFINE_AUTO_MARKING_PTR_TYPE(AutoMarkingNativeInterfacePtr, XPCNativeInterface)
|
|
3841
|
+
DEFINE_AUTO_MARKING_PTR_TYPE(AutoMarkingNativeSetPtr, XPCNativeSet)
|
|
3842
|
+
DEFINE_AUTO_MARKING_PTR_TYPE(AutoMarkingWrappedNativePtr, XPCWrappedNative)
|
|
3843
|
+
DEFINE_AUTO_MARKING_PTR_TYPE(AutoMarkingWrappedNativeTearOffPtr, XPCWrappedNativeTearOff)
|
|
3844
|
+
DEFINE_AUTO_MARKING_PTR_TYPE(AutoMarkingWrappedNativeProtoPtr, XPCWrappedNativeProto)
|
|
3845
|
+
DEFINE_AUTO_MARKING_PTR_TYPE(AutoMarkingJSVal, XPCMarkableJSVal)
|
|
3846
|
+
|
|
3847
|
+
#define DEFINE_AUTO_MARKING_ARRAY_PTR_TYPE(class_, type_) \
|
|
3848
|
+
class class_ : public AutoMarkingPtr \
|
|
3849
|
+
{ \
|
|
3850
|
+
public: \
|
|
3851
|
+
class_ (XPCCallContext& ccx) \
|
|
3852
|
+
: AutoMarkingPtr(ccx), mPtr(nsnull), mCount(0) {} \
|
|
3853
|
+
class_ (XPCCallContext& ccx, type_** aPtr, PRUint32 aCount, \
|
|
3854
|
+
PRBool aClear = PR_FALSE) \
|
|
3855
|
+
: AutoMarkingPtr(ccx), mPtr(aPtr), mCount(aCount) \
|
|
3856
|
+
{ \
|
|
3857
|
+
if(!mPtr) mCount = 0; \
|
|
3858
|
+
else if(aClear) memset(mPtr, 0, mCount*sizeof(type_*)); \
|
|
3859
|
+
} \
|
|
3860
|
+
virtual ~ class_ () {} \
|
|
3861
|
+
\
|
|
3862
|
+
virtual void TraceJS(JSTracer* trc) \
|
|
3863
|
+
{ \
|
|
3864
|
+
for(PRUint32 i = 0; i < mCount; ++i) \
|
|
3865
|
+
{ \
|
|
3866
|
+
type_* cur = mPtr[i]; \
|
|
3867
|
+
if(cur) \
|
|
3868
|
+
{ \
|
|
3869
|
+
cur->TraceJS(trc); \
|
|
3870
|
+
cur->AutoTrace(trc); \
|
|
3871
|
+
} \
|
|
3872
|
+
} \
|
|
3873
|
+
if(mNext) mNext->TraceJS(trc); \
|
|
3874
|
+
} \
|
|
3875
|
+
\
|
|
3876
|
+
virtual void MarkAfterJSFinalize() \
|
|
3877
|
+
{ \
|
|
3878
|
+
for(PRUint32 i = 0; i < mCount; ++i) \
|
|
3879
|
+
{ \
|
|
3880
|
+
type_* cur = mPtr[i]; \
|
|
3881
|
+
if(cur) \
|
|
3882
|
+
cur->Mark(); \
|
|
3883
|
+
} \
|
|
3884
|
+
if(mNext) mNext->MarkAfterJSFinalize(); \
|
|
3885
|
+
} \
|
|
3886
|
+
\
|
|
3887
|
+
type_ ** get() const {return mPtr;} \
|
|
3888
|
+
operator type_ **() const {return mPtr;} \
|
|
3889
|
+
type_ ** operator->() const {return mPtr;} \
|
|
3890
|
+
\
|
|
3891
|
+
class_ & operator =(const class_ & inst) \
|
|
3892
|
+
{mPtr = inst.mPtr; mCount = inst.mCount; return *this;} \
|
|
3893
|
+
\
|
|
3894
|
+
protected: \
|
|
3895
|
+
type_ ** mPtr; \
|
|
3896
|
+
PRUint32 mCount; \
|
|
3897
|
+
};
|
|
3898
|
+
|
|
3899
|
+
DEFINE_AUTO_MARKING_ARRAY_PTR_TYPE(AutoMarkingNativeInterfacePtrArrayPtr,
|
|
3900
|
+
XPCNativeInterface)
|
|
3901
|
+
|
|
3902
|
+
// Note: It looked like I would need one of these AutoMarkingPtr types for
|
|
3903
|
+
// XPCNativeScriptableInfo in order to manage marking its
|
|
3904
|
+
// XPCNativeScriptableShared member during construction. But AFAICT we build
|
|
3905
|
+
// these and bind them to rooted things so immediately that this just is not
|
|
3906
|
+
// needed.
|
|
3907
|
+
|
|
3908
|
+
#define AUTO_MARK_JSVAL_HELPER2(tok, line) tok##line
|
|
3909
|
+
#define AUTO_MARK_JSVAL_HELPER(tok, line) AUTO_MARK_JSVAL_HELPER2(tok, line)
|
|
3910
|
+
|
|
3911
|
+
#define AUTO_MARK_JSVAL(ccx, val) \
|
|
3912
|
+
XPCMarkableJSVal AUTO_MARK_JSVAL_HELPER(_val_,__LINE__)(val); \
|
|
3913
|
+
AutoMarkingJSVal AUTO_MARK_JSVAL_HELPER(_automarker_,__LINE__) \
|
|
3914
|
+
(ccx, &AUTO_MARK_JSVAL_HELPER(_val_,__LINE__))
|
|
3915
|
+
|
|
3916
|
+
#ifdef XPC_USE_SECURITY_CHECKED_COMPONENT
|
|
3917
|
+
/***************************************************************************/
|
|
3918
|
+
// Allocates a string that grants all access ("AllAccess")
|
|
3919
|
+
|
|
3920
|
+
extern char* xpc_CloneAllAccess();
|
|
3921
|
+
/***************************************************************************/
|
|
3922
|
+
// Returns access if wideName is in list
|
|
3923
|
+
|
|
3924
|
+
extern char * xpc_CheckAccessList(const PRUnichar* wideName, const char* list[]);
|
|
3925
|
+
#endif
|
|
3926
|
+
|
|
3927
|
+
/***************************************************************************/
|
|
3928
|
+
// in xpcvariant.cpp...
|
|
3929
|
+
|
|
3930
|
+
// {1809FD50-91E8-11d5-90F9-0010A4E73D9A}
|
|
3931
|
+
#define XPCVARIANT_IID \
|
|
3932
|
+
{0x1809fd50, 0x91e8, 0x11d5, \
|
|
3933
|
+
{ 0x90, 0xf9, 0x0, 0x10, 0xa4, 0xe7, 0x3d, 0x9a } }
|
|
3934
|
+
|
|
3935
|
+
class XPCVariant : public nsIVariant
|
|
3936
|
+
{
|
|
3937
|
+
public:
|
|
3938
|
+
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
|
3939
|
+
NS_DECL_NSIVARIANT
|
|
3940
|
+
NS_DECL_CYCLE_COLLECTION_CLASS(XPCVariant)
|
|
3941
|
+
|
|
3942
|
+
// If this class ever implements nsIWritableVariant, take special care with
|
|
3943
|
+
// the case when mJSVal is JSVAL_STRING, since we don't own the data in
|
|
3944
|
+
// that case.
|
|
3945
|
+
|
|
3946
|
+
// We #define and iid so that out module local code can use QI to detect
|
|
3947
|
+
// if a given nsIVariant is in fact an XPCVariant.
|
|
3948
|
+
NS_DECLARE_STATIC_IID_ACCESSOR(XPCVARIANT_IID)
|
|
3949
|
+
|
|
3950
|
+
static XPCVariant* newVariant(XPCCallContext& ccx, jsval aJSVal);
|
|
3951
|
+
|
|
3952
|
+
jsval GetJSVal() const {return mJSVal;}
|
|
3953
|
+
|
|
3954
|
+
XPCVariant(XPCCallContext& ccx, jsval aJSVal);
|
|
3955
|
+
|
|
3956
|
+
/**
|
|
3957
|
+
* Convert a variant into a jsval.
|
|
3958
|
+
*
|
|
3959
|
+
* @param ccx the context for the whole procedure
|
|
3960
|
+
* @param variant the variant to convert
|
|
3961
|
+
* @param scope the default scope to put on the new JSObject's __parent__
|
|
3962
|
+
* chain
|
|
3963
|
+
* @param pErr [out] relevant error code, if any.
|
|
3964
|
+
* @param pJSVal [out] the resulting jsval.
|
|
3965
|
+
*/
|
|
3966
|
+
static JSBool VariantDataToJS(XPCCallContext& ccx,
|
|
3967
|
+
nsIVariant* variant,
|
|
3968
|
+
JSObject* scope, nsresult* pErr,
|
|
3969
|
+
jsval* pJSVal);
|
|
3970
|
+
|
|
3971
|
+
protected:
|
|
3972
|
+
virtual ~XPCVariant() { }
|
|
3973
|
+
|
|
3974
|
+
JSBool InitializeData(XPCCallContext& ccx);
|
|
3975
|
+
|
|
3976
|
+
protected:
|
|
3977
|
+
nsDiscriminatedUnion mData;
|
|
3978
|
+
jsval mJSVal;
|
|
3979
|
+
JSBool mReturnRawObject;
|
|
3980
|
+
};
|
|
3981
|
+
|
|
3982
|
+
NS_DEFINE_STATIC_IID_ACCESSOR(XPCVariant, XPCVARIANT_IID)
|
|
3983
|
+
|
|
3984
|
+
class XPCTraceableVariant: public XPCVariant,
|
|
3985
|
+
public XPCRootSetElem
|
|
3986
|
+
{
|
|
3987
|
+
public:
|
|
3988
|
+
XPCTraceableVariant(XPCCallContext& ccx, jsval aJSVal)
|
|
3989
|
+
: XPCVariant(ccx, aJSVal)
|
|
3990
|
+
{
|
|
3991
|
+
ccx.GetRuntime()->AddVariantRoot(this);
|
|
3992
|
+
}
|
|
3993
|
+
|
|
3994
|
+
virtual ~XPCTraceableVariant();
|
|
3995
|
+
|
|
3996
|
+
void TraceJS(JSTracer* trc);
|
|
3997
|
+
#ifdef DEBUG
|
|
3998
|
+
static void PrintTraceName(JSTracer* trc, char *buf, size_t bufsize);
|
|
3999
|
+
#endif
|
|
4000
|
+
};
|
|
4001
|
+
|
|
4002
|
+
/***************************************************************************/
|
|
4003
|
+
#ifndef XPCONNECT_STANDALONE
|
|
4004
|
+
|
|
4005
|
+
#define PRINCIPALHOLDER_IID \
|
|
4006
|
+
{0xbf109f49, 0xf94a, 0x43d8, {0x93, 0xdb, 0xe4, 0x66, 0x49, 0xc5, 0xd9, 0x7d}}
|
|
4007
|
+
|
|
4008
|
+
class PrincipalHolder : public nsIScriptObjectPrincipal
|
|
4009
|
+
{
|
|
4010
|
+
public:
|
|
4011
|
+
NS_DECLARE_STATIC_IID_ACCESSOR(PRINCIPALHOLDER_IID)
|
|
4012
|
+
|
|
4013
|
+
PrincipalHolder(nsIPrincipal *holdee)
|
|
4014
|
+
: mHoldee(holdee)
|
|
4015
|
+
{
|
|
4016
|
+
}
|
|
4017
|
+
virtual ~PrincipalHolder() { }
|
|
4018
|
+
|
|
4019
|
+
NS_DECL_ISUPPORTS
|
|
4020
|
+
|
|
4021
|
+
nsIPrincipal *GetPrincipal();
|
|
4022
|
+
|
|
4023
|
+
private:
|
|
4024
|
+
nsCOMPtr<nsIPrincipal> mHoldee;
|
|
4025
|
+
};
|
|
4026
|
+
|
|
4027
|
+
NS_DEFINE_STATIC_IID_ACCESSOR(PrincipalHolder, PRINCIPALHOLDER_IID)
|
|
4028
|
+
|
|
4029
|
+
#endif /* !XPCONNECT_STANDALONE */
|
|
4030
|
+
|
|
4031
|
+
/***************************************************************************/
|
|
4032
|
+
// Utilities
|
|
4033
|
+
|
|
4034
|
+
inline void *
|
|
4035
|
+
xpc_GetJSPrivate(JSObject *obj)
|
|
4036
|
+
{
|
|
4037
|
+
jsval v;
|
|
4038
|
+
|
|
4039
|
+
JS_ASSERT(STOBJ_GET_CLASS(obj)->flags & JSCLASS_HAS_PRIVATE);
|
|
4040
|
+
v = obj->fslots[JSSLOT_PRIVATE];
|
|
4041
|
+
if (!JSVAL_IS_INT(v))
|
|
4042
|
+
return NULL;
|
|
4043
|
+
return JSVAL_TO_PRIVATE(v);
|
|
4044
|
+
}
|
|
4045
|
+
|
|
4046
|
+
#ifndef XPCONNECT_STANDALONE
|
|
4047
|
+
|
|
4048
|
+
// Helper for creating a sandbox object to use for evaluating
|
|
4049
|
+
// untrusted code completely separated from all other code in the
|
|
4050
|
+
// system using xpc_EvalInSandbox(). Takes the JSContext on which to
|
|
4051
|
+
// do setup etc on, puts the sandbox object in *vp (which must be
|
|
4052
|
+
// rooted by the caller), and uses the principal that's either
|
|
4053
|
+
// directly passed in prinOrSop or indirectly as an
|
|
4054
|
+
// nsIScriptObjectPrincipal holding the principal. If no principal is
|
|
4055
|
+
// reachable through prinOrSop, a new null principal will be created
|
|
4056
|
+
// and used.
|
|
4057
|
+
nsresult
|
|
4058
|
+
xpc_CreateSandboxObject(JSContext * cx, jsval * vp, nsISupports *prinOrSop);
|
|
4059
|
+
|
|
4060
|
+
// Helper for evaluating scripts in a sandbox object created with
|
|
4061
|
+
// xpc_CreateSandboxObject(). The caller is responsible of ensuring
|
|
4062
|
+
// that *rval doesn't get collected during the call or usage after the
|
|
4063
|
+
// call. This helper will use filename and lineNo for error reporting,
|
|
4064
|
+
// and if no filename is provided it will use the codebase from the
|
|
4065
|
+
// principal and line number 1 as a fallback. if returnStringOnly is
|
|
4066
|
+
// true, then the result in *rval, or the exception in cx->exception
|
|
4067
|
+
// will be coerced into strings. If an exception is thrown converting
|
|
4068
|
+
// an exception to a string, evalInSandbox will return an NS_ERROR_*
|
|
4069
|
+
// result, and cx->exception will be empty.
|
|
4070
|
+
nsresult
|
|
4071
|
+
xpc_EvalInSandbox(JSContext *cx, JSObject *sandbox, const nsAString& source,
|
|
4072
|
+
const char *filename, PRInt32 lineNo,
|
|
4073
|
+
JSVersion jsVersion, PRBool returnStringOnly, jsval *rval);
|
|
4074
|
+
#endif /* !XPCONNECT_STANDALONE */
|
|
4075
|
+
|
|
4076
|
+
/***************************************************************************/
|
|
4077
|
+
// Inlined utilities.
|
|
4078
|
+
|
|
4079
|
+
inline JSBool
|
|
4080
|
+
xpc_ForcePropertyResolve(JSContext* cx, JSObject* obj, jsval idval);
|
|
4081
|
+
|
|
4082
|
+
inline jsval
|
|
4083
|
+
GetRTStringByIndex(JSContext *cx, uintN index);
|
|
4084
|
+
|
|
4085
|
+
// Wrapper for JS_NewObject to mark the new object as system when parent is
|
|
4086
|
+
// also a system object.
|
|
4087
|
+
inline JSObject*
|
|
4088
|
+
xpc_NewSystemInheritingJSObject(JSContext *cx, JSClass *clasp, JSObject *proto,
|
|
4089
|
+
JSObject *parent);
|
|
4090
|
+
|
|
4091
|
+
inline JSBool
|
|
4092
|
+
xpc_SameScope(XPCWrappedNativeScope *objectscope,
|
|
4093
|
+
XPCWrappedNativeScope *xpcscope,
|
|
4094
|
+
JSBool *sameOrigin);
|
|
4095
|
+
|
|
4096
|
+
nsISupports *
|
|
4097
|
+
XPC_GetIdentityObject(JSContext *cx, JSObject *obj);
|
|
4098
|
+
|
|
4099
|
+
PRBool
|
|
4100
|
+
IsXPCSafeJSObjectWrapperClass(JSClass *clazz);
|
|
4101
|
+
|
|
4102
|
+
JSObject *
|
|
4103
|
+
XPC_SJOW_GetUnsafeObject(JSObject *obj);
|
|
4104
|
+
|
|
4105
|
+
JSBool
|
|
4106
|
+
XPC_SJOW_Construct(JSContext *cx, JSObject *obj, uintN, jsval *argv,
|
|
4107
|
+
jsval *rval);
|
|
4108
|
+
|
|
4109
|
+
PRBool
|
|
4110
|
+
XPC_SJOW_AttachNewConstructorObject(XPCCallContext &ccx,
|
|
4111
|
+
JSObject *aGlobalObject);
|
|
4112
|
+
|
|
4113
|
+
JSBool
|
|
4114
|
+
XPC_XOW_WrapObject(JSContext *cx, JSObject *parent, jsval *vp,
|
|
4115
|
+
XPCWrappedNative *wn = nsnull);
|
|
4116
|
+
|
|
4117
|
+
JSBool
|
|
4118
|
+
XPC_SOW_WrapObject(JSContext *cx, JSObject *parent, jsval v,
|
|
4119
|
+
jsval *vp);
|
|
4120
|
+
|
|
4121
|
+
#ifdef XPC_IDISPATCH_SUPPORT
|
|
4122
|
+
// IDispatch specific classes
|
|
4123
|
+
#include "XPCDispPrivate.h"
|
|
4124
|
+
#endif
|
|
4125
|
+
|
|
4126
|
+
/***************************************************************************/
|
|
4127
|
+
// Inlines use the above - include last.
|
|
4128
|
+
|
|
4129
|
+
#include "xpcinlines.h"
|
|
4130
|
+
|
|
4131
|
+
/***************************************************************************/
|
|
4132
|
+
// Maps have inlines that use the above - include last.
|
|
4133
|
+
|
|
4134
|
+
#include "xpcmaps.h"
|
|
4135
|
+
|
|
4136
|
+
/***************************************************************************/
|
|
4137
|
+
|
|
4138
|
+
#endif /* xpcprivate_h___ */
|