/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ // Reflect.preventExtensions is the same as Object.preventExtensions, except // for the return value and the behavior in error cases. var someObjects = [ {}, new Int32Array(7), Object(Symbol("table")), new Proxy({}, {}) ]; for (var obj of someObjects) { assertEq(Reflect.preventExtensions(obj), true); // [[PreventExtensions]] on an already-inextensible object is a no-op. assertEq(Reflect.preventExtensions(obj), true); } // Error cases. assertThrowsInstanceOf(() => Reflect.isExtensible(), TypeError); for (var value of [undefined, null, true, 1, NaN, "Phaedo", Symbol("good")]) { assertThrowsInstanceOf(() => Reflect.isExtensible(value), TypeError); } // A proxy's preventExtensions handler can return false without doing anything. obj = {}; var proxy = new Proxy(obj, { preventExtensions() { return false; } }); assertEq(Reflect.preventExtensions(proxy), false); assertEq(Reflect.isExtensible(obj), true); assertEq(Reflect.isExtensible(proxy), true); // If a proxy's preventExtensions handler throws, the exception is propagated. obj = {}; proxy = new Proxy(obj, { preventExtensions() { throw "fit"; } }); assertThrowsValue(() => Reflect.preventExtensions(proxy), "fit"); assertEq(Reflect.isExtensible(obj), true); assertEq(Reflect.isExtensible(proxy), true); // If a proxy's preventExtensions handler returns true while leaving the target // extensible, that's a TypeError. obj = {}; proxy = new Proxy(obj, { preventExtensions() { return true; } }); assertThrowsInstanceOf(() => Reflect.preventExtensions(proxy), TypeError); assertEq(Reflect.isExtensible(obj), true); assertEq(Reflect.isExtensible(proxy), true); // For more Reflect.preventExtensions tests, see target.js. reportCompare(0, 0);