Adds the abort on unload trick back in since IE9 still exhibits the bug

This commit is contained in:
jaubourg 2013-01-06 01:34:24 +01:00 committed by Dave Methvin
parent f6df0301c8
commit 62acda819f
3 changed files with 49 additions and 4 deletions

View File

@ -11,7 +11,21 @@ var xhrSupported = jQuery.ajaxSettings.xhr(),
// Support: IE9
// #1450: sometimes IE returns 1223 when it should be 204
1223: 204
};
},
// Support: IE9
// We need to keep track of outbound xhr and abort them manually
// because IE is not smart enough to do it all by itself
xhrId = 0,
xhrCallbacks = {};
if ( window.ActiveXObject ) {
jQuery( window ).on( "unload", function() {
for( var key in xhrCallbacks ) {
xhrCallbacks[ key ]();
}
xhrCallbacks = undefined;
});
}
jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
jQuery.support.ajax = xhrSupported = !!xhrSupported;
@ -22,7 +36,7 @@ jQuery.ajaxTransport(function( options ) {
if ( jQuery.support.cors || xhrSupported && !options.crossDomain ) {
return {
send: function( headers, complete ) {
var i,
var i, id,
xhr = options.xhr();
xhr.open( options.type, options.url, options.async, options.username, options.password );
// Apply custom fields if provided
@ -51,6 +65,7 @@ jQuery.ajaxTransport(function( options ) {
callback = function( type ) {
return function() {
if ( callback ) {
delete xhrCallbacks[ id ];
callback = xhr.onload = xhr.onerror = null;
if ( type === "abort" ) {
xhr.abort();
@ -80,7 +95,7 @@ jQuery.ajaxTransport(function( options ) {
xhr.onload = callback();
xhr.onerror = callback("error");
// Create the abort callback
callback = callback("abort");
callback = xhrCallbacks[( id = xhrId++ )] = callback("abort");
// Do send the request
// This may raise an exception which is actually
// handled in jQuery.ajax (so no try/catch here)

View File

@ -0,0 +1,25 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Attempt to block tests because of dangling XHR requests (IE)</title>
<script type="text/javascript" src="../../../dist/jquery.js"></script>
<script type="text/javascript">
window.onunload = function() {};
jQuery(function() {
setTimeout(function() {
var parent = window.parent;
document.write("");
parent.iframeCallback();
}, 200 );
var number = 50;
while( number-- ) {
jQuery.ajax("../name.php?wait=600");
}
});
</script>
</head>
<body>
<!-- empty body -->
</body>
</html>

View File

@ -30,6 +30,11 @@ module( "ajax", {
//----------- jQuery.ajax()
testIframeWithCallback( "XMLHttpRequest - Attempt to block tests because of dangling XHR requests (IE)", "ajax/unreleasedXHR.html", function() {
expect( 1 );
ok( true, "done" );
});
ajaxTest( "jQuery.ajax() - success callbacks", 8, {
setup: addGlobalEvents("ajaxStart ajaxStop ajaxSend ajaxComplete ajaxSuccess"),
url: url("data/name.html"),