Side navigation
Ticket #936: patch.txt
File patch.txt, 5.6 KB (added by mikael.karon@karon.s, February 09, 2007 02:55AM UTC)
Suggested patch for XMLHTTP inspection rather then rigging
--- ajax.js Fri Feb 09 09:56:03 2007
+++ ajax.modified.js Fri Feb 09 10:31:43 2007
@@ -611,8 +611,6 @@
if ( s.global && ! jQuery.active++ )
jQuery.event.trigger( "ajaxStart" );
- var requestDone = false;
-
// Create the request object
var xml = new XMLHttpRequest();
@@ -642,91 +640,97 @@
if ( s.global )
jQuery.event.trigger("ajaxSend", [xml, s]);
- // Wait for a response to come back
- var onreadystatechange = function(isTimeout){
- // The transfer is complete and the data is available, or the request timed out
- if ( xml && (xml.readyState == 4 || isTimeout == "timeout") ) {
- requestDone = true;
- var status;
- try {
- status = jQuery.httpSuccess( xml ) && isTimeout != "timeout" ?
- s.ifModified && jQuery.httpNotModified( xml, s.url ) ? "notmodified" : "success" : "error";
- // Make sure that the request was successful or notmodified
- if ( status != "error" ) {
- // Cache Last-Modified header, if ifModified mode.
- var modRes;
- try {
- modRes = xml.getResponseHeader("Last-Modified");
- } catch(e) {} // swallow exception thrown by FF if header is not available
-
- if ( s.ifModified && modRes )
- jQuery.lastModified[s.url] = modRes;
+ // Start polling the request
+ var intervalLock = false,
+ intervalCounter = 0,
+ intervalMillisec = 100,
+ intervalId = window.setInterval( function() {
+ if ( !intervalLock ) {
+ // Lock to prevent more executions while processing
+ intervalLock = true;
+
+ // Check if the request has timed out
+ intervalCounter += 1;
+ var isTimeout = false;
+ if (s.timeout > 0) {
+ if (s.timeout <= intervalCounter * intervalMillisec) {
+ isTimeout = true;
+
+ // Cancel the request
+ if ( xml ) {
+ xml.abort();
+ }
+ }
+ }
+
+ // The transfer is complete and the data is available, or the request timed out
+ if ( xml && (xml.readyState == 4 || isTimeout) ) {
+ // Clear interval
+ window.clearInterval( intervalId );
+
+ var status;
+ try {
+ status = jQuery.httpSuccess( xml ) && !isTimeout ?
+ s.ifModified && jQuery.httpNotModified( xml, s.url ) ? "notmodified" : "success" : "error";
+ // Make sure that the request was successful or notmodified
+ if ( status != "error" ) {
+ // Cache Last-Modified header, if ifModified mode.
+ var modRes;
+ try {
+ modRes = xml.getResponseHeader("Last-Modified");
+ } catch(e) {} // swallow exception thrown by FF if header is not available
+
+ if ( s.ifModified && modRes )
+ jQuery.lastModified[s.url] = modRes;
+
+ // process the data (runs the xml through httpData regardless of callback)
+ var data = jQuery.httpData( xml, s.dataType );
+
+ // If a local callback was specified, fire it and pass it the data
+ if ( s.success )
+ s.success( data, status );
+
+ // Fire the global callback
+ if( s.global )
+ jQuery.event.trigger( "ajaxSuccess", [xml, s] );
+ } else
+ jQuery.handleError(s, xml, status);
+ } catch(e) {
+ status = "error";
+ jQuery.handleError(s, xml, status, e);
+ }
- // process the data (runs the xml through httpData regardless of callback)
- var data = jQuery.httpData( xml, s.dataType );
+ // The request was completed
+ if( s.global )
+ jQuery.event.trigger( "ajaxComplete", [xml, s] );
- // If a local callback was specified, fire it and pass it the data
- if ( s.success )
- s.success( data, status );
+ // Handle the global AJAX counter
+ if ( s.global && ! --jQuery.active )
+ jQuery.event.trigger( "ajaxStop" );
- // Fire the global callback
- if( s.global )
- jQuery.event.trigger( "ajaxSuccess", [xml, s] );
- } else
- jQuery.handleError(s, xml, status);
- } catch(e) {
- status = "error";
- jQuery.handleError(s, xml, status, e);
+ // Process result
+ if ( s.complete )
+ s.complete(xml, status);
}
+
+ // Clear the interval if the request is nullified
+ if ( !xml )
+ windows.clearInterval( intervalId );
- // The request was completed
- if( s.global )
- jQuery.event.trigger( "ajaxComplete", [xml, s] );
-
- // Handle the global AJAX counter
- if ( s.global && ! --jQuery.active )
- jQuery.event.trigger( "ajaxStop" );
-
- // Process result
- if ( s.complete )
- s.complete(xml, status);
-
- // Stop memory leaks
- xml.onreadystatechange = function(){};
- xml = null;
+ // Remove lock
+ intervalLock = false;
}
- };
- xml.onreadystatechange = onreadystatechange;
-
- // Timeout checker
- if ( s.timeout > 0 )
- setTimeout(function(){
- // Check to see if the request is still happening
- if ( xml ) {
- // Cancel the request
- xml.abort();
-
- if( !requestDone )
- onreadystatechange( "timeout" );
- }
- }, s.timeout);
-
- // save non-leaking reference
- var xml2 = xml;
+ }, intervalMillisec);
// Send the data
try {
- xml2.send(s.data);
+ xml.send(s.data);
} catch(e) {
jQuery.handleError(s, xml, null, e);
}
-
- // firefox 1.5 doesn't fire statechange for sync requests
- if ( !s.async )
- onreadystatechange();
-
+
// return XMLHttpRequest to allow aborting the request etc.
- return xml2;
+ return xml;
},
handleError: function( s, xml, status, e ) {
Download in other formats:
Original Format
File patch.txt, 5.6 KB (added by mikael.karon@karon.s, February 09, 2007 02:55AM UTC)
Suggested patch for XMLHTTP inspection rather then rigging
--- ajax.js Fri Feb 09 09:56:03 2007
+++ ajax.modified.js Fri Feb 09 10:31:43 2007
@@ -611,8 +611,6 @@
if ( s.global && ! jQuery.active++ )
jQuery.event.trigger( "ajaxStart" );
- var requestDone = false;
-
// Create the request object
var xml = new XMLHttpRequest();
@@ -642,91 +640,97 @@
if ( s.global )
jQuery.event.trigger("ajaxSend", [xml, s]);
- // Wait for a response to come back
- var onreadystatechange = function(isTimeout){
- // The transfer is complete and the data is available, or the request timed out
- if ( xml && (xml.readyState == 4 || isTimeout == "timeout") ) {
- requestDone = true;
- var status;
- try {
- status = jQuery.httpSuccess( xml ) && isTimeout != "timeout" ?
- s.ifModified && jQuery.httpNotModified( xml, s.url ) ? "notmodified" : "success" : "error";
- // Make sure that the request was successful or notmodified
- if ( status != "error" ) {
- // Cache Last-Modified header, if ifModified mode.
- var modRes;
- try {
- modRes = xml.getResponseHeader("Last-Modified");
- } catch(e) {} // swallow exception thrown by FF if header is not available
-
- if ( s.ifModified && modRes )
- jQuery.lastModified[s.url] = modRes;
+ // Start polling the request
+ var intervalLock = false,
+ intervalCounter = 0,
+ intervalMillisec = 100,
+ intervalId = window.setInterval( function() {
+ if ( !intervalLock ) {
+ // Lock to prevent more executions while processing
+ intervalLock = true;
+
+ // Check if the request has timed out
+ intervalCounter += 1;
+ var isTimeout = false;
+ if (s.timeout > 0) {
+ if (s.timeout <= intervalCounter * intervalMillisec) {
+ isTimeout = true;
+
+ // Cancel the request
+ if ( xml ) {
+ xml.abort();
+ }
+ }
+ }
+
+ // The transfer is complete and the data is available, or the request timed out
+ if ( xml && (xml.readyState == 4 || isTimeout) ) {
+ // Clear interval
+ window.clearInterval( intervalId );
+
+ var status;
+ try {
+ status = jQuery.httpSuccess( xml ) && !isTimeout ?
+ s.ifModified && jQuery.httpNotModified( xml, s.url ) ? "notmodified" : "success" : "error";
+ // Make sure that the request was successful or notmodified
+ if ( status != "error" ) {
+ // Cache Last-Modified header, if ifModified mode.
+ var modRes;
+ try {
+ modRes = xml.getResponseHeader("Last-Modified");
+ } catch(e) {} // swallow exception thrown by FF if header is not available
+
+ if ( s.ifModified && modRes )
+ jQuery.lastModified[s.url] = modRes;
+
+ // process the data (runs the xml through httpData regardless of callback)
+ var data = jQuery.httpData( xml, s.dataType );
+
+ // If a local callback was specified, fire it and pass it the data
+ if ( s.success )
+ s.success( data, status );
+
+ // Fire the global callback
+ if( s.global )
+ jQuery.event.trigger( "ajaxSuccess", [xml, s] );
+ } else
+ jQuery.handleError(s, xml, status);
+ } catch(e) {
+ status = "error";
+ jQuery.handleError(s, xml, status, e);
+ }
- // process the data (runs the xml through httpData regardless of callback)
- var data = jQuery.httpData( xml, s.dataType );
+ // The request was completed
+ if( s.global )
+ jQuery.event.trigger( "ajaxComplete", [xml, s] );
- // If a local callback was specified, fire it and pass it the data
- if ( s.success )
- s.success( data, status );
+ // Handle the global AJAX counter
+ if ( s.global && ! --jQuery.active )
+ jQuery.event.trigger( "ajaxStop" );
- // Fire the global callback
- if( s.global )
- jQuery.event.trigger( "ajaxSuccess", [xml, s] );
- } else
- jQuery.handleError(s, xml, status);
- } catch(e) {
- status = "error";
- jQuery.handleError(s, xml, status, e);
+ // Process result
+ if ( s.complete )
+ s.complete(xml, status);
}
+
+ // Clear the interval if the request is nullified
+ if ( !xml )
+ windows.clearInterval( intervalId );
- // The request was completed
- if( s.global )
- jQuery.event.trigger( "ajaxComplete", [xml, s] );
-
- // Handle the global AJAX counter
- if ( s.global && ! --jQuery.active )
- jQuery.event.trigger( "ajaxStop" );
-
- // Process result
- if ( s.complete )
- s.complete(xml, status);
-
- // Stop memory leaks
- xml.onreadystatechange = function(){};
- xml = null;
+ // Remove lock
+ intervalLock = false;
}
- };
- xml.onreadystatechange = onreadystatechange;
-
- // Timeout checker
- if ( s.timeout > 0 )
- setTimeout(function(){
- // Check to see if the request is still happening
- if ( xml ) {
- // Cancel the request
- xml.abort();
-
- if( !requestDone )
- onreadystatechange( "timeout" );
- }
- }, s.timeout);
-
- // save non-leaking reference
- var xml2 = xml;
+ }, intervalMillisec);
// Send the data
try {
- xml2.send(s.data);
+ xml.send(s.data);
} catch(e) {
jQuery.handleError(s, xml, null, e);
}
-
- // firefox 1.5 doesn't fire statechange for sync requests
- if ( !s.async )
- onreadystatechange();
-
+
// return XMLHttpRequest to allow aborting the request etc.
- return xml2;
+ return xml;
},
handleError: function( s, xml, status, e ) {