diff options
Diffstat (limited to 'js/src/jit-test/tests/proxy/testDirectProxyRevoke.js')
-rw-r--r-- | js/src/jit-test/tests/proxy/testDirectProxyRevoke.js | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/proxy/testDirectProxyRevoke.js b/js/src/jit-test/tests/proxy/testDirectProxyRevoke.js new file mode 100644 index 000000000..420fe3eaf --- /dev/null +++ b/js/src/jit-test/tests/proxy/testDirectProxyRevoke.js @@ -0,0 +1,45 @@ +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; |