blob: f6b4d3e4e1cb575ca32291f00926cb0499bc07a4 [file] [log] [blame]
// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Reflect.
(function () {
// No trap.
var target = {};
var handler = {};
var proxy = new Proxy(target, handler);
assertTrue(Reflect.isExtensible(target));
assertTrue(Reflect.isExtensible(proxy));
assertTrue(Reflect.preventExtensions(proxy));
assertFalse(Reflect.isExtensible(target));
assertFalse(Reflect.isExtensible(proxy));
})();
(function () {
// "Undefined" trap.
var target = {};
var handler = { preventExtensions: null };
var proxy = new Proxy(target, handler);
assertTrue(Reflect.isExtensible(target));
assertTrue(Reflect.isExtensible(proxy));
assertTrue(Reflect.preventExtensions(proxy));
assertFalse(Reflect.isExtensible(target));
assertFalse(Reflect.isExtensible(proxy));
})();
(function () {
// Invalid trap.
var target = {};
var handler = { preventExtensions: 42 };
var proxy = new Proxy(target, handler);
assertThrows(() => { Reflect.preventExtensions(proxy) }, TypeError);
})();
(function () {
var target = {};
var handler = { isExtensible() { return "bla" } };
var proxy = new Proxy(target, handler);
// Trap returns trueish and target is extensible.
assertTrue(Reflect.isExtensible(proxy));
// Trap returns trueish but target is not extensible.
Reflect.preventExtensions(target);
assertThrows(() => { Reflect.isExtensible(proxy) }, TypeError);
})();
(function () {
// Trap returns falsish.
var target = {};
var handler = { preventExtensions() { return 0 } };
var proxy = new Proxy(target, handler);
assertFalse(Reflect.preventExtensions(proxy));
Reflect.preventExtensions(target);
assertFalse(Reflect.preventExtensions(proxy));
})();
(function () {
var target = {};
var handler = { preventExtensions() { return Symbol() } };
var proxy = new Proxy(target, handler);
// Trap returns trueish but target is extensible.
assertThrows(() => { Reflect.preventExtensions(proxy) }, TypeError);
// Trap returns trueish and target is not extensible.
Reflect.preventExtensions(target);
assertTrue(Reflect.preventExtensions(proxy));
})();
(function () {
// Target is proxy
var object = {};
assertTrue(Reflect.preventExtensions(object));
var target = new Proxy(object, {});
var proxy = new Proxy(target, {});
assertFalse(Reflect.isExtensible(object));
assertFalse(Reflect.isExtensible(target));
assertFalse(Reflect.isExtensible(proxy));
})();
// Object.
(function () {
// No trap.
var target = {};
var handler = {};
var proxy = new Proxy(target, handler);
assertTrue(Object.isExtensible(target));
assertTrue(Object.isExtensible(proxy));
assertSame(proxy, Object.preventExtensions(proxy));
assertFalse(Object.isExtensible(target));
assertFalse(Object.isExtensible(proxy));
})();
(function () {
// "Undefined" trap.
var target = {};
var handler = { preventExtensions: null };
var proxy = new Proxy(target, handler);
assertTrue(Object.isExtensible(target));
assertTrue(Object.isExtensible(proxy));
assertSame(proxy, Object.preventExtensions(proxy));
assertFalse(Object.isExtensible(target));
assertFalse(Object.isExtensible(proxy));
})();
(function () {
// Invalid trap.
var target = {};
var handler = { preventExtensions: 42 };
var proxy = new Proxy(target, handler);
assertThrows(() => { Object.preventExtensions(proxy) }, TypeError);
})();
(function () {
var target = {};
var handler = { isExtensible() { return "bla" } };
var proxy = new Proxy(target, handler);
// Trap returns trueish and target is extensible.
assertTrue(Object.isExtensible(proxy));
// Trap returns trueish but target is not extensible.
assertSame(target, Object.preventExtensions(target));
assertThrows(() => { Object.isExtensible(proxy) }, TypeError);
})();
(function () {
// Trap returns falsish.
var target = {};
var handler = { isExtensible() { return false } };
var proxy = new Proxy(target, handler);
assertThrows(() => { Object.isExtensible(proxy) }, TypeError);
assertSame(target, Object.preventExtensions(target));
assertFalse(Object.isExtensible(proxy));
})();
(function () {
// Trap returns falsish.
var target = {};
var handler = { preventExtensions() { return 0 } };
var proxy = new Proxy(target, handler);
assertFalse(Reflect.preventExtensions(proxy));
assertSame(target, Object.preventExtensions(target));
assertFalse(Reflect.preventExtensions(proxy));
assertThrows(() => { Object.preventExtensions(proxy) }, TypeError);
})();
(function () {
var target = {};
var handler = { preventExtensions() { return Symbol() } };
var proxy = new Proxy(target, handler);
// Trap returns trueish but target is extensible.
assertThrows(() => { Object.preventExtensions(proxy) }, TypeError);
// Trap returns trueish and target is not extensible.
assertSame(target, Object.preventExtensions(target));
assertTrue(Reflect.preventExtensions(proxy));
})();
(function () {
// Target is proxy
var object = {};
assertSame(object, Object.preventExtensions(object));
var target = new Proxy(object, {});
var proxy = new Proxy(target, {});
assertFalse(Object.isExtensible(object));
assertFalse(Object.isExtensible(target));
assertFalse(Object.isExtensible(proxy));
})();