1// Copyright JS Foundation and other contributors, http://js.foundation 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15// Copyright 2015 the V8 project authors. All rights reserved. 16// Use of this source code is governed by a BSD-style license that can be 17// found in the LICENSE file. 18 19var target = {}; 20var handler = { has (target) { 21 throw 42; 22}}; 23 24var proxy = new Proxy(target, handler); 25 26try { 27 // 12.9.3 28 "foo" in proxy; 29 assert(false); 30} catch (e) { 31 assert(e === 42); 32} 33 34try { 35 // 8.1.1.2.1 36 with (proxy) { 37 p; 38 assert(false); 39 } 40 assert(false); 41} catch (e) { 42 assert(e === 42); 43} 44 45try { 46 // ecma_op_put_value_lex_env_base/[[HasProperty]] 47 with (proxy) { 48 function a (){} 49 assert(false); 50 } 51 assert(false); 52} catch (e) { 53 assert(e === 42); 54} 55 56// test basic functionality 57var target = { 58 "target_one": 1 59}; 60 61var handler = { 62 has: function(target, prop) { 63 return prop == "present"; 64 } 65} 66 67var proxy = new Proxy(target, handler); 68 69assert("present" in proxy === true); 70assert("non_present" in proxy === false); 71 72var target = { 73 foo: 5, 74 bar: 10 75}; 76 77var handler = { 78 has: function(target, prop) { 79 if (prop[0] === 'f') { 80 return false; 81 } 82 return prop in target; 83 } 84}; 85 86var proxy = new Proxy(target, handler); 87 88assert("foo" in proxy === false); 89assert("bar" in proxy === true); 90 91// test with no trap 92var target = { 93 foo: "foo" 94}; 95var handler = {}; 96var proxy = new Proxy(target, handler); 97 98assert("foo" in proxy === true); 99 100// test with "undefined" trap 101var target = { 102 foo: "foo" 103}; 104var handler = {has: null}; 105var proxy = new Proxy(target, handler); 106 107assert("foo" in proxy === true); 108 109// test with invalid trap 110var target = { 111 foo: "foo" 112}; 113var handler = {has: 42}; 114var proxy = new Proxy(target, handler); 115 116try { 117 "foo" in proxy; 118 assert(false); 119} catch (e) { 120 assert(e instanceof TypeError); 121} 122 123// test when target is proxy 124var target = { 125 foo: "foo" 126}; 127 128var handler = { 129 has: function(target, prop) { 130 return prop in target; 131 } 132} 133 134var proxy1 = new Proxy(target, handler); 135var proxy2 = new Proxy(proxy1, handler); 136 137assert("foo" in proxy2 === true); 138 139// test when invariants gets violated 140var target = {}; 141 142Object.defineProperty(target, "prop", { 143 configurable: false, 144 value: 10 145}) 146 147var handler = { 148 has: function(target, prop) { 149 return false; 150 } 151} 152 153var proxy = new Proxy(target, handler); 154 155try { 156 'prop' in proxy; 157 assert(false); 158} catch (e) { 159 assert(e instanceof TypeError); 160} 161 162var target = { a: 10 }; 163Object.preventExtensions(target); 164 165var proxy = new Proxy(target, handler); 166 167try { 168 'a' in proxy; 169 assert(false); 170} catch (e) { 171 assert(e instanceof TypeError); 172} 173