1// Copyright 2016 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// Flags: --harmony-proxies --harmony-reflect --allow-natives-syntax 6 7 8var symbol = %CreatePrivateSymbol("private"); 9 10 11// Private symbols must never be listed. 12 13var object = {}; 14object[symbol] = 42; 15for (var key of Object.keys(object)) assertUnreachable(); 16for (var key of Object.getOwnPropertySymbols(object)) assertUnreachable(); 17for (var key of Object.getOwnPropertyNames(object)) assertUnreachable(); 18for (var key of Reflect.ownKeys(object)) assertUnreachable(); 19for (var key of Reflect.enumerate(object)) assertUnreachable(); 20for (var key in object) assertUnreachable(); 21 22var object2 = {__proto__: object}; 23for (var key of Object.keys(object2)) assertUnreachable(); 24for (var key of Object.getOwnPropertySymbols(object2)) assertUnreachable(); 25for (var key of Object.getOwnPropertyNames(object2)) assertUnreachable(); 26for (var key of Reflect.ownKeys(object2)) assertUnreachable(); 27for (var key of Reflect.enumerate(object2)) assertUnreachable(); 28for (var key in object2) assertUnreachable(); 29 30 31// Private symbols must never leak to proxy traps. 32 33var proxy = new Proxy({}, new Proxy({}, {get() {return () => {throw 666}}})); 34var object = {__proto__: proxy}; 35 36// [[Set]] 37assertEquals(42, proxy[symbol] = 42); 38assertThrows(function() { "use strict"; proxy[symbol] = 42 }, TypeError); 39assertEquals(false, Reflect.set(proxy, symbol, 42)); 40assertEquals(42, object[symbol] = 42); 41assertEquals(43, (function() {"use strict"; return object[symbol] = 43})()); 42assertEquals(true, Reflect.set(object, symbol, 44)); 43 44// [[DefineOwnProperty]] 45assertEquals(false, Reflect.defineProperty(proxy, symbol, {})); 46assertThrows(() => Object.defineProperty(proxy, symbol, {}), TypeError); 47assertEquals(true, Reflect.defineProperty(object, symbol, {})); 48assertEquals(object, Object.defineProperty(object, symbol, {})); 49 50// [[Delete]] 51assertEquals(true, delete proxy[symbol]); 52assertEquals(true, (function() {"use strict"; return delete proxy[symbol]})()); 53assertEquals(true, Reflect.deleteProperty(proxy, symbol)); 54assertEquals(true, delete object[symbol]); 55assertEquals(true, (function() {"use strict"; return delete object[symbol]})()); 56assertEquals(true, Reflect.deleteProperty(object, symbol)); 57 58// [[GetOwnPropertyDescriptor]] 59assertEquals(undefined, Object.getOwnPropertyDescriptor(proxy, symbol)); 60assertEquals(undefined, Reflect.getOwnPropertyDescriptor(proxy, symbol)); 61assertFalse(Object.prototype.hasOwnProperty.call(proxy, symbol)); 62assertEquals(undefined, Object.getOwnPropertyDescriptor(object, symbol)); 63assertEquals(undefined, Reflect.getOwnPropertyDescriptor(object, symbol)); 64assertFalse(Object.prototype.hasOwnProperty.call(object, symbol)); 65 66// [[Has]] 67assertFalse(symbol in proxy); 68assertFalse(Reflect.has(proxy, symbol)); 69assertFalse(symbol in object); 70assertFalse(Reflect.has(object, symbol)); 71 72// [[Get]] 73assertEquals(undefined, proxy[symbol]); 74assertEquals(undefined, Reflect.get(proxy, symbol)); 75assertEquals(undefined, Reflect.get(proxy, symbol, 42)); 76assertEquals(undefined, object[symbol]); 77assertEquals(undefined, Reflect.get(object, symbol)); 78assertEquals(undefined, Reflect.get(object, symbol, 42)); 79