summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/PrivateName/modify-non-extensible.js
blob: 7e9af31895d62df9a0492a093344fda9ec60d94c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// |reftest| 

// Returns the argument in the constructor to allow stamping private fields into
// arbitrary objects.
class OverrideBase {
  constructor(o) {
    return o;
  }
};

class A extends OverrideBase {
  #a = 1;
  g() {
    return this.#a
  }

  static gs(o) {
    return o.#a;
  }
  static inca(obj) {
    obj.#a++;
  }
}

var obj = {};
Object.seal(obj);
new A(obj);  // Add #a to obj, but not g.
assertEq('g' in obj, false);
assertEq(A.gs(obj), 1);
A.inca(obj);
assertEq(A.gs(obj), 2);

// Ensure that the object remains non-extensible
obj.h = 'hi'
assertEq('h' in obj, false);


Object.freeze(obj);
A.inca(obj);  // Despite being frozen, private names are modifiable.
assertEq(A.gs(obj), 3);
assertEq(Object.isFrozen(obj), true);

var proxy = new Proxy({}, {});
assertEq(Object.isFrozen(proxy), false);

new A(proxy);
assertEq(A.gs(proxy), 1);

// Note: this doesn't exercise the non-native object
// path in TestIntegrityLevel like you might expect.
//
// For that see below.
Object.freeze(proxy);
assertEq(Object.isFrozen(proxy), true);

A.inca(proxy);
assertEq(A.gs(proxy), 2)

var target = { a: 10 };
Object.freeze(target);
new A(target);
assertEq(Object.isFrozen(target), true)

var getOwnKeys = [];
var proxy = new Proxy(target, {
  getOwnPropertyDescriptor: function (target, key) {
    getOwnKeys.push(key);
    return Reflect.getOwnPropertyDescriptor(target, key);
  },
});

Object.isFrozen(proxy);
assertEq(getOwnKeys.length, 1);

if (typeof reportCompare === 'function') reportCompare(0, 0);