tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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);