|
1 // Debugger.prototype.findScripts can filter by global, url, and line number. |
|
2 |
|
3 // Two scripts, with different functions at the same line numbers. |
|
4 var url1 = scriptdir + 'Debugger-findScripts-12-script1'; |
|
5 var url2 = scriptdir + 'Debugger-findScripts-12-script2'; |
|
6 |
|
7 // Three globals: two with code, one with nothing. |
|
8 var g1 = newGlobal(); |
|
9 g1.toSource = function () "[global g1]"; |
|
10 g1.load(url1); |
|
11 g1.load(url2); |
|
12 var g2 = newGlobal(); |
|
13 g2.toSource = function () "[global g2]"; |
|
14 g2.load(url1); |
|
15 g2.load(url2); |
|
16 var g3 = newGlobal(); |
|
17 |
|
18 var dbg = new Debugger(g1, g2, g3); |
|
19 |
|
20 function script(func) { |
|
21 var gw = dbg.addDebuggee(func.global); |
|
22 var script = gw.makeDebuggeeValue(func).script; |
|
23 script.toString = function () |
|
24 "[Debugger.Script for " + func.name + " in " + uneval(func.global) + "]"; |
|
25 return script; |
|
26 } |
|
27 |
|
28 // The function scripts we know of. There may be random eval scripts involved, but |
|
29 // we don't care about those. |
|
30 var allScripts = ([g1.f, g1.f(), g1.g, g1.h, g1.h(), g1.i, |
|
31 g2.f, g2.f(), g2.g, g2.h, g2.h(), g2.i].map(script)); |
|
32 |
|
33 // Search for scripts using |query|, expecting no members of allScripts |
|
34 // except those given in |expected| in the result. If |expected| is |
|
35 // omitted, expect no members of allScripts at all. |
|
36 function queryExpectOnly(query, expected) { |
|
37 print(); |
|
38 print("queryExpectOnly(" + uneval(query) + ")"); |
|
39 var scripts = dbg.findScripts(query); |
|
40 var present = allScripts.filter(function (s) { return scripts.indexOf(s) != -1; }); |
|
41 if (expected) { |
|
42 expected = expected.map(script); |
|
43 expected.forEach(function (s) { |
|
44 if (present.indexOf(s) == -1) |
|
45 assertEq(s + " not present", "is present"); |
|
46 }); |
|
47 present.forEach(function (s) { |
|
48 if (expected.indexOf(s) == -1) |
|
49 assertEq(s + " is present", "not present"); |
|
50 }); |
|
51 } else { |
|
52 assertEq(present.length, 0); |
|
53 } |
|
54 } |
|
55 |
|
56 // We have twelve functions: two globals, each with two urls, each |
|
57 // defining three functions. Show that all the different combinations of |
|
58 // query parameters select what they should. |
|
59 |
|
60 // There are gaps in the pattern: |
|
61 // - You can only filter by line if you're also filtering by url. |
|
62 // - You can't ask for only the innermost scripts unless you're filtering by line. |
|
63 |
|
64 // Filtering by global, url, and line produces one function, or two |
|
65 // where they are nested. |
|
66 queryExpectOnly({ global:g1, url:url1, line: 6 }, [g1.f ]); |
|
67 queryExpectOnly({ global:g1, url:url1, line: 8 }, [g1.f, g1.f()]); |
|
68 queryExpectOnly({ global:g1, url:url1, line: 15 }, [g1.g ]); |
|
69 queryExpectOnly({ global:g1, url:url2, line: 6 }, [g1.h ]); |
|
70 queryExpectOnly({ global:g1, url:url2, line: 8 }, [g1.h, g1.h()]); |
|
71 queryExpectOnly({ global:g1, url:url2, line: 15 }, [g1.i ]); |
|
72 queryExpectOnly({ global:g2, url:url1, line: 6 }, [g2.f ]); |
|
73 queryExpectOnly({ global:g2, url:url1, line: 8 }, [g2.f, g2.f()]); |
|
74 queryExpectOnly({ global:g2, url:url1, line: 15 }, [g2.g ]); |
|
75 queryExpectOnly({ global:g2, url:url2, line: 6 }, [g2.h ]); |
|
76 queryExpectOnly({ global:g2, url:url2, line: 8 }, [g2.h, g2.h()]); |
|
77 queryExpectOnly({ global:g2, url:url2, line: 15 }, [g2.i ]); |
|
78 |
|
79 // Filtering by global, url, and line, and requesting only the innermost |
|
80 // function at each point, should produce only one function. |
|
81 queryExpectOnly({ global:g1, url:url1, line: 6, innermost: true }, [g1.f ]); |
|
82 queryExpectOnly({ global:g1, url:url1, line: 8, innermost: true }, [g1.f()]); |
|
83 queryExpectOnly({ global:g1, url:url1, line: 15, innermost: true }, [g1.g ]); |
|
84 queryExpectOnly({ global:g1, url:url2, line: 6, innermost: true }, [g1.h ]); |
|
85 queryExpectOnly({ global:g1, url:url2, line: 8, innermost: true }, [g1.h()]); |
|
86 queryExpectOnly({ global:g1, url:url2, line: 15, innermost: true }, [g1.i ]); |
|
87 queryExpectOnly({ global:g2, url:url1, line: 6, innermost: true }, [g2.f ]); |
|
88 queryExpectOnly({ global:g2, url:url1, line: 8, innermost: true }, [g2.f()]); |
|
89 queryExpectOnly({ global:g2, url:url1, line: 15, innermost: true }, [g2.g ]); |
|
90 queryExpectOnly({ global:g2, url:url2, line: 6, innermost: true }, [g2.h ]); |
|
91 queryExpectOnly({ global:g2, url:url2, line: 8, innermost: true }, [g2.h()]); |
|
92 queryExpectOnly({ global:g2, url:url2, line: 15, innermost: true }, [g2.i ]); |
|
93 |
|
94 // Filtering by url and global should produce sets of three scripts. |
|
95 queryExpectOnly({ global:g1, url:url1 }, [g1.f, g1.f(), g1.g]); |
|
96 queryExpectOnly({ global:g1, url:url2 }, [g1.h, g1.h(), g1.i]); |
|
97 queryExpectOnly({ global:g2, url:url1 }, [g2.f, g2.f(), g2.g]); |
|
98 queryExpectOnly({ global:g2, url:url2 }, [g2.h, g2.h(), g2.i]); |
|
99 |
|
100 // Filtering by url and line, innermost-only, should produce sets of two scripts, |
|
101 // or four where there are nested functions. |
|
102 queryExpectOnly({ url:url1, line: 6 }, [g1.f, g2.f ]); |
|
103 queryExpectOnly({ url:url1, line: 8 }, [g1.f, g1.f(), g2.f, g2.f()]); |
|
104 queryExpectOnly({ url:url1, line:15 }, [g1.g, g2.g ]); |
|
105 queryExpectOnly({ url:url2, line: 6 }, [g1.h, g2.h ]); |
|
106 queryExpectOnly({ url:url2, line: 8 }, [g1.h, g1.h(), g2.h, g2.h()]); |
|
107 queryExpectOnly({ url:url2, line:15 }, [g1.i, g2.i ]); |
|
108 |
|
109 // Filtering by url and line, and requesting only the innermost scripts, |
|
110 // should always produce pairs of scripts. |
|
111 queryExpectOnly({ url:url1, line: 6, innermost: true }, [g1.f, g2.f ]); |
|
112 queryExpectOnly({ url:url1, line: 8, innermost: true }, [g1.f(), g2.f()]); |
|
113 queryExpectOnly({ url:url1, line:15, innermost: true }, [g1.g, g2.g ]); |
|
114 queryExpectOnly({ url:url2, line: 6, innermost: true }, [g1.h, g2.h ]); |
|
115 queryExpectOnly({ url:url2, line: 8, innermost: true }, [g1.h(), g2.h()]); |
|
116 queryExpectOnly({ url:url2, line:15, innermost: true }, [g1.i, g2.i ]); |
|
117 |
|
118 // Filtering by global only should produce sets of six scripts. |
|
119 queryExpectOnly({ global:g1 }, [g1.f, g1.f(), g1.g, g1.h, g1.h(), g1.i]); |
|
120 queryExpectOnly({ global:g2 }, [g2.f, g2.f(), g2.g, g2.h, g2.h(), g2.i]); |
|
121 |
|
122 // Filtering by url should produce sets of six scripts. |
|
123 queryExpectOnly({ url:url1 }, [g1.f, g1.f(), g1.g, g2.f, g2.f(), g2.g]); |
|
124 queryExpectOnly({ url:url2 }, [g1.h, g1.h(), g1.i, g2.h, g2.h(), g2.i]); |
|
125 |
|
126 // Filtering by no axes should produce all twelve scripts. |
|
127 queryExpectOnly({}, [g1.f, g1.f(), g1.g, g1.h, g1.h(), g1.i, |
|
128 g2.f, g2.f(), g2.g, g2.h, g2.h(), g2.i]); |