130 lines
3.2 KiB
JavaScript
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/);
|