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 }