Skip to content
Permalink
Browse files

Fixes #4897. Added ?? as a context-insensitive placeholder for the ca…

…llback name of a JSONP request. Unit tests provided.
  • Loading branch information...
jaubourg committed Jan 12, 2011
1 parent f83cdc3 commit 0c51e9d55f39366cab14719b80cb7e989c716351
Showing with 62 additions and 5 deletions.
  1. +3 −3 src/ajax/jsonp.js
  2. +4 −0 test/data/jsonp.php
  3. +55 −2 test/unit/ajax.js
@@ -1,7 +1,7 @@
(function( jQuery ) {

var jsc = jQuery.now(),
jsre = /\=(?:\?|%3F)(&|$)/i,
jsre = /(\=)(?:\?|%3F)(&|$)|()(?:\?\?|%3F%3F)()/i,
rquery_jsonp = /\?/;

// Default jsonp settings
@@ -25,8 +25,8 @@ jQuery.ajax.prefilter("json jsonp", function(s, originalSettings) {

var jsonpCallback = s.jsonpCallback =
jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
url = s.url.replace(jsre, "=" + jsonpCallback + "$1"),
data = s.url === url && typeof(s.data) === "string" ? s.data.replace(jsre, "=" + jsonpCallback + "$1") : s.data;
url = s.url.replace(jsre, "$1" + jsonpCallback + "$2"),
data = s.url === url && typeof(s.data) === "string" ? s.data.replace(jsre, "$1" + jsonpCallback + "$2") : s.data;

if ( url === s.url && data === s.data ) {
url += (rquery_jsonp.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
@@ -1,6 +1,10 @@
<?php
error_reporting(0);
$callback = $_REQUEST['callback'];
if ( ! $callback ) {
$callback = explode("?",end(explode("/",$_SERVER['REQUEST_URI'])));
$callback = $callback[0];
}
$json = $_REQUEST['json'];
if($json) {
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() {
expect(10);
expect(14);

var count = 0;
function plus(){ if ( ++count == 10 ) start(); }
function plus(){ if ( ++count == 14 ) start(); }

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({
url: "data/jsonp.php",
dataType: "jsonp",

0 comments on commit 0c51e9d

Please sign in to comment.
You can’t perform that action at this time.