1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
// |reftest| skip-if(!this.hasOwnProperty("Intl"))
var otherGlobal = newGlobal();
var dateTimeFormat = new Intl.DateTimeFormat();
var ccwDateTimeFormat = new otherGlobal.Intl.DateTimeFormat();
// Test Intl.DateTimeFormat.prototype.format with a CCW object.
var Intl_DateTimeFormat_format_get = Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, "format").get;
assertEq(Intl_DateTimeFormat_format_get.call(ccwDateTimeFormat)(0),
Intl_DateTimeFormat_format_get.call(dateTimeFormat)(0));
// Test Intl.DateTimeFormat.prototype.formatToParts with a CCW object.
var Intl_DateTimeFormat_formatToParts = Intl.DateTimeFormat.prototype.formatToParts;
assertEq(deepEqual(Intl_DateTimeFormat_formatToParts.call(ccwDateTimeFormat, 0),
Intl_DateTimeFormat_formatToParts.call(dateTimeFormat, 0)),
true);
// Test Intl.DateTimeFormat.prototype.resolvedOptions with a CCW object.
var Intl_DateTimeFormat_resolvedOptions = Intl.DateTimeFormat.prototype.resolvedOptions;
assertEq(deepEqual(Intl_DateTimeFormat_resolvedOptions.call(ccwDateTimeFormat),
Intl_DateTimeFormat_resolvedOptions.call(dateTimeFormat)),
true);
// Special case for Intl.DateTimeFormat: The Intl fallback symbol.
function fallbackSymbol(global) {
var DTF = global.Intl.DateTimeFormat;
return Object.getOwnPropertySymbols(DTF.call(Object.create(DTF.prototype)))[0];
}
const intlFallbackSymbol = fallbackSymbol(this);
const otherIntlFallbackSymbol = fallbackSymbol(otherGlobal);
assertEq(intlFallbackSymbol === otherIntlFallbackSymbol, false);
// Test when the fallback symbol points to a CCW DateTimeFormat object.
var objWithFallbackCCWDateTimeFormat = {
__proto__: Intl.DateTimeFormat.prototype,
[intlFallbackSymbol]: ccwDateTimeFormat,
};
assertEq(Intl_DateTimeFormat_format_get.call(objWithFallbackCCWDateTimeFormat)(0),
Intl_DateTimeFormat_format_get.call(dateTimeFormat)(0));
assertEq(deepEqual(Intl_DateTimeFormat_resolvedOptions.call(objWithFallbackCCWDateTimeFormat),
Intl_DateTimeFormat_resolvedOptions.call(dateTimeFormat)),
true);
// Ensure the fallback symbol(s) are not accessed for CCW DateTimeFormat objects.
var ccwDateTimeFormatWithPoisonedFallback = new otherGlobal.Intl.DateTimeFormat();
Object.setPrototypeOf(ccwDateTimeFormatWithPoisonedFallback, Intl.DateTimeFormat.prototype);
Object.defineProperty(ccwDateTimeFormatWithPoisonedFallback, intlFallbackSymbol, {
get() { throw new Error(); }
});
Object.defineProperty(ccwDateTimeFormatWithPoisonedFallback, otherIntlFallbackSymbol, {
get() { throw new Error(); }
});
assertEq(Intl_DateTimeFormat_format_get.call(ccwDateTimeFormatWithPoisonedFallback)(0),
Intl_DateTimeFormat_format_get.call(dateTimeFormat)(0));
assertEq(deepEqual(Intl_DateTimeFormat_resolvedOptions.call(ccwDateTimeFormatWithPoisonedFallback),
Intl_DateTimeFormat_resolvedOptions.call(dateTimeFormat)),
true);
if (typeof reportCompare === "function")
reportCompare(true, true);
|