summaryrefslogtreecommitdiffstats
path: root/js/xpconnect/tests/unit/test_allowWaivers.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/xpconnect/tests/unit/test_allowWaivers.js')
-rw-r--r--js/xpconnect/tests/unit/test_allowWaivers.js30
1 files changed, 30 insertions, 0 deletions
diff --git a/js/xpconnect/tests/unit/test_allowWaivers.js b/js/xpconnect/tests/unit/test_allowWaivers.js
new file mode 100644
index 000000000..66f70694a
--- /dev/null
+++ b/js/xpconnect/tests/unit/test_allowWaivers.js
@@ -0,0 +1,30 @@
+const Cu = Components.utils;
+function checkWaivers(from, allowed) {
+ var sb = new Cu.Sandbox('http://example.com');
+ from.test = sb.eval('var o = {prop: 2, f: function() {return 42;}}; o');
+
+ // Make sure that |from| has Xrays to sb.
+ do_check_eq(from.eval('test.prop'), 2);
+ do_check_eq(from.eval('test.f'), undefined);
+
+ // Make sure that waivability works as expected.
+ do_check_eq(from.eval('!!test.wrappedJSObject'), allowed);
+ do_check_eq(from.eval('XPCNativeWrapper.unwrap(test) !== test'), allowed);
+
+ // Make a sandbox with the same principal as |from|, but without any waiver
+ // restrictions, and make sure that the waiver does not transfer.
+ var friend = new Cu.Sandbox(Cu.getObjectPrincipal(from));
+ friend.test = from.test;
+ friend.eval('var waived = test.wrappedJSObject;');
+ do_check_true(friend.eval('waived.f()'), 42);
+ friend.from = from;
+ friend.eval('from.waived = waived');
+ do_check_eq(from.eval('!!waived.f'), allowed);
+}
+
+function run_test() {
+ checkWaivers(new Cu.Sandbox('http://example.com'), true);
+ checkWaivers(new Cu.Sandbox('http://example.com', {allowWaivers: false}), false);
+ checkWaivers(new Cu.Sandbox(['http://example.com']), true);
+ checkWaivers(new Cu.Sandbox(['http://example.com'], {allowWaivers: false}), false);
+}