diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /devtools/client/debugger/test/mochitest/browser_dbg-unselected-pause.js | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'devtools/client/debugger/test/mochitest/browser_dbg-unselected-pause.js')
-rw-r--r-- | devtools/client/debugger/test/mochitest/browser_dbg-unselected-pause.js | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-unselected-pause.js b/devtools/client/debugger/test/mochitest/browser_dbg-unselected-pause.js new file mode 100644 index 0000000000..6eee32e66d --- /dev/null +++ b/devtools/client/debugger/test/mochitest/browser_dbg-unselected-pause.js @@ -0,0 +1,203 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +// Test that the debugger pauses and is automatically highlighted and selected, +// even when it hasn't been opened. + +"use strict"; + +const IFRAME_TEST_COM_URI = `https://example.com/document-builder.sjs?html=${encodeURI( + `<script>const a=2;\ndebugger;\nconsole.log(a);</script>` +)}`; + +// Embed the example.com test page in an example.org iframe. +const IFRAME_TEST_URI = `https://example.org/document-builder.sjs?html=${encodeURI( + `<script>function breakDebugger() {const b=3;\ndebugger;\nconsole.log(b);}</script><iframe src="${IFRAME_TEST_COM_URI}"></iframe><body>` +)}`; + +add_task(async function () { + info("Test a debugger statement from the top level document"); + + // Make sure the toolbox opens with the webconsole initially selected. + const toolbox = await initPane("doc-debugger-statements.html", "webconsole"); + + info("Execute a debugger statement"); + const pausedRun = SpecialPowers.spawn( + gBrowser.selectedBrowser, + [], + function () { + content.wrappedJSObject.test(); + } + ); + + const dbg = await assertDebuggerIsHighlightedAndPaused(toolbox); + const source = findSource(dbg, "doc-debugger-statements.html"); + assertPausedAtSourceAndLine(dbg, source.id, 16); + + await resume(dbg); + info("Wait for the paused code to complete after resume"); + await pausedRun; + + ok( + !toolbox.isHighlighted("jsdebugger"), + "Debugger is no longer highlighted after resume" + ); +}); + +add_task(async function () { + info("Test a debugger statement from an iframe"); + + // Make sure the toolbox opens with the webconsole initially selected. + const toolbox = await openNewTabAndToolbox(IFRAME_TEST_URI, "webconsole"); + + info( + "Reload the test page, which will trigger the debugger statement in the iframe" + ); + const pausedReload = reloadBrowser(); + + const dbg = await assertDebuggerIsHighlightedAndPaused(toolbox); + const source = findSource(dbg, IFRAME_TEST_COM_URI); + assertPausedAtSourceAndLine(dbg, source.id, 2); + + await resume(dbg); + info("Wait for the paused code to complete after resume"); + await pausedReload; + + ok( + !toolbox.isHighlighted("jsdebugger"), + "Debugger is no longer highlighted after resume" + ); +}); + +add_task(async function () { + info("Test pausing from two distinct targets"); + + // Make sure the toolbox opens with the webconsole initially selected. + const toolbox = await openNewTabAndToolbox(IFRAME_TEST_URI, "webconsole"); + + info( + "Reload the test page, which will trigger the debugger statement in the iframe" + ); + const pausedReload = reloadBrowser(); + + const dbg = await assertDebuggerIsHighlightedAndPaused(toolbox); + const topLevelThread = + toolbox.commands.targetCommand.targetFront.threadFront.actorID; + const iframeThread = dbg.selectors.getCurrentThread(); + if (isFissionEnabled() || isEveryFrameTargetEnabled()) { + isnot( + topLevelThread, + iframeThread, + "With fission/EFT, we get two distinct threads and could pause two times" + ); + ok( + !dbg.selectors.getIsPaused(topLevelThread), + "The top level document thread is not paused" + ); + ok( + dbg.selectors.getIsPaused(iframeThread), + "Only the iframe thread is paused" + ); + } else { + is( + topLevelThread, + iframeThread, + "Without fission/EFT, we get a unique thread and we won't pause when calling top document code" + ); + } + const source = findSource(dbg, IFRAME_TEST_COM_URI); + assertPausedAtSourceAndLine(dbg, source.id, 2); + + info("Step over to the next line"); + await stepOver(dbg); + assertPausedAtSourceAndLine(dbg, source.id, 3); + + info("Now execute a debugger statement in the top level target"); + const onPaused = waitForPausedThread(dbg, topLevelThread); + const pausedTopTarget = SpecialPowers.spawn( + gBrowser.selectedBrowser, + [], + function () { + content.wrappedJSObject.breakDebugger(); + } + ); + + if (isFissionEnabled() || isEveryFrameTargetEnabled()) { + info("Wait for the top level target to be paused"); + await onPaused; + // also use waitForPause to wait for UI updates + await waitForPaused(dbg); + + ok( + dbg.selectors.getIsPaused(topLevelThread), + "The top level document thread is paused" + ); + ok(dbg.selectors.getIsPaused(iframeThread), "The iframe thread is paused"); + + ok( + toolbox.isHighlighted("jsdebugger"), + "Debugger stays highlighted when pausing on another thread" + ); + + info( + "The new paused state refers to the latest breakpoint being hit, on the top level target" + ); + const source2 = findSource(dbg, IFRAME_TEST_URI); + assertPausedAtSourceAndLine(dbg, source2.id, 2); + + info("Resume the top level target"); + await resume(dbg); + + info("Wait for top level target paused code to complete after resume"); + await pausedTopTarget; + + info( + "By default we stay on the last selected thread on resume and so the current thread is no longer paused" + ); + assertNotPaused(dbg); + ok( + toolbox.isHighlighted("jsdebugger"), + "Debugger stays highlighted when resuming only the top level target" + ); + + info( + "Re-select the iframe thread, which is still paused on the original breakpoint" + ); + dbg.actions.selectThread(getContext(dbg), iframeThread); + await waitForPausedThread(dbg, iframeThread); + await waitForSelectedSource(dbg, source); + assertPausedAtSourceAndLine(dbg, source.id, 3); + + info("Resume the iframe target"); + await resume(dbg); + assertNotPaused(dbg); + + info("Wait for the paused code in the iframe to complete after resume"); + await pausedReload; + + await waitUntil(() => !toolbox.isHighlighted("jsdebugger")); + ok( + true, + "Debugger is no longer highlighted after resuming all the paused targets" + ); + } else { + info( + "Without fission/EFT, the iframe thread is the same as top document and doesn't pause. So wait for its resolution." + ); + await pausedTopTarget; + } + + info("Resume the last paused thread"); + await resume(dbg); + assertNotPaused(dbg); + + info("Wait for the paused code in the iframe to complete after resume"); + await pausedReload; + + await waitUntil(() => !toolbox.isHighlighted("jsdebugger")); + ok( + true, + "Debugger is no longer highlighted after resuming all the paused targets" + ); +}); |