tor-browser

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

ErrorStack.js (4627B)


      1 // |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
      2 
      3 var BUGNUMBER = 1343158;
      4 var summary = "Error.stack should provide meaningful stack trace in async function";
      5 
      6 print(BUGNUMBER + ": " + summary);
      7 
      8 let COOKIE = "C0F5DBB89807";
      9 
     10 async function thrower() {
     11    let stack = new Error().stack; // line 11
     12    assertEq(/^thrower@.+ErrorStack.js:11/m.test(stack), true, toMessage(stack));
     13    assertEq(/^inner@.+ErrorStack.js:38/m.test(stack), true, toMessage(stack));
     14    assertEq(/^async\*middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack));
     15    assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
     16    assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
     17 
     18    throw new Error(COOKIE); // line 18
     19 }
     20 
     21 async function inner() {
     22    let stack = new Error().stack; // line 22
     23    assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
     24    assertEq(/^inner@.+ErrorStack.js:22/m.test(stack), true, toMessage(stack));
     25    assertEq(/^middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack));
     26    assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
     27    assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
     28 
     29    await Promise.resolve(100);
     30 
     31    stack = new Error().stack; // line 31
     32    assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
     33    assertEq(/^inner@.+ErrorStack.js:31/m.test(stack), true, toMessage(stack));
     34    assertEq(/^async\*middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack));
     35    assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
     36    assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
     37 
     38    await thrower(); // line 38
     39 }
     40 
     41 async function middle() {
     42    let stack = new Error().stack; // line 42
     43    assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
     44    assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
     45    assertEq(/^middle@.+ErrorStack.js:42/m.test(stack), true, toMessage(stack));
     46    assertEq(/^outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
     47    assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
     48 
     49    await Promise.resolve(1000);
     50 
     51    stack = new Error().stack; // line 51
     52    assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
     53    assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
     54    assertEq(/^middle@.+ErrorStack.js:51/m.test(stack), true, toMessage(stack));
     55    assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
     56    assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
     57 
     58    await inner(); // line 58
     59 }
     60 
     61 async function outer() {
     62    let stack = new Error().stack; // line 62
     63    assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
     64    assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
     65    assertEq(/middle@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
     66    assertEq(/^outer@.+ErrorStack.js:62/m.test(stack), true, toMessage(stack));
     67    assertEq(/^@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
     68 
     69    await Promise.resolve(10000);
     70 
     71    stack = new Error().stack; // line 71
     72    assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
     73    assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
     74    assertEq(/middle@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
     75    assertEq(/^outer@.+ErrorStack.js:71/m.test(stack), true, toMessage(stack));
     76    assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
     77 
     78    await middle(); // line 78
     79 }
     80 
     81 try {
     82    getPromiseResult(outer()); // line 82
     83    assertEq(true, false);
     84 } catch (e) {
     85    // Re-throw the exception to log the assertion failure properly.
     86    if (!e.message.includes(COOKIE))
     87        throw e;
     88 
     89    let stack = e.stack;
     90    assertEq(/^thrower@.+ErrorStack.js:18/m.test(stack), true, toMessage(stack));
     91    assertEq(/^inner@.+ErrorStack.js:38/m.test(stack), true, toMessage(stack));
     92    assertEq(/^async\*middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack));
     93    assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
     94    assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
     95 }
     96 
     97 function toMessage(stack) {
     98    // Provide the stack string in the error message for debugging.
     99    return `[stack: ${stack.replace(/\n/g, "\\n")}]`;
    100 }
    101 
    102 if (typeof reportCompare === "function")
    103    reportCompare(true, true);