]> source.dussan.org Git - jquery.git/commitdiff
Adds the abort on unload trick back in since IE9 still exhibits the bug
authorjaubourg <j@ubourg.net>
Sun, 6 Jan 2013 00:34:24 +0000 (01:34 +0100)
committerDave Methvin <dave.methvin@gmail.com>
Mon, 7 Jan 2013 15:34:14 +0000 (10:34 -0500)
src/ajax/xhr.js
test/data/ajax/unreleasedXHR.html [new file with mode: 0644]
test/unit/ajax.js

index 72703a0b16ccb25b8a2a50bcd4f02c6ccf30c3d0..3a9c9e96860c538f839f67e7daeaba0f4929c4f1 100644 (file)
@@ -11,8 +11,22 @@ 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)
diff --git a/test/data/ajax/unreleasedXHR.html b/test/data/ajax/unreleasedXHR.html
new file mode 100644 (file)
index 0000000..d516a0c
--- /dev/null
@@ -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>
index e3180c5a33f0811d779396099709942e82f18ffb..25d942e378cebe2425def7c0337d360711dea52f 100644 (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"),