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>