| // Assigning to a proxy with no set handler causes the proxy's |
| // getOwnPropertyDescriptor handler to be called just before defineProperty |
| // in some cases. (ES6 draft rev 28, 2014 Oct 14, 9.1.9 step 5.c.) |
| |
| var attrs = ["configurable", "enumerable", "writable", "value", "get", "set"]; |
| |
| function test(target, id, existingDesc, expectedDesc) { |
| var log = ""; |
| var p = new Proxy(target, { |
| getOwnPropertyDescriptor(t, idarg) { |
| assertEq(idarg, id); |
| log += "g"; |
| return existingDesc; |
| }, |
| defineProperty(t, idarg, desc) { |
| assertEq(idarg, id); |
| for (var attr of attrs) { |
| var args = uneval([target, id, existingDesc]).slice(1, -1); |
| assertEq(attr in desc, attr in expectedDesc, |
| `test(${args}), checking existence of desc.${attr}`); |
| assertEq(desc[attr], expectedDesc[attr], |
| `test(${args}), checking value of desc.${attr}`); |
| } |
| log += "d"; |
| return true; |
| } |
| }); |
| p[id] = "pizza"; |
| assertEq(log, "gd"); |
| } |
| |
| var fullDesc = { |
| configurable: true, |
| enumerable: true, |
| writable: true, |
| value: "pizza" |
| }; |
| var valueOnlyDesc = { |
| value: "pizza" |
| }; |
| var sealedDesc = { |
| configurable: false, |
| enumerable: true, |
| writable: true, |
| value: "pizza" |
| }; |
| |
| test({}, "x", undefined, fullDesc); |
| test({}, "x", fullDesc, valueOnlyDesc); |
| test({x: 1}, "x", undefined, fullDesc); |
| test({x: 1}, "x", fullDesc, valueOnlyDesc); |
| test(Object.seal({x: 1}), "x", sealedDesc, valueOnlyDesc); |
| test(Object.create({x: 1}), "x", undefined, fullDesc); |
| test([0, 1, 2], "2", undefined, fullDesc); |
| test([0, 1, 2], "2", fullDesc, valueOnlyDesc); |
| test([0, 1, 2], "3", undefined, fullDesc); |
| test([0, 1, 2], "3", fullDesc, valueOnlyDesc); |