// 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]); })(); (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]); })();