Commit 667a3b31 authored by jaubourg's avatar jaubourg

Reworked script and xhr abort logic to take advantage of the fact jXHR.abort...

Reworked script and xhr abort logic to take advantage of the fact jXHR.abort will complete the request itself if not done already.
parent b07d43c6
......@@ -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);
}
}
};
......
......@@ -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);
}
}
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment