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
|
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/ */
// Test details of the implementation of ToPropertyDescriptor exposed to scripts
// thanks to scriptable proxies.
// A LoggingProxy object logs certain operations performed on it.
var log = [];
function LoggingProxy(target) {
return new Proxy(target, {
has: function (t, id) {
log.push("has " + id);
return id in t;
},
get: function (t, id) {
log.push("get " + id);
return t[id];
}
});
}
// Tragically, we use separate code to implement Object.defineProperty on
// arrays and on proxies. So run the test three times.
var testSubjects = [
{},
[],
new Proxy({}, {})
];
for (var obj of testSubjects) {
log = [];
// Object.defineProperty is one public method that performs a
// ToPropertyDescriptor call.
Object.defineProperty(obj, "x", new LoggingProxy({
enumerable: true,
configurable: true,
value: 3,
writable: true
}));
// It should have performed exactly these operations on the proxy, in this
// order. See ES6 rev 24 (2014 April 27) 6.2.4.5 ToPropertyDescriptor.
assertDeepEq(log, [
"has enumerable", "get enumerable",
"has configurable", "get configurable",
"has value", "get value",
"has writable", "get writable",
"has get",
"has set"
]);
}
reportCompare(0, 0);
|