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 }