tor-browser

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

browser_webconsole_console_trace_duplicates.js (3483B)


      1 /* Any copyright is dedicated to the Public Domain.
      2 * http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 const TEST_URI =
      7  "http://example.com/browser/devtools/client/webconsole/test/browser/" +
      8  "test-console-trace-duplicates.html";
      9 
     10 add_task(async function testTraceMessages() {
     11  const hud = await openNewTabAndConsole(TEST_URI);
     12 
     13  const message = await waitFor(() => findConsoleAPIMessage(hud, "foo1"));
     14  // Wait until stacktrace is displayed.
     15  await waitFor(() => !!message.querySelector(".frames"));
     16 
     17  is(
     18    message.querySelector(".message-body").textContent,
     19    "console.trace()",
     20    "console.trace message body has expected text"
     21  );
     22  is(
     23    message.querySelector(".message-repeats").textContent,
     24    "3",
     25    "console.trace has the expected content for the repeat badge"
     26  );
     27 
     28  is(
     29    message.querySelector(".frame-link-filename").textContent,
     30    "test-console-trace-duplicates.html",
     31    "message frame has expected text content"
     32  );
     33  const [, line, column] = message
     34    .querySelector(".frame-link-line")
     35    .textContent.split(":");
     36  is(line, "20", "message frame has expected line");
     37  is(column, "11", "message frame has expected column");
     38 
     39  const stack = message.querySelector(".stacktrace");
     40  ok(!!stack, "There's a stacktrace element");
     41 
     42  const frames = Array.from(stack.querySelectorAll(".frame"));
     43  checkStacktraceFrames(frames, [
     44    {
     45      functionName: "foo3",
     46      filename: TEST_URI,
     47      line: 20,
     48    },
     49    {
     50      functionName: "foo2",
     51      filename: TEST_URI,
     52      line: 16,
     53    },
     54    {
     55      functionName: "foo1",
     56      filename: TEST_URI,
     57      line: 12,
     58    },
     59    {
     60      functionName: "<anonymous>",
     61      filename: TEST_URI,
     62      line: 23,
     63    },
     64  ]);
     65 });
     66 
     67 add_task(async function testTraceMessagesNoRepeat() {
     68  await pushPref("devtools.webconsole.groupSimilarMessages", false);
     69  const hud = await openNewTabAndConsole(TEST_URI);
     70 
     71  const messages = await waitFor(() => {
     72    const res = findConsoleAPIMessages(hud, "foo1");
     73    if (res.length < 3) {
     74      return false;
     75    }
     76    return res;
     77  });
     78 
     79  // Wait until all stacktraces are displayed.
     80  await waitFor(() =>
     81    [...messages].every(message => !!message.querySelector(".frames"))
     82  );
     83 
     84  is(
     85    messages[2].querySelector(".message-body").textContent,
     86    "console.trace()",
     87    "last console.trace message body has expected text"
     88  );
     89  is(
     90    messages[2].querySelector(".message-repeats"),
     91    null,
     92    "last console.trace doesn't have a repeat badge"
     93  );
     94 });
     95 
     96 /**
     97 * Check stack info returned by getStackInfo().
     98 *
     99 * @param {object} stackInfo
    100 *        A stackInfo object returned by getStackInfo().
    101 * @param {object} expected
    102 *        An object in the same format as the expected stackInfo object.
    103 */
    104 function checkStacktraceFrames(frames, expectedFrames) {
    105  is(
    106    frames.length,
    107    expectedFrames.length,
    108    `There are ${frames.length} frames in the stacktrace`
    109  );
    110 
    111  frames.forEach((frameEl, i) => {
    112    const expected = expectedFrames[i];
    113 
    114    is(
    115      frameEl.querySelector(".title").textContent,
    116      expected.functionName,
    117      `expected function name is displayed for frame #${i}`
    118    );
    119    is(
    120      frameEl.querySelector(".location .filename").textContent,
    121      expected.filename,
    122      `expected filename is displayed for frame #${i}`
    123    );
    124    is(
    125      frameEl.querySelector(".location .line").textContent,
    126      `${expected.line}`,
    127      `expected line is displayed for frame #${i}`
    128    );
    129  });
    130 }