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 19// error checks 20var target = {}; 21var handler = { isExtensible (target) { 22 throw 42; 23}}; 24 25var proxy = new Proxy(target, handler); 26 27try { 28 // 7.3.15 29 Object.isFrozen(proxy) 30 assert(false); 31} catch (e) { 32 assert(e === 42); 33} 34 35try { 36 // 7.3.15 37 Object.isSealed(proxy) 38 assert(false); 39} catch (e) { 40 assert(e === 42); 41} 42 43try { 44 // 7.2.5 45 Object.isExtensible(proxy) 46 assert(false); 47} catch (e) { 48 assert(e === 42); 49} 50 51// no trap 52var target = {}; 53var handler = {}; 54var proxy = new Proxy(target, handler); 55assert(Object.isExtensible(target) === true) 56assert(Object.isExtensible(proxy) === true); 57Object.preventExtensions(target); 58assert(Object.isExtensible(target) === false); 59assert(Object.isExtensible(proxy) === false); 60 61// undefined trap 62var target = {}; 63var handler = { isExtensible: null }; 64var proxy = new Proxy(target, handler); 65assert(Object.isExtensible(target) === true) 66assert(Object.isExtensible(proxy) === true); 67Object.preventExtensions(target); 68assert(Object.isExtensible(target) === false); 69assert(Object.isExtensible(proxy) === false); 70 71// invalid trap 72var target = {}; 73var handler = { isExtensible: true }; 74var proxy = new Proxy(target, handler); 75 76try { 77 Object.isExtensible(proxy); 78 assert(false); 79} catch (e) { 80 assert(e instanceof TypeError); 81} 82 83// valid trap 84var target = { prop1: true }; 85var handler = { 86 isExtensible(target) { 87 target.prop1 = false; 88 return Object.isExtensible(target); 89 } 90}; 91 92var proxy = new Proxy(target, handler); 93assert(Object.isExtensible(proxy) === true); 94assert(target.prop1 === false); 95Object.preventExtensions(target); 96assert(Object.isExtensible(target) === false); 97assert(Object.isExtensible(proxy) === false); 98 99// trap result is invalid 100var target = {}; 101var handler = { 102 isExtensible(target) { 103 return false; 104 } 105}; 106 107var proxy = new Proxy(target, handler); 108 109try { 110 Object.isExtensible(proxy); 111 assert(false); 112} catch (e) { 113 assert(e instanceof TypeError); 114} 115 116// handler is null 117var target = {}; 118var handler = { 119 isExtensible (target) { 120 return Object.isExtensible(target); 121 } 122}; 123 124var revocable = Proxy.revocable (target, {}); 125var proxy = revocable.proxy; 126revocable.revoke(); 127 128try { 129 Object.isExtensible(proxy); 130 assert(false); 131} catch (e) { 132 assert(e instanceof TypeError); 133} 134 135// proxy within proxy 136var target = {}; 137var handler1 = { 138 isExtensible(target) { 139 return Object.isExtensible(target); 140 } 141}; 142 143var handler2 = { 144 isExtensible(target) { 145 return false; 146 } 147}; 148 149var proxy = new Proxy(target, handler1); 150var proxy2 = new Proxy(proxy, handler1); 151assert(Object.isExtensible(proxy2) === true); 152 153var proxy3 = new Proxy(proxy, handler2); 154 155try { 156 Object.isExtensible(proxy3); 157 assert(false); 158} catch (e) { 159 assert(e instanceof TypeError); 160} 161 162var proxy4 = new Proxy(proxy2, handler1); 163Object.preventExtensions(target); 164assert(Object.isExtensible(proxy4) === false); 165