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