1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/jit-test/tests/debug/Debugger-findScripts-12.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,128 @@ 1.4 +// Debugger.prototype.findScripts can filter by global, url, and line number. 1.5 + 1.6 +// Two scripts, with different functions at the same line numbers. 1.7 +var url1 = scriptdir + 'Debugger-findScripts-12-script1'; 1.8 +var url2 = scriptdir + 'Debugger-findScripts-12-script2'; 1.9 + 1.10 +// Three globals: two with code, one with nothing. 1.11 +var g1 = newGlobal(); 1.12 +g1.toSource = function () "[global g1]"; 1.13 +g1.load(url1); 1.14 +g1.load(url2); 1.15 +var g2 = newGlobal(); 1.16 +g2.toSource = function () "[global g2]"; 1.17 +g2.load(url1); 1.18 +g2.load(url2); 1.19 +var g3 = newGlobal(); 1.20 + 1.21 +var dbg = new Debugger(g1, g2, g3); 1.22 + 1.23 +function script(func) { 1.24 + var gw = dbg.addDebuggee(func.global); 1.25 + var script = gw.makeDebuggeeValue(func).script; 1.26 + script.toString = function () 1.27 + "[Debugger.Script for " + func.name + " in " + uneval(func.global) + "]"; 1.28 + return script; 1.29 +} 1.30 + 1.31 +// The function scripts we know of. There may be random eval scripts involved, but 1.32 +// we don't care about those. 1.33 +var allScripts = ([g1.f, g1.f(), g1.g, g1.h, g1.h(), g1.i, 1.34 + g2.f, g2.f(), g2.g, g2.h, g2.h(), g2.i].map(script)); 1.35 + 1.36 +// Search for scripts using |query|, expecting no members of allScripts 1.37 +// except those given in |expected| in the result. If |expected| is 1.38 +// omitted, expect no members of allScripts at all. 1.39 +function queryExpectOnly(query, expected) { 1.40 + print(); 1.41 + print("queryExpectOnly(" + uneval(query) + ")"); 1.42 + var scripts = dbg.findScripts(query); 1.43 + var present = allScripts.filter(function (s) { return scripts.indexOf(s) != -1; }); 1.44 + if (expected) { 1.45 + expected = expected.map(script); 1.46 + expected.forEach(function (s) { 1.47 + if (present.indexOf(s) == -1) 1.48 + assertEq(s + " not present", "is present"); 1.49 + }); 1.50 + present.forEach(function (s) { 1.51 + if (expected.indexOf(s) == -1) 1.52 + assertEq(s + " is present", "not present"); 1.53 + }); 1.54 + } else { 1.55 + assertEq(present.length, 0); 1.56 + } 1.57 +} 1.58 + 1.59 +// We have twelve functions: two globals, each with two urls, each 1.60 +// defining three functions. Show that all the different combinations of 1.61 +// query parameters select what they should. 1.62 + 1.63 +// There are gaps in the pattern: 1.64 +// - You can only filter by line if you're also filtering by url. 1.65 +// - You can't ask for only the innermost scripts unless you're filtering by line. 1.66 + 1.67 +// Filtering by global, url, and line produces one function, or two 1.68 +// where they are nested. 1.69 +queryExpectOnly({ global:g1, url:url1, line: 6 }, [g1.f ]); 1.70 +queryExpectOnly({ global:g1, url:url1, line: 8 }, [g1.f, g1.f()]); 1.71 +queryExpectOnly({ global:g1, url:url1, line: 15 }, [g1.g ]); 1.72 +queryExpectOnly({ global:g1, url:url2, line: 6 }, [g1.h ]); 1.73 +queryExpectOnly({ global:g1, url:url2, line: 8 }, [g1.h, g1.h()]); 1.74 +queryExpectOnly({ global:g1, url:url2, line: 15 }, [g1.i ]); 1.75 +queryExpectOnly({ global:g2, url:url1, line: 6 }, [g2.f ]); 1.76 +queryExpectOnly({ global:g2, url:url1, line: 8 }, [g2.f, g2.f()]); 1.77 +queryExpectOnly({ global:g2, url:url1, line: 15 }, [g2.g ]); 1.78 +queryExpectOnly({ global:g2, url:url2, line: 6 }, [g2.h ]); 1.79 +queryExpectOnly({ global:g2, url:url2, line: 8 }, [g2.h, g2.h()]); 1.80 +queryExpectOnly({ global:g2, url:url2, line: 15 }, [g2.i ]); 1.81 + 1.82 +// Filtering by global, url, and line, and requesting only the innermost 1.83 +// function at each point, should produce only one function. 1.84 +queryExpectOnly({ global:g1, url:url1, line: 6, innermost: true }, [g1.f ]); 1.85 +queryExpectOnly({ global:g1, url:url1, line: 8, innermost: true }, [g1.f()]); 1.86 +queryExpectOnly({ global:g1, url:url1, line: 15, innermost: true }, [g1.g ]); 1.87 +queryExpectOnly({ global:g1, url:url2, line: 6, innermost: true }, [g1.h ]); 1.88 +queryExpectOnly({ global:g1, url:url2, line: 8, innermost: true }, [g1.h()]); 1.89 +queryExpectOnly({ global:g1, url:url2, line: 15, innermost: true }, [g1.i ]); 1.90 +queryExpectOnly({ global:g2, url:url1, line: 6, innermost: true }, [g2.f ]); 1.91 +queryExpectOnly({ global:g2, url:url1, line: 8, innermost: true }, [g2.f()]); 1.92 +queryExpectOnly({ global:g2, url:url1, line: 15, innermost: true }, [g2.g ]); 1.93 +queryExpectOnly({ global:g2, url:url2, line: 6, innermost: true }, [g2.h ]); 1.94 +queryExpectOnly({ global:g2, url:url2, line: 8, innermost: true }, [g2.h()]); 1.95 +queryExpectOnly({ global:g2, url:url2, line: 15, innermost: true }, [g2.i ]); 1.96 + 1.97 +// Filtering by url and global should produce sets of three scripts. 1.98 +queryExpectOnly({ global:g1, url:url1 }, [g1.f, g1.f(), g1.g]); 1.99 +queryExpectOnly({ global:g1, url:url2 }, [g1.h, g1.h(), g1.i]); 1.100 +queryExpectOnly({ global:g2, url:url1 }, [g2.f, g2.f(), g2.g]); 1.101 +queryExpectOnly({ global:g2, url:url2 }, [g2.h, g2.h(), g2.i]); 1.102 + 1.103 +// Filtering by url and line, innermost-only, should produce sets of two scripts, 1.104 +// or four where there are nested functions. 1.105 +queryExpectOnly({ url:url1, line: 6 }, [g1.f, g2.f ]); 1.106 +queryExpectOnly({ url:url1, line: 8 }, [g1.f, g1.f(), g2.f, g2.f()]); 1.107 +queryExpectOnly({ url:url1, line:15 }, [g1.g, g2.g ]); 1.108 +queryExpectOnly({ url:url2, line: 6 }, [g1.h, g2.h ]); 1.109 +queryExpectOnly({ url:url2, line: 8 }, [g1.h, g1.h(), g2.h, g2.h()]); 1.110 +queryExpectOnly({ url:url2, line:15 }, [g1.i, g2.i ]); 1.111 + 1.112 +// Filtering by url and line, and requesting only the innermost scripts, 1.113 +// should always produce pairs of scripts. 1.114 +queryExpectOnly({ url:url1, line: 6, innermost: true }, [g1.f, g2.f ]); 1.115 +queryExpectOnly({ url:url1, line: 8, innermost: true }, [g1.f(), g2.f()]); 1.116 +queryExpectOnly({ url:url1, line:15, innermost: true }, [g1.g, g2.g ]); 1.117 +queryExpectOnly({ url:url2, line: 6, innermost: true }, [g1.h, g2.h ]); 1.118 +queryExpectOnly({ url:url2, line: 8, innermost: true }, [g1.h(), g2.h()]); 1.119 +queryExpectOnly({ url:url2, line:15, innermost: true }, [g1.i, g2.i ]); 1.120 + 1.121 +// Filtering by global only should produce sets of six scripts. 1.122 +queryExpectOnly({ global:g1 }, [g1.f, g1.f(), g1.g, g1.h, g1.h(), g1.i]); 1.123 +queryExpectOnly({ global:g2 }, [g2.f, g2.f(), g2.g, g2.h, g2.h(), g2.i]); 1.124 + 1.125 +// Filtering by url should produce sets of six scripts. 1.126 +queryExpectOnly({ url:url1 }, [g1.f, g1.f(), g1.g, g2.f, g2.f(), g2.g]); 1.127 +queryExpectOnly({ url:url2 }, [g1.h, g1.h(), g1.i, g2.h, g2.h(), g2.i]); 1.128 + 1.129 +// Filtering by no axes should produce all twelve scripts. 1.130 +queryExpectOnly({}, [g1.f, g1.f(), g1.g, g1.h, g1.h(), g1.i, 1.131 + g2.f, g2.f(), g2.g, g2.h, g2.h(), g2.i]);