tor-browser

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

capture-stack-async.js (2257B)


      1 // |jit-test| skip-if: getBuildConfiguration("release_or_beta"); --setpref=experimental.error_capture_stack_trace;
      2 
      3 function test_async_reparenting_with_filter() {
      4    let obj = {};
      5    let err = undefined;
      6 
      7    async function caller(callee) {
      8        return callee();
      9    }
     10 
     11 
     12    async function* a() {
     13        yield {};
     14        Error.captureStackTrace(obj, caller)
     15        err = new Error;
     16        yield {};
     17    }
     18 
     19    async function b() {
     20        return { a: 10 }
     21    }
     22 
     23 
     24    b().then(async () => {
     25        caller(async () => {
     26            let g = a();
     27            await g.next();
     28            await g.next();
     29            await g.next();
     30        })
     31    }).then(() => {
     32        // Note: No browser is re-parenting a stack and then filtering.
     33        //       So Safari & Chrome both report empty stacks for obj, where
     34        //       the stack obtained through Error is re-parented.
     35        //
     36        // Chrome 132:
     37        // Error
     38        //    at a (<anonymous>:12:11)
     39        //    at a.next (<anonymous>)
     40        //    at <anonymous>:24:17
     41        //
     42        // Safari
     43        //  @
     44        //  @
     45        //
     46        console.log("Capture: ")
     47        console.log(obj.stack);
     48        console.log("Stack")
     49        console.log(err.stack);
     50        assertEq(obj.stack, "");
     51        assertEq(err.stack == "", false);
     52    })
     53 }
     54 test_async_reparenting_with_filter();
     55 
     56 
     57 
     58 function test_async_reparenting_without_filter() {
     59    let obj = {};
     60    let err = undefined;
     61 
     62    async function caller(callee) {
     63        return callee();
     64    }
     65 
     66 
     67    async function* a() {
     68        yield {};
     69        Error.captureStackTrace(obj)
     70        err = new Error;
     71        yield {};
     72    }
     73 
     74    async function b() {
     75        return { a: 10 }
     76    }
     77 
     78 
     79    b().then(async () => {
     80        caller(async () => {
     81            let g = a();
     82            await g.next();
     83            await g.next();
     84            await g.next();
     85        })
     86    }).then(() => {
     87        // Note: In the shell we re-parent this stack and so get the same
     88        // stack as the Error getter.
     89        console.log("Capture: ")
     90        console.log(obj.stack);
     91        console.log("Stack")
     92        console.log(err.stack);
     93        assertEq(obj.stack.length, err.stack.length);
     94    })
     95 }
     96 test_async_reparenting_without_filter();