| (function( jQuery ) { |
| |
| var // #5280: next active xhr id and list of active xhrs' callbacks |
| xhrId = jQuery.now(), |
| xhrCallbacks, |
| |
| // XHR used to determine supports properties |
| testXHR; |
| |
| // #5280: Internet Explorer will keep connections alive if we don't abort on unload |
| function xhrOnUnloadAbort() { |
| jQuery( window ).unload(function() { |
| // Abort all pending requests |
| for ( var key in xhrCallbacks ) { |
| xhrCallbacks[ key ]( 0, 1 ); |
| } |
| }); |
| } |
| |
| // Functions to create xhrs |
| function createStandardXHR() { |
| try { |
| return new window.XMLHttpRequest(); |
| } catch( e ) {} |
| } |
| |
| function createActiveXHR() { |
| try { |
| return new window.ActiveXObject( "Microsoft.XMLHTTP" ); |
| } catch( e ) {} |
| } |
| |
| // Create the request object |
| // (This is still attached to ajaxSettings for backward compatibility) |
| jQuery.ajaxSettings.xhr = window.ActiveXObject ? |
| /* Microsoft failed to properly |
| * implement the XMLHttpRequest in IE7 (can't request local files), |
| * so we use the ActiveXObject when it is available |
| * Additionally XMLHttpRequest can be disabled in IE7/IE8 so |
| * we need a fallback. |
| */ |
| function() { |
| return !this.isLocal && createStandardXHR() || createActiveXHR(); |
| } : |
| // For all other browsers, use the standard XMLHttpRequest object |
| createStandardXHR; |
| |
| // Test if we can create an xhr object |
| testXHR = jQuery.ajaxSettings.xhr(); |
| jQuery.support.ajax = !!testXHR; |
| |
| // Does this browser support crossDomain XHR requests |
| jQuery.support.cors = testXHR && ( "withCredentials" in testXHR ); |
| |
| // No need for the temporary xhr anymore |
| testXHR = undefined; |
| |
| // Create transport if the browser can provide an xhr |
| if ( jQuery.support.ajax ) { |
| |
| jQuery.ajaxTransport(function( s ) { |
| // Cross domain only allowed if supported through XMLHttpRequest |
| if ( !s.crossDomain || jQuery.support.cors ) { |
| |
| var callback; |
| |
| return { |
| send: function( headers, complete ) { |
| |
| // Get a new xhr |
| var xhr = s.xhr(), |
| handle, |
| i; |
| |
| // Open the socket |
| // Passing null username, generates a login popup on Opera (#2865) |
| if ( s.username ) { |
| xhr.open( s.type, s.url, s.async, s.username, s.password ); |
| } else { |
| xhr.open( s.type, s.url, s.async ); |
| } |
| |
| // Apply custom fields if provided |
| if ( s.xhrFields ) { |
| for ( i in s.xhrFields ) { |
| xhr[ i ] = s.xhrFields[ i ]; |
| } |
| } |
| |
| // Override mime type if needed |
| if ( s.mimeType && xhr.overrideMimeType ) { |
| xhr.overrideMimeType( s.mimeType ); |
| } |
| |
| // X-Requested-With header |
| // For cross-domain requests, seeing as conditions for a preflight are |
| // akin to a jigsaw puzzle, we simply never set it to be sure. |
| // (it can always be set on a per-request basis or even using ajaxSetup) |
| // For same-domain requests, won't change header if already provided. |
| if ( !s.crossDomain && !headers["X-Requested-With"] ) { |
| headers[ "X-Requested-With" ] = "XMLHttpRequest"; |
| } |
| |
| // Need an extra try/catch for cross domain requests in Firefox 3 |
| try { |
| for ( i in headers ) { |
| xhr.setRequestHeader( i, headers[ i ] ); |
| } |
| } catch( _ ) {} |
| |
| // Do send the request |
| // This may raise an exception which is actually |
| // handled in jQuery.ajax (so no try/catch here) |
| xhr.send( ( s.hasContent && s.data ) || null ); |
| |
| // Listener |
| callback = function( _, isAbort ) { |
| |
| var status, |
| statusText, |
| responseHeaders, |
| responses, |
| xml; |
| |
| // Firefox throws exceptions when accessing properties |
| // of an xhr when a network error occured |
| // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) |
| try { |
| |
| // Was never called and is aborted or complete |
| if ( callback && ( isAbort || xhr.readyState === 4 ) ) { |
| |
| // Only called once |
| callback = undefined; |
| |
| // Do not keep as active anymore |
| if ( handle ) { |
| xhr.onreadystatechange = jQuery.noop; |
| delete xhrCallbacks[ handle ]; |
| } |
| |
| // If it's an abort |
| if ( isAbort ) { |
| // Abort it manually if needed |
| if ( xhr.readyState !== 4 ) { |
| xhr.abort(); |
| } |
| } else { |
| status = xhr.status; |
| responseHeaders = xhr.getAllResponseHeaders(); |
| responses = {}; |
| xml = xhr.responseXML; |
| |
| // Construct response list |
| if ( xml && xml.documentElement /* #4958 */ ) { |
| responses.xml = xml; |
| } |
| responses.text = xhr.responseText; |
| |
| // Firefox throws an exception when accessing |
| // statusText for faulty cross-domain requests |
| try { |
| statusText = xhr.statusText; |
| } catch( e ) { |
| // We normalize with Webkit giving an empty statusText |
| statusText = ""; |
| } |
| |
| // Filter status for non standard behaviors |
| |
| // If the request is local and we have data: assume a success |
| // (success with no data won't get notified, that's the best we |
| // can do given current implementations) |
| if ( !status && s.isLocal && !s.crossDomain ) { |
| status = responses.text ? 200 : 404; |
| // IE - #1450: sometimes returns 1223 when it should be 204 |
| } else if ( status === 1223 ) { |
| status = 204; |
| } |
| } |
| } |
| } catch( firefoxAccessException ) { |
| if ( !isAbort ) { |
| complete( -1, firefoxAccessException ); |
| } |
| } |
| |
| // Call complete if needed |
| if ( responses ) { |
| complete( status, statusText, responses, responseHeaders ); |
| } |
| }; |
| |
| // if we're in sync mode or it's in cache |
| // and has been retrieved directly (IE6 & IE7) |
| // we need to manually fire the callback |
| if ( !s.async || xhr.readyState === 4 ) { |
| callback(); |
| } else { |
| // Create the active xhrs callbacks list if needed |
| // and attach the unload handler |
| if ( !xhrCallbacks ) { |
| xhrCallbacks = {}; |
| xhrOnUnloadAbort(); |
| } |
| // Add to list of active xhrs callbacks |
| handle = xhrId++; |
| xhr.onreadystatechange = xhrCallbacks[ handle ] = callback; |
| } |
| }, |
| |
| abort: function() { |
| if ( callback ) { |
| callback(0,1); |
| } |
| } |
| }; |
| } |
| }); |
| } |
| |
| })( jQuery ); |