switch-realms-scripted.js (3249B)
1 function testBasic() { 2 var g = newGlobal({sameCompartmentAs: this}); 3 g.evaluate("function foo() { return scriptedCallerGlobal(); }"); 4 for (var i = 0; i < 20; i++) 5 assertEq(g.foo(), g); 6 7 g.evaluate("function Obj() {}"); 8 for (var i = 0; i < 30; i++) 9 assertEq(objectGlobal(new g.Obj()), g); 10 } 11 testBasic(); 12 13 function testFunCall() { 14 var g = newGlobal({sameCompartmentAs: this}); 15 g.evaluate("function foo() { return scriptedCallerGlobal(); }"); 16 for (var i = 0; i < 20; i++) 17 assertEq(g.foo.call(1, 2), g); 18 } 19 testFunCall(); 20 21 function testFunApplyArgs() { 22 var g = newGlobal({sameCompartmentAs: this}); 23 g.evaluate("function foo() { return scriptedCallerGlobal(); }"); 24 for (var i = 0; i < 2000; i++) 25 assertEq(g.foo.apply(null, arguments), g); 26 } 27 testFunApplyArgs(1, 2); 28 29 function testFunApplyArray() { 30 var g = newGlobal({sameCompartmentAs: this}); 31 g.evaluate("function foo() { return scriptedCallerGlobal(); }"); 32 var arr = [1, 2]; 33 for (var i = 0; i < 2000; i++) 34 assertEq(g.foo.apply(null, arr), g); 35 } 36 testFunApplyArray(); 37 38 function testAccessor() { 39 var g = newGlobal({sameCompartmentAs: this}); 40 g.evaluate("function foo() { return scriptedCallerGlobal(); }"); 41 var o = {}; 42 Object.defineProperty(o, "foo", {get: g.foo, set: g.foo}); 43 for (var i = 0; i < 20; i++) { 44 assertEq(o.foo, g); 45 o.foo = 1; 46 } 47 } 48 testAccessor(); 49 50 function testGenerator() { 51 var thisGlobalGen = function*() {}; 52 var thisGlobalGenObj = thisGlobalGen(); 53 54 var g = newGlobal({sameCompartmentAs: this}); 55 g.evaluate("function* gen() { for (var i = 0; i < 2; i++) yield new Array(1, 2); }"); 56 for (var i = 0; i < 20; i++) { 57 var o = g.gen(); 58 for (var j = 0; j < 2; j++) { 59 var res = thisGlobalGenObj.next.call(o); 60 assertEq(objectGlobal(res), g); 61 assertEq(Array.isArray(res.value), true); 62 assertEq(objectGlobal(res.value), g); 63 } 64 } 65 } 66 testGenerator(); 67 68 function testException1() { 69 var g = newGlobal({sameCompartmentAs: this}); 70 g.evaluate("function throwEx() { throw this; }"); 71 for (var i = 0; i < 20; i++) { 72 var ex; 73 try { 74 g.throwEx(); 75 } catch(e) { 76 ex = e; 77 } 78 assertCorrectRealm(); 79 assertEq(ex, g); 80 } 81 } 82 testException1(); 83 84 function testException2() { 85 var g = newGlobal({sameCompartmentAs: this}); 86 g.evaluate("function f1(x) { if (x > 100) throw x; }"); 87 g.f2 = function(x) { return g.f1(x); } 88 g.f3 = function(x) { return g.f2(x); } 89 g.evaluate("function f4(x) { try { return f3(x); } finally { assertCorrectRealm(); } }"); 90 var ex; 91 try { 92 for (var i = 0; i < 110; i++) { 93 g.f4(i); 94 } 95 } catch (e) { 96 ex = e; 97 } 98 assertCorrectRealm(); 99 assertEq(ex, 101); 100 } 101 testException2(); 102 testException2(); 103 104 function testException3(x) { 105 var g = newGlobal({sameCompartmentAs: this}); 106 g.f1 = function(x) { if (x === max + 2) throw 1; } 107 g.evaluate("function f2(x) { try { return f1(x); } catch(e) {} }"); 108 var max = 15; 109 for (var i = 0; i < max; i++) 110 g.f2(x * max + i); 111 } 112 testException3(0); 113 testException3(1);