Skip to content

Commit

Permalink
Deferred: Rename getStackHook to getErrorHook
Browse files Browse the repository at this point in the history
Rename `jQuery.Deferred.getStackHook` to `jQuery.Deferred.getErrorHook`
to indicate passing an error instance is usually a better choice - it
works with source maps while a raw stack generally does not.

In jQuery `3.7.0`, we'll keep both names, marking the old one as
deprecated. In jQuery `4.0.0` we'll just keep the new one. This
change implements the `4.0.0` version; PR gh-5212 implements
the `3.7.0` one.

Fixes gh-5201
Closes gh-5211
Ref gh-5212
  • Loading branch information
mgol committed Mar 14, 2023
1 parent f088c36 commit 258ca1e
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 12 deletions.
8 changes: 4 additions & 4 deletions src/deferred.js
Expand Up @@ -188,7 +188,7 @@ jQuery.extend( {

if ( jQuery.Deferred.exceptionHook ) {
jQuery.Deferred.exceptionHook( e,
process.stackTrace );
process.error );
}

// Support: Promises/A+ section 2.3.3.3.4.1
Expand Down Expand Up @@ -216,10 +216,10 @@ jQuery.extend( {
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 );
}
Expand Down
7 changes: 5 additions & 2 deletions src/deferred/exceptionHook.js
Expand Up @@ -6,13 +6,16 @@ import "../deferred.js";
// 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
);
}
};
12 changes: 6 additions & 6 deletions test/unit/deferred.js
Expand Up @@ -602,34 +602,34 @@ QUnit.test( "jQuery.Deferred.exceptionHook", function( assert ) {
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 );

var done = assert.async(),
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();
} );

Expand Down

0 comments on commit 258ca1e

Please sign in to comment.