michael@0: /* michael@0: * Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/licenses/publicdomain/ michael@0: * Contributor: michael@0: * Jeff Walden michael@0: */ michael@0: michael@0: var gTestfile = 'mutation-prevention-methods.js'; michael@0: //----------------------------------------------------------------------------- michael@0: var BUGNUMBER = 492849; michael@0: var summary = 'Object.is{Sealed,Frozen}, Object.{seal,freeze}'; michael@0: michael@0: print(BUGNUMBER + ": " + summary); michael@0: michael@0: /************** michael@0: * BEGIN TEST * michael@0: **************/ michael@0: michael@0: // Empty object michael@0: michael@0: var o1 = {}; michael@0: michael@0: assertEq(Object.isExtensible(o1), true); michael@0: assertEq(Object.isSealed(o1), false); michael@0: assertEq(Object.isFrozen(o1), false); michael@0: michael@0: Object.preventExtensions(o1); michael@0: michael@0: // An non-extensible empty object has no properties, so it is vacuously sealed michael@0: // and frozen. michael@0: assertEq(Object.isExtensible(o1), false); michael@0: assertEq(Object.isSealed(o1), true); michael@0: assertEq(Object.isFrozen(o1), true); michael@0: michael@0: michael@0: // Object with a data property michael@0: michael@0: var o2 = { 1: 2 }; michael@0: michael@0: assertEq(Object.isExtensible(o2), true); michael@0: assertEq(Object.isSealed(o2), false); michael@0: assertEq(Object.isFrozen(o2), false); michael@0: michael@0: Object.preventExtensions(o2); michael@0: michael@0: assertEq(Object.isExtensible(o2), false); michael@0: assertEq(Object.isSealed(o2), false); michael@0: assertEq(Object.isFrozen(o2), false); michael@0: michael@0: Object.seal(o2); michael@0: michael@0: assertEq(Object.isExtensible(o2), false); michael@0: assertEq(Object.isSealed(o2), true); michael@0: assertEq(Object.isFrozen(o2), false); michael@0: michael@0: assertEq(o2[1], 2); michael@0: michael@0: var desc; michael@0: michael@0: desc = Object.getOwnPropertyDescriptor(o2, "1"); michael@0: assertEq(typeof desc, "object"); michael@0: assertEq(desc.enumerable, true); michael@0: assertEq(desc.configurable, false); michael@0: assertEq(desc.value, 2); michael@0: assertEq(desc.writable, true); michael@0: michael@0: o2[1] = 17; michael@0: michael@0: assertEq(o2[1], 17); michael@0: michael@0: desc = Object.getOwnPropertyDescriptor(o2, "1"); michael@0: assertEq(typeof desc, "object"); michael@0: assertEq(desc.enumerable, true); michael@0: assertEq(desc.configurable, false); michael@0: assertEq(desc.value, 17); michael@0: assertEq(desc.writable, true); michael@0: michael@0: Object.freeze(o2); michael@0: michael@0: assertEq(o2[1], 17); michael@0: michael@0: desc = Object.getOwnPropertyDescriptor(o2, "1"); michael@0: assertEq(typeof desc, "object"); michael@0: assertEq(desc.enumerable, true); michael@0: assertEq(desc.configurable, false); michael@0: assertEq(desc.value, 17); michael@0: assertEq(desc.writable, false); michael@0: michael@0: michael@0: // Object with an accessor property michael@0: michael@0: var o3 = { get foo() { return 17; } }; michael@0: michael@0: assertEq(Object.isExtensible(o3), true); michael@0: assertEq(Object.isSealed(o3), false); michael@0: assertEq(Object.isFrozen(o3), false); michael@0: michael@0: Object.preventExtensions(o3); michael@0: michael@0: assertEq(Object.isExtensible(o3), false); michael@0: assertEq(Object.isSealed(o3), false); michael@0: assertEq(Object.isFrozen(o3), false); michael@0: michael@0: Object.seal(o3); michael@0: michael@0: // An accessor property in a sealed object is unchanged if that object is michael@0: // frozen, so a sealed object containing only accessor properties is also michael@0: // vacuously frozen. michael@0: assertEq(Object.isExtensible(o3), false); michael@0: assertEq(Object.isSealed(o3), true); michael@0: assertEq(Object.isFrozen(o3), true); michael@0: michael@0: Object.freeze(o3); michael@0: michael@0: assertEq(Object.isExtensible(o3), false); michael@0: assertEq(Object.isSealed(o3), true); michael@0: assertEq(Object.isFrozen(o3), true); michael@0: michael@0: michael@0: /******************************************************************************/ michael@0: michael@0: reportCompare(true, true); michael@0: michael@0: print("All tests passed!");