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