diff --git a/src/ajax.js b/src/ajax.js index a6dc4095a..55b528eac 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -746,8 +746,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() {}; } diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 125470519..fe831d0b1 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -810,6 +810,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;