2015-11-24 14:15:58 +00:00
|
|
|
// 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.
|
|
|
|
|
2019-06-05 16:56:31 +00:00
|
|
|
// Reflect.
|
2015-11-24 14:15:58 +00:00
|
|
|
(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);
|
|
|
|
|
2019-06-05 16:56:31 +00:00
|
|
|
assertThrows(() => { Reflect.preventExtensions(proxy) }, TypeError);
|
2015-11-24 14:15:58 +00:00
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
|
|
(function () {
|
|
|
|
var target = {};
|
2019-06-05 16:56:31 +00:00
|
|
|
var handler = { isExtensible() { return "bla" } };
|
2015-11-24 14:15:58 +00:00
|
|
|
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);
|
2019-06-05 16:56:31 +00:00
|
|
|
assertThrows(() => { Reflect.isExtensible(proxy) }, TypeError);
|
2015-11-24 14:15:58 +00:00
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
|
|
(function () {
|
|
|
|
// Trap returns falsish.
|
|
|
|
|
|
|
|
var target = {};
|
2019-06-05 16:56:31 +00:00
|
|
|
var handler = { preventExtensions() { return 0 } };
|
2015-11-24 14:15:58 +00:00
|
|
|
var proxy = new Proxy(target, handler);
|
|
|
|
|
|
|
|
assertFalse(Reflect.preventExtensions(proxy));
|
|
|
|
Reflect.preventExtensions(target);
|
|
|
|
assertFalse(Reflect.preventExtensions(proxy));
|
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
|
|
(function () {
|
|
|
|
var target = {};
|
2019-06-05 16:56:31 +00:00
|
|
|
var handler = { preventExtensions() { return Symbol() } };
|
2015-11-24 14:15:58 +00:00
|
|
|
var proxy = new Proxy(target, handler);
|
|
|
|
|
|
|
|
// Trap returns trueish but target is extensible.
|
2019-06-05 16:56:31 +00:00
|
|
|
assertThrows(() => { Reflect.preventExtensions(proxy) }, TypeError);
|
2015-11-24 14:15:58 +00:00
|
|
|
|
|
|
|
// Trap returns trueish and target is not extensible.
|
|
|
|
Reflect.preventExtensions(target);
|
|
|
|
assertTrue(Reflect.preventExtensions(proxy));
|
|
|
|
})();
|
2019-06-05 16:56:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
(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));
|
2019-06-26 15:33:53 +00:00
|
|
|
assertSame(proxy, Object.preventExtensions(proxy));
|
2019-06-05 16:56:31 +00:00
|
|
|
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));
|
2019-06-26 15:33:53 +00:00
|
|
|
assertSame(proxy, Object.preventExtensions(proxy));
|
2019-06-05 16:56:31 +00:00
|
|
|
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.
|
2019-06-26 15:33:53 +00:00
|
|
|
assertSame(target, Object.preventExtensions(target));
|
2019-06-05 16:56:31 +00:00
|
|
|
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);
|
2019-06-26 15:33:53 +00:00
|
|
|
assertSame(target, Object.preventExtensions(target));
|
2019-06-05 16:56:31 +00:00
|
|
|
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));
|
2019-06-26 15:33:53 +00:00
|
|
|
assertSame(target, Object.preventExtensions(target));
|
2019-06-05 16:56:31 +00:00
|
|
|
assertFalse(Reflect.preventExtensions(proxy));
|
2019-06-12 20:55:29 +00:00
|
|
|
assertThrows(() => { Object.preventExtensions(proxy) }, TypeError);
|
2019-06-05 16:56:31 +00:00
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
|
|
(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.
|
2019-06-26 15:33:53 +00:00
|
|
|
assertSame(target, Object.preventExtensions(target));
|
2019-06-05 16:56:31 +00:00
|
|
|
assertTrue(Reflect.preventExtensions(proxy));
|
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
|
|
(function () {
|
|
|
|
// Target is proxy
|
|
|
|
var object = {};
|
2019-06-26 15:33:53 +00:00
|
|
|
assertSame(object, Object.preventExtensions(object));
|
2019-06-05 16:56:31 +00:00
|
|
|
var target = new Proxy(object, {});
|
|
|
|
var proxy = new Proxy(target, {});
|
|
|
|
assertFalse(Object.isExtensible(object));
|
|
|
|
assertFalse(Object.isExtensible(target));
|
|
|
|
assertFalse(Object.isExtensible(proxy));
|
|
|
|
})();
|