1425bb815Sopenharmony_ci// Copyright JS Foundation and other contributors, http://js.foundation 2425bb815Sopenharmony_ci// 3425bb815Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 4425bb815Sopenharmony_ci// you may not use this file except in compliance with the License. 5425bb815Sopenharmony_ci// You may obtain a copy of the License at 6425bb815Sopenharmony_ci// 7425bb815Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 8425bb815Sopenharmony_ci// 9425bb815Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 10425bb815Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS 11425bb815Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12425bb815Sopenharmony_ci// See the License for the specific language governing permissions and 13425bb815Sopenharmony_ci// limitations under the License. 14425bb815Sopenharmony_ci 15425bb815Sopenharmony_ci// Copyright 2015 the V8 project authors. All rights reserved. 16425bb815Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be 17425bb815Sopenharmony_ci// found in the LICENSE file. 18425bb815Sopenharmony_ci 19425bb815Sopenharmony_civar target = {}; 20425bb815Sopenharmony_civar handler = { deleteProperty (target) { 21425bb815Sopenharmony_ci throw 42; 22425bb815Sopenharmony_ci}, get (object, propName) { 23425bb815Sopenharmony_ci if (propName == "length") { 24425bb815Sopenharmony_ci return 5; 25425bb815Sopenharmony_ci } 26425bb815Sopenharmony_ci}}; 27425bb815Sopenharmony_ci 28425bb815Sopenharmony_civar proxy = new Proxy(target, handler); 29425bb815Sopenharmony_ci 30425bb815Sopenharmony_civar a = 5; 31425bb815Sopenharmony_ci 32425bb815Sopenharmony_ci// ecma_op_delete_binding 33425bb815Sopenharmony_ciwith (proxy) { 34425bb815Sopenharmony_ci delete a 35425bb815Sopenharmony_ci} 36425bb815Sopenharmony_ci 37425bb815Sopenharmony_citry { 38425bb815Sopenharmony_ci // 22.1.3.16.6.e 39425bb815Sopenharmony_ci Array.prototype.pop.call(proxy); 40425bb815Sopenharmony_ci assert(false); 41425bb815Sopenharmony_ci} catch (e) { 42425bb815Sopenharmony_ci assert(e === 42); 43425bb815Sopenharmony_ci} 44425bb815Sopenharmony_ci 45425bb815Sopenharmony_ci// test basic functionality 46425bb815Sopenharmony_civar target = {foo: "bar"}; 47425bb815Sopenharmony_civar handler = { 48425bb815Sopenharmony_ci deleteProperty(obj, prop) { 49425bb815Sopenharmony_ci delete obj[prop]; 50425bb815Sopenharmony_ci } 51425bb815Sopenharmony_ci} 52425bb815Sopenharmony_ci 53425bb815Sopenharmony_civar proxy = new Proxy(target, handler); 54425bb815Sopenharmony_ci 55425bb815Sopenharmony_ciassert(target.foo === "bar") 56425bb815Sopenharmony_ciassert(proxy.foo === "bar"); 57425bb815Sopenharmony_ci 58425bb815Sopenharmony_ciassert(delete proxy.foo === false); 59425bb815Sopenharmony_ci 60425bb815Sopenharmony_ciassert(target.foo === undefined); 61425bb815Sopenharmony_ciassert(proxy.foo === undefined); 62425bb815Sopenharmony_ci 63425bb815Sopenharmony_ciassert(target.bar === undefined); 64425bb815Sopenharmony_ciassert(delete proxy.bar == false); 65425bb815Sopenharmony_ciassert(target.bar === undefined); 66425bb815Sopenharmony_ci 67425bb815Sopenharmony_civar handler2 = { 68425bb815Sopenharmony_ci deleteProperty(obj, prop) { 69425bb815Sopenharmony_ci delete obj[prop]; 70425bb815Sopenharmony_ci return true; 71425bb815Sopenharmony_ci } 72425bb815Sopenharmony_ci} 73425bb815Sopenharmony_ci 74425bb815Sopenharmony_civar proxy = new Proxy(target, handler2); 75425bb815Sopenharmony_ci 76425bb815Sopenharmony_ciassert(target.bar === undefined); 77425bb815Sopenharmony_ciassert(delete proxy.bar == true); 78425bb815Sopenharmony_ciassert(target.bar === undefined); 79425bb815Sopenharmony_ci 80425bb815Sopenharmony_ci// test with no trap 81425bb815Sopenharmony_civar target = {1: 42}; 82425bb815Sopenharmony_civar handler = {}; 83425bb815Sopenharmony_civar proxy = new Proxy(target, handler); 84425bb815Sopenharmony_ci 85425bb815Sopenharmony_ciassert(target[1] === 42) 86425bb815Sopenharmony_ciassert(delete proxy[1] === true) 87425bb815Sopenharmony_ciassert(target[1] === undefined); 88425bb815Sopenharmony_ci 89425bb815Sopenharmony_ci// test with undefined trap 90425bb815Sopenharmony_civar target = {2: 52}; 91425bb815Sopenharmony_civar handler = { deleteProperty: null}; 92425bb815Sopenharmony_civar proxy = new Proxy(target, handler); 93425bb815Sopenharmony_ci 94425bb815Sopenharmony_ciassert(target[2] === 52) 95425bb815Sopenharmony_ciassert(delete proxy[2] === true) 96425bb815Sopenharmony_ciassert(target[2] === undefined); 97425bb815Sopenharmony_ci 98425bb815Sopenharmony_ci// test when trap is invalid 99425bb815Sopenharmony_civar target = {}; 100425bb815Sopenharmony_civar handler = { deleteProperty: true }; 101425bb815Sopenharmony_civar proxy = new Proxy(target, handler); 102425bb815Sopenharmony_ci 103425bb815Sopenharmony_citry { 104425bb815Sopenharmony_ci delete proxy[0]; 105425bb815Sopenharmony_ci assert(false); 106425bb815Sopenharmony_ci} catch (e) { 107425bb815Sopenharmony_ci assert(e instanceof TypeError); 108425bb815Sopenharmony_ci} 109425bb815Sopenharmony_ci 110425bb815Sopenharmony_ci// test when handler is null 111425bb815Sopenharmony_civar revocable = Proxy.revocable ({}, {}); 112425bb815Sopenharmony_civar proxy = revocable.proxy; 113425bb815Sopenharmony_cirevocable.revoke(); 114425bb815Sopenharmony_ci 115425bb815Sopenharmony_citry { 116425bb815Sopenharmony_ci delete proxy.foo; 117425bb815Sopenharmony_ci assert(false); 118425bb815Sopenharmony_ci} catch (e) { 119425bb815Sopenharmony_ci assert(e instanceof TypeError); 120425bb815Sopenharmony_ci} 121425bb815Sopenharmony_ci 122425bb815Sopenharmony_ci// test when target is proxy 123425bb815Sopenharmony_civar target = {prop: "foo"}; 124425bb815Sopenharmony_civar handler = { 125425bb815Sopenharmony_ci deleteProperty(obj, prop) { 126425bb815Sopenharmony_ci delete obj[prop]; 127425bb815Sopenharmony_ci } 128425bb815Sopenharmony_ci}; 129425bb815Sopenharmony_ci 130425bb815Sopenharmony_civar proxy1 = new Proxy(target, handler); 131425bb815Sopenharmony_civar proxy2 = new Proxy(proxy1, handler); 132425bb815Sopenharmony_ci 133425bb815Sopenharmony_ciassert(target.prop === "foo"); 134425bb815Sopenharmony_ciassert(proxy1.prop === "foo"); 135425bb815Sopenharmony_ciassert(proxy2.prop === "foo"); 136425bb815Sopenharmony_ci 137425bb815Sopenharmony_cidelete proxy2.prop; 138425bb815Sopenharmony_ci 139425bb815Sopenharmony_ciassert(target.prop === undefined); 140425bb815Sopenharmony_ciassert(proxy1.prop === undefined); 141425bb815Sopenharmony_ciassert(proxy2.prop === undefined); 142425bb815Sopenharmony_ci 143425bb815Sopenharmony_ci// tests when invariants gets violated 144425bb815Sopenharmony_civar target = {}; 145425bb815Sopenharmony_civar handler = { 146425bb815Sopenharmony_ci deleteProperty(obj, prop) { 147425bb815Sopenharmony_ci delete obj[prop]; 148425bb815Sopenharmony_ci return true; 149425bb815Sopenharmony_ci } 150425bb815Sopenharmony_ci}; 151425bb815Sopenharmony_ci 152425bb815Sopenharmony_ciObject.defineProperty(target, "foo", { 153425bb815Sopenharmony_ci configurable: false, 154425bb815Sopenharmony_ci value: "foo" 155425bb815Sopenharmony_ci}); 156425bb815Sopenharmony_ci 157425bb815Sopenharmony_civar proxy = new Proxy (target, handler); 158425bb815Sopenharmony_ci 159425bb815Sopenharmony_citry { 160425bb815Sopenharmony_ci delete proxy.foo; 161425bb815Sopenharmony_ci assert(false); 162425bb815Sopenharmony_ci} catch (e) { 163425bb815Sopenharmony_ci assert(e instanceof TypeError); 164425bb815Sopenharmony_ci} 165