tor-browser

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

browser_webconsole_console_group.js (4500B)


      1 /* Any copyright is dedicated to the Public Domain.
      2 * http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 // Check console.group, console.groupCollapsed and console.groupEnd calls
      7 // behave as expected.
      8 
      9 const TEST_URI =
     10  "http://example.com/browser/devtools/client/webconsole/" +
     11  "test/browser/test-console-group.html";
     12 const {
     13  INDENT_WIDTH,
     14 } = require("resource://devtools/client/webconsole/components/Output/MessageIndent.js");
     15 
     16 add_task(async function () {
     17  const hud = await openNewTabAndConsole(TEST_URI);
     18  const store = hud.ui.wrapper.getStore();
     19  logAllStoreChanges(hud);
     20 
     21  const onMessagesLogged = waitForMessageByType(hud, "log-6", ".console-api");
     22  SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
     23    content.wrappedJSObject.doLog();
     24  });
     25  await onMessagesLogged;
     26 
     27  info("Test a group at root level");
     28  let node = findConsoleAPIMessage(hud, "group-1");
     29  testClass(node, "startGroup");
     30  testIndent(node, 0);
     31  await testGroupToggle({
     32    node,
     33    store,
     34    shouldBeOpen: true,
     35    visibleMessageIdsAfterExpand: ["1", "2", "3", "4", "6", "8", "9", "12"],
     36    visibleMessageIdsAfterCollapse: ["1", "8", "9", "12"],
     37  });
     38 
     39  info("Test a message in a 1 level deep group");
     40  node = findConsoleAPIMessage(hud, "log-1");
     41  testClass(node, "log");
     42  testIndent(node, 1);
     43 
     44  info("Test a group in a 1 level deep group");
     45  node = findConsoleAPIMessage(hud, "group-2");
     46  testClass(node, "startGroup");
     47  testIndent(node, 1);
     48  await testGroupToggle({
     49    node,
     50    store,
     51    shouldBeOpen: true,
     52    visibleMessageIdsAfterExpand: ["1", "2", "3", "4", "6", "8", "9", "12"],
     53    visibleMessageIdsAfterCollapse: ["1", "2", "3", "6", "8", "9", "12"],
     54  });
     55 
     56  info("Test a message in a 2 level deep group");
     57  node = findConsoleAPIMessage(hud, "log-2");
     58  testClass(node, "log");
     59  testIndent(node, 2);
     60 
     61  info(
     62    "Test a message in a 1 level deep group, after closing a 2 level deep group"
     63  );
     64  node = findConsoleAPIMessage(hud, "log-3");
     65  testClass(node, "log");
     66  testIndent(node, 1);
     67 
     68  info("Test a message at root level, after closing all the groups");
     69  node = findConsoleAPIMessage(hud, "log-4");
     70  testClass(node, "log");
     71  testIndent(node, 0);
     72 
     73  info("Test a collapsed group at root level");
     74  node = findConsoleAPIMessage(hud, "group-3");
     75  testClass(node, "startGroupCollapsed");
     76  testIndent(node, 0);
     77  await testGroupToggle({
     78    node,
     79    store,
     80    shouldBeOpen: false,
     81    visibleMessageIdsAfterExpand: [
     82      "1",
     83      "2",
     84      "3",
     85      "4",
     86      "6",
     87      "8",
     88      "9",
     89      "10",
     90      "12",
     91    ],
     92    visibleMessageIdsAfterCollapse: ["1", "2", "3", "4", "6", "8", "9", "12"],
     93  });
     94 
     95  info("Test a message at root level, after closing a collapsed group");
     96  node = findConsoleAPIMessage(hud, "log-6");
     97  testClass(node, "log");
     98  testIndent(node, 0);
     99  const nodes = hud.ui.outputNode.querySelectorAll(".message");
    100  is(nodes.length, 8, "expected number of messages are displayed");
    101 });
    102 
    103 function testClass(node, className) {
    104  ok(
    105    node.classList.contains(className),
    106    `message has the expected "${className}" class`
    107  );
    108 }
    109 
    110 function testIndent(node, indent) {
    111  if (indent == 0) {
    112    is(
    113      node.querySelector(".indent"),
    114      null,
    115      "message doesn't have any indentation"
    116    );
    117    return;
    118  }
    119 
    120  indent = `${indent * INDENT_WIDTH}px`;
    121  is(
    122    node.querySelector(".indent")?.style?.width,
    123    indent,
    124    "message has the expected level of indentation"
    125  );
    126 }
    127 
    128 async function testGroupToggle({
    129  node,
    130  store,
    131  shouldBeOpen,
    132  visibleMessageIdsAfterExpand,
    133  visibleMessageIdsAfterCollapse,
    134 }) {
    135  const toggleArrow = node.querySelector(".collapse-button");
    136  const isOpen = node2 => node2.classList.contains("open");
    137  const assertVisibleMessageIds = expanded => {
    138    const visibleMessageIds = store.getState().messages.visibleMessages;
    139    expanded
    140      ? is(
    141          visibleMessageIds.toString(),
    142          visibleMessageIdsAfterExpand.toString()
    143        )
    144      : is(
    145          visibleMessageIds.toString(),
    146          visibleMessageIdsAfterCollapse.toString()
    147        );
    148  };
    149 
    150  await waitFor(() => isOpen(node) === shouldBeOpen);
    151  assertVisibleMessageIds(shouldBeOpen);
    152 
    153  toggleArrow.click();
    154  shouldBeOpen = !shouldBeOpen;
    155  await waitFor(() => isOpen(node) === shouldBeOpen);
    156  assertVisibleMessageIds(shouldBeOpen);
    157 
    158  toggleArrow.click();
    159  shouldBeOpen = !shouldBeOpen;
    160  await waitFor(() => isOpen(node) === shouldBeOpen);
    161  assertVisibleMessageIds(shouldBeOpen);
    162 }