// Flags: --experimental-shadow-realm 'use strict'; require('../common'); const assert = require('assert'); let principalRealmPrepareStackTraceCalled = false; Error.prepareStackTrace = (error, trace) => { principalRealmPrepareStackTraceCalled = true; return `${String(error)}\n at ${trace.join('\n at ')}`; }; { // Validates inner Error.prepareStackTrace can not leak into the outer realm. const shadowRealm = new ShadowRealm(); const stack = shadowRealm.evaluate(` Error.prepareStackTrace = (error, trace) => { globalThis.leaked = 'inner'; return 'from shadow realm'; }; try { throw new Error('boom'); } catch (e) { e.stack; } `); assert.ok(!principalRealmPrepareStackTraceCalled); assert.strictEqual(stack, 'from shadow realm'); assert.strictEqual('leaked' in globalThis, false); } { // Validates stacks can be generated in the ShadowRealm. const shadowRealm = new ShadowRealm(); const stack = shadowRealm.evaluate(` function myFunc() { throw new Error('boom'); } try { myFunc(); } catch (e) { e.stack; } `); assert.ok(!principalRealmPrepareStackTraceCalled); const lines = stack.split('\n'); assert.strictEqual(lines[0], 'Error: boom'); assert.match(lines[1], /^ {4}at myFunc \(.*\)/); }