| // 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 testCallProxyTrapArrayArg() { |
| var called_target = false; |
| var called_handler = false; |
| var target = function(a, b) { |
| called_target = true; |
| assertArrayEquals([1, 2], a); |
| assertEquals(3, 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); |
| proxy([1,2], 3); |
| assertTrue(called_target); |
| assertTrue(called_handler); |
| })(); |
| |
| (function testCallProxyTrapObjectArg() { |
| var called_target = false; |
| var called_handler = false; |
| var target = function(o) { |
| called_target = true; |
| assertEquals({a: 1, b: 2}, o); |
| } |
| 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); |
| proxy({a: 1, b: 2}); |
| assertTrue(called_target); |
| assertTrue(called_handler); |
| })(); |
| |
| (function testCallProxyTrapGeneratorArg() { |
| function* gen() { |
| yield 1; |
| yield 2; |
| yield 3; |
| } |
| var called_target = false; |
| var called_handler = false; |
| var target = function(g) { |
| called_target = true; |
| assertArrayEquals([1,2,3], [...g]); |
| } |
| 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); |
| proxy(gen()); |
| assertTrue(called_target); |
| assertTrue(called_handler); |
| })(); |
| |
| (function testProxyTrapContext() { |
| var _target, _args, _handler, _context; |
| var target = function(a, b) { return a + b; }; |
| var handler = { |
| apply: function(t, c, args) { |
| _handler = this; |
| _target = t; |
| _context = c; |
| _args = args; |
| } |
| }; |
| var proxy = new Proxy(target, handler); |
| |
| var context = {}; |
| |
| proxy.call(context, 1, 2); |
| |
| assertEquals(_handler, handler); |
| assertEquals(_target, target); |
| assertEquals(_context, context); |
| assertEquals(_args.length, 2); |
| assertEquals(_args[0], 1); |
| assertEquals(_args[1], 2); |
| })(); |
| |
| (function testCallProxyNonCallableTrap() { |
| var called_target = false; |
| var target = function() { |
| called_target = true; |
| }; |
| var handler = { |
| apply: 'non callable trap' |
| }; |
| |
| var proxy = new Proxy(target, handler); |
| assertThrows(function(){ proxy() }, TypeError); |
| |
| assertFalse(called_target); |
| })(); |
| |
| (function testCallProxyNullTrap() { |
| var _args; |
| var target = function(a, b) { |
| _args = [a, b]; |
| return a + b; |
| }; |
| var handler = { |
| apply: null |
| }; |
| |
| var proxy = new Proxy(target, handler); |
| var result = proxy(1, 2); |
| |
| assertEquals(result, 3); |
| assertEquals(_args.length, 2); |
| assertEquals(_args[0], 1); |
| assertEquals(_args[1], 2); |
| })(); |
| |
| (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); |
| }); |
| })(); |