UNPKG

ses

Version:

Hardened JavaScript for Fearless Cooperation

62 lines (54 loc) 1.83 kB
import { Proxy, create, freeze, getOwnPropertyDescriptors, reflectSet, } from './commons.js'; import { strictScopeTerminatorHandler, alwaysThrowHandler, } from './strict-scope-terminator.js'; /** * `freeze` but not `harden` the proxy target so it remains trapping. * Thus, it should not be shared outside this module. * * @see https://github.com/endojs/endo/blob/master/packages/ses/docs/preparing-for-stabilize.md */ const objTarget = freeze({ __proto__: null }); /* * createSloppyGlobalsScopeTerminator() * strictScopeTerminatorHandler manages a scopeTerminator Proxy which serves as * the final scope boundary that will always return "undefined" in order * to prevent access to "start compartment globals". When "sloppyGlobalsMode" * is true, the Proxy will perform sets on the "globalObject". */ export const createSloppyGlobalsScopeTerminator = globalObject => { const scopeProxyHandlerProperties = { // inherit scopeTerminator behavior ...strictScopeTerminatorHandler, // Redirect set properties to the globalObject. set(_shadow, prop, value) { return reflectSet(globalObject, prop, value); }, // Always claim to have a potential property in order to be the recipient of a set has(_shadow, _prop) { return true; }, }; // The scope handler's prototype is a proxy that throws if any trap other // than get/set/has are run (like getOwnPropertyDescriptors, apply, // getPrototypeOf). const sloppyGlobalsScopeTerminatorHandler = freeze( create( alwaysThrowHandler, getOwnPropertyDescriptors(scopeProxyHandlerProperties), ), ); const sloppyGlobalsScopeTerminator = new Proxy( objTarget, sloppyGlobalsScopeTerminatorHandler, ); return sloppyGlobalsScopeTerminator; }; freeze(createSloppyGlobalsScopeTerminator);