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