/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ // Test details of the implementation of ToPropertyDescriptor exposed to scripts // thanks to scriptable proxies. // A LoggingProxy object logs certain operations performed on it. var log = []; function LoggingProxy(target) { return new Proxy(target, { has: function (t, id) { log.push("has " + id); return id in t; }, get: function (t, id) { log.push("get " + id); return t[id]; } }); } // Tragically, we use separate code to implement Object.defineProperty on // arrays and on proxies. So run the test three times. var testSubjects = [ {}, [], new Proxy({}, {}) ]; for (var obj of testSubjects) { log = []; // Object.defineProperty is one public method that performs a // ToPropertyDescriptor call. Object.defineProperty(obj, "x", new LoggingProxy({ enumerable: true, configurable: true, value: 3, writable: true })); // It should have performed exactly these operations on the proxy, in this // order. See ES6 rev 24 (2014 April 27) 6.2.4.5 ToPropertyDescriptor. assertDeepEq(log, [ "has enumerable", "get enumerable", "has configurable", "get configurable", "has value", "get value", "has writable", "get writable", "has get", "has set" ]); } reportCompare(0, 0);