tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

call-bound-scripted.js (3223B)


      1 function testNumBoundArgsGuard() {
      2    function f(a, b, c, d, e, f, g, h) {
      3        return [a, b, c, d, e, f, g, h].join(",");
      4    }
      5    var arr = [
      6        f.bind(null, 1, 2, 3, 4, 5, 6),
      7        f.bind(null, 4, 5, 6, 7, 8, 9),
      8        f.bind(null, 1, 2),
      9        f.bind(null, 1),
     10    ];
     11    var expected = [
     12        "1,2,3,4,5,6,10,11",
     13        "4,5,6,7,8,9,10,11",
     14        "1,2,10,11,12,13,14,15",
     15        "1,10,11,12,13,14,15,",
     16    ];
     17    for (var i = 0; i < 100; i++) {
     18        assertEq(arr[0](10, 11, 12, 13, 14, 15), expected[0]);
     19        assertEq(arr[1](10, 11, 12, 13, 14, 15), expected[1]);
     20        assertEq(arr[2](10, 11, 12, 13, 14, 15), expected[2]);
     21        assertEq(arr[3](10, 11, 12, 13, 14, 15), expected[3]);
     22        assertEq(arr[i % arr.length](10, 11, 12, 13, 14, 15), expected[i % arr.length]);
     23    }
     24 }
     25 testNumBoundArgsGuard();
     26 
     27 function testJSFunctionGuard() {
     28    var arr = [
     29        (x => x * 0).bind(null, 1),
     30        (x => x * 1).bind(null, 2),
     31        (x => x * 2).bind(null, 3),
     32        (x => x * 3).bind(null, 4),
     33        (x => x * 4).bind(null, 5),
     34        (x => x * 5).bind(null, 6),
     35        (x => x * 6).bind(null, 7),
     36        (x => x * 7).bind(null, 8),
     37        (x => x * 8).bind(null, 9),
     38    ];
     39    var boundNative = Math.abs.bind(null, -123);
     40    var boundProxy = (new Proxy(x => x * 42, {})).bind(null, 7);
     41 
     42    for (var i = 0; i < 100; i++) {
     43        var idx = i % arr.length;
     44        var fun1 = arr[idx];
     45        var expected1 = idx * (idx + 1);
     46        assertEq(fun1(), expected1);
     47        var fun2 = i > 70 ? boundNative : fun1;
     48        assertEq(fun2(), i > 70 ? 123 : expected1);
     49        var fun3 = i > 70 ? boundProxy : fun1;
     50        assertEq(fun3(), i > 70 ? 294 : expected1);
     51    }
     52 }
     53 testJSFunctionGuard();
     54 
     55 function testCrossRealmTarget() {
     56    globalThis.num = "FAIL";
     57 
     58    var globals = [];
     59    for (var i = 0; i < 4; i++) {
     60        var g = newGlobal({sameCompartmentAs: this});
     61        g.num = i;
     62        globals.push(g);
     63    }
     64    var arr = globals.map(g => g.evaluate("(x => this.num)"));
     65    arr = arr.map(f => Function.prototype.bind.call(f, null));
     66 
     67    for (var i = 0; i < 200; i++) {
     68        assertEq(arr[0](), 0);
     69        var idx = i % arr.length;
     70        assertEq(arr[idx](), idx);
     71    }
     72 }
     73 testCrossRealmTarget();
     74 
     75 // Bug 1819651.
     76 function testReturnsItself() {
     77    var fun = function() { return boundFun; };
     78    var boundFun = fun.bind(null);
     79    for (var i = 0; i < 20; i++) {
     80        assertEq(boundFun(), boundFun);
     81        assertEq(new boundFun(), boundFun);
     82    }
     83 }
     84 testReturnsItself();
     85 
     86 function testManyArgs() {
     87  var fun = function(a, b, c, d, e, f, g, h, i, j) {
     88    return [a, b, c, d, e, f, g, h, i, j].join(",");
     89  };
     90  var boundFun1 = fun.bind(null, 1, 2);
     91  var boundFun2 = fun.bind(null, 1, 2, 3, 4, 5, 6);
     92  for (var i = 0; i < 60; i++) {
     93    assertEq(boundFun1(), "1,2,,,,,,,,");
     94    assertEq(boundFun1(10, 11, 12, 13, 14), "1,2,10,11,12,13,14,,,");
     95    assertEq(boundFun1(10, 11, 12, 13, 14, 15, 16, 17), "1,2,10,11,12,13,14,15,16,17");
     96 
     97    assertEq(boundFun2(), "1,2,3,4,5,6,,,,");
     98    assertEq(boundFun2(10, 11), "1,2,3,4,5,6,10,11,,");
     99    assertEq(boundFun2(10, 11, 12, 13, 14, 15, 16, 17), "1,2,3,4,5,6,10,11,12,13");
    100  }
    101 }
    102 testManyArgs();