| 'use strict'; |
| require('../common'); |
| const assert = require('assert'); |
| const vm = require('vm'); |
| |
| // This, admittedly contrived, example tests an edge cases of the vm module. |
| // |
| // The GetterCallback explicitly checks the global_proxy() if a property is |
| // not found on the sandbox. In the following test, the explicit check |
| // inside the callback yields different results than deferring the |
| // check until after the callback. The check is deferred if the |
| // callback does not intercept, i.e., if args.GetReturnValue().Set() is |
| // not called. |
| |
| // Check that the GetterCallback explicitly calls GetRealNamedProperty() |
| // on the global proxy if the property is not found on the sandbox. |
| // |
| // foo is not defined on the sandbox until we call CopyProperties(). |
| // In the GetterCallback, we do not find the property on the sandbox and |
| // get the property from the global proxy. Since the return value is |
| // the sandbox, we replace it by |
| // the global_proxy to keep the correct identities. |
| // |
| // This test case is partially inspired by |
| // https://github.com/nodejs/node/issues/855 |
| const sandbox = { console }; |
| sandbox.document = { defaultView: sandbox }; |
| vm.createContext(sandbox); |
| const code = `Object.defineProperty( |
| this, |
| 'foo', |
| { get: function() {return document.defaultView} } |
| ); |
| var result = foo === this;`; |
| |
| vm.runInContext(code, sandbox); |
| assert.strictEqual(sandbox.result, true); |