Fix memory leaks in IE caused by the custom abort function of $.ajax. Fixes bug #6242.

This commit is contained in:
Colin Snover 2010-12-03 00:12:52 -06:00
parent e1d6edf822
commit 238ac5a0aa

View file

@ -195,6 +195,17 @@ jQuery.extend({
}, },
ajax: function( origSettings ) { 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), var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings),
jsonp, status, data, type = s.type.toUpperCase(), noContent = rnoContent.test(type); jsonp, status, data, type = s.type.toUpperCase(), noContent = rnoContent.test(type);
@ -403,13 +414,12 @@ jQuery.extend({
requestDone = true; requestDone = true;
if ( xhr ) { if ( xhr ) {
xhr.onreadystatechange = jQuery.noop; cleanup();
} }
// The transfer is complete and the data is available, or the request timed out // The transfer is complete and the data is available, or the request timed out
} else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) { } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
requestDone = true; requestDone = true;
xhr.onreadystatechange = jQuery.noop;
status = isTimeout === "timeout" ? status = isTimeout === "timeout" ?
"timeout" : "timeout" :
@ -451,10 +461,7 @@ jQuery.extend({
xhr.abort(); xhr.abort();
} }
// Stop memory leaks cleanup();
if ( s.async ) {
xhr = null;
}
} }
}; };