From 5d043915fe6c1d6f3f8ce040eb27e4143be8ccdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski-Owczarek?= Date: Mon, 28 Apr 2025 11:37:48 +0200 Subject: [PATCH] Deferred: Don't warn on setting getStackHook to the getErrorHook value Don't warn if `jQuery.Deferred.getStackHook` is set to the value of `jQuery.Deferred.getErrorHook`. This is to facilitate plugins supporting both jQuery <3.7 and older without triggering Migrate warnings and without requiring complex logic parsing `jQuery.fn.jquery`. Ref gh-577 --- src/jquery/deferred.js | 10 +++++++--- test/unit/jquery/deferred.js | 7 ++++++- warnings.md | 4 ++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/jquery/deferred.js b/src/jquery/deferred.js index bb78cd3e..4fb22844 100644 --- a/src/jquery/deferred.js +++ b/src/jquery/deferred.js @@ -88,10 +88,14 @@ Object.defineProperty( jQuery.Deferred, "getStackHook", { }, set: function( newValue ) { if ( jQuery.migrateIsPatchEnabled( "deferred-getStackHook" ) ) { - migrateWarn( "deferred-getStackHook", - "jQuery.Deferred.getStackHook is deprecated; " + + + // Only warn if `getErrorHook` wasn't set to the same value first. + if ( jQuery.Deferred.getErrorHook !== newValue ) { + migrateWarn( "deferred-getStackHook", + "jQuery.Deferred.getStackHook is deprecated; " + "use jQuery.Deferred.getErrorHook" ); - jQuery.Deferred.getErrorHook = newValue; + jQuery.Deferred.getErrorHook = newValue; + } } else { unpatchedGetStackHookValue = newValue; } diff --git a/test/unit/jquery/deferred.js b/test/unit/jquery/deferred.js index 07a0ec9a..86ae218e 100644 --- a/test/unit/jquery/deferred.js +++ b/test/unit/jquery/deferred.js @@ -77,7 +77,7 @@ QUnit.test( "jQuery.Deferred.getStackHook - getter, no getErrorHook", function( } ); QUnit.test( "jQuery.Deferred.getStackHook - setter", function( assert ) { - assert.expect( 5 ); + assert.expect( 6 ); var exceptionHookSpy, done = assert.async(); @@ -91,6 +91,11 @@ QUnit.test( "jQuery.Deferred.getStackHook - setter", function( assert ) { "getStackHook mirrors getErrorHook (setter)" ); } ); + expectNoWarning( assert, "jQuery.Deferred.getStackHook - setter", 1, function() { + var mockFn = function() {}; + jQuery.Deferred.getStackHook = jQuery.Deferred.getErrorHook = mockFn; + } ); + expectWarning( assert, "asyncHook from jQuery.Deferred.getStackHook reported", 1, function() { jQuery.Deferred.getStackHook = function() { diff --git a/warnings.md b/warnings.md index e6979b68..f3adecbf 100644 --- a/warnings.md +++ b/warnings.md @@ -319,6 +319,6 @@ See jQuery-ui [commit](https://github.com/jquery/jquery-ui/commit/c0093b599fcd58 ### \[deferred-getStackHook\] JQMIGRATE: jQuery.Deferred.getStackHook is deprecated; use jQuery.Deferred.getErrorHook -**Cause:** `jQuery.Deferred.getStackHook` was originally created to pass the stack trace from before an async barrier to report when a user error (like calling a non-existing function) causes a promise to be rejected. However, passing a stack trace doesn't take source maps into account, so we started advising to pass the whole error object. To make it clearer, we also renamed the API to `jQuery.Deferred.getErrorHook`. The legacy alias will be removed in jQuery 4.0.0 +**Cause:** `jQuery.Deferred.getStackHook` was originally created to pass the stack trace from before an async barrier to report when a user error (like calling a non-existing function) causes a promise to be rejected. However, passing a stack trace doesn't take source maps into account, so we started advising to pass the whole error object. To make it clearer, we also renamed the API to `jQuery.Deferred.getErrorHook`. The legacy alias will be removed in jQuery 4.0.0. -**Solution:** Rename all usage of `jQuery.Deferred.getStackHook` to `jQuery.Deferred.getErrorHook`. If you previously assigned a function returning an error stack to `jQuery.Deferred.getStackHook` or `jQuery.Deferred.getErrorHook`, change it to return a full error object. +**Solution:** Rename all usage of `jQuery.Deferred.getStackHook` to `jQuery.Deferred.getErrorHook`. If you previously assigned a function returning an error stack to `jQuery.Deferred.getStackHook` or `jQuery.Deferred.getErrorHook`, change it to return a full error object. If you aim to still support jQuery <3.7, assign the hook to `jQuery.Deferred.getErrorHook` first and only later to `jQuery.Deferred.getStackHook` to avoid a Migrate warning.