Fixes #4897. Added ?? as a context-insensitive placeholder for the callback name of a JSONP request. Unit tests provided.
This commit is contained in:
parent
f83cdc3c4c
commit
0c51e9d55f
3 changed files with 62 additions and 5 deletions
|
@ -1,7 +1,7 @@
|
||||||
(function( jQuery ) {
|
(function( jQuery ) {
|
||||||
|
|
||||||
var jsc = jQuery.now(),
|
var jsc = jQuery.now(),
|
||||||
jsre = /\=(?:\?|%3F)(&|$)/i,
|
jsre = /(\=)(?:\?|%3F)(&|$)|()(?:\?\?|%3F%3F)()/i,
|
||||||
rquery_jsonp = /\?/;
|
rquery_jsonp = /\?/;
|
||||||
|
|
||||||
// Default jsonp settings
|
// Default jsonp settings
|
||||||
|
@ -25,8 +25,8 @@ jQuery.ajax.prefilter("json jsonp", function(s, originalSettings) {
|
||||||
|
|
||||||
var jsonpCallback = s.jsonpCallback =
|
var jsonpCallback = s.jsonpCallback =
|
||||||
jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
|
jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
|
||||||
url = s.url.replace(jsre, "=" + jsonpCallback + "$1"),
|
url = s.url.replace(jsre, "$1" + jsonpCallback + "$2"),
|
||||||
data = s.url === url && typeof(s.data) === "string" ? s.data.replace(jsre, "=" + jsonpCallback + "$1") : s.data;
|
data = s.url === url && typeof(s.data) === "string" ? s.data.replace(jsre, "$1" + jsonpCallback + "$2") : s.data;
|
||||||
|
|
||||||
if ( url === s.url && data === s.data ) {
|
if ( url === s.url && data === s.data ) {
|
||||||
url += (rquery_jsonp.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
|
url += (rquery_jsonp.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
<?php
|
<?php
|
||||||
error_reporting(0);
|
error_reporting(0);
|
||||||
$callback = $_REQUEST['callback'];
|
$callback = $_REQUEST['callback'];
|
||||||
|
if ( ! $callback ) {
|
||||||
|
$callback = explode("?",end(explode("/",$_SERVER['REQUEST_URI'])));
|
||||||
|
$callback = $callback[0];
|
||||||
|
}
|
||||||
$json = $_REQUEST['json'];
|
$json = $_REQUEST['json'];
|
||||||
if($json) {
|
if($json) {
|
||||||
echo $callback . '([ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ])';
|
echo $callback . '([ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ])';
|
||||||
|
|
|
@ -1115,10 +1115,10 @@ test("jQuery.getScript(String, Function) - no callback", function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
test("jQuery.ajax() - JSONP, Local", function() {
|
test("jQuery.ajax() - JSONP, Local", function() {
|
||||||
expect(10);
|
expect(14);
|
||||||
|
|
||||||
var count = 0;
|
var count = 0;
|
||||||
function plus(){ if ( ++count == 10 ) start(); }
|
function plus(){ if ( ++count == 14 ) start(); }
|
||||||
|
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
|
@ -1162,6 +1162,59 @@ test("jQuery.ajax() - JSONP, Local", function() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
url: "data/jsonp.php?callback=??",
|
||||||
|
dataType: "jsonp",
|
||||||
|
success: function(data){
|
||||||
|
ok( data.data, "JSON results returned (GET, url context-free callback)" );
|
||||||
|
plus();
|
||||||
|
},
|
||||||
|
error: function(data){
|
||||||
|
ok( false, "Ajax error JSON (GET, url context-free callback)" );
|
||||||
|
plus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
url: "data/jsonp.php",
|
||||||
|
dataType: "jsonp",
|
||||||
|
data: "callback=??",
|
||||||
|
success: function(data){
|
||||||
|
ok( data.data, "JSON results returned (GET, data context-free callback)" );
|
||||||
|
plus();
|
||||||
|
},
|
||||||
|
error: function(data){
|
||||||
|
ok( false, "Ajax error JSON (GET, data context-free callback)" );
|
||||||
|
plus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
url: "data/jsonp.php/??",
|
||||||
|
dataType: "jsonp",
|
||||||
|
success: function(data){
|
||||||
|
ok( data.data, "JSON results returned (GET, REST-like)" );
|
||||||
|
plus();
|
||||||
|
},
|
||||||
|
error: function(data){
|
||||||
|
ok( false, "Ajax error JSON (GET, REST-like)" );
|
||||||
|
plus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
url: "data/jsonp.php/???json=1",
|
||||||
|
dataType: "jsonp",
|
||||||
|
success: function(data){
|
||||||
|
strictEqual( jQuery.type(data), "array", "JSON results returned (GET, REST-like with param)" );
|
||||||
|
plus();
|
||||||
|
},
|
||||||
|
error: function(data){
|
||||||
|
ok( false, "Ajax error JSON (GET, REST-like with param)" );
|
||||||
|
plus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: "data/jsonp.php",
|
url: "data/jsonp.php",
|
||||||
dataType: "jsonp",
|
dataType: "jsonp",
|
||||||
|
|
Loading…
Reference in a new issue