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,88 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
2
|
+
/* ***** BEGIN LICENSE BLOCK *****
|
|
3
|
+
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
4
|
+
*
|
|
5
|
+
* The contents of this file are subject to the Mozilla Public License Version
|
|
6
|
+
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
7
|
+
* the License. You may obtain a copy of the License at
|
|
8
|
+
* http://www.mozilla.org/MPL/
|
|
9
|
+
*
|
|
10
|
+
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
11
|
+
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
12
|
+
* for the specific language governing rights and limitations under the
|
|
13
|
+
* License.
|
|
14
|
+
*
|
|
15
|
+
* The Original Code is mozilla.org code.
|
|
16
|
+
*
|
|
17
|
+
* The Initial Developer of the Original Code is
|
|
18
|
+
* The Mozilla Foundation.
|
|
19
|
+
* Portions created by the Initial Developer are Copyright (C) 2005
|
|
20
|
+
* the Initial Developer. All Rights Reserved.
|
|
21
|
+
*
|
|
22
|
+
* Contributor(s):
|
|
23
|
+
* Johnny Stenback <jst@mozilla.org> (original author)
|
|
24
|
+
* Brendan Eich <brendan@mozilla.org>
|
|
25
|
+
*
|
|
26
|
+
* Alternatively, the contents of this file may be used under the terms of
|
|
27
|
+
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
28
|
+
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
29
|
+
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
30
|
+
* of those above. If you wish to allow use of your version of this file only
|
|
31
|
+
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
32
|
+
* use your version of this file under the terms of the MPL, indicate your
|
|
33
|
+
* decision by deleting the provisions above and replace them with the notice
|
|
34
|
+
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
35
|
+
* the provisions above, a recipient may use your version of this file under
|
|
36
|
+
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
37
|
+
*
|
|
38
|
+
* ***** END LICENSE BLOCK ***** */
|
|
39
|
+
|
|
40
|
+
#include "nscore.h"
|
|
41
|
+
#include "jsapi.h"
|
|
42
|
+
|
|
43
|
+
class nsIPrincipal;
|
|
44
|
+
|
|
45
|
+
class XPCNativeWrapper
|
|
46
|
+
{
|
|
47
|
+
public:
|
|
48
|
+
static PRBool AttachNewConstructorObject(XPCCallContext &ccx,
|
|
49
|
+
JSObject *aGlobalObject);
|
|
50
|
+
|
|
51
|
+
static JSObject *GetNewOrUsed(JSContext *cx, XPCWrappedNative *wrapper,
|
|
52
|
+
nsIPrincipal *aObjectPrincipal);
|
|
53
|
+
|
|
54
|
+
static PRBool IsNativeWrapperClass(JSClass *clazz)
|
|
55
|
+
{
|
|
56
|
+
return clazz == &sXPC_NW_JSClass.base;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
static PRBool IsNativeWrapper(JSObject *obj)
|
|
60
|
+
{
|
|
61
|
+
return STOBJ_GET_CLASS(obj) == &sXPC_NW_JSClass.base;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
static JSBool GetWrappedNative(JSContext *cx, JSObject *obj,
|
|
65
|
+
XPCWrappedNative **aWrappedNative);
|
|
66
|
+
|
|
67
|
+
// NB: Use the following carefully.
|
|
68
|
+
static XPCWrappedNative *SafeGetWrappedNative(JSObject *obj)
|
|
69
|
+
{
|
|
70
|
+
return static_cast<XPCWrappedNative *>(xpc_GetJSPrivate(obj));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
static JSClass *GetJSClass()
|
|
75
|
+
{
|
|
76
|
+
return &sXPC_NW_JSClass.base;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
static void ClearWrappedNativeScopes(JSContext* cx,
|
|
80
|
+
XPCWrappedNative* wrapper);
|
|
81
|
+
|
|
82
|
+
protected:
|
|
83
|
+
static JSExtendedClass sXPC_NW_JSClass;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
JSBool
|
|
87
|
+
XPC_XOW_WrapObject(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
|
|
88
|
+
jsval *rval);
|
|
@@ -0,0 +1,1148 @@
|
|
|
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) 2006
|
|
21
|
+
* the Initial Developer. All Rights Reserved.
|
|
22
|
+
*
|
|
23
|
+
* Contributor(s):
|
|
24
|
+
* Johnny Stenback <jst@mozilla.org> (original author)
|
|
25
|
+
*
|
|
26
|
+
* Alternatively, the contents of this file may be used under the terms of
|
|
27
|
+
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
28
|
+
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
29
|
+
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
30
|
+
* of those above. If you wish to allow use of your version of this file only
|
|
31
|
+
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
32
|
+
* use your version of this file under the terms of the MPL, indicate your
|
|
33
|
+
* decision by deleting the provisions above and replace them with the notice
|
|
34
|
+
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
35
|
+
* the provisions above, a recipient may use your version of this file under
|
|
36
|
+
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
37
|
+
*
|
|
38
|
+
* ***** END LICENSE BLOCK ***** */
|
|
39
|
+
|
|
40
|
+
#include "xpcprivate.h"
|
|
41
|
+
#include "jsdbgapi.h"
|
|
42
|
+
#include "jsscript.h" // for js_ScriptClass
|
|
43
|
+
#include "XPCWrapper.h"
|
|
44
|
+
#include "jsregexp.h"
|
|
45
|
+
|
|
46
|
+
static JSBool
|
|
47
|
+
XPC_SJOW_AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
|
|
48
|
+
|
|
49
|
+
static JSBool
|
|
50
|
+
XPC_SJOW_DelProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
|
|
51
|
+
|
|
52
|
+
static JSBool
|
|
53
|
+
XPC_SJOW_GetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
|
|
54
|
+
|
|
55
|
+
static JSBool
|
|
56
|
+
XPC_SJOW_SetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
|
|
57
|
+
|
|
58
|
+
static JSBool
|
|
59
|
+
XPC_SJOW_Enumerate(JSContext *cx, JSObject *obj);
|
|
60
|
+
|
|
61
|
+
static JSBool
|
|
62
|
+
XPC_SJOW_NewResolve(JSContext *cx, JSObject *obj, jsval id, uintN flags,
|
|
63
|
+
JSObject **objp);
|
|
64
|
+
|
|
65
|
+
static JSBool
|
|
66
|
+
XPC_SJOW_Convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp);
|
|
67
|
+
|
|
68
|
+
static void
|
|
69
|
+
XPC_SJOW_Finalize(JSContext *cx, JSObject *obj);
|
|
70
|
+
|
|
71
|
+
static JSBool
|
|
72
|
+
XPC_SJOW_CheckAccess(JSContext *cx, JSObject *obj, jsval id, JSAccessMode mode,
|
|
73
|
+
jsval *vp);
|
|
74
|
+
|
|
75
|
+
static JSBool
|
|
76
|
+
XPC_SJOW_Call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
|
|
77
|
+
jsval *rval);
|
|
78
|
+
|
|
79
|
+
JSBool
|
|
80
|
+
XPC_SJOW_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
|
|
81
|
+
jsval *rval);
|
|
82
|
+
|
|
83
|
+
static JSBool
|
|
84
|
+
XPC_SJOW_Create(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
|
|
85
|
+
jsval *rval);
|
|
86
|
+
|
|
87
|
+
static JSBool
|
|
88
|
+
XPC_SJOW_Equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp);
|
|
89
|
+
|
|
90
|
+
static JSObject *
|
|
91
|
+
XPC_SJOW_Iterator(JSContext *cx, JSObject *obj, JSBool keysonly);
|
|
92
|
+
|
|
93
|
+
static JSObject *
|
|
94
|
+
XPC_SJOW_WrappedObject(JSContext *cx, JSObject *obj);
|
|
95
|
+
|
|
96
|
+
static inline
|
|
97
|
+
JSBool
|
|
98
|
+
ThrowException(nsresult ex, JSContext *cx)
|
|
99
|
+
{
|
|
100
|
+
XPCThrower::Throw(ex, cx);
|
|
101
|
+
|
|
102
|
+
return JS_FALSE;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Find the subject and object principal. The argument
|
|
106
|
+
// subjectPrincipal can be null if the caller doesn't care about the
|
|
107
|
+
// subject principal, and secMgr can also be null if the caller
|
|
108
|
+
// doesn't need the security manager.
|
|
109
|
+
static nsresult
|
|
110
|
+
FindPrincipals(JSContext *cx, JSObject *obj, nsIPrincipal **objectPrincipal,
|
|
111
|
+
nsIPrincipal **subjectPrincipal,
|
|
112
|
+
nsIScriptSecurityManager **secMgr)
|
|
113
|
+
{
|
|
114
|
+
XPCCallContext ccx(JS_CALLER, cx);
|
|
115
|
+
|
|
116
|
+
if (!ccx.IsValid()) {
|
|
117
|
+
return NS_ERROR_UNEXPECTED;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
nsIScriptSecurityManager *ssm = XPCWrapper::GetSecurityManager();
|
|
121
|
+
|
|
122
|
+
if (subjectPrincipal) {
|
|
123
|
+
NS_IF_ADDREF(*subjectPrincipal = ssm->GetCxSubjectPrincipal(cx));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
ssm->GetObjectPrincipal(cx, obj, objectPrincipal);
|
|
127
|
+
|
|
128
|
+
if (secMgr) {
|
|
129
|
+
NS_ADDREF(*secMgr = ssm);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return *objectPrincipal ? NS_OK : NS_ERROR_XPC_SECURITY_MANAGER_VETO;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
static PRBool
|
|
136
|
+
CanCallerAccess(JSContext *cx, JSObject *unsafeObj)
|
|
137
|
+
{
|
|
138
|
+
nsCOMPtr<nsIPrincipal> subjPrincipal, objPrincipal;
|
|
139
|
+
nsCOMPtr<nsIScriptSecurityManager> ssm;
|
|
140
|
+
nsresult rv = FindPrincipals(cx, unsafeObj, getter_AddRefs(objPrincipal),
|
|
141
|
+
getter_AddRefs(subjPrincipal),
|
|
142
|
+
getter_AddRefs(ssm));
|
|
143
|
+
if (NS_FAILED(rv)) {
|
|
144
|
+
return ThrowException(rv, cx);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Assume that we're trusted if there's no running code.
|
|
148
|
+
if (!subjPrincipal) {
|
|
149
|
+
return PR_TRUE;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
PRBool subsumes;
|
|
153
|
+
rv = subjPrincipal->Subsumes(objPrincipal, &subsumes);
|
|
154
|
+
|
|
155
|
+
if (NS_FAILED(rv) || !subsumes) {
|
|
156
|
+
PRBool enabled = PR_FALSE;
|
|
157
|
+
rv = ssm->IsCapabilityEnabled("UniversalXPConnect", &enabled);
|
|
158
|
+
if (NS_FAILED(rv)) {
|
|
159
|
+
return ThrowException(rv, cx);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (!enabled) {
|
|
163
|
+
return ThrowException(NS_ERROR_XPC_SECURITY_MANAGER_VETO, cx);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return PR_TRUE;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
static JSPrincipals *
|
|
171
|
+
FindObjectPrincipals(JSContext *cx, JSObject *obj)
|
|
172
|
+
{
|
|
173
|
+
nsCOMPtr<nsIPrincipal> objPrincipal;
|
|
174
|
+
nsresult rv = FindPrincipals(cx, obj, getter_AddRefs(objPrincipal), nsnull,
|
|
175
|
+
nsnull);
|
|
176
|
+
if (NS_FAILED(rv)) {
|
|
177
|
+
return nsnull;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
JSPrincipals *jsprin;
|
|
181
|
+
rv = objPrincipal->GetJSPrincipals(cx, &jsprin);
|
|
182
|
+
if (NS_FAILED(rv)) {
|
|
183
|
+
return nsnull;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return jsprin;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
// JS class for XPCSafeJSObjectWrapper (and this doubles as the
|
|
191
|
+
// constructor for XPCSafeJSObjectWrapper for the moment too...)
|
|
192
|
+
|
|
193
|
+
JSExtendedClass sXPC_SJOW_JSClass = {
|
|
194
|
+
// JSClass (JSExtendedClass.base) initialization
|
|
195
|
+
{ "XPCSafeJSObjectWrapper",
|
|
196
|
+
JSCLASS_NEW_RESOLVE | JSCLASS_IS_EXTENDED |
|
|
197
|
+
JSCLASS_HAS_RESERVED_SLOTS(XPCWrapper::sNumSlots + 3),
|
|
198
|
+
XPC_SJOW_AddProperty, XPC_SJOW_DelProperty,
|
|
199
|
+
XPC_SJOW_GetProperty, XPC_SJOW_SetProperty,
|
|
200
|
+
XPC_SJOW_Enumerate, (JSResolveOp)XPC_SJOW_NewResolve,
|
|
201
|
+
XPC_SJOW_Convert, XPC_SJOW_Finalize,
|
|
202
|
+
nsnull, XPC_SJOW_CheckAccess,
|
|
203
|
+
XPC_SJOW_Call, XPC_SJOW_Create,
|
|
204
|
+
nsnull, nsnull,
|
|
205
|
+
nsnull, nsnull
|
|
206
|
+
},
|
|
207
|
+
// JSExtendedClass initialization
|
|
208
|
+
XPC_SJOW_Equality,
|
|
209
|
+
nsnull, // outerObject
|
|
210
|
+
nsnull, // innerObject
|
|
211
|
+
XPC_SJOW_Iterator,
|
|
212
|
+
XPC_SJOW_WrappedObject,
|
|
213
|
+
JSCLASS_NO_RESERVED_MEMBERS
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
static JSBool
|
|
217
|
+
XPC_SJOW_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
|
|
218
|
+
jsval *rval);
|
|
219
|
+
|
|
220
|
+
// Reserved slot indexes on safe wrappers.
|
|
221
|
+
|
|
222
|
+
// Boolean value, initialized to false on object creation and true
|
|
223
|
+
// only while we're resolving a property on the object.
|
|
224
|
+
#define XPC_SJOW_SLOT_IS_RESOLVING 0
|
|
225
|
+
|
|
226
|
+
// Slot for caching a compiled scripted function for property
|
|
227
|
+
// get/set.
|
|
228
|
+
#define XPC_SJOW_SLOT_SCRIPTED_GETSET 1
|
|
229
|
+
|
|
230
|
+
// Slot for caching a compiled scripted function for function
|
|
231
|
+
// calling.
|
|
232
|
+
#define XPC_SJOW_SLOT_SCRIPTED_FUN 2
|
|
233
|
+
|
|
234
|
+
// Slot for caching a compiled scripted function for calling
|
|
235
|
+
// toString().
|
|
236
|
+
#define XPC_SJOW_SLOT_SCRIPTED_TOSTRING 3
|
|
237
|
+
|
|
238
|
+
// Slot for holding on to the principal to use if a principal other
|
|
239
|
+
// than that of the unsafe object is desired for this wrapper
|
|
240
|
+
// (nsIPrincipal, strong reference).
|
|
241
|
+
#define XPC_SJOW_SLOT_PRINCIPAL 4
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
// Wrap a JS value in a safe wrapper of a function wrapper if
|
|
245
|
+
// needed. Note that rval must point to something rooted when calling
|
|
246
|
+
// this function.
|
|
247
|
+
static JSBool
|
|
248
|
+
WrapJSValue(JSContext *cx, JSObject *obj, jsval val, jsval *rval)
|
|
249
|
+
{
|
|
250
|
+
JSBool ok = JS_TRUE;
|
|
251
|
+
|
|
252
|
+
if (JSVAL_IS_PRIMITIVE(val)) {
|
|
253
|
+
*rval = val;
|
|
254
|
+
} else {
|
|
255
|
+
// Construct a new safe wrapper. Note that it doesn't matter what
|
|
256
|
+
// parent we pass in here, the construct hook will ensure we get
|
|
257
|
+
// the right parent for the wrapper.
|
|
258
|
+
JSObject *safeObj =
|
|
259
|
+
::JS_ConstructObjectWithArguments(cx, &sXPC_SJOW_JSClass.base, nsnull,
|
|
260
|
+
nsnull, 1, &val);
|
|
261
|
+
if (!safeObj) {
|
|
262
|
+
return JS_FALSE;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Set *rval to safeObj here to ensure it doesn't get collected in
|
|
266
|
+
// any of the code below.
|
|
267
|
+
*rval = OBJECT_TO_JSVAL(safeObj);
|
|
268
|
+
|
|
269
|
+
// If obj and safeObj are from the same scope, propagate cached
|
|
270
|
+
// scripted functions to the new safe object.
|
|
271
|
+
if (JS_GetGlobalForObject(cx, obj) == JS_GetGlobalForObject(cx, safeObj)) {
|
|
272
|
+
jsval rsval;
|
|
273
|
+
if (!::JS_GetReservedSlot(cx, obj, XPC_SJOW_SLOT_SCRIPTED_GETSET,
|
|
274
|
+
&rsval) ||
|
|
275
|
+
!::JS_SetReservedSlot(cx, safeObj, XPC_SJOW_SLOT_SCRIPTED_GETSET,
|
|
276
|
+
rsval) ||
|
|
277
|
+
!::JS_GetReservedSlot(cx, obj, XPC_SJOW_SLOT_SCRIPTED_FUN,
|
|
278
|
+
&rsval) ||
|
|
279
|
+
!::JS_SetReservedSlot(cx, safeObj, XPC_SJOW_SLOT_SCRIPTED_FUN,
|
|
280
|
+
rsval)) {
|
|
281
|
+
return JS_FALSE;
|
|
282
|
+
}
|
|
283
|
+
} else {
|
|
284
|
+
// Check to see if the new object we just wrapped is accessible
|
|
285
|
+
// from the unsafe object we got the new object through. If not,
|
|
286
|
+
// force the new wrapper to use the principal of the unsafe
|
|
287
|
+
// object we got the new object from.
|
|
288
|
+
nsCOMPtr<nsIPrincipal> srcObjPrincipal;
|
|
289
|
+
nsCOMPtr<nsIPrincipal> subjPrincipal;
|
|
290
|
+
nsCOMPtr<nsIPrincipal> valObjPrincipal;
|
|
291
|
+
|
|
292
|
+
nsresult rv = FindPrincipals(cx, obj, getter_AddRefs(srcObjPrincipal),
|
|
293
|
+
getter_AddRefs(subjPrincipal), nsnull);
|
|
294
|
+
if (NS_FAILED(rv)) {
|
|
295
|
+
return ThrowException(rv, cx);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
rv = FindPrincipals(cx, JSVAL_TO_OBJECT(val),
|
|
299
|
+
getter_AddRefs(valObjPrincipal), nsnull, nsnull);
|
|
300
|
+
if (NS_FAILED(rv)) {
|
|
301
|
+
return ThrowException(rv, cx);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
PRBool subsumes = PR_FALSE;
|
|
305
|
+
rv = srcObjPrincipal->Subsumes(valObjPrincipal, &subsumes);
|
|
306
|
+
if (NS_FAILED(rv)) {
|
|
307
|
+
return ThrowException(rv, cx);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// If the subject can access both the source and object principals, then
|
|
311
|
+
// don't bother forcing the principal below.
|
|
312
|
+
if (!subsumes && subjPrincipal) {
|
|
313
|
+
PRBool subjSubsumes = PR_FALSE;
|
|
314
|
+
rv = subjPrincipal->Subsumes(srcObjPrincipal, &subjSubsumes);
|
|
315
|
+
if (NS_SUCCEEDED(rv) && subjSubsumes) {
|
|
316
|
+
rv = subjPrincipal->Subsumes(valObjPrincipal, &subjSubsumes);
|
|
317
|
+
if (NS_SUCCEEDED(rv) && subjSubsumes) {
|
|
318
|
+
subsumes = PR_TRUE;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if (!subsumes) {
|
|
324
|
+
// The unsafe object we got the new object from can not access
|
|
325
|
+
// the new object, force the wrapper we just created to use
|
|
326
|
+
// the principal of the unsafe object to prevent users of the
|
|
327
|
+
// new object wrapper from evaluating code through the new
|
|
328
|
+
// wrapper with the principal of the new object.
|
|
329
|
+
if (!::JS_SetReservedSlot(cx, safeObj, XPC_SJOW_SLOT_PRINCIPAL,
|
|
330
|
+
PRIVATE_TO_JSVAL(srcObjPrincipal.get()))) {
|
|
331
|
+
return JS_FALSE;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Pass on ownership of the new object principal to the
|
|
335
|
+
// wrapper.
|
|
336
|
+
nsIPrincipal *tmp = nsnull;
|
|
337
|
+
srcObjPrincipal.swap(tmp);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
return ok;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
static inline JSObject *
|
|
346
|
+
FindSafeObject(JSObject *obj)
|
|
347
|
+
{
|
|
348
|
+
while (STOBJ_GET_CLASS(obj) != &sXPC_SJOW_JSClass.base) {
|
|
349
|
+
obj = STOBJ_GET_PROTO(obj);
|
|
350
|
+
|
|
351
|
+
if (!obj) {
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
return obj;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
PRBool
|
|
360
|
+
IsXPCSafeJSObjectWrapperClass(JSClass *clazz)
|
|
361
|
+
{
|
|
362
|
+
return clazz == &sXPC_SJOW_JSClass.base;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
static inline JSObject *
|
|
366
|
+
GetUnsafeObject(JSObject *obj)
|
|
367
|
+
{
|
|
368
|
+
obj = FindSafeObject(obj);
|
|
369
|
+
|
|
370
|
+
if (!obj) {
|
|
371
|
+
return nsnull;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
return STOBJ_GET_PARENT(obj);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
JSObject *
|
|
378
|
+
XPC_SJOW_GetUnsafeObject(JSObject *obj)
|
|
379
|
+
{
|
|
380
|
+
return GetUnsafeObject(obj);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
static jsval
|
|
384
|
+
UnwrapJSValue(jsval val)
|
|
385
|
+
{
|
|
386
|
+
if (JSVAL_IS_PRIMITIVE(val)) {
|
|
387
|
+
return val;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
JSObject *unsafeObj = GetUnsafeObject(JSVAL_TO_OBJECT(val));
|
|
391
|
+
if (unsafeObj) {
|
|
392
|
+
return OBJECT_TO_JSVAL(unsafeObj);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
return val;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// Get a scripted function for use with the safe wrapper (obj) when
|
|
399
|
+
// accessing an unsafe object (unsafeObj). If a scripted function
|
|
400
|
+
// already exists in the reserved slot slotIndex, use it, otherwise
|
|
401
|
+
// create a new one and cache it in that same slot. The source of the
|
|
402
|
+
// script is passed in funScript, and the resulting (new or cached)
|
|
403
|
+
// scripted function is returned through scriptedFunVal.
|
|
404
|
+
static JSBool
|
|
405
|
+
GetScriptedFunction(JSContext *cx, JSObject *obj, JSObject *unsafeObj,
|
|
406
|
+
uint32 slotIndex, const nsAFlatCString& funScript,
|
|
407
|
+
jsval *scriptedFunVal)
|
|
408
|
+
{
|
|
409
|
+
if (!::JS_GetReservedSlot(cx, obj, slotIndex, scriptedFunVal)) {
|
|
410
|
+
return JS_FALSE;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// If we either have no scripted function in the requested slot yet,
|
|
414
|
+
// or if the scope of the unsafeObj changed since we compiled the
|
|
415
|
+
// scripted function, re-compile to make sure the scripted function
|
|
416
|
+
// is properly scoped etc.
|
|
417
|
+
if (JSVAL_IS_VOID(*scriptedFunVal) ||
|
|
418
|
+
JS_GetGlobalForObject(cx, unsafeObj) !=
|
|
419
|
+
JS_GetGlobalForObject(cx, JSVAL_TO_OBJECT(*scriptedFunVal))) {
|
|
420
|
+
// Check whether we have a cached principal or not.
|
|
421
|
+
jsval pv;
|
|
422
|
+
if (!::JS_GetReservedSlot(cx, obj, XPC_SJOW_SLOT_PRINCIPAL, &pv)) {
|
|
423
|
+
return JS_FALSE;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
JSPrincipals *jsprin = nsnull;
|
|
427
|
+
|
|
428
|
+
if (!JSVAL_IS_VOID(pv)) {
|
|
429
|
+
nsIPrincipal *principal = (nsIPrincipal *)JSVAL_TO_PRIVATE(pv);
|
|
430
|
+
|
|
431
|
+
// Found a cached principal, use it rather than looking up the
|
|
432
|
+
// principal of the unsafe object.
|
|
433
|
+
principal->GetJSPrincipals(cx, &jsprin);
|
|
434
|
+
} else {
|
|
435
|
+
// No cached principal found, look up the principal based on the
|
|
436
|
+
// unsafe object.
|
|
437
|
+
jsprin = FindObjectPrincipals(cx, unsafeObj);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
if (!jsprin) {
|
|
441
|
+
return ThrowException(NS_ERROR_UNEXPECTED, cx);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
JSFunction *scriptedFun =
|
|
445
|
+
::JS_CompileFunctionForPrincipals(cx,
|
|
446
|
+
JS_GetGlobalForObject(cx, unsafeObj),
|
|
447
|
+
jsprin, nsnull, 0, nsnull,
|
|
448
|
+
funScript.get(), funScript.Length(),
|
|
449
|
+
"XPCSafeJSObjectWrapper.cpp",
|
|
450
|
+
__LINE__);
|
|
451
|
+
|
|
452
|
+
JSPRINCIPALS_DROP(cx, jsprin);
|
|
453
|
+
|
|
454
|
+
if (!scriptedFun) {
|
|
455
|
+
return ThrowException(NS_ERROR_FAILURE, cx);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
*scriptedFunVal = OBJECT_TO_JSVAL(::JS_GetFunctionObject(scriptedFun));
|
|
459
|
+
|
|
460
|
+
if (*scriptedFunVal == JSVAL_NULL ||
|
|
461
|
+
!::JS_SetReservedSlot(cx, obj, slotIndex, *scriptedFunVal)) {
|
|
462
|
+
return JS_FALSE;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
return JS_TRUE;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
static JSBool
|
|
471
|
+
XPC_SJOW_AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
|
|
472
|
+
{
|
|
473
|
+
// The constructor and toString properties needs to live on the safe
|
|
474
|
+
// wrapper.
|
|
475
|
+
if (id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_CONSTRUCTOR) ||
|
|
476
|
+
id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_TO_STRING)) {
|
|
477
|
+
return JS_TRUE;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
obj = FindSafeObject(obj);
|
|
481
|
+
NS_ASSERTION(obj != nsnull, "FindSafeObject() returned null in class hook!");
|
|
482
|
+
|
|
483
|
+
// Do nothing here if we're in the middle of resolving a property on
|
|
484
|
+
// this safe wrapper.
|
|
485
|
+
jsval isResolving;
|
|
486
|
+
JSBool ok = ::JS_GetReservedSlot(cx, obj, XPC_SJOW_SLOT_IS_RESOLVING,
|
|
487
|
+
&isResolving);
|
|
488
|
+
if (!ok || HAS_FLAGS(isResolving, FLAG_RESOLVING)) {
|
|
489
|
+
return ok;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
JSObject *unsafeObj = GetUnsafeObject(obj);
|
|
493
|
+
if (!unsafeObj) {
|
|
494
|
+
return ThrowException(NS_ERROR_UNEXPECTED, cx);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
// Check that the caller can access the unsafe object.
|
|
498
|
+
if (!CanCallerAccess(cx, unsafeObj)) {
|
|
499
|
+
// CanCallerAccess() already threw for us.
|
|
500
|
+
return JS_FALSE;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
return XPCWrapper::AddProperty(cx, obj, JS_FALSE, unsafeObj, id, vp);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
static JSBool
|
|
507
|
+
XPC_SJOW_DelProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
|
|
508
|
+
{
|
|
509
|
+
JSObject *unsafeObj = GetUnsafeObject(obj);
|
|
510
|
+
if (!unsafeObj) {
|
|
511
|
+
return ThrowException(NS_ERROR_UNEXPECTED, cx);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// Check that the caller can access the unsafe object.
|
|
515
|
+
if (!CanCallerAccess(cx, unsafeObj)) {
|
|
516
|
+
// CanCallerAccess() already threw for us.
|
|
517
|
+
return JS_FALSE;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
return XPCWrapper::DelProperty(cx, unsafeObj, id, vp);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
static inline JSBool
|
|
524
|
+
CallWithoutStatics(JSContext *cx, JSObject *obj, jsval fval, uintN argc,
|
|
525
|
+
jsval *argv, jsval *rval)
|
|
526
|
+
{
|
|
527
|
+
JSRegExpStatics statics;
|
|
528
|
+
JSTempValueRooter tvr;
|
|
529
|
+
js_SaveAndClearRegExpStatics(cx, &statics, &tvr);
|
|
530
|
+
JSBool ok = ::JS_CallFunctionValue(cx, obj, fval, argc, argv, rval);
|
|
531
|
+
js_RestoreRegExpStatics(cx, &statics, &tvr);
|
|
532
|
+
return ok;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
// Call wrapper to help with wrapping calls to functions or callable
|
|
536
|
+
// objects in a scripted function (see XPC_SJOW_Call()). The first
|
|
537
|
+
// argument passed to this method is the unsafe function to call, the
|
|
538
|
+
// rest are the arguments to pass to the function we're calling.
|
|
539
|
+
static JSBool
|
|
540
|
+
XPC_SJOW_CallWrapper(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
|
|
541
|
+
jsval *rval)
|
|
542
|
+
{
|
|
543
|
+
// Make sure we've got at least one argument (which may not be the
|
|
544
|
+
// case if someone's monkeying with this function directly from JS).
|
|
545
|
+
if (argc < 1) {
|
|
546
|
+
return ThrowException(NS_ERROR_INVALID_ARG, cx);
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
return CallWithoutStatics(cx, obj, argv[0], argc - 1, argv + 1, rval);
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
static JSBool
|
|
553
|
+
XPC_SJOW_GetOrSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp,
|
|
554
|
+
JSBool aIsSet)
|
|
555
|
+
{
|
|
556
|
+
// We resolve toString to a function in our resolve hook.
|
|
557
|
+
if (id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_TO_STRING)) {
|
|
558
|
+
return JS_TRUE;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
obj = FindSafeObject(obj);
|
|
562
|
+
NS_ASSERTION(obj != nsnull, "FindSafeObject() returned null in class hook!");
|
|
563
|
+
|
|
564
|
+
JSObject *unsafeObj = GetUnsafeObject(obj);
|
|
565
|
+
if (!unsafeObj) {
|
|
566
|
+
return ThrowException(NS_ERROR_UNEXPECTED, cx);
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// Check that the caller can access the unsafe object.
|
|
570
|
+
if (!CanCallerAccess(cx, unsafeObj)) {
|
|
571
|
+
// CanCallerAccess() already threw for us.
|
|
572
|
+
return JS_FALSE;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
// Function body for wrapping property get/set in a scripted
|
|
576
|
+
// caller. This scripted function's first argument is the property
|
|
577
|
+
// to get/set. If the operation is a get operation, the function is
|
|
578
|
+
// passed one argument. If the operation is a set operation, the
|
|
579
|
+
// function gets two arguments and the second argument will be the
|
|
580
|
+
// value to set the property to.
|
|
581
|
+
NS_NAMED_LITERAL_CSTRING(funScript,
|
|
582
|
+
"if (arguments.length == 1) return this[arguments[0]];"
|
|
583
|
+
"return this[arguments[0]] = arguments[1];");
|
|
584
|
+
|
|
585
|
+
jsval scriptedFunVal;
|
|
586
|
+
if (!GetScriptedFunction(cx, obj, unsafeObj, XPC_SJOW_SLOT_SCRIPTED_GETSET,
|
|
587
|
+
funScript, &scriptedFunVal)) {
|
|
588
|
+
return JS_FALSE;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
// Build up our argument array per the comment above.
|
|
592
|
+
jsval args[2];
|
|
593
|
+
|
|
594
|
+
args[0] = id;
|
|
595
|
+
|
|
596
|
+
if (aIsSet) {
|
|
597
|
+
args[1] = UnwrapJSValue(*vp);
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
jsval val;
|
|
601
|
+
JSBool ok = CallWithoutStatics(cx, unsafeObj, scriptedFunVal,
|
|
602
|
+
aIsSet ? 2 : 1, args, &val);
|
|
603
|
+
return ok && WrapJSValue(cx, obj, val, vp);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
static JSBool
|
|
607
|
+
XPC_SJOW_GetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
|
|
608
|
+
{
|
|
609
|
+
return XPC_SJOW_GetOrSetProperty(cx, obj, id, vp, PR_FALSE);
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
static JSBool
|
|
613
|
+
XPC_SJOW_SetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
|
|
614
|
+
{
|
|
615
|
+
return XPC_SJOW_GetOrSetProperty(cx, obj, id, vp, PR_TRUE);
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
static JSBool
|
|
619
|
+
XPC_SJOW_Enumerate(JSContext *cx, JSObject *obj)
|
|
620
|
+
{
|
|
621
|
+
obj = FindSafeObject(obj);
|
|
622
|
+
NS_ASSERTION(obj != nsnull, "FindSafeObject() returned null in class hook!");
|
|
623
|
+
|
|
624
|
+
// We are being notified of a for-in loop or similar operation on
|
|
625
|
+
// this XPCSafeJSObjectWrapper. Forward to the correct high-level
|
|
626
|
+
// object hook, OBJ_ENUMERATE on the unsafe object, called via the
|
|
627
|
+
// JS_Enumerate API. Then reflect properties named by the
|
|
628
|
+
// enumerated identifiers from the unsafe object to the safe
|
|
629
|
+
// wrapper.
|
|
630
|
+
|
|
631
|
+
JSObject *unsafeObj = GetUnsafeObject(obj);
|
|
632
|
+
if (!unsafeObj) {
|
|
633
|
+
return JS_TRUE;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
// Check that the caller can access the unsafe object.
|
|
637
|
+
if (!CanCallerAccess(cx, unsafeObj)) {
|
|
638
|
+
// CanCallerAccess() already threw for us.
|
|
639
|
+
return JS_FALSE;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
// Since we enumerate using JS_Enumerate() on the unsafe object here
|
|
643
|
+
// we don't need to do a security check since JS_Enumerate() will
|
|
644
|
+
// look up unsafeObj.__iterator__ and if we don't have permission to
|
|
645
|
+
// access that, it'll throw and we'll be safe.
|
|
646
|
+
|
|
647
|
+
return XPCWrapper::Enumerate(cx, obj, unsafeObj);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
static JSBool
|
|
651
|
+
XPC_SJOW_NewResolve(JSContext *cx, JSObject *obj, jsval id, uintN flags,
|
|
652
|
+
JSObject **objp)
|
|
653
|
+
{
|
|
654
|
+
obj = FindSafeObject(obj);
|
|
655
|
+
NS_ASSERTION(obj != nsnull, "FindSafeObject() returned null in class hook!");
|
|
656
|
+
|
|
657
|
+
JSObject *unsafeObj = GetUnsafeObject(obj);
|
|
658
|
+
if (!unsafeObj) {
|
|
659
|
+
// No unsafe object, nothing to resolve here.
|
|
660
|
+
|
|
661
|
+
return JS_TRUE;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
// Check that the caller can access the unsafe object.
|
|
665
|
+
if (!CanCallerAccess(cx, unsafeObj)) {
|
|
666
|
+
// CanCallerAccess() already threw for us.
|
|
667
|
+
return JS_FALSE;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
// Resolve toString specially.
|
|
671
|
+
if (id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_TO_STRING)) {
|
|
672
|
+
*objp = obj;
|
|
673
|
+
return JS_DefineFunction(cx, obj, "toString",
|
|
674
|
+
XPC_SJOW_toString, 0, 0) != nsnull;
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
return XPCWrapper::NewResolve(cx, obj, JS_FALSE, unsafeObj, id, flags, objp);
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
static JSBool
|
|
681
|
+
XPC_SJOW_Convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
|
|
682
|
+
{
|
|
683
|
+
NS_ASSERTION(type != JSTYPE_STRING, "toString failed us");
|
|
684
|
+
return JS_TRUE;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
static void
|
|
688
|
+
XPC_SJOW_Finalize(JSContext *cx, JSObject *obj)
|
|
689
|
+
{
|
|
690
|
+
// Release the reference to the cached principal if we have one.
|
|
691
|
+
jsval v;
|
|
692
|
+
if (::JS_GetReservedSlot(cx, obj, XPC_SJOW_SLOT_PRINCIPAL, &v) &&
|
|
693
|
+
!JSVAL_IS_VOID(v)) {
|
|
694
|
+
nsIPrincipal *principal = (nsIPrincipal *)JSVAL_TO_PRIVATE(v);
|
|
695
|
+
|
|
696
|
+
NS_RELEASE(principal);
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
static JSBool
|
|
701
|
+
XPC_SJOW_CheckAccess(JSContext *cx, JSObject *obj, jsval id,
|
|
702
|
+
JSAccessMode mode, jsval *vp)
|
|
703
|
+
{
|
|
704
|
+
// Prevent setting __proto__ on an XPCSafeJSObjectWrapper
|
|
705
|
+
if ((mode & JSACC_WATCH) == JSACC_PROTO && (mode & JSACC_WRITE)) {
|
|
706
|
+
return ThrowException(NS_ERROR_XPC_SECURITY_MANAGER_VETO, cx);
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
// Forward to the checkObjectAccess hook in the runtime, if any.
|
|
710
|
+
JSSecurityCallbacks *callbacks = JS_GetSecurityCallbacks(cx);
|
|
711
|
+
if (callbacks && callbacks->checkObjectAccess &&
|
|
712
|
+
!callbacks->checkObjectAccess(cx, obj, id, mode, vp)) {
|
|
713
|
+
return JS_FALSE;
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
JSObject *unsafeObj = GetUnsafeObject(obj);
|
|
717
|
+
if (!unsafeObj) {
|
|
718
|
+
return JS_TRUE;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
// Forward the unsafe object to the checkObjectAccess hook in the
|
|
722
|
+
// runtime too, if any.
|
|
723
|
+
if (callbacks && callbacks->checkObjectAccess &&
|
|
724
|
+
!callbacks->checkObjectAccess(cx, unsafeObj, id, mode, vp)) {
|
|
725
|
+
return JS_FALSE;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
JSClass *clazz = STOBJ_GET_CLASS(unsafeObj);
|
|
729
|
+
return !clazz->checkAccess ||
|
|
730
|
+
clazz->checkAccess(cx, unsafeObj, id, mode, vp);
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
static JSBool
|
|
734
|
+
XPC_SJOW_Call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
|
|
735
|
+
jsval *rval)
|
|
736
|
+
{
|
|
737
|
+
JSObject *tmp = FindSafeObject(obj);
|
|
738
|
+
JSObject *unsafeObj, *callThisObj = nsnull;
|
|
739
|
+
|
|
740
|
+
if (tmp) {
|
|
741
|
+
// A function wrapped in an XPCSafeJSObjectWrapper is being called
|
|
742
|
+
// directly (i.e. safeObj.fun()), set obj to be the safe object
|
|
743
|
+
// wrapper. In this case, the "this" object used when calling the
|
|
744
|
+
// function will be the unsafe object gotten off of the safe
|
|
745
|
+
// object.
|
|
746
|
+
obj = tmp;
|
|
747
|
+
} else {
|
|
748
|
+
// A function wrapped in an XPCSafeJSObjectWrapper is being called
|
|
749
|
+
// indirectly off of an object that's not a safe wrapper
|
|
750
|
+
// (i.e. foo.bar = safeObj.fun; foo.bar()), set obj to be the safe
|
|
751
|
+
// wrapper for the function, and use the object passed in as the
|
|
752
|
+
// "this" object when calling the function.
|
|
753
|
+
callThisObj = obj;
|
|
754
|
+
|
|
755
|
+
// Check that the caller can access the object we're about to pass
|
|
756
|
+
// in as "this" for the call we're about to make.
|
|
757
|
+
if (!CanCallerAccess(cx, callThisObj)) {
|
|
758
|
+
// CanCallerAccess() already threw for us.
|
|
759
|
+
return JS_FALSE;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
obj = FindSafeObject(JSVAL_TO_OBJECT(argv[-2]));
|
|
763
|
+
|
|
764
|
+
if (!obj) {
|
|
765
|
+
return ThrowException(NS_ERROR_INVALID_ARG, cx);
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
unsafeObj = GetUnsafeObject(obj);
|
|
770
|
+
if (!unsafeObj) {
|
|
771
|
+
return ThrowException(NS_ERROR_UNEXPECTED, cx);
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
if (!callThisObj) {
|
|
775
|
+
callThisObj = unsafeObj;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
JSObject *funToCall = GetUnsafeObject(JSVAL_TO_OBJECT(argv[-2]));
|
|
779
|
+
|
|
780
|
+
if (!funToCall) {
|
|
781
|
+
// Someone has called XPCSafeJSObjectWrapper.prototype() causing
|
|
782
|
+
// us to find a safe object wrapper without an unsafeObject as
|
|
783
|
+
// its parent. That call shouldn't do anything, so bail here.
|
|
784
|
+
return JS_TRUE;
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
// Check that the caller can access the unsafe object on which the
|
|
788
|
+
// call is being made, and the actual function we're about to call.
|
|
789
|
+
if (!CanCallerAccess(cx, unsafeObj) || !CanCallerAccess(cx, funToCall)) {
|
|
790
|
+
// CanCallerAccess() already threw for us.
|
|
791
|
+
return JS_FALSE;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
// Function body for wrapping calls to functions or callable objects
|
|
795
|
+
// in a scripted caller. This scripted function's first argument is
|
|
796
|
+
// a native call wrapper, and the second argument is the unsafe
|
|
797
|
+
// function to call. All but the first argument are passed to the
|
|
798
|
+
// call wrapper.
|
|
799
|
+
NS_NAMED_LITERAL_CSTRING(funScript,
|
|
800
|
+
"var args = [];"
|
|
801
|
+
"for (var i = 1; i < arguments.length; i++)"
|
|
802
|
+
"args.push(arguments[i]);"
|
|
803
|
+
"return arguments[0].apply(this, args);");
|
|
804
|
+
|
|
805
|
+
// Get the scripted function.
|
|
806
|
+
jsval scriptedFunVal;
|
|
807
|
+
if (!GetScriptedFunction(cx, obj, unsafeObj, XPC_SJOW_SLOT_SCRIPTED_FUN,
|
|
808
|
+
funScript, &scriptedFunVal)) {
|
|
809
|
+
return JS_FALSE;
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
JSFunction *callWrapper;
|
|
813
|
+
jsval cwval;
|
|
814
|
+
|
|
815
|
+
// Check if we've cached the call wrapper on the scripted function
|
|
816
|
+
// already. If so, use the cached call wrapper.
|
|
817
|
+
if (!::JS_GetReservedSlot(cx, JSVAL_TO_OBJECT(scriptedFunVal), 0, &cwval)) {
|
|
818
|
+
return JS_FALSE;
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
if (JSVAL_IS_PRIMITIVE(cwval)) {
|
|
822
|
+
// No cached call wrapper found.
|
|
823
|
+
callWrapper =
|
|
824
|
+
::JS_NewFunction(cx, XPC_SJOW_CallWrapper, 0, 0, callThisObj,
|
|
825
|
+
"XPC_SJOW_CallWrapper");
|
|
826
|
+
if (!callWrapper) {
|
|
827
|
+
return JS_FALSE;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
// Cache the call wrapper function, this will also ensure it
|
|
831
|
+
// doesn't get collected early. We piggy-back on one of the
|
|
832
|
+
// reserved slots in JS functions here, and that's ok since we
|
|
833
|
+
// know the scripted function we're storing it on is a function
|
|
834
|
+
// compiled by the JS engine and the reserved slots are unused.
|
|
835
|
+
JSObject *callWrapperObj = ::JS_GetFunctionObject(callWrapper);
|
|
836
|
+
if (!::JS_SetReservedSlot(cx, JSVAL_TO_OBJECT(scriptedFunVal), 0,
|
|
837
|
+
OBJECT_TO_JSVAL(callWrapperObj))) {
|
|
838
|
+
return JS_FALSE;
|
|
839
|
+
}
|
|
840
|
+
} else {
|
|
841
|
+
// Found a cached call wrapper, extract the function.
|
|
842
|
+
callWrapper = ::JS_ValueToFunction(cx, cwval);
|
|
843
|
+
|
|
844
|
+
if (!callWrapper) {
|
|
845
|
+
return ThrowException(NS_ERROR_UNEXPECTED, cx);
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
// Build up our argument array per earlier comment.
|
|
850
|
+
jsval argsBuf[8];
|
|
851
|
+
jsval *args = argsBuf;
|
|
852
|
+
|
|
853
|
+
if (argc > 7) {
|
|
854
|
+
args = (jsval *)nsMemory::Alloc((argc + 2) * sizeof(jsval *));
|
|
855
|
+
if (!args) {
|
|
856
|
+
return ThrowException(NS_ERROR_OUT_OF_MEMORY, cx);
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
args[0] = OBJECT_TO_JSVAL(::JS_GetFunctionObject(callWrapper));
|
|
861
|
+
args[1] = OBJECT_TO_JSVAL(funToCall);
|
|
862
|
+
|
|
863
|
+
if (args[0] == JSVAL_NULL) {
|
|
864
|
+
return JS_FALSE;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
for (uintN i = 0; i < argc; ++i) {
|
|
868
|
+
args[i + 2] = UnwrapJSValue(argv[i]);
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
jsval val;
|
|
872
|
+
JSBool ok = CallWithoutStatics(cx, callThisObj, scriptedFunVal, argc + 2,
|
|
873
|
+
args, &val);
|
|
874
|
+
|
|
875
|
+
if (args != argsBuf) {
|
|
876
|
+
nsMemory::Free(args);
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
return ok && WrapJSValue(cx, obj, val, rval);
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
JSBool
|
|
883
|
+
XPC_SJOW_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
|
|
884
|
+
jsval *rval)
|
|
885
|
+
{
|
|
886
|
+
if (argc < 1) {
|
|
887
|
+
return ThrowException(NS_ERROR_XPC_NOT_ENOUGH_ARGS, cx);
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
// |obj| almost always has the wrong proto and parent so we have to create
|
|
891
|
+
// our own object anyway. Set |obj| to null so we don't use it by accident.
|
|
892
|
+
obj = nsnull;
|
|
893
|
+
|
|
894
|
+
if (JSVAL_IS_PRIMITIVE(argv[0])) {
|
|
895
|
+
JSStackFrame *fp = nsnull;
|
|
896
|
+
if (JS_FrameIterator(cx, &fp) && JS_IsConstructorFrame(cx, fp)) {
|
|
897
|
+
return ThrowException(NS_ERROR_ILLEGAL_VALUE, cx);
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
*rval = argv[0];
|
|
901
|
+
return JS_TRUE;
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
JSObject *objToWrap = JSVAL_TO_OBJECT(argv[0]);
|
|
905
|
+
|
|
906
|
+
// Prevent script created Script objects from ever being wrapped
|
|
907
|
+
// with XPCSafeJSObjectWrapper, and never let the eval function
|
|
908
|
+
// object be directly wrapped.
|
|
909
|
+
|
|
910
|
+
if (STOBJ_GET_CLASS(objToWrap) == &js_ScriptClass ||
|
|
911
|
+
(::JS_ObjectIsFunction(cx, objToWrap) &&
|
|
912
|
+
::JS_GetFunctionNative(cx, ::JS_ValueToFunction(cx, argv[0])) ==
|
|
913
|
+
XPCWrapper::sEvalNative)) {
|
|
914
|
+
return ThrowException(NS_ERROR_INVALID_ARG, cx);
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
if (STOBJ_GET_CLASS(objToWrap) == &sXPC_XOW_JSClass.base) {
|
|
918
|
+
// We're being asked to wrap a XOW. By using XPCWrapper::Unwrap,
|
|
919
|
+
// we guarantee that the wrapped object is same-origin to us. If
|
|
920
|
+
// it isn't, then just wrap the XOW for an added layer of wrapping.
|
|
921
|
+
|
|
922
|
+
JSObject *maybeInner = XPCWrapper::Unwrap(cx, objToWrap);
|
|
923
|
+
if (maybeInner) {
|
|
924
|
+
objToWrap = maybeInner;
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
// Check that the caller can access the unsafe object.
|
|
929
|
+
if (!CanCallerAccess(cx, objToWrap)) {
|
|
930
|
+
// CanCallerAccess() already threw for us.
|
|
931
|
+
return JS_FALSE;
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
JSObject *unsafeObj = GetUnsafeObject(objToWrap);
|
|
935
|
+
|
|
936
|
+
if (unsafeObj) {
|
|
937
|
+
// We're asked to wrap an already wrapped object. Re-wrap the
|
|
938
|
+
// object wrapped by the given wrapper.
|
|
939
|
+
|
|
940
|
+
objToWrap = unsafeObj;
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
// Don't use the object the JS engine created for us, it is in most
|
|
944
|
+
// cases incorectly parented and has a proto from the wrong scope.
|
|
945
|
+
JSObject *wrapperObj =
|
|
946
|
+
::JS_NewObjectWithGivenProto(cx, &sXPC_SJOW_JSClass.base, nsnull,
|
|
947
|
+
objToWrap);
|
|
948
|
+
|
|
949
|
+
if (!wrapperObj) {
|
|
950
|
+
// JS_NewObjectWithGivenProto already threw.
|
|
951
|
+
return JS_FALSE;
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
if (!::JS_SetReservedSlot(cx, wrapperObj, XPC_SJOW_SLOT_IS_RESOLVING,
|
|
955
|
+
JSVAL_ZERO)) {
|
|
956
|
+
return JS_FALSE;
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
*rval = OBJECT_TO_JSVAL(wrapperObj);
|
|
960
|
+
|
|
961
|
+
return JS_TRUE;
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
static JSBool
|
|
965
|
+
XPC_SJOW_Create(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
|
|
966
|
+
jsval *rval)
|
|
967
|
+
{
|
|
968
|
+
JSObject *callee = JSVAL_TO_OBJECT(argv[-2]);
|
|
969
|
+
NS_ASSERTION(GetUnsafeObject(callee), "How'd we get here?");
|
|
970
|
+
JSObject *unsafeObj = GetUnsafeObject(callee);
|
|
971
|
+
|
|
972
|
+
// Check that the caller can access the unsafe object.
|
|
973
|
+
if (!CanCallerAccess(cx, unsafeObj)) {
|
|
974
|
+
// CanCallerAccess() already threw for us.
|
|
975
|
+
return JS_FALSE;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
JSBool ok = CallWithoutStatics(cx, obj, OBJECT_TO_JSVAL(callee), argc, argv,
|
|
979
|
+
rval);
|
|
980
|
+
return ok && WrapJSValue(cx, callee, *rval, rval);
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
static JSBool
|
|
984
|
+
XPC_SJOW_Equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp)
|
|
985
|
+
{
|
|
986
|
+
if (JSVAL_IS_PRIMITIVE(v)) {
|
|
987
|
+
*bp = JS_FALSE;
|
|
988
|
+
} else {
|
|
989
|
+
JSObject *unsafeObj = GetUnsafeObject(obj);
|
|
990
|
+
|
|
991
|
+
JSObject *other = JSVAL_TO_OBJECT(v);
|
|
992
|
+
JSObject *otherUnsafe = GetUnsafeObject(other);
|
|
993
|
+
|
|
994
|
+
// An object is equal to a SJOW if:
|
|
995
|
+
// - The other object is the same SJOW.
|
|
996
|
+
// - The other object is the object that this SJOW is wrapping.
|
|
997
|
+
// - The other object is a SJOW wrapping the same object as this one.
|
|
998
|
+
// or
|
|
999
|
+
// - Both objects somehow wrap the same native object.
|
|
1000
|
+
if (obj == other || unsafeObj == other ||
|
|
1001
|
+
(unsafeObj && unsafeObj == otherUnsafe)) {
|
|
1002
|
+
*bp = JS_TRUE;
|
|
1003
|
+
} else {
|
|
1004
|
+
nsISupports *objIdentity = XPC_GetIdentityObject(cx, obj);
|
|
1005
|
+
nsISupports *otherIdentity = XPC_GetIdentityObject(cx, other);
|
|
1006
|
+
|
|
1007
|
+
*bp = objIdentity && objIdentity == otherIdentity;
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
|
|
1011
|
+
return JS_TRUE;
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
static JSObject *
|
|
1015
|
+
XPC_SJOW_Iterator(JSContext *cx, JSObject *obj, JSBool keysonly)
|
|
1016
|
+
{
|
|
1017
|
+
obj = FindSafeObject(obj);
|
|
1018
|
+
NS_ASSERTION(obj != nsnull, "FindSafeObject() returned null in class hook!");
|
|
1019
|
+
|
|
1020
|
+
JSObject *unsafeObj = GetUnsafeObject(obj);
|
|
1021
|
+
if (!unsafeObj) {
|
|
1022
|
+
ThrowException(NS_ERROR_INVALID_ARG, cx);
|
|
1023
|
+
|
|
1024
|
+
return nsnull;
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
// Check that the caller can access the unsafe object.
|
|
1028
|
+
if (!CanCallerAccess(cx, unsafeObj)) {
|
|
1029
|
+
// CanCallerAccess() already threw for us.
|
|
1030
|
+
return nsnull;
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
// Create our dummy SJOW.
|
|
1034
|
+
JSObject *wrapperIter =
|
|
1035
|
+
::JS_NewObjectWithGivenProto(cx, &sXPC_SJOW_JSClass.base, nsnull,
|
|
1036
|
+
unsafeObj);
|
|
1037
|
+
if (!wrapperIter) {
|
|
1038
|
+
return nsnull;
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
if (!::JS_SetReservedSlot(cx, wrapperIter, XPC_SJOW_SLOT_IS_RESOLVING,
|
|
1042
|
+
JSVAL_ZERO)) {
|
|
1043
|
+
return nsnull;
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
JSAutoTempValueRooter tvr(cx, OBJECT_TO_JSVAL(wrapperIter));
|
|
1047
|
+
|
|
1048
|
+
// Initialize the wrapper.
|
|
1049
|
+
return XPCWrapper::CreateIteratorObj(cx, wrapperIter, obj, unsafeObj,
|
|
1050
|
+
keysonly);
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
static JSObject *
|
|
1054
|
+
XPC_SJOW_WrappedObject(JSContext *cx, JSObject *obj)
|
|
1055
|
+
{
|
|
1056
|
+
return GetUnsafeObject(obj);
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
static JSBool
|
|
1060
|
+
XPC_SJOW_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
|
|
1061
|
+
jsval *rval)
|
|
1062
|
+
{
|
|
1063
|
+
obj = FindSafeObject(obj);
|
|
1064
|
+
if (!obj) {
|
|
1065
|
+
return ThrowException(NS_ERROR_INVALID_ARG, cx);
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
JSObject *unsafeObj = GetUnsafeObject(obj);
|
|
1069
|
+
|
|
1070
|
+
if (!unsafeObj) {
|
|
1071
|
+
// No unsafe object, nothing to stringify here, return "[object
|
|
1072
|
+
// XPCSafeJSObjectWrapper]" so callers know what they're looking
|
|
1073
|
+
// at.
|
|
1074
|
+
|
|
1075
|
+
JSString *str = JS_NewStringCopyZ(cx, "[object XPCSafeJSObjectWrapper]");
|
|
1076
|
+
if (!str) {
|
|
1077
|
+
return JS_FALSE;
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
*rval = STRING_TO_JSVAL(str);
|
|
1081
|
+
|
|
1082
|
+
return JS_TRUE;
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
// Check that the caller can access the unsafe object.
|
|
1086
|
+
if (!CanCallerAccess(cx, unsafeObj)) {
|
|
1087
|
+
// CanCallerAccess() already threw for us.
|
|
1088
|
+
return JS_FALSE;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
// Function body for wrapping toString() in a scripted caller.
|
|
1092
|
+
NS_NAMED_LITERAL_CSTRING(funScript, "return '' + this;");
|
|
1093
|
+
|
|
1094
|
+
jsval scriptedFunVal;
|
|
1095
|
+
if (!GetScriptedFunction(cx, obj, unsafeObj, XPC_SJOW_SLOT_SCRIPTED_TOSTRING,
|
|
1096
|
+
funScript, &scriptedFunVal)) {
|
|
1097
|
+
return JS_FALSE;
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
jsval val;
|
|
1101
|
+
JSBool ok = CallWithoutStatics(cx, unsafeObj, scriptedFunVal, 0, nsnull,
|
|
1102
|
+
&val);
|
|
1103
|
+
return ok && WrapJSValue(cx, obj, val, rval);
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
PRBool
|
|
1107
|
+
XPC_SJOW_AttachNewConstructorObject(XPCCallContext &ccx,
|
|
1108
|
+
JSObject *aGlobalObject)
|
|
1109
|
+
{
|
|
1110
|
+
// Initialize sEvalNative the first time we attach a constructor.
|
|
1111
|
+
// NB: This always happens before any cross origin wrappers are
|
|
1112
|
+
// created, so it's OK to do this here.
|
|
1113
|
+
if (!XPCWrapper::FindEval(ccx, aGlobalObject)) {
|
|
1114
|
+
return PR_FALSE;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
JSObject *class_obj =
|
|
1118
|
+
::JS_InitClass(ccx, aGlobalObject, nsnull, &sXPC_SJOW_JSClass.base,
|
|
1119
|
+
XPC_SJOW_Construct, 0, nsnull, nsnull, nsnull, nsnull);
|
|
1120
|
+
if (!class_obj) {
|
|
1121
|
+
NS_WARNING("can't initialize the XPCSafeJSObjectWrapper class");
|
|
1122
|
+
return PR_FALSE;
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
if (!::JS_DefineFunction(ccx, class_obj, "toString", XPC_SJOW_toString,
|
|
1126
|
+
0, 0)) {
|
|
1127
|
+
return PR_FALSE;
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
// Null out the class object's parent to prevent code in this class
|
|
1131
|
+
// from thinking the class object is a wrapper for the global
|
|
1132
|
+
// object.
|
|
1133
|
+
::JS_SetParent(ccx, class_obj, nsnull);
|
|
1134
|
+
|
|
1135
|
+
// Make sure our prototype chain is empty and that people can't mess
|
|
1136
|
+
// with XPCSafeJSObjectWrapper.prototype.
|
|
1137
|
+
::JS_SetPrototype(ccx, class_obj, nsnull);
|
|
1138
|
+
if (!::JS_SealObject(ccx, class_obj, JS_FALSE)) {
|
|
1139
|
+
NS_WARNING("Failed to seal XPCSafeJSObjectWrapper.prototype");
|
|
1140
|
+
return PR_FALSE;
|
|
1141
|
+
}
|
|
1142
|
+
|
|
1143
|
+
JSBool found;
|
|
1144
|
+
return ::JS_SetPropertyAttributes(ccx, aGlobalObject,
|
|
1145
|
+
sXPC_SJOW_JSClass.base.name,
|
|
1146
|
+
JSPROP_READONLY | JSPROP_PERMANENT,
|
|
1147
|
+
&found);
|
|
1148
|
+
}
|