Object-getOwnPropertyDescriptor-01.js (2202B)
1 // getOwnPropertyDescriptor works with simple data properties. 2 3 var g = newGlobal({newCompartment: true}); 4 var dbg = Debugger(g); 5 var hits; 6 var expected; 7 dbg.onDebuggerStatement = function (frame) { 8 var args = frame.arguments; 9 var obj = args[0], id = args[1]; 10 var desc = obj.getOwnPropertyDescriptor(id); 11 if (expected === undefined) { 12 assertEq(desc, undefined); 13 } else { 14 assertEq(desc instanceof Object, true); 15 assertEq(desc.enumerable, expected.enumerable); 16 assertEq(desc.configurable, expected.configurable); 17 assertEq(desc.hasOwnProperty("value"), true); 18 assertEq(desc.value, expected.value); 19 assertEq(desc.writable, expected.writable === undefined ? true : expected.writable); 20 assertEq("get" in desc, false); 21 assertEq("set" in desc, false); 22 } 23 hits++; 24 }; 25 26 g.eval("function f(obj, id) { debugger; }"); 27 28 function test(obj, id, desc) { 29 expected = desc; 30 hits = 0; 31 g.f(obj, id); 32 assertEq(hits, 1); 33 } 34 35 var obj = g.eval("({a: 1, ' ': undefined, '0': 0})"); 36 test(obj, "a", {value: 1, enumerable: true, configurable: true}); 37 test(obj, " ", {value: undefined, enumerable: true, configurable: true}); 38 test(obj, "b", undefined); 39 test(obj, "0", {value: 0, enumerable: true, configurable: true}); 40 test(obj, 0, {value: 0, enumerable: true, configurable: true}); 41 42 var arr = g.eval("[7,,]"); 43 test(arr, 'length', {value: 2, enumerable: false, configurable: false}); 44 test(arr, 0, {value: 7, enumerable: true, configurable: true}); 45 test(arr, "0", {value: 7, enumerable: true, configurable: true}); 46 test(arr, 1, undefined); 47 test(arr, "1", undefined); 48 test(arr, 2, undefined); 49 test(arr, "2", undefined); 50 test(arr, "argelfraster", undefined); 51 52 var re = g.eval("/erwe/"); 53 test(re, 'lastIndex', {value: 0, enumerable: false, configurable: false}); 54 55 // String objects have a well-behaved resolve hook. 56 var str = g.eval("new String('hello world')"); 57 test(str, 'length', {value: 11, enumerable: false, configurable: false, writable: false}); 58 test(str, 0, {value: 'h', enumerable: true, configurable: false, writable: false}); 59 test(str, "0", {value: 'h', enumerable: true, configurable: false, writable: false});