tor-browser

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

regress-336376-01.js (6610B)


      1 /* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 //-----------------------------------------------------------------------------
      7 var BUGNUMBER     = "336376";
      8 var summary = "Tests reserved words in contexts in which they are not reserved";
      9 var actual, expect;
     10 
     11 printBugNumber(BUGNUMBER);
     12 printStatus(summary);
     13 
     14 /**************
     15 * TEST SETUP *
     16 **************/
     17 
     18 //
     19 // New tests go in Tester.prototype._tests.  A test is called with a single
     20 // argument, the keyword to test in the syntax tested by that test.  Tests
     21 // should not return anything, and they should signal failure by throwing an
     22 // explanatory exception and success by not throwing one.
     23 //
     24 // If you define a new test, make sure to name it using an informative string
     25 // for ease of use if any keywords ever manually define the array of tests they
     26 // should pass, and add it as a string to ALL_TESTS.
     27 //
     28 
     29 // all tests
     30 const ALL_TESTS =
     31  [
     32    "CONTEXT_OBJECT_LITERAL_PROPERTY",
     33    "CONTEXT_OBJECT_PROPERTY_DOT_REFERENCE",
     34    "CONTEXT_OBJECT_PROPERTY_DOT_REFERENCE_IS_FUNCTION",
     35    "CONTEXT_OBJECT_PROPERTY_DOT_GET",
     36    "CONTEXT_OBJECT_PROPERTY_DOT_SET",
     37    ];
     38 
     39 function r(keyword, tests)
     40 {
     41  /**
     42   * @param keyword
     43   *   the keyword as a string
     44   * @param tests
     45   *   array of test numbers against it, or leave undefined to run all tests
     46   *   against it
     47   */
     48  function Reserved(keyword, tests)
     49  {
     50    this.keyword = keyword;
     51    if (tests)
     52      this.tests = tests;
     53    else
     54      this.tests = ALL_TESTS;
     55  }
     56  Reserved.prototype =
     57    {
     58      toString:
     59      function()
     60      {
     61 return "'" + this.keyword + "' being run against tests " +
     62 this.tests;
     63      }
     64    };
     65  return new Reserved(keyword, tests);
     66 }
     67 
     68 // ECMA-262, 3rd. ed. keywords -- see 7.5.2
     69 const ECMA_262_3_KEYWORD =
     70  [
     71    r("break"),
     72    r("case"),
     73    r("catch"),
     74    r("continue"),
     75    r("default"),
     76    r("delete"),
     77    r("do"),
     78    r("else"),
     79    r("finally"),
     80    r("for"),
     81    r("function"),
     82    r("if"),
     83    r("in"),
     84    r("instanceof"),
     85    r("new"),
     86    r("return"),
     87    r("switch"),
     88    r("this"),
     89    r("throw"),
     90    r("try"),
     91    r("typeof"),
     92    r("var"),
     93    r("void"),
     94    r("while"),
     95    r("with"),
     96    ];
     97 
     98 // ECMA-262, 3rd. ed. future reserved keywords -- see 7.5.3
     99 const ECMA_262_3_FUTURERESERVEDKEYWORD =
    100  [
    101    r("abstract"),
    102    r("boolean"),
    103    r("byte"),
    104    r("char"),
    105    r("class"),
    106    r("const"),
    107    r("debugger"),
    108    r("double"),
    109    r("enum"),
    110    r("export"),
    111    r("extends"),
    112    r("final"),
    113    r("float"),
    114    r("goto"),
    115    r("implements"),
    116    r("import"),
    117    r("int"),
    118    r("interface"),
    119    r("long"),
    120    r("native"),
    121    r("package"),
    122    r("private"),
    123    r("protected"),
    124    r("public"),
    125    r("short"),
    126    r("static"),
    127    r("super"),
    128    r("synchronized"),
    129    r("throws"),
    130    r("transient"),
    131    r("volatile"),
    132    ];
    133 
    134 // like reserved words, but not quite reserved words
    135 const PSEUDO_RESERVED =
    136  [
    137    r("true"),
    138    r("false"),
    139    r("null"),
    140    ];
    141 
    142 // new-in-ES4 reserved words -- fill this as each is implemented
    143 const ECMA_262_4_RESERVED_WORDS =
    144  [
    145    r("let")
    146    ];
    147 
    148 
    149 
    150 /**
    151 * @param keyword
    152 *   string containing the tested keyword
    153 * @param test
    154 *   the number of the failing test
    155 * @param error
    156 *   the exception thrown when running the test
    157 */
    158 function Failure(keyword, test, error)
    159 {
    160  this.keyword = keyword;
    161  this.test = test;
    162  this.error = error;
    163 }
    164 Failure.prototype =
    165 {
    166  toString:
    167  function()
    168  {
    169    return "*** FAILURE on '" + this.keyword + "'!\n" +
    170    "* test:     " + this.test + "\n" +
    171    "* error:    " + this.error + "\n";
    172  }
    173 };
    174 
    175 function Tester()
    176 {
    177  this._failedTests = [];
    178 }
    179 Tester.prototype =
    180 {
    181  testReservedWords:
    182  function(reservedArray)
    183  {
    184    var rv;
    185    for (var i = 0, sz = reservedArray.length; i < sz; i++)
    186    {
    187      var res = reservedArray[i];
    188      if (!res)
    189 continue;
    190 
    191      var tests = res.tests;
    192      for (var j = 0, sz2 = tests.length; j < sz2; j++)
    193      {
    194 var test = tests[j];
    195 if (!test)
    196   continue;
    197 
    198 try
    199 {
    200   this._tests[test](res.keyword);
    201 }
    202 catch (e)
    203 {
    204   this._failedTests.push(new Failure(res.keyword, test, e));
    205 }
    206      }
    207    }
    208  },
    209  flushErrors:
    210  function ()
    211  {
    212    if (this._failedTests.length > 0) {
    213      var except = "*************************\n" +
    214      "* FAILURES ENCOUNTERED! *\n" +
    215      "*************************\n";
    216      for (var i = 0, sz = this._failedTests.length; i < sz; i++)
    217 except += this._failedTests[i];
    218      throw except;
    219    }
    220  },
    221  _tests:
    222  {
    223    CONTEXT_OBJECT_LITERAL_PROPERTY:
    224    function(keyword)
    225    {
    226      try
    227      {
    228 eval("var o = { " + keyword + ": 17 };\n" +
    229      "if (o['" + keyword + "'] != 17)\n" +
    230      "throw \"o['" + keyword + "'] == 17\";");
    231      }
    232      catch (e)
    233      {
    234 throw e;
    235      }
    236    },
    237    CONTEXT_OBJECT_PROPERTY_DOT_REFERENCE:
    238    function(keyword)
    239    {
    240      try
    241      {
    242 eval("var o = { \"" + keyword + "\": 17, baz: null };\n" +
    243      "if (o." + keyword + " != 17)\n" +
    244      "throw \"o." + keyword + " == 17\";");
    245      }
    246      catch (e)
    247      {
    248 throw e;
    249      }
    250    },
    251    CONTEXT_OBJECT_PROPERTY_DOT_REFERENCE_IS_FUNCTION:
    252    function(keyword)
    253    {
    254      try
    255      {
    256 eval("var o = { '" + keyword + "': function() { return 17; }, baz: null };\n" +
    257      "if (o." + keyword + "() != 17)\n" +
    258      "throw \"o." + keyword + " == 17\";");
    259      }
    260      catch (e)
    261      {
    262 throw e;
    263      }
    264    },
    265    CONTEXT_OBJECT_PROPERTY_DOT_GET:
    266    function(keyword)
    267    {
    268      try
    269      {
    270 var o = {};
    271 eval("o['" + keyword + "'] = 17;\n" +
    272      "if (o." + keyword + " != 17)\n" +
    273      "throw \"'o." + keyword + " != 17' failed!\";");
    274      }
    275      catch (e)
    276      {
    277 throw e;
    278      }
    279    },
    280    CONTEXT_OBJECT_PROPERTY_DOT_SET:
    281    function(keyword)
    282    {
    283      try
    284      {
    285 var o = {};
    286 eval("o." + keyword + " = 17;\n" +
    287      "if (o['" + keyword + "'] != 17)\n" +
    288      "throw \"'o." + keyword + " = 17' failed!\";");
    289      }
    290      catch (e)
    291      {
    292 throw e;
    293      }
    294    },
    295  }
    296 };
    297 
    298 
    299 /***************
    300 * BEGIN TESTS *
    301 ***************/
    302 
    303 var failed = false;
    304 
    305 try
    306 {
    307  var tester = new Tester();
    308  tester.testReservedWords(ECMA_262_3_KEYWORD);
    309  tester.testReservedWords(ECMA_262_3_FUTURERESERVEDKEYWORD);
    310  tester.testReservedWords(PSEUDO_RESERVED);
    311  tester.testReservedWords(ECMA_262_4_RESERVED_WORDS);
    312  tester.flushErrors();
    313 }
    314 catch (e)
    315 {
    316  failed = e;
    317 }
    318 
    319 expect = false;
    320 actual = failed;
    321 
    322 reportCompare(expect, actual, summary);