// Any copyright is dedicated to the Public Domain. // http://creativecommons.org/licenses/publicdomain/ var gTestfile = 'parse-reviver-array-delete.js'; //----------------------------------------------------------------------------- var BUGNUMBER = 999999; var summary = "JSON.parse with a reviver which elides array elements"; print(BUGNUMBER + ": " + summary); /************** * BEGIN TEST * **************/ /* * The reviver deletes all properties from the to-be-returned array. Thus * stringification reveals properties on the prototype chain -- but there are * none, so this result is unsurprising. */ assertEq(JSON.parse('[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0]', function revive(k, v) { if (k === "") return v; return undefined; }) + "", ",,,,,,,,,,,,,,,,,,,"); /* * Now let's try a reviver that deletes every property but a mega-huge one. */ var str = "["; var expected = ""; var expected2 = ""; for (var i = 0; i < 2048; i++) { str += "1,"; if (i === 2047) { expected += "1"; expected2 += "1"; } if (i === 3) expected2 += "17"; expected += ","; expected2 += ","; } str += "1]"; assertEq(JSON.parse(str, function reviver(k, v) { if (k === "" || k === "2047") return v; return undefined; }) + "", expected); Array.prototype[3] = 17; /* Now, with a property on the prototype chain, it'll show through. */ assertEq(JSON.parse('[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0]', function revive(k, v) { if (k === "") return v; return undefined; }) + "", ",,,17,,,,,,,,,,,,,,,,"); /* And here too. */ assertEq(JSON.parse(str, function reviver(k, v) { if (k === "" || k === "2047") return v; return undefined; }) + "", expected2); /******************************************************************************/ if (typeof reportCompare === "function") reportCompare(true, true); print("Tests complete");