tor-browser

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

binaryarith-date-symbol-toPrimitive-pollution.js (3084B)


      1 function warmup(fun, input_array) {
      2  for (var index = 0; index < input_array.length; index++) {
      3      input = input_array[index];
      4      input_lhs = input[0];
      5      input_rhs = input[1];
      6      output    = input[2];
      7      for (var i = 0; i < 30; i++) {
      8          var y = fun(input_lhs, input_rhs);
      9          assertEq(y, output)
     10      }
     11  }
     12 }
     13 
     14 {
     15  // Check that changing the Symbol.toPrimitive function of Date.prototype does not affect the inlined Date subtraction.
     16  const testCases = [[new Date("2024-09-20T19:54:27.432Z"), new Date("2024-09-20T19:54:27.427Z"), 5],
     17                 [new Date("2024-09-20T19:54:27.432Z"), 1726862067427, 5],
     18                 [1726862067427, new Date("2024-09-20T19:54:27.432Z"), -5]];
     19  const funDateSub = (a, b) => { return a - b; }
     20  warmup(funDateSub, testCases);
     21 
     22  const originalDateToPrimitive = Date.prototype[Symbol.toPrimitive];
     23  let counter = 0;
     24  Object.defineProperty(Date.prototype, Symbol.toPrimitive, {
     25    value: function(hint) {
     26      counter++;
     27      return originalDateToPrimitive.call(this, hint);
     28    },
     29    configurable: true,
     30  });
     31 
     32  assertEq(funDateSub(new Date("2024-09-20T19:54:27.432Z"), new Date("2024-09-20T19:54:27.422Z")), 10);
     33  assertEq(counter, 2);
     34 }
     35 
     36 {
     37  // Check that a pre-existing Date.prototype[Symbol.toPrimitive] override does not affect the inlined Date subtraction.
     38  let counter = 0;
     39  const originalDateToPrimitive = Date.prototype[Symbol.toPrimitive];
     40  Object.defineProperty(Date.prototype, Symbol.toPrimitive, {
     41    value: function(hint) {
     42      counter++;
     43      return originalDateToPrimitive.call(this, hint);
     44    },
     45  });
     46 
     47  const funDateSub = (a, b) => { return a - b; }
     48  assertEq(funDateSub(new Date("2024-09-20T19:54:27.432Z"), new Date("2024-09-20T19:54:27.422Z")), 10);
     49  assertEq(counter, 2);
     50 
     51  const testCases = [[new Date("2024-09-20T19:54:27.432Z"), new Date("2024-09-20T19:54:27.427Z"), 5],
     52                 [new Date("2024-09-20T19:54:27.432Z"), 1726862067427, 5],
     53                 [1726862067427, new Date("2024-09-20T19:54:27.432Z"), -5]];
     54  warmup(funDateSub, testCases);
     55  counter = 0;
     56 
     57  assertEq(funDateSub(new Date("2024-09-20T19:54:27.432Z"), new Date("2024-09-20T19:54:27.422Z")), 10);
     58  assertEq(funDateSub(new Date("2024-09-20T19:54:27.432Z"), 1726862067427), 5);
     59  assertEq(counter, 3);
     60 }
     61 
     62 {
     63  // Check that using extended date classes does not affect the inlined Date subtraction.
     64  const testCases = [[new Date("2024-09-20T19:54:27.432Z"), new Date("2024-09-20T19:54:27.427Z"), 5],
     65                 [new Date("2024-09-20T19:54:27.432Z"), 1726862067427, 5],
     66                 [1726862067427, new Date("2024-09-20T19:54:27.432Z"), -5]];
     67  const funDateSub = (a, b) => { return a - b; }
     68  warmup(funDateSub, testCases);
     69 
     70  let counter = 0;
     71  class MyDate extends Date {
     72    [Symbol.toPrimitive]() {
     73      counter++;
     74      return super.valueOf();
     75    }
     76  }
     77 
     78  assertEq(funDateSub(new MyDate("2024-09-20T19:54:27.432Z"), new MyDate("2024-09-20T19:54:27.422Z")), 10);
     79  assertEq(funDateSub(1726862067427, new MyDate("2024-09-20T19:54:27.432Z")), -5);
     80  assertEq(counter, 3);
     81 }