1'use strict'; 2const common = require('../common'); 3const assert = require('assert'); 4const vm = require('vm'); 5 6const getSetSymbolReceivingFunction = Symbol('sym-1'); 7const getSetSymbolReceivingNumber = Symbol('sym-2'); 8const symbolReceivingNumber = Symbol('sym-3'); 9const unknownSymbolReceivingNumber = Symbol('sym-4'); 10 11const window = createWindow(); 12 13const descriptor1 = Object.getOwnPropertyDescriptor( 14 window.globalProxy, 15 'getSetPropReceivingFunction' 16); 17assert.strictEqual(typeof descriptor1.get, 'function'); 18assert.strictEqual(typeof descriptor1.set, 'function'); 19assert.strictEqual(descriptor1.configurable, true); 20 21const descriptor2 = Object.getOwnPropertyDescriptor( 22 window.globalProxy, 23 'getSetPropReceivingNumber' 24); 25assert.strictEqual(typeof descriptor2.get, 'function'); 26assert.strictEqual(typeof descriptor2.set, 'function'); 27assert.strictEqual(descriptor2.configurable, true); 28 29const descriptor3 = Object.getOwnPropertyDescriptor( 30 window.globalProxy, 31 'propReceivingNumber' 32); 33assert.strictEqual(descriptor3.value, 44); 34 35const descriptor4 = Object.getOwnPropertyDescriptor( 36 window.globalProxy, 37 'unknownPropReceivingNumber' 38); 39assert.strictEqual(descriptor4, undefined); 40 41const descriptor5 = Object.getOwnPropertyDescriptor( 42 window.globalProxy, 43 getSetSymbolReceivingFunction 44); 45assert.strictEqual(typeof descriptor5.get, 'function'); 46assert.strictEqual(typeof descriptor5.set, 'function'); 47assert.strictEqual(descriptor5.configurable, true); 48 49const descriptor6 = Object.getOwnPropertyDescriptor( 50 window.globalProxy, 51 getSetSymbolReceivingNumber 52); 53assert.strictEqual(typeof descriptor6.get, 'function'); 54assert.strictEqual(typeof descriptor6.set, 'function'); 55assert.strictEqual(descriptor6.configurable, true); 56 57const descriptor7 = Object.getOwnPropertyDescriptor( 58 window.globalProxy, 59 symbolReceivingNumber 60); 61assert.strictEqual(descriptor7.value, 48); 62 63const descriptor8 = Object.getOwnPropertyDescriptor( 64 window.globalProxy, 65 unknownSymbolReceivingNumber 66); 67assert.strictEqual(descriptor8, undefined); 68 69const descriptor9 = Object.getOwnPropertyDescriptor( 70 window.globalProxy, 71 'getSetPropThrowing' 72); 73assert.strictEqual(typeof descriptor9.get, 'function'); 74assert.strictEqual(typeof descriptor9.set, 'function'); 75assert.strictEqual(descriptor9.configurable, true); 76 77const descriptor10 = Object.getOwnPropertyDescriptor( 78 window.globalProxy, 79 'nonWritableProp' 80); 81assert.strictEqual(descriptor10.value, 51); 82assert.strictEqual(descriptor10.writable, false); 83 84// Regression test for GH-42962. This assignment should not throw. 85window.globalProxy.getSetPropReceivingFunction = () => {}; 86assert.strictEqual(window.globalProxy.getSetPropReceivingFunction, 42); 87 88window.globalProxy.getSetPropReceivingNumber = 143; 89assert.strictEqual(window.globalProxy.getSetPropReceivingNumber, 43); 90 91window.globalProxy.propReceivingNumber = 144; 92assert.strictEqual(window.globalProxy.propReceivingNumber, 144); 93 94window.globalProxy.unknownPropReceivingNumber = 145; 95assert.strictEqual(window.globalProxy.unknownPropReceivingNumber, 145); 96 97window.globalProxy[getSetSymbolReceivingFunction] = () => {}; 98assert.strictEqual(window.globalProxy[getSetSymbolReceivingFunction], 46); 99 100window.globalProxy[getSetSymbolReceivingNumber] = 147; 101assert.strictEqual(window.globalProxy[getSetSymbolReceivingNumber], 47); 102 103window.globalProxy[symbolReceivingNumber] = 148; 104assert.strictEqual(window.globalProxy[symbolReceivingNumber], 148); 105 106window.globalProxy[unknownSymbolReceivingNumber] = 149; 107assert.strictEqual(window.globalProxy[unknownSymbolReceivingNumber], 149); 108 109assert.throws( 110 () => (window.globalProxy.getSetPropThrowing = 150), 111 new Error('setter called') 112); 113assert.strictEqual(window.globalProxy.getSetPropThrowing, 50); 114 115assert.throws( 116 () => (window.globalProxy.nonWritableProp = 151), 117 new TypeError('Cannot redefine property: nonWritableProp') 118); 119assert.strictEqual(window.globalProxy.nonWritableProp, 51); 120 121function createWindow() { 122 const obj = {}; 123 vm.createContext(obj); 124 Object.defineProperty(obj, 'getSetPropReceivingFunction', { 125 get: common.mustCall(() => 42), 126 set: common.mustCall(), 127 configurable: true, 128 }); 129 Object.defineProperty(obj, 'getSetPropReceivingNumber', { 130 get: common.mustCall(() => 43), 131 set: common.mustCall(), 132 configurable: true, 133 }); 134 obj.propReceivingNumber = 44; 135 Object.defineProperty(obj, getSetSymbolReceivingFunction, { 136 get: common.mustCall(() => 46), 137 set: common.mustCall(), 138 configurable: true, 139 }); 140 Object.defineProperty(obj, getSetSymbolReceivingNumber, { 141 get: common.mustCall(() => 47), 142 set: common.mustCall(), 143 configurable: true, 144 }); 145 obj[symbolReceivingNumber] = 48; 146 Object.defineProperty(obj, 'getSetPropThrowing', { 147 get: common.mustCall(() => 50), 148 set: common.mustCall(() => { 149 throw new Error('setter called'); 150 }), 151 configurable: true, 152 }); 153 Object.defineProperty(obj, 'nonWritableProp', { 154 value: 51, 155 writable: false, 156 }); 157 158 obj.globalProxy = vm.runInContext('this', obj); 159 160 return obj; 161} 162