tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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]);