/* * Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ function check(obj, name, value, readonly) { // Start with a non-configurable, writable data property implemented via // js::PropertyOp getter and setter. var pd = Object.getOwnPropertyDescriptor(obj, name); assertEq(pd.configurable, false, "non-configurable " + name); assertEq(pd.writable, !readonly, "writable " + name); try { // Do not allow a transition from js::PropertyOp to writable js::Value // data property. Object.defineProperty(obj, name, {writable: true}); assertEq(0, 1); } catch (e) { assertEq('' + e, "TypeError: can't redefine non-configurable property '" + name + "'"); } if (!readonly) { try { // Do not allow the property denoted by name to become a true data // property via a descriptor that preserves the native property's // writable attribute. Object.defineProperty(obj, name, {value: value}); assertEq(0, 1); } catch (e) { assertEq('' + e, "TypeError: can't redefine non-configurable property '" + name + "'"); } } try { // Do not allow the property to be frozen at some bogus value. Object.defineProperty(obj, name, {value: "bogus", writable: false}); assertEq(0, 1); } catch (e) { assertEq('' + e, "TypeError: can't redefine non-configurable property '" + name + "'"); } // Now make name non-writable. Object.defineProperty(obj, name, {writable: false}) // Assert that the right getter result "stuck". assertEq(obj[name], value); // Test that it is operationally non-writable now. obj[name] = "eek!"; assertEq(obj[name], value); } // Reset RegExp.leftContext to the empty string. /x/.test('x'); var d = Object.getOwnPropertyDescriptor(RegExp, "leftContext"); assertEq(d.set, undefined); assertEq(typeof d.get, "function"); assertEq(d.enumerable, true); assertEq(d.configurable, false); assertEq(d.get.call(RegExp), ""); reportCompare(0, 0, "ok");