trap-is-missing-receiver-multiple-calls-index.js (2425B)
1 // Copyright (C) 2020 Alexey Shvayka. All rights reserved. 2 // This code is governed by the BSD license found in the LICENSE file. 3 4 /*--- 5 esid: sec-proxy-object-internal-methods-and-internal-slots-set-p-v-receiver 6 description: > 7 If "set" trap is missing, the call is properly forwarded to ordinary 8 [[Set]] that invokes [[GetOwnProperty]] and [[DefineOwnProperty]] methods 9 on receiver (that is a Proxy itself) every time it is called. 10 (integer index property name) 11 info: | 12 [[Set]] ( P, V, Receiver ) 13 14 [...] 15 6. Let trap be ? GetMethod(handler, "set"). 16 7. If trap is undefined, then 17 a. Return ? target.[[Set]](P, V, Receiver). 18 19 OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc ) 20 21 [...] 22 3. If IsDataDescriptor(ownDesc) is true, then 23 [...] 24 c. Let existingDescriptor be ? Receiver.[[GetOwnProperty]](P). 25 d. If existingDescriptor is not undefined, then 26 [...] 27 iii. Let valueDesc be the PropertyDescriptor { [[Value]]: V }. 28 iv. Return ? Receiver.[[DefineOwnProperty]](P, valueDesc). 29 e. Else, 30 i. Assert: Receiver does not currently have a property P. 31 ii. Return ? CreateDataProperty(Receiver, P, V). 32 [...] 33 34 [[DefineOwnProperty]] ( P, Desc ) 35 36 [...] 37 9. Let booleanTrapResult be ! ToBoolean(? Call(trap, handler, « target, P, descObj »)). 38 [...] 39 17. Return true. 40 features: [Proxy, Reflect] 41 includes: [compareArray.js] 42 ---*/ 43 44 var getOwnPropertyKeys = []; 45 var definePropertyKeys = []; 46 47 var p = new Proxy({ 48 "0": null, 49 }, { 50 getOwnPropertyDescriptor: function(target, key) { 51 getOwnPropertyKeys.push(key); 52 return Reflect.getOwnPropertyDescriptor(target, key); 53 }, 54 defineProperty: function(target, key, desc) { 55 definePropertyKeys.push(key); 56 return Reflect.defineProperty(target, key, desc); 57 }, 58 }); 59 60 p[0] = true; 61 p[0] = true; 62 p["0"] = true; 63 64 assert.compareArray(getOwnPropertyKeys, ["0", "0", "0"], 65 "getOwnPropertyDescriptor: key present on [[ProxyTarget]]"); 66 assert.compareArray(definePropertyKeys, ["0", "0", "0"], 67 "defineProperty: key present on [[ProxyTarget]]"); 68 69 getOwnPropertyKeys = []; 70 definePropertyKeys = []; 71 72 p[22] = false; 73 p["22"] = false; 74 p[22] = false; 75 76 assert.compareArray(getOwnPropertyKeys, ["22", "22", "22"], 77 "getOwnPropertyDescriptor: key absent on [[ProxyTarget]]"); 78 assert.compareArray(definePropertyKeys, ["22", "22", "22"], 79 "defineProperty: key absent on [[ProxyTarget]]"); 80 81 reportCompare(0, 0);