tor-browser

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

optimized-promise-already-resolved.js (2233B)


      1 // Promise created with default resolution functions (without instances) should
      2 // behave in the same way as normal case.
      3 
      4 class MockPromise {
      5  constructor(...args) {
      6    return new Promise(...args);
      7  }
      8 }
      9 
     10 for (const expected of ["resolve", "reject"]) {
     11  for (const unexpected of ["resolve", "reject"]) {
     12    let resolve, reject;
     13    const p = new Promise((a, b) => {
     14      resolve = a;
     15      reject = b;
     16    });
     17 
     18    // To prevent fast path in Promise.resolve that returns the passed promise,
     19    // modify constructor property.
     20    p.constructor = MockPromise;
     21 
     22    // Given `p` has custom constructor, Promise.resolve creates a new promise
     23    // instead of returning `p` itself.
     24    //
     25    // Newly created promise `optimized` does not have resolution function
     26    // instances.
     27    const optimized = Promise.resolve(p);
     28 
     29    // Newly created promise `normal` has resolution functions.
     30    const normal = new Promise(r => r(p));
     31 
     32    // These calls should be ignored because [[AlreadyResolved]] == true,
     33    if (unexpected === "resolve") {
     34      resolvePromise(optimized, "unexpected resolve optimized");
     35      resolvePromise(normal, "unexpected resolve normal");
     36    } else {
     37      rejectPromise(optimized, "unexpected reject optimized");
     38      rejectPromise(normal, "unexpected reject normal");
     39    }
     40 
     41    if (expected === "resolve") {
     42      resolve("resolve");
     43    } else {
     44      reject("reject");
     45    }
     46 
     47    let optimized_resolutionValue, optimized_rejectionValue;
     48    optimized.then(
     49      x => { optimized_resolutionValue = x; },
     50      x => { optimized_rejectionValue = x; }
     51    );
     52 
     53    let normal_resolutionValue, normal_rejectionValue;
     54    normal.then(
     55      x => { normal_resolutionValue = x; },
     56      x => { normal_rejectionValue = x; }
     57    );
     58 
     59    drainJobQueue();
     60 
     61    if (expected === "resolve") {
     62      assertEq(optimized_resolutionValue, "resolve",
     63               `${expected} + ${unexpected}`);
     64      assertEq(normal_resolutionValue, "resolve",
     65               `${expected} + ${unexpected}`);
     66    } else {
     67      assertEq(optimized_rejectionValue, "reject",
     68               `${expected} + ${unexpected}`);
     69      assertEq(normal_rejectionValue, "reject",
     70               `${expected} + ${unexpected}`);
     71    }
     72  }
     73 }