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 = { deleteProperty (target) { 21 throw 42; 22}, get (object, propName) { 23 if (propName == "length") { 24 return 5; 25 } 26}}; 27 28var proxy = new Proxy(target, handler); 29 30var a = 5; 31 32// ecma_op_delete_binding 33with (proxy) { 34 delete a 35} 36 37try { 38 // 22.1.3.16.6.e 39 Array.prototype.pop.call(proxy); 40 assert(false); 41} catch (e) { 42 assert(e === 42); 43} 44 45// test basic functionality 46var target = {foo: "bar"}; 47var handler = { 48 deleteProperty(obj, prop) { 49 delete obj[prop]; 50 } 51} 52 53var proxy = new Proxy(target, handler); 54 55assert(target.foo === "bar") 56assert(proxy.foo === "bar"); 57 58assert(delete proxy.foo === false); 59 60assert(target.foo === undefined); 61assert(proxy.foo === undefined); 62 63assert(target.bar === undefined); 64assert(delete proxy.bar == false); 65assert(target.bar === undefined); 66 67var handler2 = { 68 deleteProperty(obj, prop) { 69 delete obj[prop]; 70 return true; 71 } 72} 73 74var proxy = new Proxy(target, handler2); 75 76assert(target.bar === undefined); 77assert(delete proxy.bar == true); 78assert(target.bar === undefined); 79 80// test with no trap 81var target = {1: 42}; 82var handler = {}; 83var proxy = new Proxy(target, handler); 84 85assert(target[1] === 42) 86assert(delete proxy[1] === true) 87assert(target[1] === undefined); 88 89// test with undefined trap 90var target = {2: 52}; 91var handler = { deleteProperty: null}; 92var proxy = new Proxy(target, handler); 93 94assert(target[2] === 52) 95assert(delete proxy[2] === true) 96assert(target[2] === undefined); 97 98// test when trap is invalid 99var target = {}; 100var handler = { deleteProperty: true }; 101var proxy = new Proxy(target, handler); 102 103try { 104 delete proxy[0]; 105 assert(false); 106} catch (e) { 107 assert(e instanceof TypeError); 108} 109 110// test when handler is null 111var revocable = Proxy.revocable ({}, {}); 112var proxy = revocable.proxy; 113revocable.revoke(); 114 115try { 116 delete proxy.foo; 117 assert(false); 118} catch (e) { 119 assert(e instanceof TypeError); 120} 121 122// test when target is proxy 123var target = {prop: "foo"}; 124var handler = { 125 deleteProperty(obj, prop) { 126 delete obj[prop]; 127 } 128}; 129 130var proxy1 = new Proxy(target, handler); 131var proxy2 = new Proxy(proxy1, handler); 132 133assert(target.prop === "foo"); 134assert(proxy1.prop === "foo"); 135assert(proxy2.prop === "foo"); 136 137delete proxy2.prop; 138 139assert(target.prop === undefined); 140assert(proxy1.prop === undefined); 141assert(proxy2.prop === undefined); 142 143// tests when invariants gets violated 144var target = {}; 145var handler = { 146 deleteProperty(obj, prop) { 147 delete obj[prop]; 148 return true; 149 } 150}; 151 152Object.defineProperty(target, "foo", { 153 configurable: false, 154 value: "foo" 155}); 156 157var proxy = new Proxy (target, handler); 158 159try { 160 delete proxy.foo; 161 assert(false); 162} catch (e) { 163 assert(e instanceof TypeError); 164} 165