Fixes #7229 and #5803
[jquery.git] / src / ajax.js
index e615480..915bbaa 100644 (file)
@@ -208,6 +208,12 @@ jQuery.extend({
                        s.data = jQuery.param( s.data, s.traditional );
                }
 
+               // If the jsonpCallback has been set, we can assume that dataType is jsonp
+               // Ticket #5803
+               if ( s.jsonpCallback ) {
+                 s.dataType = "jsonp";
+               }
+
                // Handle JSONP Parameter Callbacks
                if ( s.dataType === "jsonp" ) {
                        if ( type === "GET" ) {
@@ -239,10 +245,6 @@ jQuery.extend({
                        var customJsonp = window[ jsonp ];
 
                        window[ jsonp ] = function( tmp ) {
-                               data = tmp;
-                               jQuery.ajax.handleSuccess( s, xhr, status, data );
-                               jQuery.ajax.handleComplete( s, xhr, status, data );
-                               
                                if ( jQuery.isFunction( customJsonp ) ) {
                                        customJsonp( tmp );
 
@@ -254,6 +256,10 @@ jQuery.extend({
                                                delete window[ jsonp ];
                                        } catch( jsonpError ) {}
                                }
+
+                               data = tmp;
+                               jQuery.handleSuccess( s, xhr, status, data );
+                               jQuery.handleComplete( s, xhr, status, data );
                                
                                if ( head ) {
                                        head.removeChild( script );
@@ -281,7 +287,7 @@ jQuery.extend({
                }
 
                // Watch for a new set of requests
-               if ( s.global && jQuery.ajax.active++ === 0 ) {
+               if ( s.global && jQuery.active++ === 0 ) {
                        jQuery.event.trigger( "ajaxStart" );
                }
 
@@ -308,8 +314,8 @@ jQuery.extend({
                                        if ( !done && (!this.readyState ||
                                                        this.readyState === "loaded" || this.readyState === "complete") ) {
                                                done = true;
-                                               jQuery.ajax.handleSuccess( s, xhr, status, data );
-                                               jQuery.ajax.handleComplete( s, xhr, status, data );
+                                               jQuery.handleSuccess( s, xhr, status, data );
+                                               jQuery.handleComplete( s, xhr, status, data );
 
                                                // Handle memory leak in IE
                                                script.onload = script.onreadystatechange = null;
@@ -358,8 +364,8 @@ jQuery.extend({
                                        xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
                                }
 
-                               if ( jQuery.ajax.etag[s.url] ) {
-                                       xhr.setRequestHeader("If-None-Match", jQuery.ajax.etag[s.url]);
+                               if ( jQuery.etag[s.url] ) {
+                                       xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
                                }
                        }
 
@@ -378,7 +384,7 @@ jQuery.extend({
                // Allow custom headers/mimetypes and early abort
                if ( s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false ) {
                        // Handle the global AJAX counter
-                       if ( s.global && jQuery.ajax.active-- === 1 ) {
+                       if ( s.global && jQuery.active-- === 1 ) {
                                jQuery.event.trigger( "ajaxStop" );
                        }
 
@@ -388,7 +394,7 @@ jQuery.extend({
                }
 
                if ( s.global ) {
-                       jQuery.ajax.triggerGlobal( s, "ajaxSend", [xhr, s] );
+                       jQuery.triggerGlobal( s, "ajaxSend", [xhr, s] );
                }
 
                // Wait for a response to come back
@@ -398,7 +404,7 @@ jQuery.extend({
                                // Opera doesn't call onreadystatechange before this point
                                // so we simulate the call
                                if ( !requestDone ) {
-                                       jQuery.ajax.handleComplete( s, xhr, status, data );
+                                       jQuery.handleComplete( s, xhr, status, data );
                                }
 
                                requestDone = true;
@@ -413,9 +419,9 @@ jQuery.extend({
 
                                status = isTimeout === "timeout" ?
                                        "timeout" :
-                                       !jQuery.ajax.httpSuccess( xhr ) ?
+                                       !jQuery.httpSuccess( xhr ) ?
                                                "error" :
-                                               s.ifModified && jQuery.ajax.httpNotModified( xhr, s.url ) ?
+                                               s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
                                                        "notmodified" :
                                                        "success";
 
@@ -425,7 +431,7 @@ jQuery.extend({
                                        // Watch for, and catch, XML document parse errors
                                        try {
                                                // process the data (runs the xml through httpData regardless of callback)
-                                               data = jQuery.ajax.httpData( xhr, s.dataType, s );
+                                               data = jQuery.httpData( xhr, s.dataType, s );
                                        } catch( parserError ) {
                                                status = "parsererror";
                                                errMsg = parserError;
@@ -436,15 +442,15 @@ jQuery.extend({
                                if ( status === "success" || status === "notmodified" ) {
                                        // JSONP handles its own success callback
                                        if ( !jsonp ) {
-                                               jQuery.ajax.handleSuccess( s, xhr, status, data );
+                                               jQuery.handleSuccess( s, xhr, status, data );
                                        }
                                } else {
-                                       jQuery.ajax.handleError( s, xhr, status, errMsg );
+                                       jQuery.handleError( s, xhr, status, errMsg );
                                }
 
                                // Fire the complete handlers
                                if ( !jsonp ) {
-                                       jQuery.ajax.handleComplete( s, xhr, status, data );
+                                       jQuery.handleComplete( s, xhr, status, data );
                                }
 
                                if ( isTimeout === "timeout" ) {
@@ -458,12 +464,14 @@ jQuery.extend({
                        }
                };
 
-               // Override the abort handler, if we can (IE doesn't allow it, but that's OK)
+               // Override the abort handler, if we can (IE 6 doesn't allow it, but that's OK)
                // Opera doesn't fire onreadystatechange at all on abort
                try {
                        var oldAbort = xhr.abort;
                        xhr.abort = function() {
-                               if ( xhr ) {
+                               // xhr.abort in IE7 is not a native JS function
+                               // and does not have a call property
+                               if ( xhr && oldAbort.call ) {
                                        oldAbort.call( xhr );
                                }
 
@@ -486,10 +494,10 @@ jQuery.extend({
                        xhr.send( noContent || s.data == null ? null : s.data );
 
                } catch( sendError ) {
-                       jQuery.ajax.handleError( s, xhr, null, sendError );
+                       jQuery.handleError( s, xhr, null, sendError );
 
                        // Fire the complete handlers
-                       jQuery.ajax.handleComplete( s, xhr, status, data );
+                       jQuery.handleComplete( s, xhr, status, data );
                }
 
                // firefox 1.5 doesn't fire statechange for sync requests
@@ -572,7 +580,9 @@ function buildParams( prefix, obj, traditional, add ) {
        }
 }
 
-jQuery.extend( jQuery.ajax, {
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
 
        // Counter for holding the number of active queries
        active: 0,
@@ -589,7 +599,7 @@ jQuery.extend( jQuery.ajax, {
 
                // Fire the global callback
                if ( s.global ) {
-                       jQuery.ajax.triggerGlobal( s, "ajaxError", [xhr, s, e] );
+                       jQuery.triggerGlobal( s, "ajaxError", [xhr, s, e] );
                }
        },
 
@@ -601,7 +611,7 @@ jQuery.extend( jQuery.ajax, {
 
                // Fire the global callback
                if ( s.global ) {
-                       jQuery.ajax.triggerGlobal( s, "ajaxSuccess", [xhr, s] );
+                       jQuery.triggerGlobal( s, "ajaxSuccess", [xhr, s] );
                }
        },
 
@@ -613,11 +623,11 @@ jQuery.extend( jQuery.ajax, {
 
                // The request was completed
                if ( s.global ) {
-                       jQuery.ajax.triggerGlobal( s, "ajaxComplete", [xhr, s] );
+                       jQuery.triggerGlobal( s, "ajaxComplete", [xhr, s] );
                }
 
                // Handle the global AJAX counter
-               if ( s.global && jQuery.ajax.active-- === 1 ) {
+               if ( s.global && jQuery.active-- === 1 ) {
                        jQuery.event.trigger( "ajaxStop" );
                }
        },
@@ -644,11 +654,11 @@ jQuery.extend( jQuery.ajax, {
                        etag = xhr.getResponseHeader("Etag");
 
                if ( lastModified ) {
-                       jQuery.ajax.lastModified[url] = lastModified;
+                       jQuery.lastModified[url] = lastModified;
                }
 
                if ( etag ) {
-                       jQuery.ajax.etag[url] = etag;
+                       jQuery.etag[url] = etag;
                }
 
                return xhr.status === 304;
@@ -698,19 +708,16 @@ if ( window.ActiveXObject ) {
                if ( window.location.protocol !== "file:" ) {
                        try {
                                return new window.XMLHttpRequest();
-                       } catch(e) {}
+                       } catch(xhrError) {}
                }
 
                try {
                        return new window.ActiveXObject("Microsoft.XMLHTTP");
-               } catch(e) {}
+               } catch(activeError) {}
        };
 }
 
 // Does this browser support XHR requests?
 jQuery.support.ajax = !!jQuery.ajaxSettings.xhr();
 
-// For backwards compatibility
-jQuery.extend( jQuery.ajax );
-
 })( jQuery );