// Test handling of false return from a handler.defineProperty() hook. load(libdir + "asserts.js"); var obj = {x: 1, y: 2}; var nope = false; var p = new Proxy(obj, { defineProperty(target, key, desc) { return nope; } }); // Object.defineProperty throws on failure. print(1); assertThrowsInstanceOf(() => Object.defineProperty(p, "z", {value: 3}), TypeError); assertEq("z" in obj, false); assertThrowsInstanceOf(() => Object.defineProperty(p, "x", {value: 0}), TypeError); // Setting a property ultimately causes [[DefineOwnProperty]] to be called. // In strict mode code only, this is a TypeError. print(2); assertEq(p.z = 3, 3); assertThrowsInstanceOf(() => { "use strict"; p.z = 3; }, TypeError); // Other falsy values also trigger failure. print(3); for (nope of [0, -0, NaN, ""]) assertThrowsInstanceOf(() => { "use strict"; p.z = 3; }, TypeError);