From 0b9c5037f707a0b8e0dbb11776b690ae7dde7123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82=C4=99biowski-Owczarek?= Date: Wed, 1 Feb 2023 13:46:44 +0100 Subject: [PATCH] Deferred: Respect source maps in jQuery.Deferred.exceptionHook So far, `jQuery.Deferred.exceptionHook` used to log error message and stack separately. However, that breaks browser applying source maps against the stack trace - most browsers require logging an error instance. This change makes us do exactly that. One drawback of the change is that in IE 11 previously stack was printed directly and now just the error summary; to get to the actual stack trace, three clicks are required. This seems to be a low price to pay for having source maps work in all the other browsers, though. Safari with the new change requires one click to get to the stack trace which sounds manageable. Fixes gh-3179 Closes gh-5192 Ref https://crbug.com/622227 --- src/deferred/exceptionHook.js | 4 ++-- test/unit/deferred.js | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/deferred/exceptionHook.js b/src/deferred/exceptionHook.js index 2e3c7cc35c..0315b2ecba 100644 --- a/src/deferred/exceptionHook.js +++ b/src/deferred/exceptionHook.js @@ -10,8 +10,8 @@ jQuery.Deferred.exceptionHook = function( error, stack ) { if ( error && rerrorNames.test( error.name ) ) { window.console.warn( - "jQuery.Deferred exception: " + error.message, - error.stack, + "jQuery.Deferred exception", + error, stack ); } diff --git a/test/unit/deferred.js b/test/unit/deferred.js index 535dc0115b..8a215ff998 100644 --- a/test/unit/deferred.js +++ b/test/unit/deferred.js @@ -575,9 +575,9 @@ QUnit.test( "jQuery.Deferred.exceptionHook", function( assert ) { defer = jQuery.Deferred(), oldWarn = window.console.warn; - window.console.warn = function() { - var msg = Array.prototype.join.call( arguments, " " ); - assert.ok( /barf/.test( msg ), "Message: " + msg ); + window.console.warn = function( _intro, error ) { + assert.ok( /barf/.test( error.message + "\n" + error.stack ), + "Error mentions the method: " + error.message + "\n" + error.stack ); }; jQuery.when(