Upstream: Upgrade jQuery JSON from 2.3 to 2.4.0.
authorTimo Tijhof <ttijhof@wikimedia.org>
Wed, 12 Dec 2012 20:13:03 +0000 (21:13 +0100)
committerTimo Tijhof <ttijhof@wikimedia.org>
Wed, 12 Dec 2012 20:13:03 +0000 (21:13 +0100)
* http://code.google.com/p/jquery-json/downloads/list

Change-Id: I882f232063d320370451003631c6fa369f08059f

RELEASE-NOTES-1.21
resources/jquery/jquery.json.js

index 1776d32..3d147cf 100644 (file)
@@ -60,7 +60,8 @@ production.
 * Debug message emitted by wfDebugLog() will now be prefixed with the group
   name when its logged to the default log file. That is the case whenever the
   group has no key in wgDebugLogGroups, that will help triage the default log.
-* (bug 24620) Add types to LogFormatter
+* (bug 24620) Add types to LogFormatter.
+* jQuery JSON upgraded from 2.3 to 2.4.0.
 
 === Bug fixes in 1.21 ===
 * (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
index aac3428..75953f4 100644 (file)
 /**
- * jQuery JSON Plugin
- * version: 2.3 (2011-09-17)
+ * jQuery JSON plugin 2.4.0
  *
- * This document is licensed as free software under the terms of the
- * MIT License: http://www.opensource.org/licenses/mit-license.php
- *
- * Brantley Harris wrote this plugin. It is based somewhat on the JSON.org
- * website's http://www.json.org/json2.js, which proclaims:
- * "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that
- * I uphold.
- *
- * It is also influenced heavily by MochiKit's serializeJSON, which is
- * copyrighted 2005 by Bob Ippolito.
+ * @author Brantley Harris, 2009-2011
+ * @author Timo Tijhof, 2011-2012
+ * @source This plugin is heavily influenced by MochiKit's serializeJSON, which is
+ *         copyrighted 2005 by Bob Ippolito.
+ * @source Brantley Harris wrote this plugin. It is based somewhat on the JSON.org
+ *         website's http://www.json.org/json2.js, which proclaims:
+ *         "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that
+ *         I uphold.
+ * @license MIT License <http://www.opensource.org/licenses/mit-license.php>
  */
+(function ($) {
+       'use strict';
 
-(function( $ ) {
-
-       var     escapeable = /["\\\x00-\x1f\x7f-\x9f]/g,
-                       meta = {
-                               '\b': '\\b',
-                               '\t': '\\t',
-                               '\n': '\\n',
-                               '\f': '\\f',
-                               '\r': '\\r',
-                               '"' : '\\"',
-                               '\\': '\\\\'
-                       };
+       var escape = /["\\\x00-\x1f\x7f-\x9f]/g,
+               meta = {
+                       '\b': '\\b',
+                       '\t': '\\t',
+                       '\n': '\\n',
+                       '\f': '\\f',
+                       '\r': '\\r',
+                       '"' : '\\"',
+                       '\\': '\\\\'
+               },
+               hasOwn = Object.prototype.hasOwnProperty;
 
        /**
         * jQuery.toJSON
-        * Converts the given argument into a JSON respresentation.
+        * Converts the given argument into a JSON representation.
         *
-        * @param o {Mixed} The json-serializble *thing* to be converted
+        * @param o {Mixed} The json-serializable *thing* to be converted
         *
         * If an object has a toJSON prototype, that will be used to get the representation.
         * Non-integer/string keys are skipped in the object, as are keys that point to a
         * function.
         *
         */
-       $.toJSON = typeof JSON === 'object' && JSON.stringify
-                       ? JSON.stringify
-                       : function( o ) {
-
-               if ( o === null ) {
+       $.toJSON = typeof JSON === 'object' && JSON.stringify ? JSON.stringify : function (o) {
+               if (o === null) {
                        return 'null';
                }
 
-               var type = typeof o;
+               var pairs, k, name, val,
+                       type = $.type(o);
 
-               if ( type === 'undefined' ) {
+               if (type === 'undefined') {
                        return undefined;
                }
-               if ( type === 'number' || type === 'boolean' ) {
-                       return '' + o;
+
+               // Also covers instantiated Number and Boolean objects,
+               // which are typeof 'object' but thanks to $.type, we
+               // catch them here. I don't know whether it is right
+               // or wrong that instantiated primitives are not
+               // exported to JSON as an {"object":..}.
+               // We choose this path because that's what the browsers did.
+               if (type === 'number' || type === 'boolean') {
+                       return String(o);
                }
-               if ( type === 'string') {
-                       return $.quoteString( o );
+               if (type === 'string') {
+                       return $.quoteString(o);
                }
-               if ( type === 'object' ) {
-                       if ( typeof o.toJSON === 'function' ) {
-                               return $.toJSON( o.toJSON() );
-                       }
-                       if ( o.constructor === Date ) {
-                               var     month = o.getUTCMonth() + 1,
-                                               day = o.getUTCDate(),
-                                               year = o.getUTCFullYear(),
-                                               hours = o.getUTCHours(),
-                                               minutes = o.getUTCMinutes(),
-                                               seconds = o.getUTCSeconds(),
-                                               milli = o.getUTCMilliseconds();
+               if (typeof o.toJSON === 'function') {
+                       return $.toJSON(o.toJSON());
+               }
+               if (type === 'date') {
+                       var month = o.getUTCMonth() + 1,
+                               day = o.getUTCDate(),
+                               year = o.getUTCFullYear(),
+                               hours = o.getUTCHours(),
+                               minutes = o.getUTCMinutes(),
+                               seconds = o.getUTCSeconds(),
+                               milli = o.getUTCMilliseconds();
 
-                               if ( month < 10 ) {
-                                       month = '0' + month;
-                               }
-                               if ( day < 10 ) {
-                                       day = '0' + day;
-                               }
-                               if ( hours < 10 ) {
-                                       hours = '0' + hours;
-                               }
-                               if ( minutes < 10 ) {
-                                       minutes = '0' + minutes;
-                               }
-                               if ( seconds < 10 ) {
-                                       seconds = '0' + seconds;
-                               }
-                               if ( milli < 100 ) {
-                                       milli = '0' + milli;
-                               }
-                               if ( milli < 10 ) {
-                                       milli = '0' + milli;
-                               }
-                               return '"' + year + '-' + month + '-' + day + 'T' +
-                                               hours + ':' + minutes + ':' + seconds +
-                                               '.' + milli + 'Z"';
+                       if (month < 10) {
+                               month = '0' + month;
                        }
-                       if ( o.constructor === Array ) {
-                               var ret = [];
-                               for ( var i = 0; i < o.length; i++ ) {
-                                       ret.push( $.toJSON( o[i] ) || 'null' );
-                               }
-                               return '[' + ret.join(',') + ']';
+                       if (day < 10) {
+                               day = '0' + day;
+                       }
+                       if (hours < 10) {
+                               hours = '0' + hours;
+                       }
+                       if (minutes < 10) {
+                               minutes = '0' + minutes;
+                       }
+                       if (seconds < 10) {
+                               seconds = '0' + seconds;
+                       }
+                       if (milli < 100) {
+                               milli = '0' + milli;
+                       }
+                       if (milli < 10) {
+                               milli = '0' + milli;
+                       }
+                       return '"' + year + '-' + month + '-' + day + 'T' +
+                               hours + ':' + minutes + ':' + seconds +
+                               '.' + milli + 'Z"';
+               }
+
+               pairs = [];
+
+               if ($.isArray(o)) {
+                       for (k = 0; k < o.length; k++) {
+                               pairs.push($.toJSON(o[k]) || 'null');
                        }
-                       var     name,
-                                       val,
-                                       pairs = [];
-                       for ( var k in o ) {
-                               type = typeof k;
-                               if ( type === 'number' ) {
-                                       name = '"' + k + '"';
-                               } else if (type === 'string') {
-                                       name = $.quoteString(k);
-                               } else {
+                       return '[' + pairs.join(',') + ']';
+               }
+
+               // Any other object (plain object, RegExp, ..)
+               // Need to do typeof instead of $.type, because we also
+               // want to catch non-plain objects.
+               if (typeof o === 'object') {
+                       for (k in o) {
+                               // Only include own properties,
+                               // Filter out inherited prototypes
+                               if (hasOwn.call(o, k)) {
                                        // Keys must be numerical or string. Skip others
-                                       continue;
-                               }
-                               type = typeof o[k];
+                                       type = typeof k;
+                                       if (type === 'number') {
+                                               name = '"' + k + '"';
+                                       } else if (type === 'string') {
+                                               name = $.quoteString(k);
+                                       } else {
+                                               continue;
+                                       }
+                                       type = typeof o[k];
 
-                               if ( type === 'function' || type === 'undefined' ) {
                                        // Invalid values like these return undefined
                                        // from toJSON, however those object members
                                        // shouldn't be included in the JSON string at all.
-                                       continue;
+                                       if (type !== 'function' && type !== 'undefined') {
+                                               val = $.toJSON(o[k]);
+                                               pairs.push(name + ':' + val);
+                                       }
                                }
-                               val = $.toJSON( o[k] );
-                               pairs.push( name + ':' + val );
                        }
-                       return '{' + pairs.join( ',' ) + '}';
+                       return '{' + pairs.join(',') + '}';
                }
        };
 
        /**
         * jQuery.evalJSON
-        * Evaluates a given piece of json source.
+        * Evaluates a given json string.
         *
-        * @param src {String}
+        * @param str {String}
         */
-       $.evalJSON = typeof JSON === 'object' && JSON.parse
-                       ? JSON.parse
-                       : function( src ) {
-               return eval('(' + src + ')');
+       $.evalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
+               /*jshint evil: true */
+               return eval('(' + str + ')');
        };
 
        /**
         * jQuery.secureEvalJSON
         * Evals JSON in a way that is *more* secure.
         *
-        * @param src {String}
+        * @param str {String}
         */
-       $.secureEvalJSON = typeof JSON === 'object' && JSON.parse
-                       ? JSON.parse
-                       : function( src ) {
-
+       $.secureEvalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
                var filtered =
-                               src
-                                               .replace( /\\["\\\/bfnrtu]/g, '@' )
-                                               .replace( /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
-                                               .replace( /(?:^|:|,)(?:\s*\[)+/g, '');
+                       str
+                       .replace(/\\["\\\/bfnrtu]/g, '@')
+                       .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
+                       .replace(/(?:^|:|,)(?:\s*\[)+/g, '');
 
-               if ( /^[\],:{}\s]*$/.test( filtered ) ) {
-                       return eval( '(' + src + ')' );
-               } else {
-                       throw new SyntaxError( 'Error parsing JSON, source is not valid.' );
+               if (/^[\],:{}\s]*$/.test(filtered)) {
+                       /*jshint evil: true */
+                       return eval('(' + str + ')');
                }
+               throw new SyntaxError('Error parsing JSON, source is not valid.');
        };
 
        /**
         * >>> jQuery.quoteString('"Where are we going?", she asked.')
         * "\"Where are we going?\", she asked."
         */
-       $.quoteString = function( string ) {
-               if ( string.match( escapeable ) ) {
-                       return '"' + string.replace( escapeable, function( a ) {
+       $.quoteString = function (str) {
+               if (str.match(escape)) {
+                       return '"' + str.replace(escape, function (a) {
                                var c = meta[a];
-                               if ( typeof c === 'string' ) {
+                               if (typeof c === 'string') {
                                        return c;
                                }
                                c = a.charCodeAt();
                                return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
                        }) + '"';
                }
-               return '"' + string + '"';
+               return '"' + str + '"';
        };
 
-})( jQuery );
+}(jQuery));