• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// 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
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})();
212