]> source.dussan.org Git - jquery.git/commitdiff
Reworked script and xhr abort logic to take advantage of the fact jXHR.abort will...
authorjaubourg <j@ubourg.net>
Thu, 13 Jan 2011 01:05:39 +0000 (02:05 +0100)
committerjaubourg <j@ubourg.net>
Thu, 13 Jan 2011 01:05:39 +0000 (02:05 +0100)
src/ajax/script.js
src/ajax/xhr.js

index 75f34fce20b6bc753b6a79f937fd6173e0e8e9db..645ddf3355403d297719aa08c1e169cc913197f3 100644 (file)
@@ -47,7 +47,7 @@ jQuery.ajax.transport("script", function(s) {
                                script.src = s.url;
 
                                // Attach handlers for all browsers
-                               script.onload = script.onreadystatechange = function( _ , statusText) {
+                               script.onload = script.onreadystatechange = function( _ , isAbort ) {
 
                                        if ( ! script.readyState || /loaded|complete/.test( script.readyState ) ) {
 
@@ -59,10 +59,13 @@ jQuery.ajax.transport("script", function(s) {
                                                        head.removeChild( script );
                                                }
 
+                                               // Dereference the script
                                                script = 0;
 
-                                               // Callback
-                                               callback( statusText ? 0 : 200, statusText || "success" );
+                                               // Callback if not abort
+                                               if ( ! isAbort ) {
+                                                       callback( 200, "success" );
+                                               }
                                        }
                                };
                                // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
@@ -70,9 +73,9 @@ jQuery.ajax.transport("script", function(s) {
                                head.insertBefore( script, head.firstChild );
                        },
 
-                       abort: function(statusText) {
+                       abort: function() {
                                if ( script ) {
-                                       script.onload( 0 , statusText );
+                                       script.onload(0,1);
                                }
                        }
                };
index 26e91ce790ca1a057553c2f3fca292588861d421..3c3d12493f74f7d222fd7fe935a7dcb829e88bb6 100644 (file)
@@ -9,8 +9,8 @@ var // Next fake timer id
        // XHR pool
        xhrPool = [],
 
-       // #5280: see end of file
-       xhrUnloadAbortMarker;
+       // #5280: see below
+       xhrUnloadAbortInstalled;
 
 
 jQuery.ajax.transport( function( s , determineDataType ) {
@@ -25,25 +25,23 @@ jQuery.ajax.transport( function( s , determineDataType ) {
                        send: function(headers, complete) {
 
                                // #5280: we need to abort on unload or IE will keep connections alive
-                               if ( ! xhrUnloadAbortMarker ) {
+                               if ( ! xhrUnloadAbortInstalled ) {
 
-                                       xhrUnloadAbortMarker = [];
+                                       xhrUnloadAbortInstalled = 1;
 
                                        jQuery(window).bind( "unload" , function() {
 
                                                // Abort all pending requests
                                                jQuery.each(xhrs, function(_, xhr) {
                                                        if ( xhr.onreadystatechange ) {
-                                                               xhr.onreadystatechange( xhrUnloadAbortMarker );
+                                                               xhr.onreadystatechange( 1 );
                                                        }
                                                });
 
-                                               // Reset polling structure to be safe
-                                               xhrs = {};
-
                                        });
                                }
 
+                               // Get a new xhr
                                var xhr = xhrPool.pop() || s.xhr(),
                                        handle;
 
@@ -58,7 +56,7 @@ jQuery.ajax.transport( function( s , determineDataType ) {
                                // Requested-With header
                                // Not set for crossDomain requests with no content
                                // (see why at http://trac.dojotoolkit.org/ticket/9486)
-                               // Won't change header if already provided in beforeSend
+                               // Won't change header if already provided
                                if ( ! ( s.crossDomain && ! s.hasContent ) && ! headers["x-requested-with"] ) {
                                        headers["x-requested-with"] = "XMLHttpRequest";
                                }
@@ -76,20 +74,23 @@ jQuery.ajax.transport( function( s , determineDataType ) {
                                try {
                                        xhr.send( ( s.hasContent && s.data ) || null );
                                } catch(e) {
-                                       // Store back in pool
+                                       // Store back into pool
                                        xhrPool.push( xhr );
                                        complete(0, "error", "" + e);
                                        return;
                                }
 
                                // Listener
-                               callback = function ( abortStatusText ) {
+                               callback = function( isAbort ) {
 
                                        // Was never called and is aborted or complete
-                                       if ( callback && ( abortStatusText || xhr.readyState === 4 ) ) {
+                                       if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+                                               // Only called once
+                                               callback = 0;
 
-                                               // Do not listen anymore
-                                               // and Store back in pool
+                                               // Do not keep as active anymore
+                                               // and store back into pool
                                                if (handle) {
                                                        xhr.onreadystatechange = jQuery.noop;
                                                        delete xhrs[ handle ];
@@ -97,28 +98,20 @@ jQuery.ajax.transport( function( s , determineDataType ) {
                                                        xhrPool.push( xhr );
                                                }
 
-                                               callback = 0;
-
-                                               // Get info
-                                               var status, statusText, response, responseHeaders;
-
-                                               if ( abortStatusText ) {
+                                               // If it's an abort
+                                               if ( isAbort ) {
 
+                                                       // Abort it manually if needed
                                                        if ( xhr.readyState !== 4 ) {
                                                                xhr.abort();
                                                        }
-
-                                                       // Stop here if unloadAbort
-                                                       if ( abortStatusText === xhrUnloadAbortMarker ) {
-                                                               return;
-                                                       }
-
-                                                       status = 0;
-                                                       statusText = abortStatusText;
-
                                                } else {
 
-                                                       status = xhr.status;
+                                                       // Get info
+                                                       var status = xhr.status,
+                                                               statusText,
+                                                               response,
+                                                               responseHeaders = xhr.getAllResponseHeaders();
 
                                                        try { // Firefox throws an exception when accessing statusText for faulty cross-domain requests
 
@@ -130,8 +123,6 @@ jQuery.ajax.transport( function( s , determineDataType ) {
 
                                                        }
 
-                                                       responseHeaders = xhr.getAllResponseHeaders();
-
                                                        // Filter status for non standard behaviours
                                                        // (so many they seem to be the actual "standard")
                                                        status =
@@ -164,10 +155,10 @@ jQuery.ajax.transport( function( s , determineDataType ) {
                                                                        xhr.getResponseHeader("content-type"),
                                                                        xhr.responseText,
                                                                        xhr.responseXML );
-                                               }
 
-                                               // Call complete
-                                               complete(status,statusText,response,responseHeaders);
+                                                       // Call complete
+                                                       complete(status,statusText,response,responseHeaders);
+                                               }
                                        }
                                };
 
@@ -189,9 +180,9 @@ jQuery.ajax.transport( function( s , determineDataType ) {
                                }
                        },
 
-                       abort: function(statusText) {
+                       abort: function() {
                                if ( callback ) {
-                                       callback(statusText);
+                                       callback(1);
                                }
                        }
                };