michael@0: // Debugger.prototype.findScripts can filter by global, url, and line number. michael@0: michael@0: // Two scripts, with different functions at the same line numbers. michael@0: var url1 = scriptdir + 'Debugger-findScripts-12-script1'; michael@0: var url2 = scriptdir + 'Debugger-findScripts-12-script2'; michael@0: michael@0: // Three globals: two with code, one with nothing. michael@0: var g1 = newGlobal(); michael@0: g1.toSource = function () "[global g1]"; michael@0: g1.load(url1); michael@0: g1.load(url2); michael@0: var g2 = newGlobal(); michael@0: g2.toSource = function () "[global g2]"; michael@0: g2.load(url1); michael@0: g2.load(url2); michael@0: var g3 = newGlobal(); michael@0: michael@0: var dbg = new Debugger(g1, g2, g3); michael@0: michael@0: function script(func) { michael@0: var gw = dbg.addDebuggee(func.global); michael@0: var script = gw.makeDebuggeeValue(func).script; michael@0: script.toString = function () michael@0: "[Debugger.Script for " + func.name + " in " + uneval(func.global) + "]"; michael@0: return script; michael@0: } michael@0: michael@0: // The function scripts we know of. There may be random eval scripts involved, but michael@0: // we don't care about those. michael@0: var allScripts = ([g1.f, g1.f(), g1.g, g1.h, g1.h(), g1.i, michael@0: g2.f, g2.f(), g2.g, g2.h, g2.h(), g2.i].map(script)); michael@0: michael@0: // Search for scripts using |query|, expecting no members of allScripts michael@0: // except those given in |expected| in the result. If |expected| is michael@0: // omitted, expect no members of allScripts at all. michael@0: function queryExpectOnly(query, expected) { michael@0: print(); michael@0: print("queryExpectOnly(" + uneval(query) + ")"); michael@0: var scripts = dbg.findScripts(query); michael@0: var present = allScripts.filter(function (s) { return scripts.indexOf(s) != -1; }); michael@0: if (expected) { michael@0: expected = expected.map(script); michael@0: expected.forEach(function (s) { michael@0: if (present.indexOf(s) == -1) michael@0: assertEq(s + " not present", "is present"); michael@0: }); michael@0: present.forEach(function (s) { michael@0: if (expected.indexOf(s) == -1) michael@0: assertEq(s + " is present", "not present"); michael@0: }); michael@0: } else { michael@0: assertEq(present.length, 0); michael@0: } michael@0: } michael@0: michael@0: // We have twelve functions: two globals, each with two urls, each michael@0: // defining three functions. Show that all the different combinations of michael@0: // query parameters select what they should. michael@0: michael@0: // There are gaps in the pattern: michael@0: // - You can only filter by line if you're also filtering by url. michael@0: // - You can't ask for only the innermost scripts unless you're filtering by line. michael@0: michael@0: // Filtering by global, url, and line produces one function, or two michael@0: // where they are nested. michael@0: queryExpectOnly({ global:g1, url:url1, line: 6 }, [g1.f ]); michael@0: queryExpectOnly({ global:g1, url:url1, line: 8 }, [g1.f, g1.f()]); michael@0: queryExpectOnly({ global:g1, url:url1, line: 15 }, [g1.g ]); michael@0: queryExpectOnly({ global:g1, url:url2, line: 6 }, [g1.h ]); michael@0: queryExpectOnly({ global:g1, url:url2, line: 8 }, [g1.h, g1.h()]); michael@0: queryExpectOnly({ global:g1, url:url2, line: 15 }, [g1.i ]); michael@0: queryExpectOnly({ global:g2, url:url1, line: 6 }, [g2.f ]); michael@0: queryExpectOnly({ global:g2, url:url1, line: 8 }, [g2.f, g2.f()]); michael@0: queryExpectOnly({ global:g2, url:url1, line: 15 }, [g2.g ]); michael@0: queryExpectOnly({ global:g2, url:url2, line: 6 }, [g2.h ]); michael@0: queryExpectOnly({ global:g2, url:url2, line: 8 }, [g2.h, g2.h()]); michael@0: queryExpectOnly({ global:g2, url:url2, line: 15 }, [g2.i ]); michael@0: michael@0: // Filtering by global, url, and line, and requesting only the innermost michael@0: // function at each point, should produce only one function. michael@0: queryExpectOnly({ global:g1, url:url1, line: 6, innermost: true }, [g1.f ]); michael@0: queryExpectOnly({ global:g1, url:url1, line: 8, innermost: true }, [g1.f()]); michael@0: queryExpectOnly({ global:g1, url:url1, line: 15, innermost: true }, [g1.g ]); michael@0: queryExpectOnly({ global:g1, url:url2, line: 6, innermost: true }, [g1.h ]); michael@0: queryExpectOnly({ global:g1, url:url2, line: 8, innermost: true }, [g1.h()]); michael@0: queryExpectOnly({ global:g1, url:url2, line: 15, innermost: true }, [g1.i ]); michael@0: queryExpectOnly({ global:g2, url:url1, line: 6, innermost: true }, [g2.f ]); michael@0: queryExpectOnly({ global:g2, url:url1, line: 8, innermost: true }, [g2.f()]); michael@0: queryExpectOnly({ global:g2, url:url1, line: 15, innermost: true }, [g2.g ]); michael@0: queryExpectOnly({ global:g2, url:url2, line: 6, innermost: true }, [g2.h ]); michael@0: queryExpectOnly({ global:g2, url:url2, line: 8, innermost: true }, [g2.h()]); michael@0: queryExpectOnly({ global:g2, url:url2, line: 15, innermost: true }, [g2.i ]); michael@0: michael@0: // Filtering by url and global should produce sets of three scripts. michael@0: queryExpectOnly({ global:g1, url:url1 }, [g1.f, g1.f(), g1.g]); michael@0: queryExpectOnly({ global:g1, url:url2 }, [g1.h, g1.h(), g1.i]); michael@0: queryExpectOnly({ global:g2, url:url1 }, [g2.f, g2.f(), g2.g]); michael@0: queryExpectOnly({ global:g2, url:url2 }, [g2.h, g2.h(), g2.i]); michael@0: michael@0: // Filtering by url and line, innermost-only, should produce sets of two scripts, michael@0: // or four where there are nested functions. michael@0: queryExpectOnly({ url:url1, line: 6 }, [g1.f, g2.f ]); michael@0: queryExpectOnly({ url:url1, line: 8 }, [g1.f, g1.f(), g2.f, g2.f()]); michael@0: queryExpectOnly({ url:url1, line:15 }, [g1.g, g2.g ]); michael@0: queryExpectOnly({ url:url2, line: 6 }, [g1.h, g2.h ]); michael@0: queryExpectOnly({ url:url2, line: 8 }, [g1.h, g1.h(), g2.h, g2.h()]); michael@0: queryExpectOnly({ url:url2, line:15 }, [g1.i, g2.i ]); michael@0: michael@0: // Filtering by url and line, and requesting only the innermost scripts, michael@0: // should always produce pairs of scripts. michael@0: queryExpectOnly({ url:url1, line: 6, innermost: true }, [g1.f, g2.f ]); michael@0: queryExpectOnly({ url:url1, line: 8, innermost: true }, [g1.f(), g2.f()]); michael@0: queryExpectOnly({ url:url1, line:15, innermost: true }, [g1.g, g2.g ]); michael@0: queryExpectOnly({ url:url2, line: 6, innermost: true }, [g1.h, g2.h ]); michael@0: queryExpectOnly({ url:url2, line: 8, innermost: true }, [g1.h(), g2.h()]); michael@0: queryExpectOnly({ url:url2, line:15, innermost: true }, [g1.i, g2.i ]); michael@0: michael@0: // Filtering by global only should produce sets of six scripts. michael@0: queryExpectOnly({ global:g1 }, [g1.f, g1.f(), g1.g, g1.h, g1.h(), g1.i]); michael@0: queryExpectOnly({ global:g2 }, [g2.f, g2.f(), g2.g, g2.h, g2.h(), g2.i]); michael@0: michael@0: // Filtering by url should produce sets of six scripts. michael@0: queryExpectOnly({ url:url1 }, [g1.f, g1.f(), g1.g, g2.f, g2.f(), g2.g]); michael@0: queryExpectOnly({ url:url2 }, [g1.h, g1.h(), g1.i, g2.h, g2.h(), g2.i]); michael@0: michael@0: // Filtering by no axes should produce all twelve scripts. michael@0: queryExpectOnly({}, [g1.f, g1.f(), g1.g, g1.h, g1.h(), g1.i, michael@0: g2.f, g2.f(), g2.g, g2.h, g2.h(), g2.i]);