summaryrefslogtreecommitdiff
path: root/js/xpconnect/tests/unit/test_allowWaivers.js
blob: 66f70694a325d5de6977deadc65946878366ed0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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);
}