tor-browser

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

regexp-6.js (2263B)


      1 // Tests for String.prototype builtins with custom regexp symbols on
      2 // RegExp.prototype.
      3 // Use fresh globals because this pops realm fuses.
      4 
      5 // Custom RegExp.prototype[@@match].
      6 newGlobal().evaluate(`(function() {
      7  var s = "foobar";
      8  var re = /abc.+/;
      9  var count = 0;
     10  for (var i = 0; i < 200; i++) {
     11    s.match(re);
     12    if (i === 150) {
     13      RegExp.prototype[Symbol.match] = function() {
     14        count++;
     15        return null;
     16      };
     17    }
     18  }
     19  assertEq(count, 49);
     20 })();`);
     21 
     22 // Custom RegExp.prototype[@@matchAll].
     23 newGlobal().evaluate(`(function() {
     24  var s = "foobar";
     25  var re = /abc.+/g;
     26  var count = 0;
     27  for (var i = 0; i < 200; i++) {
     28    s.matchAll(re);
     29    if (i === 150) {
     30      RegExp.prototype[Symbol.matchAll] = function() {
     31        count++;
     32        return null;
     33      };
     34    }
     35  }
     36  assertEq(count, 49);
     37 })();`);
     38 
     39 // Custom RegExp.prototype[@@replace] for replace.
     40 newGlobal().evaluate(`(function() {
     41  var s = "foobar";
     42  var re = /abc.+/;
     43  var count = 0;
     44  for (var i = 0; i < 200; i++) {
     45    s.replace(re, "");
     46    if (i === 150) {
     47      RegExp.prototype[Symbol.replace] = function() {
     48        count++;
     49        return "";
     50      };
     51    }
     52  }
     53  assertEq(count, 49);
     54 })();`);
     55 
     56 // Custom RegExp.prototype[@@replace] for replaceAll.
     57 newGlobal().evaluate(`(function() {
     58  var s = "foobar";
     59  var re = /abc.+/g;
     60  var count = 0;
     61  for (var i = 0; i < 200; i++) {
     62    s.replaceAll(re, "");
     63    if (i === 150) {
     64      RegExp.prototype[Symbol.replace] = function() {
     65        count++;
     66        return "";
     67      };
     68    }
     69  }
     70  assertEq(count, 49);
     71 })();`);
     72 
     73 // Custom RegExp.prototype[@@search].
     74 newGlobal().evaluate(`(function() {
     75  var s = "foobar";
     76  var re = /abc.+/g;
     77  var count = 0;
     78  for (var i = 0; i < 200; i++) {
     79    s.search(re);
     80    if (i === 150) {
     81      RegExp.prototype[Symbol.search] = function() {
     82        count++;
     83        return -1;
     84      };
     85    }
     86  }
     87  assertEq(count, 49);
     88 })();`);
     89 
     90 // Custom RegExp.prototype[@@split].
     91 newGlobal().evaluate(`(function() {
     92  var s = "foobar";
     93  var re = /abc.+/;
     94  var count = 0;
     95  for (var i = 0; i < 200; i++) {
     96    s.split(re);
     97    if (i === 150) {
     98      RegExp.prototype[Symbol.split] = function() {
     99        count++;
    100        return [];
    101      };
    102    }
    103  }
    104  assertEq(count, 49);
    105 })();`);