tor-browser

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

promise-rejection-events-iframe.html (4159B)


      1 <!doctype html>
      2 <meta charset=utf-8>
      3 <title></title>
      4 <div id="log"></div><br>
      5 <script src=/resources/testharness.js></script>
      6 <script src=/resources/testharnessreport.js></script>
      7 <script>
      8 'use strict';
      9 
     10 setup({
     11  allow_uncaught_exception: true
     12 });
     13 
     14 async_test(function(t) {
     15  createIframeAndStartTest(t, function(w) {
     16    let e = new Error();
     17    let promise = new w.Promise(function(_, reject) {
     18      setTimeout(function() {
     19        reject(e);
     20      }, 1);
     21    });
     22 
     23    let unhandled = function(evt) {
     24      if (evt.promise === promise) {
     25        t.step(function() {
     26          assert_equals(evt.reason, e);
     27          assert_equals(evt.promise, promise);
     28        });
     29        t.done();
     30      }
     31    };
     32    let handled = function(evt) {
     33      if (evt.promise === promise) {
     34        t.step(function() {
     35          assert_unreached('rejectionhandled event is not supposed to be triggered');
     36        });
     37      }
     38    };
     39 
     40    w.addEventListener('unhandledrejection', unhandled);
     41    w.addEventListener('rejectionhandled', handled);
     42    ensureCleanup(t, w, unhandled, handled);
     43  });
     44 }, "unhandledrejection: promise is created in iframe and being rejected elsewhere");
     45 
     46 async_test(function(t) {
     47  createIframeAndStartTest(t, function(w) {
     48    let e = new Error();
     49    let promise = w.Promise.reject(e);
     50 
     51    let unhandled = function(evt) {
     52      if (evt.promise === promise) {
     53        t.step(function() {
     54          assert_unreached('unhandledrejection event is not supposed to be triggered');
     55        });
     56      }
     57    };
     58    let handled = function(evt) {
     59      if (evt.promise === promise) {
     60        t.step(function() {
     61          assert_unreached('rejectionhandled event is not supposed to be triggered');
     62        });
     63      }
     64    };
     65 
     66    w.addEventListener('unhandledrejection', unhandled);
     67    w.addEventListener('rejectionhandled', handled);
     68    ensureCleanup(t, w, unhandled, handled);
     69 
     70    promise.catch(function() {});
     71    setTimeout(function() {
     72      t.done();
     73    }, 10);
     74  });
     75 }, 'no unhandledrejection/rejectionhandled: promise is created in iframe and being rejected elsewhere');
     76 
     77 async_test(function(t) {
     78  createIframeAndStartTest(t, function(w) {
     79    let e = new Error();
     80    let promise = w.Promise.reject(e);
     81    var unhandledPromises = [];
     82    var unhandledReasons = [];
     83    var handledPromises = [];
     84    var handledReasons = [];
     85 
     86    let unhandled = function(evt) {
     87      if (evt.promise === promise) {
     88        t.step(function() {
     89          unhandledPromises.push(evt.promise);
     90          unhandledReasons.push(evt.reason);
     91 
     92          setTimeout(function() {
     93            var unreached = t.unreached_func('promise should not be fulfilled');
     94            promise.then(unreached, function(reason) {
     95              assert_equals(reason, e);
     96              setTimeout(function() {
     97                assert_array_equals(handledPromises, [promise]);
     98                assert_array_equals(handledReasons, [e]);
     99                t.done();
    100              }, 10);
    101            });
    102          }, 10);
    103        });
    104      }
    105    };
    106    let handled = function(evt) {
    107      if (evt.promise === promise) {
    108        t.step(function() {
    109          assert_array_equals(unhandledPromises, [promise]);
    110          assert_array_equals(unhandledReasons, [e]);
    111          handledPromises.push(evt.promise);
    112          handledReasons.push(evt.reason);
    113        });
    114      }
    115    };
    116 
    117    w.addEventListener('unhandledrejection', unhandled);
    118    w.addEventListener('rejectionhandled', handled);
    119    ensureCleanup(t, w, unhandled, handled);
    120  });
    121 }, 'delayed handling: promise is created in iframe and being rejected elsewhere');
    122 
    123 // Helpers
    124 
    125 function createIframeAndStartTest(t, runTest) {
    126  var iframe = document.createElement("iframe");
    127  iframe.onload = function() {
    128    t.add_cleanup(() => iframe.remove());
    129    runTest(iframe.contentWindow);
    130  };
    131  iframe.srcdoc = '';
    132  document.documentElement.appendChild(iframe);
    133 }
    134 
    135 function ensureCleanup(t, win, unhandled, handled) {
    136  t.add_cleanup(function() {
    137    if (unhandled) {
    138      win.removeEventListener('unhandledrejection', unhandled);
    139    }
    140    if (handled) {
    141      win.removeEventListener('rejectionhandled', handled);
    142    }
    143  });
    144 }
    145 
    146 </script>