OLD | NEW |
| (Empty) |
1 // Copyright 2016 the V8 project authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 // Flags: --harmony-object-own-property-descriptors | |
6 // Flags: --allow-natives-syntax | |
7 | |
8 function DataDescriptor(value) { | |
9 return { "enumerable": true, "configurable": true, "writable": true, value }; | |
10 } | |
11 | |
12 | |
13 function TestMeta() { | |
14 assertEquals(1, Object.getOwnPropertyDescriptors.length); | |
15 assertEquals(Function.prototype, | |
16 Object.getPrototypeOf(Object.getOwnPropertyDescriptors)); | |
17 assertEquals( | |
18 'getOwnPropertyDescriptors', Object.getOwnPropertyDescriptors.name); | |
19 var desc = Reflect.getOwnPropertyDescriptor( | |
20 Object, 'getOwnPropertyDescriptors'); | |
21 assertFalse(desc.enumerable); | |
22 assertTrue(desc.writable); | |
23 assertTrue(desc.configurable); | |
24 } | |
25 TestMeta(); | |
26 | |
27 | |
28 function TestToObject() { | |
29 assertThrows(function() { | |
30 Object.getOwnPropertyDescriptors(null); | |
31 }, TypeError); | |
32 | |
33 assertThrows(function() { | |
34 Object.getOwnPropertyDescriptors(undefined); | |
35 }, TypeError); | |
36 | |
37 assertThrows(function() { | |
38 Object.getOwnPropertyDescriptors(); | |
39 }, TypeError); | |
40 } | |
41 TestToObject(); | |
42 | |
43 | |
44 function TestPrototypeProperties() { | |
45 function F() {}; | |
46 F.prototype.a = "A"; | |
47 F.prototype.b = "B"; | |
48 | |
49 var F2 = new F(); | |
50 Object.defineProperties(F2, { | |
51 "b": { | |
52 enumerable: false, | |
53 configurable: true, | |
54 writable: false, | |
55 value: "Shadowed 'B'" | |
56 }, | |
57 "c": { | |
58 enumerable: false, | |
59 configurable: true, | |
60 writable: false, | |
61 value: "C" | |
62 } | |
63 }); | |
64 | |
65 assertEquals({ | |
66 "b": { | |
67 enumerable: false, | |
68 configurable: true, | |
69 writable: false, | |
70 value: "Shadowed 'B'" | |
71 }, | |
72 "c": { | |
73 enumerable: false, | |
74 configurable: true, | |
75 writable: false, | |
76 value: "C" | |
77 } | |
78 }, Object.getOwnPropertyDescriptors(F2)); | |
79 } | |
80 TestPrototypeProperties(); | |
81 | |
82 | |
83 function TestPrototypeProperties() { | |
84 function F() {}; | |
85 F.prototype.a = "A"; | |
86 F.prototype.b = "B"; | |
87 | |
88 var F2 = new F(); | |
89 Object.defineProperties(F2, { | |
90 "b": { | |
91 enumerable: false, | |
92 configurable: true, | |
93 writable: false, | |
94 value: "Shadowed 'B'" | |
95 }, | |
96 "c": { | |
97 enumerable: false, | |
98 configurable: true, | |
99 writable: false, | |
100 value: "C" | |
101 } | |
102 }); | |
103 | |
104 assertEquals({ | |
105 "b": { | |
106 enumerable: false, | |
107 configurable: true, | |
108 writable: false, | |
109 value: "Shadowed 'B'" | |
110 }, | |
111 "c": { | |
112 enumerable: false, | |
113 configurable: true, | |
114 writable: false, | |
115 value: "C" | |
116 } | |
117 }, Object.getOwnPropertyDescriptors(F2)); | |
118 } | |
119 TestPrototypeProperties(); | |
120 | |
121 | |
122 function TestTypeFilteringAndOrder() { | |
123 var log = []; | |
124 var sym = Symbol("foo"); | |
125 var psym = %CreatePrivateSymbol("private"); | |
126 var O = { | |
127 0: 0, | |
128 [sym]: 3, | |
129 "a": 2, | |
130 [psym]: 4, | |
131 1: 1, | |
132 }; | |
133 var P = new Proxy(O, { | |
134 ownKeys(target) { | |
135 log.push("ownKeys()"); | |
136 return Reflect.ownKeys(target); | |
137 }, | |
138 getOwnPropertyDescriptor(target, name) { | |
139 log.push(`getOwnPropertyDescriptor(${String(name)})`); | |
140 return Reflect.getOwnPropertyDescriptor(target, name); | |
141 }, | |
142 get(target, name) { assertUnreachable(); }, | |
143 set(target, name, value) { assertUnreachable(); }, | |
144 deleteProperty(target, name) { assertUnreachable(); }, | |
145 defineProperty(target, name, desc) { assertUnreachable(); } | |
146 }); | |
147 | |
148 var result1 = Object.getOwnPropertyDescriptors(O); | |
149 assertEquals({ | |
150 0: DataDescriptor(0), | |
151 1: DataDescriptor(1), | |
152 "a": DataDescriptor(2), | |
153 [sym]: DataDescriptor(3) | |
154 }, result1); | |
155 | |
156 var result2 = Object.getOwnPropertyDescriptors(P); | |
157 assertEquals([ | |
158 "ownKeys()", | |
159 "getOwnPropertyDescriptor(0)", | |
160 "getOwnPropertyDescriptor(1)", | |
161 "getOwnPropertyDescriptor(a)", | |
162 "getOwnPropertyDescriptor(Symbol(foo))" | |
163 ], log); | |
164 assertEquals({ | |
165 0: DataDescriptor(0), | |
166 1: DataDescriptor(1), | |
167 "a": DataDescriptor(2), | |
168 [sym]: DataDescriptor(3) | |
169 }, result2); | |
170 } | |
171 TestTypeFilteringAndOrder(); | |
172 | |
173 | |
174 function TestDuplicateKeys() { | |
175 var i = 0; | |
176 var log = []; | |
177 var P = new Proxy({}, { | |
178 ownKeys() { | |
179 log.push(`ownKeys()`); | |
180 return ["A", "A"]; | |
181 }, | |
182 getOwnPropertyDescriptor(t, name) { | |
183 log.push(`getOwnPropertyDescriptor(${name})`); | |
184 if (i++) return; | |
185 return { | |
186 configurable: true, | |
187 writable: false, | |
188 value: "VALUE" | |
189 }; | |
190 }, | |
191 get(target, name) { assertUnreachable(); }, | |
192 set(target, name, value) { assertUnreachable(); }, | |
193 deleteProperty(target, name) { assertUnreachable(); }, | |
194 defineProperty(target, name, desc) { assertUnreachable(); } | |
195 }); | |
196 | |
197 var result = Object.getOwnPropertyDescriptors(P); | |
198 assertEquals({ | |
199 "A": { | |
200 "value": "VALUE", | |
201 "writable": false, | |
202 "enumerable": false, | |
203 "configurable": true | |
204 } | |
205 }, result); | |
206 assertTrue(result.hasOwnProperty("A")); | |
207 assertEquals([ | |
208 "ownKeys()", | |
209 "getOwnPropertyDescriptor(A)", | |
210 "getOwnPropertyDescriptor(A)" | |
211 ], log); | |
212 } | |
213 TestDuplicateKeys(); | |
214 | |
215 function TestFakeProperty() { | |
216 var log = []; | |
217 var P = new Proxy({}, { | |
218 ownKeys() { | |
219 log.push(`ownKeys()`); | |
220 return ["fakeProperty"]; | |
221 }, | |
222 getOwnPropertyDescriptor(target, name) { | |
223 log.push(`getOwnPropertyDescriptor(${name})`); | |
224 return; | |
225 } | |
226 }); | |
227 var result = Object.getOwnPropertyDescriptors(P); | |
228 assertEquals({}, result); | |
229 assertFalse(result.hasOwnProperty("fakeProperty")); | |
230 assertEquals([ | |
231 "ownKeys()", | |
232 "getOwnPropertyDescriptor(fakeProperty)" | |
233 ], log); | |
234 } | |
235 TestFakeProperty(); | |
OLD | NEW |