Merge branch 'bug6242' of https://github.com/csnover/jquery into csnover-bug6242
authorJohn Resig <jeresig@gmail.com>
Mon, 6 Dec 2010 22:23:08 +0000 (17:23 -0500)
committerJohn Resig <jeresig@gmail.com>
Mon, 6 Dec 2010 22:23:08 +0000 (17:23 -0500)
src/ajax.js

index d20ad76..90dc350 100644 (file)
@@ -195,6 +195,17 @@ jQuery.extend({
        },
 
        ajax: function( origSettings ) {
+               // IE8 leaks a lot when we've set abort, and IE6-8 a little
+               // when we have set onreadystatechange. Bug #6242
+               // XXX IE7 still leaks when abort is called, no matter what
+               // we do
+               function cleanup() {
+                       // IE6 will throw an error setting xhr.abort
+                       try {
+                               xhr.abort = xhr.onreadystatechange = jQuery.noop;
+                       } catch(e) {}
+               }
+
                var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings),
                        jsonp, status, data, type = s.type.toUpperCase(), noContent = rnoContent.test(type);
 
@@ -406,13 +417,12 @@ jQuery.extend({
 
                                requestDone = true;
                                if ( xhr ) {
-                                       xhr.onreadystatechange = jQuery.noop;
+                                       cleanup();
                                }
 
                        // The transfer is complete and the data is available, or the request timed out
                        } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
                                requestDone = true;
-                               xhr.onreadystatechange = jQuery.noop;
 
                                status = isTimeout === "timeout" ?
                                        "timeout" :
@@ -454,10 +464,7 @@ jQuery.extend({
                                        xhr.abort();
                                }
 
-                               // Stop memory leaks
-                               if ( s.async ) {
-                                       xhr = null;
-                               }
+                               cleanup();
                        }
                };