Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(719)

Side by Side Diff: LayoutTests/fast/dom/resources/promise-rejection-events.js

Issue 1179113007: Implement onunhandledrejection / onrejectionhandled events (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: updates Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 'use strict';
2 if (self.importScripts) {
3 self.importScripts('../../../resources/testharness.js');
4 }
5 //
domenic 2015/06/16 15:42:36 You killed all my nice separating newlines :(
jochen (gone - plz use gerrit) 2015/06/16 18:08:18 I blame this on paste... I'll put them back in
6 // Straightforward unhandledrejection tests
7 //
8 async_test(function(t) {
9 var e = new Error();
10 var p;
11 onUnhandledSucceed(t, e, function() { return p; });
12 p = Promise.reject(e);
13 }, 'unhandledrejection: from Promise.reject');
14 async_test(function(t) {
15 var e = new Error();
16 var p;
17 onUnhandledSucceed(t, e, function() { return p; });
18 p = new Promise(function(_, reject) {
19 reject(e);
20 });
21 }, 'unhandledrejection: from a synchronous rejection in new Promise');
22 async_test(function(t) {
23 var e = new Error();
24 var p;
25 onUnhandledSucceed(t, e, function() { return p; });
26 p = new Promise(function(_, reject) {
27 postMessageTask(function() {
28 reject(e);
29 });
30 });
31 }, 'unhandledrejection: from a task-delayed rejection');
32 async_test(function(t) {
33 var e = new Error();
34 var p;
35 onUnhandledSucceed(t, e, function() { return p; });
36 p = new Promise(function(_, reject) {
37 setTimeout(function() {
38 reject(e);
39 }, 1);
40 });
41 }, 'unhandledrejection: from a setTimeout-delayed rejection');
42 async_test(function(t) {
43 var e = new Error();
44 var e2 = new Error();
45 var promise2;
46 onUnhandledSucceed(t, e2, function() { return promise2; });
47 var unreached = t.unreached_func('promise should not be fulfilled');
48 promise2 = Promise.reject(e).then(unreached, function(reason) {
49 t.step(function() {
50 assert_equals(reason, e);
51 });
52 throw e2;
53 });
54 }, 'unhandledrejection: from a throw in a rejection handler chained off of Promi se.reject');
55 async_test(function(t) {
56 var e = new Error();
57 var e2 = new Error();
58 var promise2;
59 onUnhandledSucceed(t, e2, function() { return promise2; });
60 var unreached = t.unreached_func('promise should not be fulfilled');
61 promise2 = new Promise(function(_, reject) {
62 setTimeout(function() {
63 reject(e);
64 }, 1);
65 }).then(unreached, function(reason) {
66 t.step(function() {
67 assert_equals(reason, e);
68 });
69 throw e2;
70 });
71 }, 'unhandledrejection: from a throw in a rejection handler chained off of a set Timeout-delayed rejection');
72 async_test(function(t) {
73 var e = new Error();
74 var e2 = new Error();
75 var promise2;
76 onUnhandledSucceed(t, e2, function() { return promise2; });
77 var promise = new Promise(function(_, reject) {
78 setTimeout(function() {
79 reject(e);
80 postMicroTask(function() {
81 var unreached = t.unreached_func('promise should not be fulfilled');
82 promise2 = promise.then(unreached, function(reason) {
83 t.step(function() {
84 assert_equals(reason, e);
85 });
86 throw e2;
87 });
88 });
89 }, 1);
90 });
91 }, 'unhandledrejection: from a throw in a rejection handler attached one microta sk after a setTimeout-delayed rejection');
92 async_test(function(t) {
93 var e = new Error();
94 var p;
95 onUnhandledSucceed(t, e, function() { return p; });
96 p = Promise.resolve().then(function() {
97 return Promise.reject(e);
98 });
99 }, 'unhandledrejection: from returning a Promise.reject-created rejection in a f ulfillment handler');
100 async_test(function(t) {
101 var e = new Error();
102 var p;
103 onUnhandledSucceed(t, e, function() { return p; });
104 p = Promise.resolve().then(function() {
105 throw e;
106 });
107 }, 'unhandledrejection: from a throw in a fulfillment handler');
108 async_test(function(t) {
109 var e = new Error();
110 var p;
111 onUnhandledSucceed(t, e, function() { return p; });
112 p = Promise.resolve().then(function() {
113 return new Promise(function(_, reject) {
114 setTimeout(function() {
115 reject(e);
116 }, 1);
117 });
118 });
119 }, 'unhandledrejection: from returning a setTimeout-delayed rejection in a fulfi llment handler');
120 async_test(function(t) {
121 var e = new Error();
122 var p;
123 onUnhandledSucceed(t, e, function() { return p; });
124 p = Promise.all([Promise.reject(e)]);
125 }, 'unhandledrejection: from Promise.reject, indirected through Promise.all');
126 //
127 // Negative unhandledrejection/rejectionhandled tests with immediate attachment
128 //
129 async_test(function(t) {
130 var e = new Error();
131 var p;
132 onUnhandledFail(t, function() { return p; });
133 var unreached = t.unreached_func('promise should not be fulfilled');
134 p = Promise.reject(e).then(unreached, function() {});
135 }, 'no unhandledrejection/rejectionhandled: rejection handler attached synchrono usly to a promise from Promise.reject');
136 async_test(function(t) {
137 var e = new Error();
138 var p;
139 onUnhandledFail(t, function() { return p; });
140 var unreached = t.unreached_func('promise should not be fulfilled');
141 p = Promise.all([Promise.reject(e)]).then(unreached, function() {});
142 }, 'no unhandledrejection/rejectionhandled: rejection handler attached synchrono usly to a promise from ' +
143 'Promise.reject, indirecting through Promise.all');
144 async_test(function(t) {
145 var e = new Error();
146 var p;
147 onUnhandledFail(t, function() { return p; });
148 var unreached = t.unreached_func('promise should not be fulfilled');
149 p = new Promise(function(_, reject) {
150 reject(e);
151 }).then(unreached, function() {});
152 }, 'no unhandledrejection/rejectionhandled: rejection handler attached synchrono usly to a synchronously-rejected ' +
153 'promise created with new Promise');
154 async_test(function(t) {
155 var e = new Error();
156 var p;
157 onUnhandledFail(t, function() { return p; });
158 var unreached = t.unreached_func('promise should not be fulfilled');
159 p = Promise.resolve().then(function() {
160 throw e;
161 }).then(unreached, function(reason) {
162 t.step(function() {
163 assert_equals(reason, e);
164 });
165 });
166 }, 'no unhandledrejection/rejectionhandled: rejection handler attached synchrono usly to a promise created from ' +
167 'throwing in a fulfillment handler');
168 async_test(function(t) {
169 var e = new Error();
170 var p;
171 onUnhandledFail(t, function() { return p; });
172 var unreached = t.unreached_func('promise should not be fulfilled');
173 p = Promise.resolve().then(function() {
174 return Promise.reject(e);
175 }).then(unreached, function(reason) {
176 t.step(function() {
177 assert_equals(reason, e);
178 });
179 });
180 }, 'no unhandledrejection/rejectionhandled: rejection handler attached synchrono usly to a promise created from ' +
181 'returning a Promise.reject-created promise in a fulfillment handler');
182 async_test(function(t) {
183 var e = new Error();
184 var p;
185 onUnhandledFail(t, function() { return p; });
186 var unreached = t.unreached_func('promise should not be fulfilled');
187 p = Promise.resolve().then(function() {
188 return new Promise(function(_, reject) {
189 setTimeout(function() {
190 reject(e);
191 }, 1);
192 });
193 }).then(unreached, function(reason) {
194 t.step(function() {
195 assert_equals(reason, e);
196 });
197 });
198 }, 'no unhandledrejection/rejectionhandled: rejection handler attached synchrono usly to a promise created from ' +
199 'returning a setTimeout-delayed rejection in a fulfillment handler');
200 async_test(function(t) {
201 var e = new Error();
202 var p;
203 onUnhandledFail(t, function() { return p; });
204 postMessageTask(function() {
205 p = Promise.resolve().then(function() {
206 return Promise.reject(e);
207 })
208 .catch(function() {});
209 });
210 }, 'no unhandledrejection/rejectionhandled: all inside a queued task, a rejectio n handler attached synchronously to ' +
211 'a promise created from returning a Promise.reject-created promise in a fulfi llment handler');
212 //
213 // Negative unhandledrejection/rejectionhandled tests with delayed attachment
214 //
215 async_test(function(t) {
216 var e = new Error();
217 var p;
218 onUnhandledFail(t, function() { return p; });
219 p = Promise.reject(e);
220 postMicroTask(function() {
221 var unreached = t.unreached_func('promise should not be fulfilled');
222 p.then(unreached, function() {});
223 });
224 }, 'delayed handling: a microtask delay before attaching a handler prevents both events (Promise.reject-created ' +
225 'promise)');
226 async_test(function(t) {
227 var e = new Error();
228 var p;
229 onUnhandledFail(t, function() { return p; });
230 p = new Promise(function(_, reject) {
231 reject(e);
232 });
233 postMicroTask(function() {
234 var unreached = t.unreached_func('promise should not be fulfilled');
235 p.then(unreached, function() {});
236 });
237 }, 'delayed handling: a microtask delay before attaching a handler prevents both events (immediately-rejected new ' +
238 'Promise-created promise)');
239 async_test(function(t) {
240 var e = new Error();
241 var p1;
242 var p2;
243 onUnhandledFail(t, function() { return p1; });
244 onUnhandledFail(t, function() { return p2; });
245 p1 = new Promise(function(_, reject) {
246 postMicroTask(function() {
247 reject(e);
248 });
249 });
250 p2 = Promise.all([p1]);
251 postMicroTask(function() {
252 var unreached = t.unreached_func('promise should not be fulfilled');
253 p2.then(unreached, function() {});
254 });
255 }, 'delayed handling: a microtask delay before attaching the handler, and before rejecting the promise, indirected ' +
256 'through Promise.all');
257 //
258 // Positive unhandledrejection/rejectionhandled tests with delayed attachment
259 //
260 async_test(function(t) {
261 var e = new Error();
262 var p;
263 onUnhandledSucceed(t, e, function() { return p; });
264 var _reject;
265 p = new Promise(function(_, reject) {
266 _reject = reject;
267 });
268 _reject(e);
269 postMessageTask(function() {
270 var unreached = t.unreached_func('promise should not be fulfilled');
271 p.then(unreached, function() {});
272 });
273 }, 'delayed handling: a task delay before attaching a handler does not prevent u nhandledrejection');
274 async_test(function(t) {
275 var unhandledPromises = [];
276 var unhandledReasons = [];
277 var e = new Error();
278 var p;
279 var unhandled = function(ev) {
280 if (ev.promise === p) {
281 t.step(function() {
282 unhandledPromises.push(ev.promise);
283 unhandledReasons.push(ev.reason);
284 });
285 }
286 };
287 var handled = function(ev) {
288 if (ev.promise === p) {
289 t.step(function() {
290 assert_array_equals(unhandledPromises, [p]);
291 assert_array_equals(unhandledReasons, [e]);
292 assert_equals(ev.promise, p);
293 assert_equals(ev.reason, e);
294 });
295 }
296 };
297 addEventListener('unhandledrejection', unhandled);
298 addEventListener('rejectionhandled', handled);
299 ensureCleanup(t, unhandled, handled);
300 p = new Promise(function() {
301 throw e;
302 });
303 setTimeout(function() {
304 var unreached = t.unreached_func('promise should not be fulfilled');
305 p.then(unreached, function(reason) {
306 assert_equals(reason, e);
307 setTimeout(function() { t.done(); }, 10);
308 });
309 }, 10);
310 }, 'delayed handling: delaying handling by setTimeout(,10) will cause both event s to fire');
311 async_test(function(t) {
312 var e = new Error();
313 var p;
314 onUnhandledSucceed(t, e, function() { return p; });
315 p = Promise.reject(e);
316 postMessageTask(function() {
317 Promise.resolve().then(function() {
318 p.catch(function() {});
319 });
320 });
321 }, 'delayed handling: postMessageTask after promise creation/rejection, plus pro mise microtasks, is too late to ' +
322 'attach a rejection handler');
323 async_test(function(t) {
324 var e = new Error();
325 var p;
326 onUnhandledSucceed(t, e, function() { return p; });
327 postMessageTask(function() {
328 Promise.resolve().then(function() {
329 Promise.resolve().then(function() {
330 Promise.resolve().then(function() {
331 Promise.resolve().then(function() {
332 p.catch(function() {});
333 });
334 });
335 });
336 });
337 });
338 p = Promise.reject(e);
339 }, 'delayed handling: postMessageTask before promise creation/rejection, plus ma ny promise microtasks, is too late ' +
340 'to attach a rejection handler');
341 async_test(function(t) {
342 var e = new Error();
343 var p;
344 onUnhandledSucceed(t, e, function() { return p; });
345 p = Promise.reject(e);
346 postMessageTask(function() {
347 Promise.resolve().then(function() {
348 Promise.resolve().then(function() {
349 Promise.resolve().then(function() {
350 Promise.resolve().then(function() {
351 p.catch(function() {});
352 });
353 });
354 });
355 });
356 });
357 }, 'delayed handling: postMessageTask after promise creation/rejection, plus man y promise microtasks, is too late ' +
358 'to attach a rejection handler');
359 //
360 // Miscellaneous tests about integration with the rest of the platform
361 //
362 async_test(function(t) {
363 var e = new Error();
364 var l = function(ev) {
365 var order = [];
366 postMicroTask(function() {
367 order.push(1);
368 });
369 setTimeout(function() {
370 order.push(2);
371 t.step(function() {
372 assert_array_equals(order, [1, 2]);
373 });
374 t.done();
375 }, 1);
376 };
377 addEventListener('unhandledrejection', l);
378 ensureCleanup(t, l);
379 Promise.reject(e);
380 }, 'postMicroTask vs. postMessageTask ordering is not disturbed inside unhandled rejection events');
381 //
382 // HELPERS
383 //
384 function postMessageTask(f) {
385 if ('document' in self) {
386 var l = function() {
387 removeEventListener('message', l);
388 f();
389 };
390 addEventListener('message', l);
391 postMessage('abusingpostmessageforfunandprofit', '*');
392 } else {
393 setTimeout(function() { f(); }, 0);
domenic 2015/06/16 15:42:36 Should use MessageChannel in workers. https://gith
jochen (gone - plz use gerrit) 2015/06/17 07:57:53 done
394 }
395 }
396 function postMicroTask(f) {
397 Promise.resolve().then(function() { f(); });
domenic 2015/06/16 15:42:36 Kind of the point of the microtask tests is to tes
jochen (gone - plz use gerrit) 2015/06/16 18:08:18 i'll put them back. from an implementation point
398 }
399 function onUnhandledSucceed(t, expectedReason, expectedPromiseGetter) {
400 var l = function(ev) {
401 if (ev.promise === expectedPromiseGetter()) {
domenic 2015/06/16 15:42:36 This if seems bad. If they mismatch, then the test
jochen (gone - plz use gerrit) 2015/06/16 18:08:18 without this, none of the tests will work, as they
402 t.step(function() {
403 assert_equals(ev.reason, expectedReason);
404 assert_equals(ev.promise, expectedPromiseGetter());
405 });
406 t.done();
407 }
408 };
409 addEventListener('unhandledrejection', l);
410 ensureCleanup(t, l);
411 }
412 function onUnhandledFail(t, expectedPromiseGetter) {
413 var unhandled = function(evt) {
414 if (evt.promise === expectedPromiseGetter()) {
415 t.unreached_func('unhandledrejection event is not supposed to be triggered ');
416 }
417 };
418 var handled = function(evt) {
419 if (evt.promise === expectedPromiseGetter()) {
420 t.unreached_func('rejectionhandled event is not supposed to be triggered') ;
421 }
422 };
423 addEventListener('unhandledrejection', unhandled);
424 addEventListener('rejectionhandled', handled);
425 ensureCleanup(t, unhandled, handled);
426 setTimeout(function() {
427 t.done();
428 }, 10);
429 }
430 function ensureCleanup(t, unhandled, handled) {
431 t.add_cleanup(function() {
432 if (unhandled)
433 removeEventListener('unhandledrejection', unhandled);
434 if (handled)
435 removeEventListener('rejectionhandled', handled);
436 });
437 }
438
439 done();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698