tor-browser

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

object-rest-proxy-gopd-not-called-on-excluded-keys.js (1762B)


      1 // Copyright (C) 2021 Alexey Shvayka. All rights reserved.
      2 // This code is governed by the BSD license found in the LICENSE file.
      3 /*---
      4 esid: sec-destructuring-binding-patterns-runtime-semantics-restbindinginitialization
      5 description: >
      6  Proxy's "getOwnPropertyDescriptor" trap is not invoked for excluded keys.
      7 info: |
      8  BindingRestProperty : ... BindingIdentifier
      9 
     10  [...]
     11  3. Perform ? CopyDataProperties(restObj, value, excludedNames).
     12 
     13  CopyDataProperties ( target, source, excludedItems )
     14 
     15  [...]
     16  5. Let keys be ? from.[[OwnPropertyKeys]]().
     17  6. For each element nextKey of keys in List order, do
     18    b. For each element e of excludedItems, do
     19      i. If SameValue(e, nextKey) is true, then
     20        1. Set excluded to true.
     21    c. If excluded is false, then
     22      i. Let desc be ? from.[[GetOwnProperty]](nextKey).
     23 
     24  [[OwnPropertyKeys]] ( )
     25 
     26  [...]
     27  7. Let trapResultArray be ? Call(trap, handler, « target »).
     28  8. Let trapResult be ? CreateListFromArrayLike(trapResultArray, « String, Symbol »).
     29  [...]
     30  23. Return trapResult.
     31 features: [object-rest, destructuring-binding, Proxy, Symbol]
     32 includes: [compareArray.js]
     33 ---*/
     34 
     35 var excludedSymbol = Symbol("excluded_symbol");
     36 var includedSymbol = Symbol("included_symbol");
     37 
     38 var excludedKeys = [excludedSymbol, "excludedString", "0"];
     39 var includedKeys = [includedSymbol, "includedString", "1"];
     40 var ownKeysResult = [...excludedKeys, ...includedKeys];
     41 
     42 var getOwnKeys = [];
     43 var proxy = new Proxy({}, {
     44  getOwnPropertyDescriptor: function(_target, key) {
     45    getOwnKeys.push(key);
     46  },
     47  ownKeys: function() {
     48    return ownKeysResult;
     49  },
     50 });
     51 
     52 var {[excludedSymbol]: _, excludedString, 0: excludedIndex, ...rest} = proxy;
     53 assert.compareArray(getOwnKeys, includedKeys);
     54 
     55 reportCompare(0, 0);