Fix memory leaks in IE caused by the custom abort function of $.ajax. Fixes bug ...
authorColin Snover <github.com@zetafleet.com>
Fri, 3 Dec 2010 06:12:52 +0000 (00:12 -0600)
committerColin Snover <github.com@zetafleet.com>
Fri, 3 Dec 2010 06:12:52 +0000 (00:12 -0600)
src/ajax.js

index d10b931..6ea61eb 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);
 
@@ -403,13 +414,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" :
@@ -451,10 +461,7 @@ jQuery.extend({
                                        xhr.abort();
                                }
 
-                               // Stop memory leaks
-                               if ( s.async ) {
-                                       xhr = null;
-                               }
+                               cleanup();
                        }
                };