| // Copyright 2015 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. |
| |
| var target = { target: 1 }; |
| target.__proto__ = {}; |
| var handler = { handler: 1 }; |
| var proxy = new Proxy(target, handler); |
| |
| assertSame(Object.getPrototypeOf(proxy), target.__proto__ ); |
| |
| target.__proto__ = []; |
| assertSame(Object.getPrototypeOf(proxy), target.__proto__); |
| |
| handler.getPrototypeOf = function() { |
| return 1; |
| } |
| assertThrows(function() { Object.getPrototypeOf(proxy) }, TypeError); |
| |
| var target_prototype = {a:1, b:2}; |
| handler.getPrototypeOf = function() { |
| return target_prototype ; |
| } |
| assertSame(Object.getPrototypeOf(proxy), target_prototype); |
| |
| // Test with proxy target: |
| var proxy2 = new Proxy(proxy, {'handler':1}); |
| assertSame(Object.getPrototypeOf(proxy2), target_prototype); |
| |
| // Test with Proxy handler: |
| var proxy3_prototype = {'proto3':true}; |
| var handler_proxy = new Proxy({ |
| getPrototypeOf: function() { return proxy3_prototype } |
| }, {}); |
| var proxy3 = new Proxy(target, handler_proxy); |
| assertSame(Object.getPrototypeOf(proxy3), proxy3_prototype); |
| |
| |
| // Some tests with Object.prototype.isPrototypeOf |
| |
| (function () { |
| var object = {}; |
| var handler = {}; |
| var proto = new Proxy({}, handler); |
| object.__proto__ = proto; |
| |
| assertTrue(proto.isPrototypeOf(object)); |
| assertTrue(Object.prototype.isPrototypeOf.call(proto, object)); |
| |
| handler.getPrototypeOf = function () { return Object.prototype }; |
| assertTrue(proto.isPrototypeOf(object)); |
| assertTrue(Object.prototype.isPrototypeOf.call(proto, object)); |
| assertTrue(Object.prototype.isPrototypeOf(object)); |
| assertFalse(Object.prototype.isPrototypeOf.call(Array.prototype, object)); |
| assertFalse(Array.prototype.isPrototypeOf(object)); |
| |
| handler.getPrototypeOf = function () { return object }; |
| assertTrue(Object.prototype.isPrototypeOf.call(proto, object)); |
| assertTrue(proto.isPrototypeOf(object)); |
| assertTrue(Object.prototype.isPrototypeOf.call(object, object)); |
| assertTrue(object.isPrototypeOf(object)); |
| |
| handler.getPrototypeOf = function () { throw "foo" }; |
| assertTrue(proto.isPrototypeOf(object)); |
| assertTrue(Object.prototype.isPrototypeOf.call(proto, object)); |
| assertThrows(()=> Object.prototype.isPrototypeOf(object)); |
| assertThrows(()=> Object.prototype.isPrototypeOf.call(Array.prototype, object)); |
| assertThrows(()=> Array.prototype.isPrototypeOf(object)); |
| })(); |
| |
| (function () { |
| var handler = {}; |
| var object = new Proxy({}, handler); |
| var proto = {}; |
| |
| assertFalse(Object.prototype.isPrototypeOf.call(object, object)); |
| assertFalse(Object.prototype.isPrototypeOf.call(proto, object)); |
| assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, object)); |
| |
| handler.getPrototypeOf = function () { return proto }; |
| assertTrue(Object.prototype.isPrototypeOf.call(proto, object)); |
| assertFalse(Object.prototype.isPrototypeOf.call({}, object)); |
| assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, object)); |
| |
| handler.getPrototypeOf = function () { return object }; |
| assertTrue(Object.prototype.isPrototypeOf.call(object, object)); |
| |
| handler.getPrototypeOf = function () { throw "foo" }; |
| assertThrows(()=> Object.prototype.isPrototypeOf.call(object, object)); |
| assertThrows(()=> Object.prototype.isPrototypeOf(object)); |
| })(); |