|
1 // Asking for the script of a Debugger.Object should work, even when lazy |
|
2 // functions are involved. |
|
3 |
|
4 // Note that we never hand out the scripts of non-debuggee functions, and |
|
5 // putting a compartment in debug mode automatically de-lazifies all its |
|
6 // functions. (This ensures that findScripts works, too.) |
|
7 // |
|
8 // So here we create a reference to a non-debuggee function, verify that we |
|
9 // can't access its interesting properties, make it a debuggee, and verify |
|
10 // that everything becomes available. |
|
11 |
|
12 // Create functions f, g in a non-debuggee compartment. |
|
13 var g1 = newGlobal(); |
|
14 g1.eval('function f() { return "from f"; }'); |
|
15 g1.eval('function g() { return "from g"; }'); |
|
16 |
|
17 // Create a debuggee compartment with CCWs referring to f and g. |
|
18 var g2 = newGlobal(); |
|
19 var dbg = new Debugger; |
|
20 var g2w = dbg.addDebuggee(g2); |
|
21 g2.f = g1.f; |
|
22 g2.g = g1.g; |
|
23 |
|
24 // At this point, g1.f should still be a lazy function. Unwrapping a D.O |
|
25 // referring to g2's CCW of f should yield a D.O referring to f directly. |
|
26 // Asking for that second D.O's script should yield null, because it's not |
|
27 // a debuggee. |
|
28 var fDO = g2w.getOwnPropertyDescriptor('f').value; |
|
29 assertEq(fDO.global, g2w); |
|
30 assertEq(fDO.unwrap().global === g2w, false); |
|
31 assertEq(fDO.unwrap().script, null); |
|
32 |
|
33 // Similarly for g1.g, and asking for its parameter names. |
|
34 var gDO = g2w.getOwnPropertyDescriptor('g').value; |
|
35 assertEq(gDO.global, g2w); |
|
36 assertEq(gDO.unwrap().global === g2w, false); |
|
37 assertEq(gDO.unwrap().parameterNames, undefined); |
|
38 |
|
39 // Add g1 as a debuggee, and verify that we can get everything. |
|
40 dbg.addDebuggee(g1); |
|
41 assertEq(fDO.unwrap().script instanceof Debugger.Script, true); |
|
42 assertEq(gDO.unwrap().parameterNames instanceof Array, true); |
|
43 |