From 3812f9436da09d9f31ca4a61a14cd70f3e8cbeaf Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Mon, 13 Aug 2012 12:43:49 -0500 Subject: [PATCH] Fix #12278. Promises on non-default queue wait until a dequeue is attempted on an empty queue. Close gh-893. --- src/queue.js | 8 ++++++-- test/unit/queue.js | 31 +++++++++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/queue.js b/src/queue.js index d49b3dd68..d3a1136a6 100644 --- a/src/queue.js +++ b/src/queue.js @@ -22,6 +22,7 @@ jQuery.extend({ type = type || "fx"; var queue = jQuery.queue( elem, type ), + startLength = queue.length, fn = queue.shift(), hooks = jQuery._queueHooks( elem, type ), next = function() { @@ -31,6 +32,7 @@ jQuery.extend({ // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); + startLength--; } if ( fn ) { @@ -45,7 +47,8 @@ jQuery.extend({ delete hooks.stop; fn.call( elem, next, hooks ); } - if ( !queue.length && hooks ) { + + if ( !startLength && hooks ) { hooks.empty.fire(); } }, @@ -131,7 +134,8 @@ jQuery.fn.extend({ type = type || "fx"; while( i-- ) { - if ( (tmp = jQuery._data( elements[ i ], type + "queueHooks" )) && tmp.empty ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); } diff --git a/test/unit/queue.js b/test/unit/queue.js index 5c5317b42..5307bfd2b 100644 --- a/test/unit/queue.js +++ b/test/unit/queue.js @@ -1,6 +1,6 @@ module( "queue", { teardown: moduleTeardown }); -test( "queue() with other types", 12, function() { +test( "queue() with other types", 14, function() { var counter = 0; stop(); @@ -45,6 +45,12 @@ test( "queue() with other types", 12, function() { equal( counter, 4, "Testing previous call to dequeue" ); equal( $div.queue("foo").length, 0, "Testing queue length" ); + + $div.dequeue("foo"); + + equal( counter, 4, "Testing previous call to dequeue" ); + equal( $div.queue("foo").length, 0, "Testing queue length" ); + }); test("queue(name) passes in the next item in the queue as a parameter", function() { @@ -206,8 +212,8 @@ asyncTest( "fn.promise( \"queue\" ) - called whenever last queue function is deq }).queue( "queue", function( next ) { strictEqual( test++, 2, "step two" ); setTimeout( function() { - strictEqual( test++, 4, "step four" ); next(); + strictEqual( test++, 4, "step four" ); start(); }, 10 ); }).promise( "queue" ).done( function() { @@ -217,6 +223,27 @@ asyncTest( "fn.promise( \"queue\" ) - called whenever last queue function is deq foo.dequeue( "queue" ); }); +asyncTest( "fn.promise( \"queue\" ) - waits for animation to complete before resolving", 2, function() { + var foo = jQuery( "#foo" ), + test = 1; + + foo.animate({ + top: 100 + }, { + duration: 1, + queue: "queue", + complete: function() { + strictEqual( test++, 1, "step one" ); + } + }).dequeue( "queue" ); + + foo.promise( "queue" ).done( function() { + strictEqual( test++, 2, "step two" ); + start(); + }); + +}); + test( ".promise(obj)", function() { expect(2);