if ( jQuery.Deferred.exceptionHook ) {
jQuery.Deferred.exceptionHook( e,
- process.stackTrace );
+ process.error );
}
// Support: Promises/A+ section 2.3.3.3.4.1
process();
} else {
- // Call an optional hook to record the stack, in case of exception
+ // Call an optional hook to record the error, in case of exception
// since it's otherwise lost when execution goes async
- if ( jQuery.Deferred.getStackHook ) {
- process.stackTrace = jQuery.Deferred.getStackHook();
+ if ( jQuery.Deferred.getErrorHook ) {
+ process.error = jQuery.Deferred.getErrorHook();
}
window.setTimeout( process );
}
// warn about them ASAP rather than swallowing them by default.
var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
-jQuery.Deferred.exceptionHook = function( error, stack ) {
+// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error
+// captured before the async barrier to get the original error cause
+// which may otherwise be hidden.
+jQuery.Deferred.exceptionHook = function( error, asyncError ) {
if ( error && rerrorNames.test( error.name ) ) {
window.console.warn(
"jQuery.Deferred exception",
error,
- stack
+ asyncError
);
}
};
defer.resolve();
} );
-QUnit.test( "jQuery.Deferred.exceptionHook with stack hooks", function( assert ) {
+QUnit.test( "jQuery.Deferred.exceptionHook with error hooks", function( assert ) {
assert.expect( 2 );
defer = jQuery.Deferred(),
oldWarn = window.console.warn;
- jQuery.Deferred.getStackHook = function() {
+ jQuery.Deferred.getErrorHook = function() {
// Default exceptionHook assumes the stack is in a form console.warn can log,
- // but a custom getStackHook+exceptionHook pair could save a raw form and
+ // but a custom getErrorHook+exceptionHook pair could save a raw form and
// format it to a string only when an exception actually occurs.
// For the unit test we just ensure the plumbing works.
- return "NO STACK FOR YOU";
+ return "NO ERROR FOR YOU";
};
window.console.warn = function() {
var msg = Array.prototype.join.call( arguments, " " );
assert.ok( /cough_up_hairball/.test( msg ), "Function mentioned: " + msg );
- assert.ok( /NO STACK FOR YOU/.test( msg ), "Stack trace included: " + msg );
+ assert.ok( /NO ERROR FOR YOU/.test( msg ), "Error included: " + msg );
};
defer.then( function() {
jQuery.cough_up_hairball();
} ).then( null, function( ) {
window.console.warn = oldWarn;
- delete jQuery.Deferred.getStackHook;
+ delete jQuery.Deferred.getErrorHook;
done();
} );