diff options
Diffstat (limited to 'devtools/client/debugger/test/mochitest/browser_dbg-features-asm.js')
-rw-r--r-- | devtools/client/debugger/test/mochitest/browser_dbg-features-asm.js | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-features-asm.js b/devtools/client/debugger/test/mochitest/browser_dbg-features-asm.js new file mode 100644 index 0000000000..15c7737072 --- /dev/null +++ b/devtools/client/debugger/test/mochitest/browser_dbg-features-asm.js @@ -0,0 +1,92 @@ +/* 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/>. */ + +/** + * This test covers all specifics of debugging ASM.js files. + * + * ASM.js is a subset of the Javascript syntax. + * Thanks to these limitations, the JS engine is able to compile this code + * into machine instructions and execute it faster. + * + * When the DevTools are opened, ThreadConfiguration's `observeAsmJS` is set to true, + * which sets DebuggerAPI's `allowUnobservedAsmJS` to false, + * which disables the compilation of ASM.js files and make them run as regular JS code. + * Thus, allowing to debug them as regular JS code. + * + * This behavior introduces some limitations when opening the debugger against + * and already loaded page. The ASM.js file won't be debuggable. + */ + +"use strict"; + +add_task(async function () { + // Load the test page before opening the debugger + // and also force a GC before opening the debugger + // so that ASM.js is fully garbaged collected. + // Otherwise on debug builds, the thread actor is able to intermittently + // retrieve the ASM.js sources and retrieve the breakable lines. + const tab = await addTab(EXAMPLE_URL + "doc-asm.html"); + await SpecialPowers.spawn(tab.linkedBrowser, [], function () { + Cu.forceGC(); + }); + const toolbox = await openToolboxForTab(tab, "jsdebugger"); + const dbg = createDebuggerContext(toolbox); + + // There is the legit and the spurious wasm source (see following comment) + await waitForSourcesInSourceTree(dbg, ["doc-asm.html", "asm.js", "asm.js"]); + is(dbg.selectors.getSourceCount(), 3, "There are only three sources"); + + const legitSource = findSource(dbg, EXAMPLE_URL + "asm.js"); + ok( + legitSource.url.startsWith("https://"), + "We got the legit source that works, not the spurious WASM one" + ); + is(legitSource.isWasm, false, "ASM.js sources are *not* flagged as WASM"); + + // XXX Bug 1759573 - There is a spurious wasm source reported which is broken + // and ideally shouldn't exists at all in UI. + // The Thread Actor is notified by the Debugger API about a WASM + // source when calling Debugger.findSources in ThreadActor.addAllSources. + const wasmUrl = "wasm:" + legitSource.url; + ok( + sourceExists(dbg, wasmUrl), + `There is a spurious wasm:// source displayed: ${wasmUrl}` + ); + + await selectSource(dbg, legitSource); + + assertTextContentOnLine(dbg, 7, "return 1 | 0;"); + + info( + "Before reloading, ThreadConfiguration's 'observedAsmJS' was false while the page was loading" + ); + info( + "So that we miss info about the ASM sources and lines are not breakables" + ); + assertLineIsBreakable(dbg, legitSource.url, 7, false); + + info("Reload and assert that ASM.js file are then debuggable"); + await reload(dbg, "doc-asm.html", "asm.js"); + + info("After reloading, ASM lines are breakable"); + // Ensure selecting the source before asserting breakable lines + // otherwise the gutter may not be yet updated + await selectSource(dbg, "asm.js"); + assertLineIsBreakable(dbg, legitSource.url, 7, true); + + await waitForSourcesInSourceTree(dbg, ["doc-asm.html", "asm.js"]); + is(dbg.selectors.getSourceCount(), 2, "There is only the two sources"); + + assertTextContentOnLine(dbg, 7, "return 1 | 0;"); + + await addBreakpoint(dbg, "asm.js", 7); + invokeInTab("runAsm"); + + await waitForPaused(dbg); + assertPausedAtSourceAndLine(dbg, findSource(dbg, "asm.js").id, 7); + await assertBreakpoint(dbg, 7); + + await removeBreakpoint(dbg, findSource(dbg, "asm.js").id, 7); + await resume(dbg); +}); |