load(libdir + "asserts.js"); // Test for various properties demanded of Proxy.revocable var holder = Proxy.revocable({}, {}); // The returned object must inherit from Object.prototype assertEq(Object.getPrototypeOf(holder), Object.prototype); assertDeepEq(Object.getOwnPropertyNames(holder), [ 'proxy', 'revoke' ]); // The revocation function must inherit from Function.prototype assertEq(Object.getPrototypeOf(holder.revoke), Function.prototype); // Proxy.revoke should return unique objects from the same opcode call. var proxyLog = [] var revokerLog = [] var holderLog = [] function addUnique(l, v) { assertEq(l.indexOf(v), -1); l.push(v); } for (let i = 0; i < 5; i++) { holder = Proxy.revocable({}, {}); addUnique(holderLog, holder); addUnique(revokerLog, holder.revoke); addUnique(proxyLog, holder.proxy); } // The provided revoke function should revoke only the 1 proxy var p = proxyLog.pop(); var r = revokerLog.pop(); // Works before, but not after. This is mostly a token. There are // testDirectProxy* tests to check each trap revokes properly. p.foo; assertEq(r(), undefined, "Revoke trap must return undefined"); assertThrowsInstanceOf(() => p.foo, TypeError); assertEq(r(), undefined, "Revoke trap must return undefined"); // None of this should throw, since these proxies are unrevoked. for (let i = 0; i < proxyLog.length; i++) proxyLog[i].foo;