Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 // Debugger.prototype.findScripts can filter by global, url, and line number.
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';
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();
18 var dbg = new Debugger(g1, g2, g3);
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 }
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));
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 }
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.
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.
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 ]);
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 ]);
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]);
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 ]);
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 ]);
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]);
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]);
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]);