Refactor queueing system to allow auto-dequeuing to use dequeue directly and
[jquery.git] / src / data.js
index 9cc76c6..03116e4 100644 (file)
@@ -63,30 +63,37 @@ jQuery.extend({
                }\r
        },\r
        queue: function( elem, type, data ) {\r
-               if ( elem ){\r
+               if( !elem ) return;\r
 \r
-                       type = (type || "fx") + "queue";\r
+               type = (type || "fx") + "queue";\r
+               var q = jQuery.data( elem, type );\r
 \r
-                       var q = jQuery.data( elem, type );\r
+               // Speed up dequeue by getting out quickly if this is just a lookup\r
+               if( !data ) return q || [];\r
 \r
-                       if ( !q || jQuery.isArray(data) )\r
-                               q = jQuery.data( elem, type, jQuery.makeArray(data) );\r
-                       else if( data )\r
-                               q.push( data );\r
+               if ( !q || jQuery.isArray(data) )\r
+                       q = jQuery.data( elem, type, jQuery.makeArray(data) );\r
+               else\r
+                       q.push( data );\r
 \r
-               }\r
                return q;\r
        },\r
 \r
        dequeue: function( elem, type ){\r
-               var queue = jQuery.queue( elem, type ),\r
-                       fn = queue.shift();\r
+               type = type || "fx";\r
+\r
+               var queue = jQuery.queue( elem, type ), fn = queue.shift();\r
 \r
-               if( !type || type === "fx" )\r
-                       fn = queue[0];\r
+               // If the fx queue is dequeued, always remove the progress sentinel\r
+               if( fn === "inprogress" ) fn = queue.shift();\r
 \r
-               if( fn !== undefined )\r
-                       fn.call(elem, function() { jQuery(elem).dequeue(type); });\r
+               if( fn ) {\r
+                       // Add a progress sentinel to prevent the fx queue from being\r
+                       // automatically dequeued\r
+                       if( type == "fx" ) queue.unshift("inprogress");\r
+\r
+                       fn.call(elem, function() { jQuery.dequeue(elem, type); });\r
+               }\r
        }\r
 });\r
 \r
@@ -129,8 +136,8 @@ jQuery.fn.extend({
                return this.each(function(i, elem){\r
                        var queue = jQuery.queue( this, type, data );\r
 \r
-                       if( type == "fx" && queue.length == 1 )\r
-                               queue[0].call(this, function() { jQuery(elem).dequeue(type); });\r
+                       if( type == "fx" && queue[0] !== "inprogress" )\r
+                               jQuery.dequeue( this, type )\r
                });\r
        },\r
        dequeue: function(type){\r