blob: d61618a53ef8afd3cdd2527a0f7f7b094caf570b [file] [log] [blame]
<!DOCTYPE html>
<meta charset="utf-8">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cors/support.js?pipe=sub"></script>
<link rel="help" href="https://html.spec.whatwg.org/#unhandled-promise-rejections">
<link rel="help" href="https://html.spec.whatwg.org/#muted-errors">
<body>
<script>
'use strict';
setup({
allow_uncaught_exception: true
});
(function() {
var resolveLoaded;
var loadedPromise = new Promise(function(resolve) { resolveLoaded = resolve; });
promise_test(function(t) {
var unreachedUnhandled = t.unreached_func('unhandledrejection event should never be triggered');
var unreachedHandled = t.unreached_func('rejectionhandled event should never be triggered');
addEventListener('unhandledrejection', unreachedUnhandled);
addEventListener('rejectionhandled', unreachedHandled);
ensureCleanup(t, unreachedUnhandled, unreachedHandled);
return loadedPromise.then(t.step_func(function() {
return new Promise(function(resolve) {
t.step_timeout(function() {
resolve();
}, 1000);
});
}));
}, 'Promise rejection event should be muted for cross-origin non-CORS script');
promise_test(function(t) {
var unreachedUnhandled = t.unreached_func('unhandledrejection event should never be triggered');
var unreachedHandled = t.unreached_func('rejectionhandled event should never be triggered');
addEventListener('unhandledrejection', unreachedUnhandled);
addEventListener('rejectionhandled', unreachedHandled);
ensureCleanup(t, unreachedUnhandled, unreachedHandled);
return new Promise(function(resolve) {
handleRejectedPromise(new Promise(function(resolve, reject) { reject(42); }));
t.step_timeout(function() {
resolve();
}, 1000);
});
}, 'Promise rejection should be muted if the rejected promise is handled in cross-origin non-CORS script');
promise_test(function(t) {
var promise = new Promise(function(resolve, reject) { reject(42); });
var resolveReceived;
var eventPromise = new Promise(function(resolve) { resolveReceived = resolve; });
var unhandled = t.step_func(function(e) {
if (e.promise === promise) {
handleRejectedPromise(promise);
resolveReceived();
}
});
var unreachedHandled = t.unreached_func('rejectionhandled event should never be triggered');
addEventListener('unhandledrejection', unhandled);
addEventListener('rejectionhandled', unreachedHandled);
ensureCleanup(t, unhandled, unreachedHandled);
return eventPromise.then(t.step_func(function() {
return new Promise(function(resolve) {
t.step_timeout(function() {
resolve();
}, 1000);
});
}));
}, 'Promise rejection should be muted if the rejected promise is handled in unhandledrejection event handler in cross-origin non-CORS script');
function ensureCleanup(t, unhandled, handled) {
t.add_cleanup(function() {
if (unhandled) {
removeEventListener('unhandledrejection', unhandled);
}
if (handled) {
removeEventListener('rejectionhandled', handled);
}
});
}
var scriptEl = document.createElement('script');
scriptEl.src = CROSSDOMAIN + 'support/promise-access-control.py?allow=false';
scriptEl.onload = resolveLoaded;
document.body.appendChild(scriptEl);
}());
</script>
</body>