blob: 9ed6005d6b2ffcbff5d24b57e83dc7605292b4a5 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 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-proxies --harmony-reflect
6
7
8
9function toKey(x) {
10 if (typeof x === "symbol") return x;
11 return String(x);
12}
13
14
15const noconf = {configurable: false};
16const noconf_nowrite = {configurable: false, writable: false};
17
18
19var symbol = Symbol();
20
21
22var log = [];
23var logger = {};
24var handler = new Proxy({}, logger);
25
26logger.get = function(t, trap, r) {
27 return function() {
28 log.push([trap, ...arguments]);
29 return Reflect[trap](...arguments);
30 }
31};
32
33
34(function Seal() {
35 var target = [];
36 var proxy = new Proxy(target, handler);
37 log.length = 0;
38
39 target.wurst = 42;
40 target[0] = true;
41 Object.defineProperty(target, symbol, {get: undefined});
42
43 Object.seal(proxy);
44 assertEquals(6, log.length)
45 for (var i in log) assertSame(target, log[i][1]);
46
47 assertArrayEquals(
48 ["preventExtensions", target], log[0]);
49 assertArrayEquals(
50 ["ownKeys", target], log[1]);
51 assertArrayEquals(
52 ["defineProperty", target, toKey(0), noconf], log[2]);
53 assertArrayEquals(
54 ["defineProperty", target, toKey("length"), noconf], log[3]);
55 assertArrayEquals(
56 ["defineProperty", target, toKey("wurst"), noconf], log[4]);
57 assertArrayEquals(
58 ["defineProperty", target, toKey(symbol), noconf], log[5]);
59})();
60
61
62(function Freeze() {
63 var target = [];
64 var proxy = new Proxy(target, handler);
65 log.length = 0;
66
67 target.wurst = 42;
68 target[0] = true;
69 Object.defineProperty(target, symbol, {get: undefined});
70
71 Object.freeze(proxy);
72 assertEquals(10, log.length)
73 for (var i in log) assertSame(target, log[i][1]);
74
75 assertArrayEquals(
76 ["preventExtensions", target], log[0]);
77 assertArrayEquals(
78 ["ownKeys", target], log[1]);
79 assertArrayEquals(
80 ["getOwnPropertyDescriptor", target, toKey(0)], log[2]);
81 assertArrayEquals(
82 ["defineProperty", target, toKey(0), noconf_nowrite], log[3]);
83 assertArrayEquals(
84 ["getOwnPropertyDescriptor", target, toKey("length")], log[4]);
85 assertArrayEquals(
86 ["defineProperty", target, toKey("length"), noconf_nowrite], log[5]);
87 assertArrayEquals(
88 ["getOwnPropertyDescriptor", target, toKey("wurst")], log[6]);
89 assertArrayEquals(
90 ["defineProperty", target, toKey("wurst"), noconf_nowrite], log[7]);
91 assertArrayEquals(
92 ["getOwnPropertyDescriptor", target, toKey(symbol)], log[8]);
93 assertArrayEquals(
94 ["defineProperty", target, toKey(symbol), noconf], log[9]);
95})();
96
97
98(function IsSealed() {
99 var target = [];
100 var proxy = new Proxy(target, handler);
101
102 target.wurst = 42;
103 target[0] = true;
104 Object.defineProperty(target, symbol, {get: undefined});
105
106 // Extensible.
107
108 log.length = 0;
109
110 Object.isSealed(proxy);
111 assertEquals(1, log.length)
112 for (var i in log) assertSame(target, log[i][1]);
113
114 assertArrayEquals(
115 ["isExtensible", target], log[0]);
116
117 // Not extensible but not sealed.
118
119 log.length = 0;
120 Object.preventExtensions(target);
121
122 Object.isSealed(proxy);
123 assertEquals(3, log.length)
124 for (var i in log) assertSame(target, log[i][1]);
125
126 assertArrayEquals(
127 ["isExtensible", target], log[0]);
128 assertArrayEquals(
129 ["ownKeys", target], log[1]);
130 assertArrayEquals(
131 ["getOwnPropertyDescriptor", target, toKey(0)], log[2]);
132
133 // Sealed.
134
135 log.length = 0;
136 Object.seal(target);
137
138 Object.isSealed(proxy);
139 assertEquals(6, log.length)
140 for (var i in log) assertSame(target, log[i][1]);
141
142 assertArrayEquals(
143 ["isExtensible", target], log[0]);
144 assertArrayEquals(
145 ["ownKeys", target], log[1]);
146 assertArrayEquals(
147 ["getOwnPropertyDescriptor", target, toKey(0)], log[2]);
148 assertArrayEquals(
149 ["getOwnPropertyDescriptor", target, toKey("length")], log[3]);
150 assertArrayEquals(
151 ["getOwnPropertyDescriptor", target, toKey("wurst")], log[4]);
152 assertArrayEquals(
153 ["getOwnPropertyDescriptor", target, toKey(symbol)], log[5]);
154})();
155
156
157(function IsFrozen() {
158 var target = [];
159 var proxy = new Proxy(target, handler);
160
161 target.wurst = 42;
162 target[0] = true;
163 Object.defineProperty(target, symbol, {get: undefined});
164
165 // Extensible.
166
167 log.length = 0;
168
169 Object.isFrozen(proxy);
170 assertEquals(1, log.length)
171 for (var i in log) assertSame(target, log[i][1]);
172
173 assertArrayEquals(
174 ["isExtensible", target], log[0]);
175
176 // Not extensible but not frozen.
177
178 log.length = 0;
179 Object.preventExtensions(target);
180
181 Object.isFrozen(proxy);
182 assertEquals(3, log.length)
183 for (var i in log) assertSame(target, log[i][1]);
184
185 assertArrayEquals(
186 ["isExtensible", target], log[0]);
187 assertArrayEquals(
188 ["ownKeys", target], log[1]);
189 assertArrayEquals(
190 ["getOwnPropertyDescriptor", target, toKey(0)], log[2]);
191
192 // Frozen.
193
194 log.length = 0;
195 Object.freeze(target);
196
197 Object.isFrozen(proxy);
198 assertEquals(6, log.length)
199 for (var i in log) assertSame(target, log[i][1]);
200
201 assertArrayEquals(
202 ["isExtensible", target], log[0]);
203 assertArrayEquals(
204 ["ownKeys", target], log[1]);
205 assertArrayEquals(
206 ["getOwnPropertyDescriptor", target, toKey(0)], log[2]);
207 assertArrayEquals(
208 ["getOwnPropertyDescriptor", target, toKey("length")], log[3]);
209 assertArrayEquals(
210 ["getOwnPropertyDescriptor", target, toKey("wurst")], log[4]);
211 assertArrayEquals(
212 ["getOwnPropertyDescriptor", target, toKey(symbol)], log[5]);
213})();