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