nodejs/test/parallel/test-vm-global-property-int...

130 lines
3.2 KiB
JavaScript

'use strict';
require('../common');
const assert = require('assert');
const vm = require('vm');
const dSymbol = Symbol('d');
const sandbox = {
a: 'a',
dSymbol
};
Object.defineProperties(sandbox, {
b: {
value: 'b'
},
c: {
value: 'c',
writable: true,
enumerable: true
},
[dSymbol]: {
value: 'd'
},
e: {
value: 'e',
configurable: true
},
f: {}
});
const ctx = vm.createContext(sandbox);
const result = vm.runInContext(`
const getDesc = (prop) => Object.getOwnPropertyDescriptor(this, prop);
const result = {
a: getDesc('a'),
b: getDesc('b'),
c: getDesc('c'),
d: getDesc(dSymbol),
e: getDesc('e'),
f: getDesc('f'),
g: getDesc('g')
};
result;
`, ctx);
// eslint-disable-next-line no-restricted-properties
assert.deepEqual(result, {
a: { value: 'a', writable: true, enumerable: true, configurable: true },
b: { value: 'b', writable: false, enumerable: false, configurable: false },
c: { value: 'c', writable: true, enumerable: true, configurable: false },
d: { value: 'd', writable: false, enumerable: false, configurable: false },
e: { value: 'e', writable: false, enumerable: false, configurable: true },
f: {
value: undefined,
writable: false,
enumerable: false,
configurable: false
},
g: undefined
});
// Define new properties
vm.runInContext(`
Object.defineProperty(this, 'h', {value: 'h'});
Object.defineProperty(this, 'i', {});
Object.defineProperty(this, 'j', {
get() { return 'j'; }
});
let kValue = 0;
Object.defineProperty(this, 'k', {
get() { return kValue; },
set(value) { kValue = value }
});
`, ctx);
assert.deepStrictEqual(Object.getOwnPropertyDescriptor(ctx, 'h'), {
value: 'h',
writable: false,
enumerable: false,
configurable: false
});
assert.deepStrictEqual(Object.getOwnPropertyDescriptor(ctx, 'i'), {
value: undefined,
writable: false,
enumerable: false,
configurable: false
});
const jDesc = Object.getOwnPropertyDescriptor(ctx, 'j');
assert.strictEqual(typeof jDesc.get, 'function');
assert.strictEqual(typeof jDesc.set, 'undefined');
assert.strictEqual(jDesc.enumerable, false);
assert.strictEqual(jDesc.configurable, false);
const kDesc = Object.getOwnPropertyDescriptor(ctx, 'k');
assert.strictEqual(typeof kDesc.get, 'function');
assert.strictEqual(typeof kDesc.set, 'function');
assert.strictEqual(kDesc.enumerable, false);
assert.strictEqual(kDesc.configurable, false);
assert.strictEqual(ctx.k, 0);
ctx.k = 1;
assert.strictEqual(ctx.k, 1);
assert.strictEqual(vm.runInContext('k;', ctx), 1);
vm.runInContext('k = 2;', ctx);
assert.strictEqual(ctx.k, 2);
assert.strictEqual(vm.runInContext('k;', ctx), 2);
// Redefine properties on the global object
assert.strictEqual(typeof vm.runInContext('encodeURI;', ctx), 'function');
assert.strictEqual(ctx.encodeURI, undefined);
vm.runInContext(`
Object.defineProperty(this, 'encodeURI', { value: 42 });
`, ctx);
assert.strictEqual(vm.runInContext('encodeURI;', ctx), 42);
assert.strictEqual(ctx.encodeURI, 42);
// Redefine properties on the sandbox
vm.runInContext(`
Object.defineProperty(this, 'e', { value: 'newE' });
`, ctx);
assert.strictEqual(ctx.e, 'newE');
assert.throws(() => vm.runInContext(`
'use strict';
Object.defineProperty(this, 'f', { value: 'newF' });
`, ctx), /TypeError: Cannot redefine property: f/);