| /* Any copyright is dedicated to the Public Domain. |
| * http://creativecommons.org/licenses/publicdomain/ */ |
| |
| // Reflect.isExtensible behaves just like Object.extensible except when the |
| // target argument is missing or is not an object (and that behavior is tested |
| // in target.js). |
| |
| // Test basic functionality. |
| var someObjects = [ |
| {}, |
| {a: "a"}, |
| [0, 1], |
| new Uint8Array(64), |
| Object(Symbol("table")), |
| new Proxy({}, {}) |
| ]; |
| if (typeof SharedArrayBuffer != "undefined") |
| someObjects.push(new Uint8Array(new SharedArrayBuffer(64))); |
| |
| for (var obj of someObjects) { |
| assertEq(Reflect.isExtensible(obj), true); |
| assertEq(Reflect.preventExtensions(obj), true); |
| assertEq(Reflect.isExtensible(obj), false); |
| } |
| |
| // Array with nonwritable length. |
| var arr = [0, 1, 2, 3]; |
| Object.defineProperty(arr, "length", {writable: false}); |
| assertEq(Reflect.isExtensible(arr), true); |
| |
| // Proxy case. |
| for (var ext of [true, false]) { |
| var obj = {}; |
| if (!ext) |
| Object.preventExtensions(obj); |
| var proxy = new Proxy(obj, { |
| isExtensible() { return ext; } |
| }); |
| assertEq(Reflect.isExtensible(proxy), ext); |
| } |
| |
| // If a Proxy's isExtensible method throws, the exception is propagated. |
| proxy = new Proxy({}, { |
| isExtensible() { throw "oops"; } |
| }); |
| assertThrowsValue(() => Reflect.isExtensible(proxy), "oops"); |
| |
| // If an invariant is broken, [[IsExtensible]] does not return false. It throws |
| // a TypeError. |
| proxy = new Proxy({}, { |
| isExtensible() { return false; } |
| }); |
| assertThrowsInstanceOf(() => Reflect.isExtensible(proxy), TypeError); |
| |
| // For more Reflect.isExtensible tests, see target.js. |
| |
| reportCompare(0, 0); |