2015-12-07 11:01:16 +00:00
|
|
|
// Copyright 2015 the V8 project authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function toKey(x) {
|
|
|
|
if (typeof x === "symbol") return x;
|
|
|
|
return String(x);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const noconf = {configurable: false};
|
|
|
|
const noconf_nowrite = {configurable: false, writable: false};
|
|
|
|
|
|
|
|
|
|
|
|
var symbol = Symbol();
|
|
|
|
|
|
|
|
|
|
|
|
var log = [];
|
|
|
|
var logger = {};
|
|
|
|
var handler = new Proxy({}, logger);
|
|
|
|
|
|
|
|
logger.get = function(t, trap, r) {
|
|
|
|
return function() {
|
|
|
|
log.push([trap, ...arguments]);
|
|
|
|
return Reflect[trap](...arguments);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
(function Seal() {
|
|
|
|
var target = [];
|
|
|
|
var proxy = new Proxy(target, handler);
|
|
|
|
log.length = 0;
|
|
|
|
|
|
|
|
target.wurst = 42;
|
|
|
|
target[0] = true;
|
|
|
|
Object.defineProperty(target, symbol, {get: undefined});
|
|
|
|
|
|
|
|
Object.seal(proxy);
|
|
|
|
assertEquals(6, log.length)
|
|
|
|
for (var i in log) assertSame(target, log[i][1]);
|
|
|
|
|
|
|
|
assertArrayEquals(
|
|
|
|
["preventExtensions", target], log[0]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["ownKeys", target], log[1]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["defineProperty", target, toKey(0), noconf], log[2]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["defineProperty", target, toKey("length"), noconf], log[3]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["defineProperty", target, toKey("wurst"), noconf], log[4]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["defineProperty", target, toKey(symbol), noconf], log[5]);
|
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
|
|
(function Freeze() {
|
|
|
|
var target = [];
|
|
|
|
var proxy = new Proxy(target, handler);
|
|
|
|
log.length = 0;
|
|
|
|
|
|
|
|
target.wurst = 42;
|
|
|
|
target[0] = true;
|
|
|
|
Object.defineProperty(target, symbol, {get: undefined});
|
|
|
|
|
|
|
|
Object.freeze(proxy);
|
|
|
|
assertEquals(10, log.length)
|
|
|
|
for (var i in log) assertSame(target, log[i][1]);
|
|
|
|
|
|
|
|
assertArrayEquals(
|
|
|
|
["preventExtensions", target], log[0]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["ownKeys", target], log[1]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["getOwnPropertyDescriptor", target, toKey(0)], log[2]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["defineProperty", target, toKey(0), noconf_nowrite], log[3]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["getOwnPropertyDescriptor", target, toKey("length")], log[4]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["defineProperty", target, toKey("length"), noconf_nowrite], log[5]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["getOwnPropertyDescriptor", target, toKey("wurst")], log[6]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["defineProperty", target, toKey("wurst"), noconf_nowrite], log[7]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["getOwnPropertyDescriptor", target, toKey(symbol)], log[8]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["defineProperty", target, toKey(symbol), noconf], log[9]);
|
|
|
|
})();
|
2015-12-07 15:35:49 +00:00
|
|
|
|
|
|
|
|
|
|
|
(function IsSealed() {
|
|
|
|
var target = [];
|
|
|
|
var proxy = new Proxy(target, handler);
|
|
|
|
|
|
|
|
target.wurst = 42;
|
|
|
|
target[0] = true;
|
|
|
|
Object.defineProperty(target, symbol, {get: undefined});
|
|
|
|
|
|
|
|
// Extensible.
|
|
|
|
|
|
|
|
log.length = 0;
|
|
|
|
|
|
|
|
Object.isSealed(proxy);
|
|
|
|
assertEquals(1, log.length)
|
|
|
|
for (var i in log) assertSame(target, log[i][1]);
|
|
|
|
|
|
|
|
assertArrayEquals(
|
|
|
|
["isExtensible", target], log[0]);
|
|
|
|
|
|
|
|
// Not extensible but not sealed.
|
|
|
|
|
|
|
|
log.length = 0;
|
|
|
|
Object.preventExtensions(target);
|
|
|
|
|
|
|
|
Object.isSealed(proxy);
|
|
|
|
assertEquals(3, log.length)
|
|
|
|
for (var i in log) assertSame(target, log[i][1]);
|
|
|
|
|
|
|
|
assertArrayEquals(
|
|
|
|
["isExtensible", target], log[0]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["ownKeys", target], log[1]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["getOwnPropertyDescriptor", target, toKey(0)], log[2]);
|
|
|
|
|
|
|
|
// Sealed.
|
|
|
|
|
|
|
|
log.length = 0;
|
|
|
|
Object.seal(target);
|
|
|
|
|
|
|
|
Object.isSealed(proxy);
|
|
|
|
assertEquals(6, log.length)
|
|
|
|
for (var i in log) assertSame(target, log[i][1]);
|
|
|
|
|
|
|
|
assertArrayEquals(
|
|
|
|
["isExtensible", target], log[0]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["ownKeys", target], log[1]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["getOwnPropertyDescriptor", target, toKey(0)], log[2]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["getOwnPropertyDescriptor", target, toKey("length")], log[3]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["getOwnPropertyDescriptor", target, toKey("wurst")], log[4]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["getOwnPropertyDescriptor", target, toKey(symbol)], log[5]);
|
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
|
|
(function IsFrozen() {
|
|
|
|
var target = [];
|
|
|
|
var proxy = new Proxy(target, handler);
|
|
|
|
|
|
|
|
target.wurst = 42;
|
|
|
|
target[0] = true;
|
|
|
|
Object.defineProperty(target, symbol, {get: undefined});
|
|
|
|
|
|
|
|
// Extensible.
|
|
|
|
|
|
|
|
log.length = 0;
|
|
|
|
|
|
|
|
Object.isFrozen(proxy);
|
|
|
|
assertEquals(1, log.length)
|
|
|
|
for (var i in log) assertSame(target, log[i][1]);
|
|
|
|
|
|
|
|
assertArrayEquals(
|
|
|
|
["isExtensible", target], log[0]);
|
|
|
|
|
|
|
|
// Not extensible but not frozen.
|
|
|
|
|
|
|
|
log.length = 0;
|
|
|
|
Object.preventExtensions(target);
|
|
|
|
|
|
|
|
Object.isFrozen(proxy);
|
|
|
|
assertEquals(3, log.length)
|
|
|
|
for (var i in log) assertSame(target, log[i][1]);
|
|
|
|
|
|
|
|
assertArrayEquals(
|
|
|
|
["isExtensible", target], log[0]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["ownKeys", target], log[1]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["getOwnPropertyDescriptor", target, toKey(0)], log[2]);
|
|
|
|
|
|
|
|
// Frozen.
|
|
|
|
|
|
|
|
log.length = 0;
|
|
|
|
Object.freeze(target);
|
|
|
|
|
|
|
|
Object.isFrozen(proxy);
|
|
|
|
assertEquals(6, log.length)
|
|
|
|
for (var i in log) assertSame(target, log[i][1]);
|
|
|
|
|
|
|
|
assertArrayEquals(
|
|
|
|
["isExtensible", target], log[0]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["ownKeys", target], log[1]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["getOwnPropertyDescriptor", target, toKey(0)], log[2]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["getOwnPropertyDescriptor", target, toKey("length")], log[3]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["getOwnPropertyDescriptor", target, toKey("wurst")], log[4]);
|
|
|
|
assertArrayEquals(
|
|
|
|
["getOwnPropertyDescriptor", target, toKey(symbol)], log[5]);
|
|
|
|
})();
|