]> source.dussan.org Git - jquery.git/commitdiff
Ajax: Execute JSONP error script responses
authorDallas Fraser <dallas.fraser.waterloo@gmail.com>
Tue, 25 Aug 2020 19:41:06 +0000 (15:41 -0400)
committerMichał Gołębiowski-Owczarek <m.goleb@gmail.com>
Tue, 25 Aug 2020 19:43:02 +0000 (21:43 +0200)
Issue gh-4379 was meant to be a bug fix but the JSONP case is a bit special:
under the hood it's a script but it simulates JSON responses in an environment
without a CORS setup and sending JSON payloads on error responses is quite
typical there.

This commit makes JSONP error responses still execute the payload. The regular
script error responses continue to be skipped.

Fixes gh-4771
Closes gh-4773

(cherry picked from commit a1e619b03a557b47c3e26a5e74af12b63a0d5e73)

src/ajax.js
test/unit/ajax.js

index 670b6c1025afb42a0224e45a054f3a97de7cae2d..4be4a9e920123905a937c3f493b1d68e93c0625b 100644 (file)
@@ -745,8 +745,10 @@ jQuery.extend( {
                                response = ajaxHandleResponses( s, jqXHR, responses );
                        }
 
-                       // Use a noop converter for missing script
-                       if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+                       // Use a noop converter for missing script but not if jsonp
+                       if ( !isSuccess &&
+                               jQuery.inArray( "script", s.dataTypes ) > -1 &&
+                               jQuery.inArray( "json", s.dataTypes ) < 0 ) {
                                s.converters[ "text script" ] = function() {};
                        }
 
index 8b3850605ebe48324fce8c0c48b305c2fd9e8cc8..9582018e79f94c1355f10a788d576e1a49166fdf 100644 (file)
@@ -837,6 +837,19 @@ QUnit.module( "ajax", {
                };
        } );
 
+       ajaxTest( "jQuery.ajax() - do execute scripts if JSONP from unsuccessful responses", 1, function( assert ) {
+               var testMsg = "Unsuccessful JSONP requests should have a JSON body";
+               return {
+                       dataType: "jsonp",
+                       url: url( "mock.php?action=errorWithScript" ),
+                       // error is the significant assertion
+                       error: function( xhr ) {
+                               var expected = { "status": 404, "msg": "Not Found" };
+                               assert.deepEqual( xhr.responseJSON, expected, testMsg );
+                       }
+               };
+       } );
+
        ajaxTest( "jQuery.ajax() - do not execute scripts from unsuccessful responses (gh-4250)", 11, function( assert ) {
                var globalEval = jQuery.globalEval;