From 3bae54aa50b7485b1f18501dff038a61507012a5 Mon Sep 17 00:00:00 2001 From: Dallas Fraser Date: Tue, 25 Aug 2020 15:41:06 -0400 Subject: [PATCH] Ajax: Execute JSONP error script responses 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 | 6 ++++-- test/unit/ajax.js | 13 +++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index 670b6c102..4be4a9e92 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -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() {}; } diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 8b3850605..9582018e7 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -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;