| // getOwnPropertyDescriptor works with simple data properties. |
| |
| var g = newGlobal(); |
| var dbg = Debugger(g); |
| var hits; |
| var expected; |
| dbg.onDebuggerStatement = function (frame) { |
| var args = frame.arguments; |
| var obj = args[0], id = args[1]; |
| var desc = obj.getOwnPropertyDescriptor(id); |
| if (expected === undefined) { |
| assertEq(desc, undefined); |
| } else { |
| assertEq(desc instanceof Object, true); |
| assertEq(desc.enumerable, expected.enumerable); |
| assertEq(desc.configurable, expected.configurable); |
| assertEq(desc.hasOwnProperty("value"), true); |
| assertEq(desc.value, expected.value); |
| assertEq(desc.writable, expected.writable === undefined ? true : expected.writable); |
| assertEq("get" in desc, false); |
| assertEq("set" in desc, false); |
| } |
| hits++; |
| }; |
| |
| g.eval("function f(obj, id) { debugger; }"); |
| |
| function test(obj, id, desc) { |
| expected = desc; |
| hits = 0; |
| g.f(obj, id); |
| assertEq(hits, 1); |
| } |
| |
| var obj = g.eval("({a: 1, ' ': undefined, '0': 0})"); |
| test(obj, "a", {value: 1, enumerable: true, configurable: true}); |
| test(obj, " ", {value: undefined, enumerable: true, configurable: true}); |
| test(obj, "b", undefined); |
| test(obj, "0", {value: 0, enumerable: true, configurable: true}); |
| test(obj, 0, {value: 0, enumerable: true, configurable: true}); |
| |
| var arr = g.eval("[7,,]"); |
| test(arr, 'length', {value: 2, enumerable: false, configurable: false}); |
| test(arr, 0, {value: 7, enumerable: true, configurable: true}); |
| test(arr, "0", {value: 7, enumerable: true, configurable: true}); |
| test(arr, 1, undefined); |
| test(arr, "1", undefined); |
| test(arr, 2, undefined); |
| test(arr, "2", undefined); |
| test(arr, "argelfraster", undefined); |
| |
| var re = g.eval("/erwe/"); |
| test(re, 'lastIndex', {value: 0, enumerable: false, configurable: false}); |
| |
| // String objects have a well-behaved resolve hook. |
| var str = g.eval("new String('hello world')"); |
| test(str, 'length', {value: 11, enumerable: false, configurable: false, writable: false}); |
| test(str, 0, {value: 'h', enumerable: true, configurable: false, writable: false}); |
| test(str, "0", {value: 'h', enumerable: true, configurable: false, writable: false}); |