]> source.dussan.org Git - jquery.git/commitdiff
Fix #12278. Promises on non-default queue wait until a dequeue is attempted on an...
authorCorey Frang <gnarf@gnarf.net>
Mon, 13 Aug 2012 17:43:49 +0000 (12:43 -0500)
committerDave Methvin <dave.methvin@gmail.com>
Mon, 20 Aug 2012 01:48:52 +0000 (21:48 -0400)
src/queue.js
test/unit/queue.js

index d49b3dd68b85adb090afba31b0cd3088460e02f0..d3a1136a6b06102d93af2318daf3cc0e99cf5af4 100644 (file)
@@ -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 );
                        }
index 5c5317b42767480b0b69fe96ef333f9ebf22c4e1..5307bfd2b6e07adf77d214bbc8614abeb1012d4f 100644 (file)
@@ -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);