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