tor-browser

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

promise-race-with-default-resolving-internal.js (1709B)


      1 function newPromiseCapability() {
      2    let resolve, reject, promise = new Promise(function(r1, r2) {
      3        resolve = r1;
      4        reject = r2;
      5    });
      6    return {promise, resolve, reject};
      7 }
      8 
      9 function neverCalled() {
     10    // Quit with non-zero exit code to ensure a test suite error is shown,
     11    // even when this function is called within promise handlers which normally
     12    // swallow any exceptions.
     13    quit(1);
     14 }
     15 
     16 var c = 0;
     17 var g_resolve;
     18 
     19 class P extends Promise {
     20    constructor(executor) {
     21        // Only the very first object created through this constructor gets
     22        // special treatment, all other invocations create built-in Promise
     23        // objects.
     24        if (c++ > 1) {
     25            return new Promise(executor);
     26        }
     27 
     28        // Pass a native ResolvePromiseFunction function as the resolve handler.
     29        // (It's okay that the promise of this promise capability is never used.)
     30        executor(newPromiseCapability().resolve, neverCalled);
     31 
     32        let {promise, resolve} = newPromiseCapability();
     33        g_resolve = resolve;
     34 
     35        // Use an async function to create a Promise without resolving functions.
     36        return async function(){ await promise; return 456; }();
     37    }
     38 
     39    // Ensure we don't take the (spec) fast path in Promise.resolve and instead
     40    // create a new promise object. (We could not provide an override at all
     41    // and rely on the default behaviour, but giving an explicit definition
     42    // may help to interpret this test case.)
     43    static resolve(v) {
     44        return super.resolve(v);
     45    }
     46 }
     47 
     48 let {promise: alwaysPending} = newPromiseCapability();
     49 
     50 P.race([alwaysPending]).then(neverCalled, neverCalled);
     51 
     52 g_resolve(123);
     53 
     54 drainJobQueue();