/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ // Test that rejected promise are reported to the console. "use strict"; const TEST_URI = `data:text/html;charset=utf-8, `; add_task(async function() { await pushPref("javascript.options.asyncstack_capture_debuggee_only", false); const hud = await openNewTabAndConsole(TEST_URI); const expectedErrors = [ "Uncaught (in promise) potato", "Uncaught (in promise) ", "Uncaught (in promise) 0", "Uncaught (in promise) false", "Uncaught (in promise) null", "Uncaught (in promise) undefined", `Uncaught (in promise) Object { fav: "eggplant" }`, `Uncaught (in promise) Array [ "cherry", "strawberry" ]`, `Uncaught (in promise) Error: spinach`, `Uncaught (in promise) VeggieError: carrot`, ]; for (const expectedError of expectedErrors) { const message = await waitFor( () => findMessage(hud, expectedError, ".error"), `Couldn't find «${expectedError}» message` ); ok(message, `Found «${expectedError}» message`); message.querySelector(".collapse-button").click(); const framesEl = await waitFor(() => { const frames = message.querySelectorAll( ".message-body-wrapper > .stacktrace .frame" ); return frames.length > 0 ? frames : null; }, "Couldn't find stacktrace"); const frames = Array.from(framesEl) .map(frameEl => Array.from( frameEl.querySelectorAll(".title, .location-async-cause") ).map(el => el.textContent.trim()) ) .flat(); is( frames.join("\n"), [ "setTimeoutCb", "(Async: setTimeout handler)", "promiseCb", "createRejectedPromise", "forEachCb", "forEach", "", ].join("\n"), "Error message has expected frames" ); } ok(true, "All expected messages were found"); info("Check that object in errors can be expanded"); const rejectedObjectMessage = findMessage( hud, `Uncaught (in promise) Object { fav: "eggplant" }`, ".error" ); const oi = rejectedObjectMessage.querySelector(".tree"); ok(true, "The object was rendered in an ObjectInspector"); info("Expanding the object"); const onOiExpanded = waitFor(() => { return oi.querySelectorAll(".node").length === 3; }); oi.querySelector(".arrow").click(); await onOiExpanded; ok( oi.querySelector(".arrow").classList.contains("expanded"), "Object expanded" ); // The object inspector now looks like: // {...} // | fav: "eggplant" // | : Object { ... } const oiNodes = oi.querySelectorAll(".node"); is(oiNodes.length, 3, "There is the expected number of nodes in the tree"); ok(oiNodes[0].textContent.includes(`{\u2026}`)); ok(oiNodes[1].textContent.includes(`fav: "eggplant"`)); ok(oiNodes[2].textContent.includes(`: Object { \u2026 }`)); });