From d5dae259eb52a838f94703d51999f63deec19bfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Wed, 8 Jun 2016 14:22:13 +0200 Subject: [PATCH] Deferred: Propagate progress correctly from unwrapped promises Progress parameters are now correctly propagated from a deferred to which another deferred resolved unwrapping it. Thanks to @gibson042 for the report and a clear description of the problem and the needed fix. Fixes gh-3062 Closes gh-3150 --- src/deferred.js | 2 +- test/unit/deferred.js | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/deferred.js b/src/deferred.js index 73b2f9ef2..a7938025c 100644 --- a/src/deferred.js +++ b/src/deferred.js @@ -162,7 +162,7 @@ jQuery.extend( { resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ), resolve( maxDepth, deferred, Identity, - deferred.notify ) + deferred.notifyWith ) ); } diff --git a/test/unit/deferred.js b/test/unit/deferred.js index d8ea1918f..3e147a96e 100644 --- a/test/unit/deferred.js +++ b/test/unit/deferred.js @@ -768,6 +768,36 @@ QUnit.test( "jQuery.Deferred - notify and resolve", function( assert ) { } ); } ); +QUnit.test( "jQuery.Deferred - resolved to a notifying deferred", function( assert ) { + + assert.expect( 2 ); + + var deferred = jQuery.Deferred(), + done = assert.async( 2 ); + + deferred.resolve( jQuery.Deferred( function( notifyingDeferred ) { + notifyingDeferred.notify( "foo", "bar" ); + notifyingDeferred.resolve( "baz", "quux" ); + } ) ); + + // Apply an empty then to force thenable unwrapping. + // See https://github.com/jquery/jquery/issues/3000 for more info. + deferred.then().then( function() { + assert.deepEqual( + [].slice.call( arguments ), + [ "baz", "quux" ], + "The fulfilled handler receives proper params" + ); + done(); + }, null, function() { + assert.deepEqual( + [].slice.call( arguments ), + [ "foo", "bar" ], + "The progress handler receives proper params" + ); + done(); + } ); +} ); QUnit.test( "jQuery.when(nonThenable) - like Promise.resolve", function( assert ) { "use strict";