1'use strict'; 2require('../common'); 3const assert = require('assert'); 4const vm = require('vm'); 5 6const dSymbol = Symbol('d'); 7const sandbox = { 8 a: 'a', 9 dSymbol 10}; 11 12Object.defineProperties(sandbox, { 13 b: { 14 value: 'b' 15 }, 16 c: { 17 value: 'c', 18 writable: true, 19 enumerable: true 20 }, 21 [dSymbol]: { 22 value: 'd' 23 }, 24 e: { 25 value: 'e', 26 configurable: true 27 }, 28 f: {} 29}); 30 31const ctx = vm.createContext(sandbox); 32 33const result = vm.runInContext(` 34const getDesc = (prop) => Object.getOwnPropertyDescriptor(this, prop); 35const result = { 36 a: getDesc('a'), 37 b: getDesc('b'), 38 c: getDesc('c'), 39 d: getDesc(dSymbol), 40 e: getDesc('e'), 41 f: getDesc('f'), 42 g: getDesc('g') 43}; 44result; 45`, ctx); 46 47// eslint-disable-next-line no-restricted-properties 48assert.deepEqual(result, { 49 a: { value: 'a', writable: true, enumerable: true, configurable: true }, 50 b: { value: 'b', writable: false, enumerable: false, configurable: false }, 51 c: { value: 'c', writable: true, enumerable: true, configurable: false }, 52 d: { value: 'd', writable: false, enumerable: false, configurable: false }, 53 e: { value: 'e', writable: false, enumerable: false, configurable: true }, 54 f: { 55 value: undefined, 56 writable: false, 57 enumerable: false, 58 configurable: false 59 }, 60 g: undefined 61}); 62 63// Define new properties 64vm.runInContext(` 65Object.defineProperty(this, 'h', {value: 'h'}); 66Object.defineProperty(this, 'i', {}); 67Object.defineProperty(this, 'j', { 68 get() { return 'j'; } 69}); 70let kValue = 0; 71Object.defineProperty(this, 'k', { 72 get() { return kValue; }, 73 set(value) { kValue = value } 74}); 75`, ctx); 76 77assert.deepStrictEqual(Object.getOwnPropertyDescriptor(ctx, 'h'), { 78 value: 'h', 79 writable: false, 80 enumerable: false, 81 configurable: false 82}); 83 84assert.deepStrictEqual(Object.getOwnPropertyDescriptor(ctx, 'i'), { 85 value: undefined, 86 writable: false, 87 enumerable: false, 88 configurable: false 89}); 90 91const jDesc = Object.getOwnPropertyDescriptor(ctx, 'j'); 92assert.strictEqual(typeof jDesc.get, 'function'); 93assert.strictEqual(typeof jDesc.set, 'undefined'); 94assert.strictEqual(jDesc.enumerable, false); 95assert.strictEqual(jDesc.configurable, false); 96 97const kDesc = Object.getOwnPropertyDescriptor(ctx, 'k'); 98assert.strictEqual(typeof kDesc.get, 'function'); 99assert.strictEqual(typeof kDesc.set, 'function'); 100assert.strictEqual(kDesc.enumerable, false); 101assert.strictEqual(kDesc.configurable, false); 102 103assert.strictEqual(ctx.k, 0); 104ctx.k = 1; 105assert.strictEqual(ctx.k, 1); 106assert.strictEqual(vm.runInContext('k;', ctx), 1); 107vm.runInContext('k = 2;', ctx); 108assert.strictEqual(ctx.k, 2); 109assert.strictEqual(vm.runInContext('k;', ctx), 2); 110 111// Redefine properties on the global object 112assert.strictEqual(typeof vm.runInContext('encodeURI;', ctx), 'function'); 113assert.strictEqual(ctx.encodeURI, undefined); 114vm.runInContext(` 115Object.defineProperty(this, 'encodeURI', { value: 42 }); 116`, ctx); 117assert.strictEqual(vm.runInContext('encodeURI;', ctx), 42); 118assert.strictEqual(ctx.encodeURI, 42); 119 120// Redefine properties on the sandbox 121vm.runInContext(` 122Object.defineProperty(this, 'e', { value: 'newE' }); 123`, ctx); 124assert.strictEqual(ctx.e, 'newE'); 125 126assert.throws(() => vm.runInContext(` 127'use strict'; 128Object.defineProperty(this, 'f', { value: 'newF' }); 129`, ctx), /TypeError: Cannot redefine property: f/); 130