| // Test handling of false return from a handler.set() hook. |
| |
| load(libdir + "asserts.js"); |
| |
| var obj = {x: 1}; |
| var p = new Proxy(obj, { |
| set(target, key, value, receiver) { return false; } |
| }); |
| |
| // Failing to set a property is a no-op in non-strict code. |
| assertEq(p.x = 2, 2); |
| assertEq(obj.x, 1); |
| |
| // It's a TypeError in strict mode code. |
| assertThrowsInstanceOf(() => { "use strict"; p.x = 2; }, TypeError); |
| assertEq(obj.x, 1); |
| |
| // Even if the value doesn't change. |
| assertThrowsInstanceOf(() => { "use strict"; p.x = 1; }, TypeError); |
| assertEq(obj.x, 1); |
| |
| // Even if the target property doesn't already exist. |
| assertThrowsInstanceOf(() => { "use strict"; p.z = 1; }, TypeError); |
| assertEq("z" in obj, false); |
| |
| // [].sort() mutates its operand only by doing strict [[Set]] calls. |
| var arr = ["not", "already", "in", "order"]; |
| var p2 = new Proxy(arr, { |
| set(target, key, value, receiver) { return false; } |
| }); |
| assertThrowsInstanceOf(() => p2.sort(), TypeError); |
| assertDeepEq(arr, ["not", "already", "in", "order"]); |