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