Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: asan OR true
- Manifest: devtools/client/debugger/test/mochitest/browser_kz.toml
/* 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
"use strict";
// Tests for stepping through Babel's compile output.
requestLongerTimeout(4);
add_task(async function () {
const dbg = await initDebugger("doc-sourcemapped.html");
await testStepOverForOf(dbg);
await testStepOverForOfArray(dbg);
await testStepOveForOfClosure(dbg);
await testStepOverForOfArrayClosure(dbg);
await testStepOverFunctionParams(dbg);
await testStepOverRegeneratorAwait(dbg);
});
async function breakpointSteps(dbg, target, fixture, { line, column }, steps) {
const filename = `${target}://./${fixture}/input.`;
const fnName = `${target}-${fixture}`.replace(/-([a-z])/g, (s, c) =>
c.toUpperCase()
);
await invokeWithBreakpoint(
dbg,
fnName,
filename,
{ line, column },
async source => {
await runSteps(dbg, source, steps);
}
);
ok(true, `Ran tests for ${fixture} at line ${line} column ${column}`);
}
async function runSteps(dbg, source, steps) {
for (const [i, [type, position]] of steps.entries()) {
info(`Step ${i}`);
switch (type) {
case "stepOver":
await stepOver(dbg);
break;
case "stepIn":
await stepIn(dbg);
break;
default:
throw new Error("Unknown stepping type");
}
await assertPausedAtSourceAndLine(
dbg,
source.id,
position.line,
position.column
);
}
}
function testStepOverForOf(dbg) {
return breakpointSteps(
dbg,
"webpack3-babel6",
"step-over-for-of",
{ line: 4, column: 2 },
[
["stepOver", { line: 6, column: 20 }],
["stepOver", { line: 6, column: 2 }],
["stepOver", { line: 7, column: 4 }],
["stepOver", { line: 6, column: 2 }],
["stepOver", { line: 7, column: 4 }],
["stepOver", { line: 6, column: 2 }],
["stepOver", { line: 10, column: 2 }],
]
);
}
// This codifies the current behavior, but stepping twice over the for
// header isn't ideal.
function testStepOverForOfArray(dbg) {
return breakpointSteps(
dbg,
"webpack3-babel6",
"step-over-for-of-array",
{ line: 3, column: 2 },
[
["stepOver", { line: 5, column: 2 }],
["stepOver", { line: 5, column: 13 }],
["stepOver", { line: 6, column: 4 }],
["stepOver", { line: 5, column: 2 }],
["stepOver", { line: 5, column: 13 }],
["stepOver", { line: 6, column: 4 }],
["stepOver", { line: 5, column: 2 }],
["stepOver", { line: 9, column: 2 }],
]
);
}
// The closure means it isn't actually possible to step into the for body,
// and Babel doesn't map the _loop() call, so we step past it automatically.
function testStepOveForOfClosure(dbg) {
return breakpointSteps(
dbg,
"webpack3-babel6",
"step-over-for-of-closure",
{ line: 6, column: 2 },
[
["stepOver", { line: 8, column: 20 }],
["stepOver", { line: 8, column: 2 }],
["stepOver", { line: 12, column: 2 }],
]
);
}
// Same as the previous, not possible to step into the body. The less
// complicated array logic makes it possible to step into the header at least,
// but this does end up double-visiting the for head.
function testStepOverForOfArrayClosure(dbg) {
return breakpointSteps(
dbg,
"webpack3-babel6",
"step-over-for-of-array-closure",
{ line: 3, column: 2 },
[
["stepOver", { line: 5, column: 2 }],
["stepOver", { line: 5, column: 13 }],
["stepOver", { line: 5, column: 2 }],
["stepOver", { line: 5, column: 13 }],
["stepOver", { line: 5, column: 2 }],
["stepOver", { line: 9, column: 2 }],
]
);
}
function testStepOverFunctionParams(dbg) {
return breakpointSteps(
dbg,
"webpack3-babel6",
"step-over-function-params",
{ line: 6, column: 2 },
[
["stepOver", { line: 7, column: 2 }],
["stepIn", { line: 2, column: 2 }],
]
);
}
function testStepOverRegeneratorAwait(dbg) {
return breakpointSteps(
dbg,
"webpack3-babel6",
"step-over-regenerator-await",
{ line: 2, column: 2 },
[
// Won't work until a fix to regenerator lands and we rebuild.
// ["stepOver", { line: 4, column: 2 }],
]
);
}