testDirectProxySetFailure.js (1015B)
1 // Test handling of false return from a handler.set() hook. 2 3 load(libdir + "asserts.js"); 4 5 var obj = {x: 1}; 6 var p = new Proxy(obj, { 7 set(target, key, value, receiver) { return false; } 8 }); 9 10 // Failing to set a property is a no-op in non-strict code. 11 assertEq(p.x = 2, 2); 12 assertEq(obj.x, 1); 13 14 // It's a TypeError in strict mode code. 15 assertThrowsInstanceOf(() => { "use strict"; p.x = 2; }, TypeError); 16 assertEq(obj.x, 1); 17 18 // Even if the value doesn't change. 19 assertThrowsInstanceOf(() => { "use strict"; p.x = 1; }, TypeError); 20 assertEq(obj.x, 1); 21 22 // Even if the target property doesn't already exist. 23 assertThrowsInstanceOf(() => { "use strict"; p.z = 1; }, TypeError); 24 assertEq("z" in obj, false); 25 26 // [].sort() mutates its operand only by doing strict [[Set]] calls. 27 var arr = ["not", "already", "in", "order"]; 28 var p2 = new Proxy(arr, { 29 set(target, key, value, receiver) { return false; } 30 }); 31 assertThrowsInstanceOf(() => p2.sort(), TypeError); 32 assertDeepEq(arr, ["not", "already", "in", "order"]);