• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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