|
10 | 10 | <script>
|
11 | 11 | 'use strict';
|
12 | 12 |
|
| 13 | +setup({ |
| 14 | + allow_uncaught_exception: true |
| 15 | +}); |
| 16 | + |
13 | 17 | (function() {
|
14 | 18 | var resolveLoaded;
|
15 | 19 | var loadedPromise = new Promise(function(resolve) { resolveLoaded = resolve; });
|
16 | 20 |
|
17 |
| - async_test(function(t) { |
18 |
| - addEventListener('unhandledrejection', t.unreached_func('unhandledrejection event should never be triggered')); |
19 |
| - addEventListener('rejectionhandled', t.unreached_func('rejectionhandled event should never be triggered')); |
| 21 | + promise_test(function(t) { |
| 22 | + var unreachedUnhandled = t.unreached_func('unhandledrejection event should never be triggered'); |
| 23 | + var unreachedHandled = t.unreached_func('rejectionhandled event should never be triggered'); |
| 24 | + |
| 25 | + addEventListener('unhandledrejection', unreachedUnhandled); |
| 26 | + addEventListener('rejectionhandled', unreachedHandled); |
| 27 | + ensureCleanup(t, unreachedUnhandled, unreachedHandled); |
| 28 | + |
| 29 | + return loadedPromise.then(t.step_func(function() { |
| 30 | + return new Promise(function(resolve) { |
| 31 | + t.step_timeout(function() { |
| 32 | + resolve(); |
| 33 | + }, 1000); |
| 34 | + }); |
| 35 | + })); |
| 36 | + }, 'Promise rejection event should be muted for cross-origin non-CORS script'); |
| 37 | + |
| 38 | + promise_test(function(t) { |
| 39 | + var unreachedUnhandled = t.unreached_func('unhandledrejection event should never be triggered'); |
| 40 | + var unreachedHandled = t.unreached_func('rejectionhandled event should never be triggered'); |
20 | 41 |
|
21 |
| - loadedPromise.then(t.step_func(function() { |
| 42 | + addEventListener('unhandledrejection', unreachedUnhandled); |
| 43 | + addEventListener('rejectionhandled', unreachedHandled); |
| 44 | + ensureCleanup(t, unreachedUnhandled, unreachedHandled); |
| 45 | + |
| 46 | + return new Promise(function(resolve) { |
| 47 | + handleRejectedPromise(new Promise(function(resolve, reject) { reject(42); })); |
22 | 48 | t.step_timeout(function() {
|
23 |
| - t.done(); |
| 49 | + resolve(); |
24 | 50 | }, 1000);
|
| 51 | + }); |
| 52 | + }, 'Promise rejection should be muted if the rejected promise is handled in cross-origin non-CORS script'); |
| 53 | + |
| 54 | + promise_test(function(t) { |
| 55 | + var promise = new Promise(function(resolve, reject) { reject(42); }); |
| 56 | + var resolveReceived; |
| 57 | + var eventPromise = new Promise(function(resolve) { resolveReceived = resolve; }); |
| 58 | + var unhandled = t.step_func(function(e) { |
| 59 | + if (e.promise === promise) { |
| 60 | + handleRejectedPromise(promise); |
| 61 | + resolveReceived(); |
| 62 | + } |
| 63 | + }); |
| 64 | + var unreachedHandled = t.unreached_func('rejectionhandled event should never be triggered'); |
| 65 | + |
| 66 | + addEventListener('unhandledrejection', unhandled); |
| 67 | + addEventListener('rejectionhandled', unreachedHandled); |
| 68 | + ensureCleanup(t, unhandled, unreachedHandled); |
| 69 | + |
| 70 | + return eventPromise.then(t.step_func(function() { |
| 71 | + return new Promise(function(resolve) { |
| 72 | + t.step_timeout(function() { |
| 73 | + resolve(); |
| 74 | + }, 1000); |
| 75 | + }); |
25 | 76 | }));
|
26 |
| - }, 'Promise rejection event should be muted for cross-origin non-CORS script'); |
| 77 | + }, 'Promise rejection should be muted if the rejected promise is handled in unhandledrejection event handler in cross-origin non-CORS script'); |
| 78 | + |
| 79 | + function ensureCleanup(t, unhandled, handled) { |
| 80 | + t.add_cleanup(function() { |
| 81 | + if (unhandled) { |
| 82 | + removeEventListener('unhandledrejection', unhandled); |
| 83 | + } |
| 84 | + if (handled) { |
| 85 | + removeEventListener('rejectionhandled', handled); |
| 86 | + } |
| 87 | + }); |
| 88 | + } |
27 | 89 |
|
28 | 90 | var scriptEl = document.createElement('script');
|
29 | 91 | scriptEl.src = CROSSDOMAIN + 'support/promise-access-control.py?allow=false';
|
|
0 commit comments