gecko-dev/toolkit/modules/tests/xpcshell/test_propertyListsUtils.js
Kris Maglione e930b89c34 Bug 1514594: Part 3 - Change ChromeUtils.import API.
***
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
2019-01-17 10:18:31 -08:00

106 lines
4 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const {PropertyListUtils} = ChromeUtils.import("resource://gre/modules/PropertyListUtils.jsm");
function checkValue(aPropertyListObject, aType, aValue) {
Assert.equal(PropertyListUtils.getObjectType(aPropertyListObject), aType);
if (aValue !== undefined) {
// Perform strict equality checks until Bug 714467 is fixed.
let strictEqualityCheck = function(a, b) {
Assert.equal(typeof(a), typeof(b));
Assert.equal(a, b);
};
if (typeof(aPropertyListObject) == "object")
strictEqualityCheck(aPropertyListObject.valueOf(), aValue.valueOf());
else
strictEqualityCheck(aPropertyListObject, aValue);
}
}
function checkLazyGetterValue(aObject, aPropertyName, aType, aValue) {
let descriptor = Object.getOwnPropertyDescriptor(aObject, aPropertyName);
Assert.equal(typeof(descriptor.get), "function");
Assert.equal(typeof(descriptor.value), "undefined");
checkValue(aObject[aPropertyName], aType, aValue);
descriptor = Object.getOwnPropertyDescriptor(aObject, aPropertyName);
Assert.equal(typeof(descriptor.get), "undefined");
Assert.notEqual(typeof(descriptor.value), "undefined");
}
function checkMainPropertyList(aPropertyListRoot) {
const PRIMITIVE = PropertyListUtils.TYPE_PRIMITIVE;
checkValue(aPropertyListRoot, PropertyListUtils.TYPE_DICTIONARY);
// Check .has()
Assert.ok(aPropertyListRoot.has("Boolean"));
Assert.ok(!aPropertyListRoot.has("Nonexistent"));
checkValue(aPropertyListRoot.get("Boolean"), PRIMITIVE, false);
let array = aPropertyListRoot.get("Array");
checkValue(array, PropertyListUtils.TYPE_ARRAY);
Assert.equal(array.length, 8);
// Test both long and short values, since binary property lists store
// long values a little bit differently (see readDataLengthAndOffset).
// Short ASCII string
checkLazyGetterValue(array, 0, PRIMITIVE, "abc");
// Long ASCII string
checkLazyGetterValue(array, 1, PRIMITIVE, new Array(1001).join("a"));
// Short unicode string
checkLazyGetterValue(array, 2, PRIMITIVE, "\u05D0\u05D0\u05D0");
// Long unicode string
checkLazyGetterValue(array, 3, PRIMITIVE, new Array(1001).join("\u05D0"));
// Unicode surrogate pair
checkLazyGetterValue(array, 4, PRIMITIVE,
"\uD800\uDC00\uD800\uDC00\uD800\uDC00");
// Date
checkLazyGetterValue(array, 5, PropertyListUtils.TYPE_DATE,
new Date("2011-12-31T11:15:23Z"));
// Data
checkLazyGetterValue(array, 6, PropertyListUtils.TYPE_UINT8_ARRAY);
let dataAsString = Array.from(array[6]).map(b => String.fromCharCode(b)).join("");
Assert.equal(dataAsString, "2011-12-31T11:15:33Z");
// Dict
let dict = array[7];
checkValue(dict, PropertyListUtils.TYPE_DICTIONARY);
checkValue(dict.get("Negative Number"), PRIMITIVE, -400);
checkValue(dict.get("Real Number"), PRIMITIVE, 2.71828183);
checkValue(dict.get("Big Int"),
PropertyListUtils.TYPE_INT64,
"9007199254740993");
checkValue(dict.get("Negative Big Int"),
PropertyListUtils.TYPE_INT64,
"-9007199254740993");
}
function readPropertyList(aFile, aCallback) {
PropertyListUtils.read(aFile, function(aPropertyListRoot) {
// Null root indicates failure to read property list.
// Note: It is important not to run do_check_n/eq directly on Dict and array
// objects, because it cases their toString to get invoked, doing away with
// all the lazy getter we'd like to test later.
Assert.ok(aPropertyListRoot !== null);
aCallback(aPropertyListRoot);
run_next_test();
});
}
function run_test() {
add_test(readPropertyList.bind(this,
do_get_file("propertyLists/bug710259_propertyListBinary.plist", false),
checkMainPropertyList));
add_test(readPropertyList.bind(this,
do_get_file("propertyLists/bug710259_propertyListXML.plist", false),
checkMainPropertyList));
run_next_test();
}