mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-10 05:08:36 +02:00
***
Bug 1514594: Part 3a - Change ChromeUtils.import to return an exports object; not pollute global. r=mccr8
This changes the behavior of ChromeUtils.import() to return an exports object,
rather than a module global, in all cases except when `null` is passed as a
second argument, and changes the default behavior not to pollute the global
scope with the module's exports. Thus, the following code written for the old
model:
ChromeUtils.import("resource://gre/modules/Services.jsm");
is approximately the same as the following, in the new model:
var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
Since the two behaviors are mutually incompatible, this patch will land with a
scripted rewrite to update all existing callers to use the new model rather
than the old.
***
Bug 1514594: Part 3b - Mass rewrite all JS code to use the new ChromeUtils.import API. rs=Gijs
This was done using the followng script:
https://bitbucket.org/kmaglione/m-c-rewrites/src/tip/processors/cu-import-exports.jsm
***
Bug 1514594: Part 3c - Update ESLint plugin for ChromeUtils.import API changes. r=Standard8
Differential Revision: https://phabricator.services.mozilla.com/D16747
***
Bug 1514594: Part 3d - Remove/fix hundreds of duplicate imports from sync tests. r=Gijs
Differential Revision: https://phabricator.services.mozilla.com/D16748
***
Bug 1514594: Part 3e - Remove no-op ChromeUtils.import() calls. r=Gijs
Differential Revision: https://phabricator.services.mozilla.com/D16749
***
Bug 1514594: Part 3f.1 - Cleanup various test corner cases after mass rewrite. r=Gijs
***
Bug 1514594: Part 3f.2 - Cleanup various non-test corner cases after mass rewrite. r=Gijs
Differential Revision: https://phabricator.services.mozilla.com/D16750
--HG--
extra : rebase_source : 359574ee3064c90f33bf36c2ebe3159a24cc8895
extra : histedit_source : b93c8f42808b1599f9122d7842d2c0b3e656a594%2C64a3a4e3359dc889e2ab2b49461bab9e27fc10a7
160 lines
5.2 KiB
JavaScript
160 lines
5.2 KiB
JavaScript
const { CanonicalJSON } = ChromeUtils.import("resource://gre/modules/CanonicalJSON.jsm");
|
|
|
|
function stringRepresentation(obj) {
|
|
const clone = JSON.parse(JSON.stringify(obj));
|
|
return JSON.stringify(clone);
|
|
}
|
|
|
|
add_task(async function test_canonicalJSON_should_preserve_array_order() {
|
|
const input = ["one", "two", "three"];
|
|
// No sorting should be done on arrays.
|
|
Assert.equal(CanonicalJSON.stringify(input), '["one","two","three"]');
|
|
});
|
|
|
|
add_task(async function test_canonicalJSON_orders_object_keys() {
|
|
const input = [{
|
|
b: ["two", "three"],
|
|
a: ["zero", "one"],
|
|
}];
|
|
Assert.equal(
|
|
CanonicalJSON.stringify(input),
|
|
'[{"a":["zero","one"],"b":["two","three"]}]'
|
|
);
|
|
});
|
|
|
|
add_task(async function test_canonicalJSON_orders_nested_object_keys() {
|
|
const input = [{
|
|
b: {d: "d", c: "c"},
|
|
a: {b: "b", a: "a"},
|
|
}];
|
|
Assert.equal(
|
|
CanonicalJSON.stringify(input),
|
|
'[{"a":{"a":"a","b":"b"},"b":{"c":"c","d":"d"}}]'
|
|
);
|
|
});
|
|
|
|
add_task(async function test_canonicalJSON_escapes_unicode_values() {
|
|
Assert.equal(
|
|
CanonicalJSON.stringify([{key: "✓"}]),
|
|
'[{"key":"\\u2713"}]'
|
|
);
|
|
// Unicode codepoints should be output in lowercase.
|
|
Assert.equal(
|
|
CanonicalJSON.stringify([{key: "é"}]),
|
|
'[{"key":"\\u00e9"}]'
|
|
);
|
|
});
|
|
|
|
add_task(async function test_canonicalJSON_escapes_unicode_object_keys() {
|
|
Assert.equal(
|
|
CanonicalJSON.stringify([{"é": "check"}]),
|
|
'[{"\\u00e9":"check"}]'
|
|
);
|
|
});
|
|
|
|
|
|
add_task(async function test_canonicalJSON_does_not_alter_input() {
|
|
const records = [
|
|
{"foo": "bar", "last_modified": "12345", "id": "1"},
|
|
{"bar": "baz", "last_modified": "45678", "id": "2"},
|
|
];
|
|
const serializedJSON = JSON.stringify(records);
|
|
CanonicalJSON.stringify(records);
|
|
Assert.equal(JSON.stringify(records), serializedJSON);
|
|
});
|
|
|
|
|
|
add_task(async function test_canonicalJSON_preserves_data() {
|
|
const records = [
|
|
{"foo": "bar", "last_modified": "12345", "id": "1"},
|
|
{"bar": "baz", "last_modified": "45678", "id": "2"},
|
|
];
|
|
const expected = '[{"foo":"bar","id":"1","last_modified":"12345"},' +
|
|
'{"bar":"baz","id":"2","last_modified":"45678"}]';
|
|
Assert.equal(CanonicalJSON.stringify(records), expected);
|
|
});
|
|
|
|
add_task(async function test_canonicalJSON_does_not_add_space_separators() {
|
|
const records = [
|
|
{"foo": "bar", "last_modified": "12345", "id": "1"},
|
|
{"bar": "baz", "last_modified": "45678", "id": "2"},
|
|
];
|
|
const serialized = CanonicalJSON.stringify(records);
|
|
Assert.ok(!serialized.includes(" "));
|
|
});
|
|
|
|
add_task(async function test_canonicalJSON_serializes_empty_object() {
|
|
Assert.equal(CanonicalJSON.stringify({}), "{}");
|
|
});
|
|
|
|
add_task(async function test_canonicalJSON_serializes_empty_array() {
|
|
Assert.equal(CanonicalJSON.stringify([]), "[]");
|
|
});
|
|
|
|
add_task(async function test_canonicalJSON_serializes_NaN() {
|
|
Assert.equal(CanonicalJSON.stringify(NaN), "null");
|
|
});
|
|
|
|
add_task(async function test_canonicalJSON_serializes_inf() {
|
|
// This isn't part of the JSON standard.
|
|
Assert.equal(CanonicalJSON.stringify(Infinity), "null");
|
|
});
|
|
|
|
|
|
add_task(async function test_canonicalJSON_serializes_empty_string() {
|
|
Assert.equal(CanonicalJSON.stringify(""), '""');
|
|
});
|
|
|
|
add_task(async function test_canonicalJSON_escapes_backslashes() {
|
|
Assert.equal(CanonicalJSON.stringify("This\\and this"), '"This\\\\and this"');
|
|
});
|
|
|
|
add_task(async function test_canonicalJSON_handles_signed_zeros() {
|
|
// do_check_eq doesn't support comparison of -0 and 0 properly.
|
|
Assert.ok(CanonicalJSON.stringify(-0) === "-0");
|
|
Assert.ok(CanonicalJSON.stringify(0) === "0");
|
|
});
|
|
|
|
|
|
add_task(async function test_canonicalJSON_with_deeply_nested_dicts() {
|
|
const records = [{
|
|
"a": {
|
|
"b": "b",
|
|
"a": "a",
|
|
"c": {
|
|
"b": "b",
|
|
"a": "a",
|
|
"c": ["b", "a", "c"],
|
|
"d": {"b": "b", "a": "a"},
|
|
"id": "1",
|
|
"e": 1,
|
|
"f": [2, 3, 1],
|
|
"g": {2: 2, 3: 3, 1: {
|
|
"b": "b", "a": "a", "c": "c"}}}},
|
|
"id": "1"}];
|
|
const expected =
|
|
'[{"a":{"a":"a","b":"b","c":{"a":"a","b":"b","c":["b","a","c"],' +
|
|
'"d":{"a":"a","b":"b"},"e":1,"f":[2,3,1],"g":{' +
|
|
'"1":{"a":"a","b":"b","c":"c"},"2":2,"3":3},"id":"1"}},"id":"1"}]';
|
|
|
|
Assert.equal(CanonicalJSON.stringify(records), expected);
|
|
});
|
|
|
|
add_task(async function test_canonicalJSON_should_use_scientific_notation() {
|
|
/*
|
|
We globally follow the Python float representation, except for exponents < 10
|
|
where we drop the leading zero
|
|
*/
|
|
Assert.equal(CanonicalJSON.stringify(.00099), "0.00099");
|
|
Assert.equal(CanonicalJSON.stringify(.000011), "0.000011");
|
|
Assert.equal(CanonicalJSON.stringify(.0000011), "0.0000011");
|
|
Assert.equal(CanonicalJSON.stringify(.000001), "0.000001");
|
|
Assert.equal(CanonicalJSON.stringify(.00000099), "9.9e-7");
|
|
Assert.equal(CanonicalJSON.stringify(.0000001), "1e-7");
|
|
Assert.equal(CanonicalJSON.stringify(.000000930258908), "9.30258908e-7");
|
|
Assert.equal(CanonicalJSON.stringify(.00000000000068272), "6.8272e-13");
|
|
Assert.equal(CanonicalJSON.stringify(Math.pow(10, 20)), "100000000000000000000");
|
|
Assert.equal(CanonicalJSON.stringify(Math.pow(10, 21)), "1e+21");
|
|
Assert.equal(CanonicalJSON.stringify(Math.pow(10, 15) + 0.1), "1000000000000000.1");
|
|
Assert.equal(CanonicalJSON.stringify(Math.pow(10, 16) * 1.1), "11000000000000000");
|
|
});
|