summaryrefslogtreecommitdiff
path: root/tests/node_compat/test/parallel/test-vm-property-not-on-sandbox.js
diff options
context:
space:
mode:
Diffstat (limited to 'tests/node_compat/test/parallel/test-vm-property-not-on-sandbox.js')
-rw-r--r--tests/node_compat/test/parallel/test-vm-property-not-on-sandbox.js44
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/node_compat/test/parallel/test-vm-property-not-on-sandbox.js b/tests/node_compat/test/parallel/test-vm-property-not-on-sandbox.js
new file mode 100644
index 000000000..360a5dabf
--- /dev/null
+++ b/tests/node_compat/test/parallel/test-vm-property-not-on-sandbox.js
@@ -0,0 +1,44 @@
+// deno-fmt-ignore-file
+// deno-lint-ignore-file
+
+// Copyright Joyent and Node contributors. All rights reserved. MIT license.
+// Taken from Node 18.12.1
+// This file is automatically generated by `tests/node_compat/runner/setup.ts`. Do not modify this file manually.
+
+'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);