Bug 458959. this.JSON is enumerable. r+sr=mrbkap

This commit is contained in:
Robert Sayre 2008-10-08 19:33:26 -04:00
parent c801f5aa4d
commit 70868d33ad
6 changed files with 35 additions and 36 deletions

View File

@ -2322,10 +2322,10 @@ SessionStoreService.prototype = {
* @return the object's JSON representation
*/
_toJSONString: function sss_toJSONString(aJSObject) {
let str = JSON.toString(aJSObject, ["_tab", "_hosts", "_formDataSaved"] /* keys to drop */);
let str = JSONModule.toString(aJSObject, ["_tab", "_hosts", "_formDataSaved"] /* keys to drop */);
// sanity check - so that API consumers can just eval this string
if (!JSON.isMostlyHarmless(str))
if (!JSONModule.isMostlyHarmless(str))
throw new Error("JSON conversion failed unexpectedly!");
return str;

View File

@ -115,7 +115,7 @@ function testEventDispatching() {
// expectedEvents should be empty now. If it's not, print errors.
expectedEvents.forEach(function(e) {
ok(false, "Didn't receive expected event: " + JSON.toString(e));
ok(false, "Didn't receive expected event: " + JSON.parse(e));
});
};
let i = 0;
@ -213,7 +213,6 @@ function testDefaultHandling() {
function runTests() {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
Components.utils.import("resource://gre/modules/JSON.jsm");
testEventDispatching();

View File

@ -913,7 +913,8 @@ js_InitJSONClass(JSContext *cx, JSObject *obj)
if (!JSON)
return NULL;
if (!JS_DefineProperty(cx, obj, js_JSON_str, OBJECT_TO_JSVAL(JSON),
JS_PropertyStub, JS_PropertyStub, JSPROP_ENUMERATE))
JS_PropertyStub, JS_PropertyStub,
JSPROP_READONLY | JSPROP_PERMANENT))
return NULL;
if (!JS_DefineFunctions(cx, JSON, json_static_methods))

View File

@ -44,14 +44,14 @@
*
* Usage:
*
* var newJSONString = JSON.toString( GIVEN_JAVASCRIPT_OBJECT );
* var newJavaScriptObject = JSON.fromString( GIVEN_JSON_STRING );
* var newJSONString = JSONModule.toString( GIVEN_JAVASCRIPT_OBJECT );
* var newJavaScriptObject = JSONModule.fromString( GIVEN_JSON_STRING );
*
* Note: For your own safety, Objects/Arrays returned by
* JSON.fromString aren't instanceof Object/Array.
* JSONModule.fromString aren't instanceof Object/Array.
*/
var EXPORTED_SYMBOLS = ["JSON"];
var EXPORTED_SYMBOLS = ["JSONModule"];
// The following code is a loose adaption of Douglas Crockford's code
// from http://www.json.org/json.js (public domain'd)
@ -61,7 +61,7 @@ var EXPORTED_SYMBOLS = ["JSON"];
// silently dropped but always lead to a TypeError.
// * An optional key blacklist has been added to JSON.toString
var JSON = {
var JSONModule = {
/**
* Converts a JavaScript object into a JSON string.
*

View File

@ -37,8 +37,8 @@
function run_test() {
// converts an object to a JSON string and tests its integrity
function toJSONString(a) {
var res = JSON.toString(a);
if (!JSON.isMostlyHarmless(res))
var res = JSONModule.toString(a);
if (!JSONModule.isMostlyHarmless(res))
throw new SyntaxError("Invalid JSON string: " + res);
return res;
}
@ -46,7 +46,7 @@ function run_test() {
// ensures that an object can't be converted to a JSON string
function isInvalidType(a) {
try {
JSON.toString(a);
JSONModule.toString(a);
return false;
} catch (ex) {
return ex.name == "TypeError";
@ -55,15 +55,15 @@ function run_test() {
// ensures that a string can't be converted back to a JavaScript object
function isInvalidSyntax(a) {
try {
JSON.fromString(a);
JSONModule.fromString(a);
return false;
} catch (ex) {
return ex.name == "SyntaxError";
}
}
Components.utils.import("resource://gre/modules/JSON.jsm");
do_check_eq(typeof(JSON), "object");
Components.utils.import("resource://gre/modules/JSONModule.jsm");
do_check_eq(typeof(JSONModule), "object");
// some of the tests are adapted from /testing/mochitest/tests/test_Base.js
do_check_eq(toJSONString(true), "true");
@ -89,50 +89,50 @@ function run_test() {
var obj = { a: 1, b: "2", c: [-3e+30] };
do_check_eq(toJSONString(obj), '{"a":1,"b":"2","c":[-3e+30]}');
do_check_eq(JSON.toString(obj, ["b", "c"] /* keys to drop */), '{"a":1}');
do_check_eq(JSONModule.toString(obj, ["b", "c"] /* keys to drop */), '{"a":1}');
do_check_true(isInvalidType(function() { }));
// make sure that toJSONString actually works...
do_check_eq(toJSONString(obj), JSON.toString(obj));
do_check_eq(toJSONString(obj), JSONModule.toString(obj));
do_check_eq(JSON.fromString("true"), true);
do_check_eq(JSON.fromString("false"), false);
do_check_eq(JSON.fromString("1"), 1);
do_check_eq(JSON.fromString('"2.2"'), "2.2");
do_check_eq(JSON.fromString("1.23e-45"), 1.23e-45);
do_check_eq(JSONModule.fromString("true"), true);
do_check_eq(JSONModule.fromString("false"), false);
do_check_eq(JSONModule.fromString("1"), 1);
do_check_eq(JSONModule.fromString('"2.2"'), "2.2");
do_check_eq(JSONModule.fromString("1.23e-45"), 1.23e-45);
do_check_true(isInvalidSyntax("NaN"));
do_check_eq(JSON.fromString('"Foo-Bar \\b\\t\\n\\f\\r\\"\\\\ \\u0001\\u20ac"'),
do_check_eq(JSONModule.fromString('"Foo-Bar \\b\\t\\n\\f\\r\\"\\\\ \\u0001\\u20ac"'),
"Foo-Bar \b\t\n\f\r\"\\ \x01\u20ac");
do_check_true(isInvalidSyntax('"multi\nline"'));
do_check_eq(JSON.fromString("null"), null);
do_check_eq(JSONModule.fromString("null"), null);
do_check_true(isInvalidSyntax("."));
var res = JSON.fromString('[1,"2",3.3]');
var res = JSONModule.fromString('[1,"2",3.3]');
do_check_eq(res.length, 3);
do_check_eq(res[2], 3.3);
// res is an instance of the sandbox's array
do_check_false(res instanceof Array);
res = JSON.fromString(toJSONString(obj));
res = JSONModule.fromString(toJSONString(obj));
do_check_eq(res.a, obj.a);
do_check_eq(res.b, obj.b);
do_check_eq(res.c.length, obj.c.length);
do_check_eq(res.c[0], obj.c[0]);
// those would throw on JSON.fromString if there's no object |a|
do_check_true(JSON.isMostlyHarmless("a"));
do_check_true(JSON.isMostlyHarmless("a[0]"));
do_check_true(JSON.isMostlyHarmless('a["alert(\\"P0wn3d!\\");"]'));
// those would throw on JSONModule.fromString if there's no object |a|
do_check_true(JSONModule.isMostlyHarmless("a"));
do_check_true(JSONModule.isMostlyHarmless("a[0]"));
do_check_true(JSONModule.isMostlyHarmless('a["alert(\\"P0wn3d!\\");"]'));
do_check_false(JSON.isMostlyHarmless('(function() { alert("P0wn3d!"); })()'));
do_check_false(JSON.isMostlyHarmless('{ get a() { return "P0wn3d!"; } }'));
do_check_false(JSONModule.isMostlyHarmless('(function() { alert("P0wn3d!"); })()'));
do_check_false(JSONModule.isMostlyHarmless('{ get a() { return "P0wn3d!"; } }'));
// this string shouldn't cause a "script stack space quota is exhausted" error
let bigString = " ";
while (bigString.length < (1 << 22))
bigString += bigString;
do_check_eq(JSON.fromString(toJSONString(bigString)), bigString);
do_check_eq(JSONModule.fromString(toJSONString(bigString)), bigString);
}

View File

@ -55,7 +55,6 @@ const HTTP_BAD_GATEWAY = 502;
const HTTP_SERVICE_UNAVAILABLE = 503;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/JSON.jsm");
/**
* SuggestAutoCompleteResult contains the results returned by the Suggest
@ -523,7 +522,7 @@ SuggestAutoComplete.prototype = {
this._clearServerErrors();
var serverResults = JSON.fromString(responseText);
var serverResults = JSON.parse(responseText);
var searchString = serverResults[0] || "";
var results = serverResults[1] || [];