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