| // Copyright 2016 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| let get = () => {}; |
| let set = () => {}; |
| let target = {}; |
| let handler = { |
| getOwnPropertyDescriptor(target, prop) { |
| let configurable = true; |
| if (prop == "both") { |
| return { get, set, configurable }; |
| } else if (prop == "get") { |
| return { get, configurable }; |
| } else if (prop == "set") { |
| return { set, configurable }; |
| } else if (prop == "data") { |
| return { value: 42, configurable }; |
| } else { |
| return Reflect.getOwnPropertyDescriptor(target, prop); |
| } |
| } |
| }; |
| |
| // Test behavior on own properties. |
| let proxy = new Proxy(target, handler); |
| assertSame(get, proxy.__lookupGetter__("both")); |
| assertSame(get, proxy.__lookupGetter__("get")); |
| assertSame(undefined, proxy.__lookupGetter__("set")); |
| assertSame(undefined, proxy.__lookupGetter__("data")); |
| assertSame(set, proxy.__lookupSetter__("both")); |
| assertSame(undefined, proxy.__lookupSetter__("get")); |
| assertSame(set, proxy.__lookupSetter__("set")); |
| assertSame(undefined, proxy.__lookupSetter__("data")); |
| |
| // Test behavior on the prototype chain. |
| let object = { __proto__: proxy }; |
| assertSame(get, object.__lookupGetter__("both")); |
| assertSame(get, object.__lookupGetter__("get")); |
| assertSame(undefined, object.__lookupGetter__("set")); |
| assertSame(undefined, object.__lookupGetter__("data")); |
| assertSame(set, object.__lookupSetter__("both")); |
| assertSame(undefined, object.__lookupSetter__("get")); |
| assertSame(set, object.__lookupSetter__("set")); |
| assertSame(undefined, object.__lookupSetter__("data")); |
| |
| // Test being shadowed while on prototype chain. |
| let shadower = { __proto__: proxy, both: 1, get: 2, set: 3, data: 4 }; |
| assertSame(undefined, shadower.__lookupGetter__("both")); |
| assertSame(undefined, shadower.__lookupGetter__("get")); |
| assertSame(undefined, shadower.__lookupGetter__("set")); |
| assertSame(undefined, shadower.__lookupGetter__("data")); |
| assertSame(undefined, shadower.__lookupSetter__("both")); |
| assertSame(undefined, shadower.__lookupSetter__("get")); |
| assertSame(undefined, shadower.__lookupSetter__("set")); |
| assertSame(undefined, shadower.__lookupSetter__("data")); |
| |
| // Test getPrototypeOf trap. |
| let getFoo = () => {}; |
| let setFoo = () => {}; |
| let proto = {}; |
| Reflect.defineProperty(proto, "foo", { get: getFoo, set: setFoo }); |
| Reflect.setPrototypeOf(target, proto); |
| assertSame(getFoo, proxy.__lookupGetter__("foo")); |
| assertSame(setFoo, proxy.__lookupSetter__("foo")); |
| handler.getPrototypeOf = () => null; |
| assertSame(undefined, proxy.__lookupGetter__("foo")); |
| assertSame(undefined, proxy.__lookupSetter__("foo")); |
| handler.getPrototypeOf = () => proto; |
| assertSame(getFoo, proxy.__lookupGetter__("foo")); |
| assertSame(setFoo, proxy.__lookupSetter__("foo")); |
| |
| // Test shadowing the prototype. |
| Reflect.defineProperty(proto, "data", { get: getFoo, set: setFoo }); |
| assertSame(undefined, proxy.__lookupGetter__("data")); |
| assertSame(undefined, proxy.__lookupSetter__("data")); |