| // 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. |
| |
| (function testNonCallable() { |
| var proxy = new Proxy({},{}); |
| assertThrows(function(){ proxy() }, TypeError); |
| |
| var proxy2 = new Proxy(proxy, {}); |
| assertThrows(function(){ proxy2() }, TypeError); |
| })(); |
| |
| (function testCallProxyFallbackNoArguments() { |
| var called = false; |
| var target = function() { |
| called = true; |
| } |
| var proxy = new Proxy(target, {}); |
| assertFalse(called); |
| proxy(); |
| assertTrue(called); |
| |
| called = false; |
| var proxy2 = new Proxy(proxy, {}); |
| assertFalse(called); |
| proxy2(); |
| assertTrue(called); |
| })(); |
| |
| (function testCallProxyFallback1Argument() { |
| var called = false; |
| var target = function(a) { |
| called = true; |
| assertEquals('1', a); |
| } |
| var proxy = new Proxy(target, {}); |
| assertFalse(called); |
| proxy('1'); |
| assertTrue(called); |
| })(); |
| |
| (function testCallProxyFallback2Arguments() { |
| var called = false; |
| var target = function(a, b) { |
| called = true; |
| assertEquals('1', a); |
| assertEquals('2', b); |
| } |
| var proxy = new Proxy(target, {}); |
| assertFalse(called); |
| proxy('1', '2'); |
| assertTrue(called); |
| })(); |
| |
| (function testCallProxyFallbackChangedReceiver() { |
| var apply_receiver = {receiver:true}; |
| var seen_receiver = undefined; |
| var target = function() { |
| seen_receiver = this; |
| } |
| var proxy = new Proxy(target, {}); |
| assertEquals(undefined, seen_receiver); |
| Reflect.apply(proxy, apply_receiver, [1,2,3,4]); |
| assertSame(apply_receiver, seen_receiver); |
| })(); |
| |
| (function testCallProxyTrap() { |
| var called_target = false; |
| var called_handler = false; |
| var target = function(a, b) { |
| called_target = true; |
| assertEquals(1, a); |
| assertEquals(2, b); |
| } |
| var handler = { |
| apply: function(target, this_arg, args) { |
| target.apply(this_arg, args); |
| called_handler = true; |
| } |
| } |
| var proxy = new Proxy(target, handler); |
| assertFalse(called_target); |
| assertFalse(called_handler); |
| Reflect.apply(proxy, {rec:1}, [1,2]); |
| assertTrue(called_target); |
| assertTrue(called_handler); |
| })(); |
| |
| |
| (function testCallProxyNonCallableTarget() { |
| var values = [NaN, 1.5, 100, /RegExp/, "string", {}, [], Symbol(), |
| new Map(), new Set(), new WeakMap(), new WeakSet()]; |
| values.forEach(target => { |
| target = Object(target); |
| var proxy = new Proxy(target, { apply() { assertUnreachable(); } }); |
| assertThrows(() => { proxy(); }, TypeError); |
| assertThrows(() => { ({ proxy }).proxy(); }, TypeError); |
| assertThrows(() => { Reflect.apply(proxy, null, []); }, TypeError); |
| assertThrows(() => { Reflect.apply(proxy, { proxy }, []); }, TypeError); |
| assertThrows(() => { |
| Function.prototype.call.apply(proxy, [null]); |
| }, TypeError); |
| assertThrows(() => { |
| Function.prototype.apply.apply(proxy, [null, []]); |
| }, TypeError); |
| |
| var proxy_to_proxy = new Proxy(proxy, { apply() { assertUnreachable(); } }); |
| assertThrows(() => { proxy_to_proxy(); }, TypeError); |
| assertThrows(() => { ({ proxy_to_proxy }).proxy_to_proxy(); }, TypeError); |
| assertThrows(() => { Reflect.apply(proxy_to_proxy, null, []); }, TypeError); |
| assertThrows(() => { Reflect.apply(proxy_to_proxy, { proxy }, []); }, |
| TypeError); |
| assertThrows(() => { |
| Function.prototype.call.apply(proxy_to_proxy, [null]); |
| }, TypeError); |
| assertThrows(() => { |
| Function.prototype.apply.apply(proxy_to_proxy, [null, []]); |
| }, TypeError); |
| }); |
| })(); |