]> source.dussan.org Git - jquery.git/commitdiff
Fix #12751. Ensure parseJson throws in the same situations as JSON.parse. Close gh...
authorJames Huston <james@jameshuston.net>
Tue, 16 Oct 2012 18:51:54 +0000 (14:51 -0400)
committerDave Methvin <dave.methvin@gmail.com>
Wed, 17 Oct 2012 20:28:55 +0000 (16:28 -0400)
AUTHORS.txt
src/core.js
test/unit/ajax.js
test/unit/core.js

index 5a213d5a24969e32cf8bb6b9abab9c1631209cfb..b2dd8bfabc33c8cee68bd5300d5bf1a1ab6c6f03 100644 (file)
@@ -133,4 +133,5 @@ Daniel Chatfield <chatfielddaniel@gmail.com>
 Nikita Govorov <nikita.govorov@gmail.com>
 Michael Pennisi <mike@mikepennisi.com>
 Markus Staab <markus.staab@redaxo.de>
-Daniel Gálvez <dgalvez@editablething.com>
\ No newline at end of file
+Daniel Gálvez <dgalvez@editablething.com>
+James Huston <james@jameshuston.net>
\ No newline at end of file
index 5564a9870fcc183166b9efcb23ca64b08594bcc1..2f5908b55dacb1a17342829a807c152f1d4c67b6 100644 (file)
@@ -488,27 +488,32 @@ jQuery.extend({
        },
 
        parseJSON: function( data ) {
-               if ( !data || typeof data !== "string") {
-                       return null;
-               }
-
-               // Make sure leading/trailing whitespace is removed (IE can't handle it)
-               data = jQuery.trim( data );
-
                // Attempt to parse using the native JSON parser first
                if ( window.JSON && window.JSON.parse ) {
                        return window.JSON.parse( data );
                }
 
-               // Make sure the incoming data is actual JSON
-               // Logic borrowed from http://json.org/json2.js
-               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
-                       .replace( rvalidtokens, "]" )
-                       .replace( rvalidbraces, "")) ) {
+               if ( data === null ) {
+                       return data;
+               }
 
-                       return ( new Function( "return " + data ) )();
+               if ( typeof data === "string" ) {
+                       
+                       // Make sure leading/trailing whitespace is removed (IE can't handle it)
+                       data = jQuery.trim( data );
 
+                       if ( data ) {
+                               // Make sure the incoming data is actual JSON
+                               // Logic borrowed from http://json.org/json2.js
+                               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+                                       .replace( rvalidtokens, "]" )
+                                       .replace( rvalidbraces, "")) ) {
+
+                                       return ( new Function( "return " + data ) )();
+                               }
+                       }
                }
+
                jQuery.error( "Invalid JSON: " + data );
        },
 
index 4a93c65fe11dfce593c5a01eb7f9957eb7154b67..c5185efb380077c0be5f1de19b08a4fb65918306 100644 (file)
@@ -2759,4 +2759,18 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
                        start();
                });
        });
+       
+       test( "jQuery.ajax - empty json gets to error callback instead of success callback.", function() {
+               expect( 1 );
+
+               stop();
+
+               jQuery.ajax( url("data/echoData.php"), {
+                       error: function( _, __, error ) {
+                               equal( typeof error === "object", true,  "Didn't get back error object for empty json response" );
+                               start();
+                       },
+                       dataType: "json"
+               });
+       });
 }
index c0a719fe343865782f032757c51d9f063cb6328e..85d394e9864d93b40ac1385f010fbbe423cc3ceb 100644 (file)
@@ -1150,9 +1150,13 @@ test("jQuery.parseHTML", function() {
 test("jQuery.parseJSON", function(){
        expect(8);
 
-       equal( jQuery.parseJSON(), null, "Nothing in, null out." );
-       equal( jQuery.parseJSON( null ), null, "Nothing in, null out." );
-       equal( jQuery.parseJSON( "" ), null, "Nothing in, null out." );
+       raises(function() {
+               jQuery.parseJSON();
+       }, null, "parseJson now matches JSON.parse for empty input." );
+       equal(jQuery.parseJSON( null ), null, "parseJson now matches JSON.parse on null input." );
+       raises( function() {
+               jQuery.parseJSON( "" );
+       }, null, "parseJson now matches JSON.parse for empty strings." );
 
        deepEqual( jQuery.parseJSON("{}"), {}, "Plain object parsing." );
        deepEqual( jQuery.parseJSON("{\"test\":1}"), {"test":1}, "Plain object parsing." );
@@ -1346,3 +1350,50 @@ test("jQuery.camelCase()", function() {
                equal( jQuery.camelCase( key ), val, "Converts: " + key + " => " + val );
        });
 });
+
+test( "JQuery.parseJSON() test internal parseJson (using fallback) to make sure that it throws like JSON.parse", function() {
+       expect( 10 );
+
+       var jsonParse = window.JSON;
+       window.JSON = null;
+
+       raises(function() {
+               jsonParse.parse("''");
+       });
+
+       raises(function() {
+               jQuery.parseJSON("''");
+       });
+
+       raises(function() {
+               jsonParse.parse("");
+       });
+
+       raises(function() {
+               jQuery.parseJSON("");
+       });
+
+       raises(function() {
+               jsonParse.parse({});
+       });
+
+       raises(function() {
+               jQuery.parseJSON({});
+       });
+
+       var parsedValue = jsonParse.parse(null);
+       equal( parsedValue, null );
+
+       parsedValue = jQuery.parseJSON(null);
+       equal( parsedValue, null );
+
+       parsedValue = jsonParse.parse("{}");
+       equal( (typeof parsedValue === "object"), true );
+
+       parsedValue = jQuery.parseJSON("{}");
+       equal( (typeof parsedValue === "object"), true );
+       
+
+       window.JSON = jsonParse;
+} );
+