diff options
Diffstat (limited to 'devtools/client/webconsole/test/browser/browser_webconsole_async_stack.js')
-rw-r--r-- | devtools/client/webconsole/test/browser/browser_webconsole_async_stack.js | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_async_stack.js b/devtools/client/webconsole/test/browser/browser_webconsole_async_stack.js new file mode 100644 index 0000000000..c8c638facd --- /dev/null +++ b/devtools/client/webconsole/test/browser/browser_webconsole_async_stack.js @@ -0,0 +1,90 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +// Check that async stacktraces are displayed as expected. + +"use strict"; + +const TEST_URI = `data:text/html;charset=utf8,<!DOCTYPE html><script> +function timeout(cb, delay) { + setTimeout(cb, delay); +} + +function promiseThen(cb) { + Promise.resolve().then(cb); +} + +const onTimeout = () => { + console.trace("Trace message"); + console.error("console error message"); + throw new Error("Thrown error message"); +}; +const onPromiseThen = () => timeout(onTimeout, 1); +promiseThen(onPromiseThen); + +</script>`; + +add_task(async function () { + await pushPref("javascript.options.asyncstack_capture_debuggee_only", false); + const hud = await openNewTabAndConsole(TEST_URI); + + // Cached messages stacktrace are missing "promise callback" frames, so we reload + // the page to get "live" messages instead. See Bug 1604428. + await reloadPage(); + + const expectedFrames = [ + "onTimeout", + "(Async: setTimeout handler)", + "timeout", + "onPromiseThen", + "(Async: promise callback)", + "promiseThen", + "<anonymous>", + ].join("\n"); + + const traceMsgNode = await waitFor( + () => findConsoleAPIMessage(hud, "Trace message", ".trace"), + "Wait for the trace message to be logged" + ); + let frames = await getSimplifiedStack(traceMsgNode); + is(frames, expectedFrames, "console.trace has expected frames"); + + const consoleErrorMsgNode = await waitFor( + () => findConsoleAPIMessage(hud, "console error message", ".error"), + "Wait for the console error message to be logged" + ); + consoleErrorMsgNode.querySelector(".arrow").click(); + frames = await getSimplifiedStack(consoleErrorMsgNode); + is(frames, expectedFrames, "console.error has expected frames"); + + const errorMsgNode = await waitFor( + () => + findErrorMessage( + hud, + "Uncaught Error: Thrown error message", + ".javascript" + ), + "Wait for the thrown error message to be logged" + ); + errorMsgNode.querySelector(".arrow").click(); + frames = await getSimplifiedStack(errorMsgNode); + is(frames, expectedFrames, "thrown error has expected frames"); +}); + +async function getSimplifiedStack(messageEl) { + const framesEl = await waitFor(() => { + const frames = messageEl.querySelectorAll( + ".message-body-wrapper > .stacktrace .frame" + ); + return frames.length ? frames : null; + }, "Couldn't find stacktrace"); + + return Array.from(framesEl) + .map(frameEl => + Array.from(frameEl.querySelectorAll(".title,.location-async-cause")).map( + el => el.textContent.trim() + ) + ) + .flat() + .join("\n"); +} |