Source code
Revision control
Copy as Markdown
Other Tools
// |reftest| skip-if(!this.hasOwnProperty("Intl"))
var otherGlobal = newGlobal();
var numberFormat = new Intl.NumberFormat();
var ccwNumberFormat = new otherGlobal.Intl.NumberFormat();
// Test Intl.NumberFormat.prototype.format with a CCW object.
var Intl_NumberFormat_format_get = Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, "format").get;
assertEq(Intl_NumberFormat_format_get.call(ccwNumberFormat)(0),
Intl_NumberFormat_format_get.call(numberFormat)(0));
// Test Intl.NumberFormat.prototype.formatToParts with a CCW object.
var Intl_NumberFormat_formatToParts = Intl.NumberFormat.prototype.formatToParts;
assertEq(deepEqual(Intl_NumberFormat_formatToParts.call(ccwNumberFormat, 0),
Intl_NumberFormat_formatToParts.call(numberFormat, 0)),
true);
// Test Intl.NumberFormat.prototype.resolvedOptions with a CCW object.
var Intl_NumberFormat_resolvedOptions = Intl.NumberFormat.prototype.resolvedOptions;
assertEq(deepEqual(Intl_NumberFormat_resolvedOptions.call(ccwNumberFormat),
Intl_NumberFormat_resolvedOptions.call(numberFormat)),
true);
// Special case for Intl.NumberFormat: The Intl fallback symbol.
function fallbackSymbol(global) {
var NF = global.Intl.NumberFormat;
return Object.getOwnPropertySymbols(NF.call(Object.create(NF.prototype)))[0];
}
const intlFallbackSymbol = fallbackSymbol(this);
const otherIntlFallbackSymbol = fallbackSymbol(otherGlobal);
assertEq(intlFallbackSymbol === otherIntlFallbackSymbol, false);
// Test when the fallback symbol points to a CCW NumberFormat object.
var objWithFallbackCCWNumberFormat = {
__proto__: Intl.NumberFormat.prototype,
[intlFallbackSymbol]: ccwNumberFormat,
};
assertEq(Intl_NumberFormat_format_get.call(objWithFallbackCCWNumberFormat)(0),
Intl_NumberFormat_format_get.call(numberFormat)(0));
assertEq(deepEqual(Intl_NumberFormat_resolvedOptions.call(objWithFallbackCCWNumberFormat),
Intl_NumberFormat_resolvedOptions.call(numberFormat)),
true);
// Ensure the fallback symbol(s) are not accessed for CCW NumberFormat objects.
var ccwNumberFormatWithPoisonedFallback = new otherGlobal.Intl.NumberFormat();
Object.setPrototypeOf(ccwNumberFormatWithPoisonedFallback, Intl.NumberFormat.prototype);
Object.defineProperty(ccwNumberFormatWithPoisonedFallback, intlFallbackSymbol, {
get() { throw new Error(); }
});
Object.defineProperty(ccwNumberFormatWithPoisonedFallback, otherIntlFallbackSymbol, {
get() { throw new Error(); }
});
assertEq(Intl_NumberFormat_format_get.call(ccwNumberFormatWithPoisonedFallback)(0),
Intl_NumberFormat_format_get.call(numberFormat)(0));
assertEq(deepEqual(Intl_NumberFormat_resolvedOptions.call(ccwNumberFormatWithPoisonedFallback),
Intl_NumberFormat_resolvedOptions.call(numberFormat)),
true);
if (typeof reportCompare === "function")
reportCompare(true, true);