blob: 7fbbd7dc1913deff082b870d03a1b34b573d1b70 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00005"use strict";
6var global = this;
7
8(function TestGlobalReceiver() {
9 class A {
10 s(value) {
11 super.bla = value;
12 }
13 }
14 var a = new A();
15 a.s(9);
16 assertEquals(undefined, global.bla);
17 assertEquals(9, a.bla);
18
19 a = new A();
20 a.s.call(global, 10);
21 assertEquals(10, global.bla);
22 assertEquals(undefined, a.bla);
23})();
24
25
26(function TestProxyProto() {
27 var calls = 0;
28 var handler = {
29 set(t, p, v, r) {
30 calls++;
31 return Reflect.set(t, p, v, r);
32 },
33 getPropertyDescriptor(target, name) {
34 calls += 10;
35 return undefined;
36 }
37 };
38 var target = {};
39 var proxy = new Proxy(target, handler);
40 var object = {
41 __proto__: proxy,
42 setX(v) {
43 super.x = v;
44 },
45 setSymbol(sym, v) {
46 super[sym] = v;
47 }
48 };
49
50 object.setX(1);
51 assertEquals(1, object.x);
52 assertEquals(1, Object.getOwnPropertyDescriptor(object, 'x').value);
53 assertEquals(1, calls);
54
55 calls = 0;
56 object.setX.call(proxy, 2);
57 assertEquals(2, target.x);
58 assertEquals(1, Object.getOwnPropertyDescriptor(object, 'x').value);
59 assertEquals(1, calls);
60
61 var sym = Symbol();
62 calls = 0;
63 object.setSymbol.call(global, sym, 2);
64 assertEquals(2, Object.getOwnPropertyDescriptor(global, sym).value);
65 // We currently do not invoke proxy traps for symbols
66 assertEquals(1, calls);
67});
68
69
70(function TestProxyReceiver() {
71 var object = {
72 setY(v) {
73 super.y = v;
74 }
75 };
76
77 var calls = 0;
78 var target = {target:1};
79 var handler = {
80 getOwnPropertyDescriptor(t, name) {
81 calls++;
82 },
83 defineProperty(t, name, desc) {
84 calls += 10;
85 t[name] = desc.value;
86 return true;
87 },
88 set(target, name, value) {
89 assertUnreachable();
90 }
91 };
92 var proxy = new Proxy(target, handler);
93
94 assertEquals(undefined, object.y);
95 object.setY(10);
96 assertEquals(10, object.y);
97
98 // Change the receiver to the proxy, but the set is called on the global.
99 object.setY.call(proxy, 3);
100 assertEquals(3, target.y);
101 assertEquals(11, calls);
102})();