Blame devtools/client/debugger/new/test/mochitest/browser_dbg-babel-scopes.js

Packit f0b94e
/* Any copyright is dedicated to the Public Domain.
Packit f0b94e
 * http://creativecommons.org/publicdomain/zero/1.0/ */
Packit f0b94e
Packit f0b94e
// This test can be really slow on debug platforms and should be split
Packit f0b94e
requestLongerTimeout(4);
Packit f0b94e
Packit f0b94e
// Tests loading sourcemapped sources for Babel's compile output.
Packit f0b94e
Packit f0b94e
async function breakpointScopes(dbg, fixture, { line, column }, scopes) {
Packit f0b94e
  const { selectors: { getBreakpoint, getBreakpoints }, getState } = dbg;
Packit f0b94e
Packit f0b94e
  const filename = `fixtures/${fixture}/input.js`;
Packit f0b94e
  await waitForSources(dbg, filename);
Packit f0b94e
Packit f0b94e
  ok(true, "Original sources exist");
Packit f0b94e
  const source = findSource(dbg, filename);
Packit f0b94e
Packit f0b94e
  await selectSource(dbg, source);
Packit f0b94e
Packit f0b94e
  // Test that breakpoint is not off by a line.
Packit f0b94e
  await addBreakpoint(dbg, source, line);
Packit f0b94e
Packit f0b94e
  is(getBreakpoints(getState()).size, 1, "One breakpoint exists");
Packit f0b94e
  ok(
Packit f0b94e
    getBreakpoint(getState(), { sourceId: source.id, line, column }),
Packit f0b94e
    "Breakpoint has correct line"
Packit f0b94e
  );
Packit f0b94e
Packit f0b94e
  const fnName = fixture.replace(/-([a-z])/g, (s, c) => c.toUpperCase());
Packit f0b94e
Packit f0b94e
  const invokeResult = invokeInTab(fnName);
Packit f0b94e
Packit f0b94e
  let invokeFailed = await Promise.race([
Packit f0b94e
    waitForPaused(dbg),
Packit f0b94e
    invokeResult.then(() => new Promise(() => {}), () => true)
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  if (invokeFailed) {
Packit f0b94e
    return invokeResult;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  assertPausedLocation(dbg);
Packit f0b94e
Packit f0b94e
  await assertScopes(dbg, scopes);
Packit f0b94e
Packit f0b94e
  await removeBreakpoint(dbg, source.id, line, column);
Packit f0b94e
Packit f0b94e
  is(getBreakpoints(getState()).size, 0, "Breakpoint reverted");
Packit f0b94e
Packit f0b94e
  await resume(dbg);
Packit f0b94e
Packit f0b94e
  // If the invoke errored later somehow, capture here so the error is reported nicely.
Packit f0b94e
  await invokeResult;
Packit f0b94e
Packit f0b94e
  ok(true, `Ran tests for ${fixture} at line ${line} column ${column}`);
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
async function expandAllScopes(dbg) {
Packit f0b94e
  const scopes = await waitForElement(dbg, "scopes");
Packit f0b94e
  const scopeElements = scopes.querySelectorAll(
Packit f0b94e
    `.tree-node[aria-level="0"][data-expandable="true"]:not([aria-expanded="true"])`
Packit f0b94e
  );
Packit f0b94e
  const indices = Array.from(scopeElements, el => {
Packit f0b94e
    return Array.prototype.indexOf.call(el.parentNode.childNodes, el);
Packit f0b94e
  }).reverse();
Packit f0b94e
Packit f0b94e
  for (const index of indices) {
Packit f0b94e
    await toggleScopeNode(dbg, index + 1);
Packit f0b94e
  }
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
async function assertScopes(dbg, items) {
Packit f0b94e
  await expandAllScopes(dbg);
Packit f0b94e
Packit f0b94e
  for (const [i, val] of items.entries()) {
Packit f0b94e
    if (Array.isArray(val)) {
Packit f0b94e
      is(getScopeLabel(dbg, i + 1), val[0]);
Packit f0b94e
      is(
Packit f0b94e
        getScopeValue(dbg, i + 1),
Packit f0b94e
        val[1],
Packit f0b94e
        `"${val[0]}" has the expected "${val[1]}" value`
Packit f0b94e
      );
Packit f0b94e
    } else {
Packit f0b94e
      is(getScopeLabel(dbg, i + 1), val);
Packit f0b94e
    }
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  is(getScopeLabel(dbg, items.length + 1), "Window");
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
add_task(async function() {
Packit f0b94e
  await pushPref("devtools.debugger.features.map-scopes", true);
Packit f0b94e
Packit f0b94e
  const dbg = await initDebugger("doc-babel.html");
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "for-of", { line: 5, column: 4 }, [
Packit f0b94e
    "For",
Packit f0b94e
    ["x", "1"],
Packit f0b94e
    "forOf",
Packit f0b94e
    "doThing()",
Packit f0b94e
    "Module",
Packit f0b94e
    "forOf",
Packit f0b94e
    "mod"
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "shadowed-vars", { line: 18, column: 6 }, [
Packit f0b94e
    "Block",
Packit f0b94e
    ["aConst", '"const3"'],
Packit f0b94e
    ["aLet", '"let3"'],
Packit f0b94e
    "Block",
Packit f0b94e
    ["aConst", '"const2"'],
Packit f0b94e
    ["aLet", '"let2"'],
Packit f0b94e
    "Outer:_Outer()",
Packit f0b94e
    "Block",
Packit f0b94e
    ["aConst", '"const1"'],
Packit f0b94e
    ["aLet", '"let1"'],
Packit f0b94e
    "Outer()",
Packit f0b94e
    "default",
Packit f0b94e
    ["aVar", '"var3"']
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(
Packit f0b94e
    dbg,
Packit f0b94e
    "this-arguments-bindings",
Packit f0b94e
    { line: 4, column: 4 },
Packit f0b94e
    [
Packit f0b94e
      "Block",
Packit f0b94e
      ["<this>", '"this-value"'],
Packit f0b94e
      ["arrow", "undefined"],
Packit f0b94e
      "fn",
Packit f0b94e
      ["arg", '"arg-value"'],
Packit f0b94e
      ["arguments", "Arguments"],
Packit f0b94e
      "root",
Packit f0b94e
      "fn()",
Packit f0b94e
      "Module",
Packit f0b94e
      "root()"
Packit f0b94e
    ]
Packit f0b94e
  );
Packit f0b94e
Packit f0b94e
  // No '<this>' binding here because Babel does not currently general
Packit f0b94e
  // the current mappings for 'this' bindings.
Packit f0b94e
  await breakpointScopes(
Packit f0b94e
    dbg,
Packit f0b94e
    "this-arguments-bindings",
Packit f0b94e
    { line: 8, column: 6 },
Packit f0b94e
    [
Packit f0b94e
      "arrow",
Packit f0b94e
      ["argArrow", "(unmapped)"],
Packit f0b94e
      "Block",
Packit f0b94e
      "arrow()",
Packit f0b94e
      "fn",
Packit f0b94e
      ["arg", '"arg-value"'],
Packit f0b94e
      ["arguments", "Arguments"],
Packit f0b94e
      "root",
Packit f0b94e
      "fn()",
Packit f0b94e
      "Module",
Packit f0b94e
      "root()"
Packit f0b94e
    ]
Packit f0b94e
  );
Packit f0b94e
Packit f0b94e
  // Babel 6's imports aren't fully mapped, so they show as unavailable.
Packit f0b94e
  // The call-based ones work, but the single-identifier ones do not.
Packit f0b94e
  await breakpointScopes(dbg, "imported-bindings", { line: 17, column: 2 }, [
Packit f0b94e
    "Module",
Packit f0b94e
    ["aDefault", "(unmapped)"],
Packit f0b94e
    ["aDefault2", '"a-default2"'],
Packit f0b94e
    ["aDefault3", "(unmapped)"],
Packit f0b94e
    ["anAliased", "(unmapped)"],
Packit f0b94e
    ["anAliased2", '"an-original2"'],
Packit f0b94e
    ["anAliased3", "(unmapped)"],
Packit f0b94e
    ["aNamed", "(unmapped)"],
Packit f0b94e
    ["aNamed2", '"a-named2"'],
Packit f0b94e
    ["aNamed3", "(unmapped)"],
Packit f0b94e
    ["aNamespace", "{\u2026}"],
Packit f0b94e
    ["aNamespace2", "{\u2026}"],
Packit f0b94e
    ["aNamespace3", "{\u2026}"],
Packit f0b94e
    "root()"
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "classes", { line: 12, column: 6 }, [
Packit f0b94e
    "Block",
Packit f0b94e
    ["three", "3"],
Packit f0b94e
    ["two", "2"],
Packit f0b94e
    "Class",
Packit f0b94e
    "Another()",
Packit f0b94e
    "Block",
Packit f0b94e
    "Another()",
Packit f0b94e
    ["one", "1"],
Packit f0b94e
    "Thing()",
Packit f0b94e
    "Module",
Packit f0b94e
    "root()"
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "for-loops", { line: 5, column: 4 }, [
Packit f0b94e
    "For",
Packit f0b94e
    ["i", "1"],
Packit f0b94e
    "Block",
Packit f0b94e
    ["i", "0"],
Packit f0b94e
    "Module",
Packit f0b94e
    "root()"
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "for-loops", { line: 9, column: 4 }, [
Packit f0b94e
    "For",
Packit f0b94e
    ["i", '"2"'],
Packit f0b94e
    "Block",
Packit f0b94e
    ["i", "0"],
Packit f0b94e
    "Module",
Packit f0b94e
    "root()"
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "for-loops", { line: 13, column: 4 }, [
Packit f0b94e
    "For",
Packit f0b94e
    ["i", "3"],
Packit f0b94e
    "Block",
Packit f0b94e
    ["i", "0"],
Packit f0b94e
    "Module",
Packit f0b94e
    "root()"
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "functions", { line: 6, column: 8 }, [
Packit f0b94e
    "arrow",
Packit f0b94e
    ["p3", "undefined"],
Packit f0b94e
    "Block",
Packit f0b94e
    "arrow()",
Packit f0b94e
    "inner",
Packit f0b94e
    ["p2", "undefined"],
Packit f0b94e
    "Function Expression",
Packit f0b94e
    "inner()",
Packit f0b94e
    "Block",
Packit f0b94e
    "inner()",
Packit f0b94e
    "decl",
Packit f0b94e
    ["p1", "undefined"],
Packit f0b94e
    "root",
Packit f0b94e
    "decl()",
Packit f0b94e
    "Module",
Packit f0b94e
    "root()"
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "modules", { line: 7, column: 2 }, [
Packit f0b94e
    "Module",
Packit f0b94e
    ["alsoModuleScoped", "2"],
Packit f0b94e
    ["moduleScoped", "1"],
Packit f0b94e
    "thirdModuleScoped()"
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "commonjs", { line: 7, column: 2 }, [
Packit f0b94e
    "Module",
Packit f0b94e
    ["alsoModuleScoped", "2"],
Packit f0b94e
    ["moduleScoped", "1"],
Packit f0b94e
    "thirdModuleScoped()"
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "non-modules", { line: 7, column: 2 }, []);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "switches", { line: 7, column: 6 }, [
Packit f0b94e
    "Switch",
Packit f0b94e
    ["val", "2"],
Packit f0b94e
    "Block",
Packit f0b94e
    ["val", "1"],
Packit f0b94e
    "Module",
Packit f0b94e
    "root()"
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "switches", { line: 10, column: 6 }, [
Packit f0b94e
    "Block",
Packit f0b94e
    ["val", "3"],
Packit f0b94e
    "Switch",
Packit f0b94e
    ["val", "2"],
Packit f0b94e
    "Block",
Packit f0b94e
    ["val", "1"],
Packit f0b94e
    "Module",
Packit f0b94e
    "root()"
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "try-catches", { line: 8, column: 4 }, [
Packit f0b94e
    "Block",
Packit f0b94e
    ["two", "2"],
Packit f0b94e
    "Catch",
Packit f0b94e
    ["err", '"AnError"'],
Packit f0b94e
    "Block",
Packit f0b94e
    ["one", "1"],
Packit f0b94e
    "Module",
Packit f0b94e
    "root()"
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "webpack-modules", { line: 17, column: 2 }, [
Packit f0b94e
    "Module",
Packit f0b94e
    ["aDefault", '"a-default"'],
Packit f0b94e
    ["aDefault2", '"a-default2"'],
Packit f0b94e
    ["aDefault3", '"a-default3"'],
Packit f0b94e
    ["anAliased", "Getter"],
Packit f0b94e
    ["anAliased2", "Getter"],
Packit f0b94e
    ["anAliased3", "Getter"],
Packit f0b94e
    ["aNamed", "Getter"],
Packit f0b94e
    ["aNamed2", "Getter"],
Packit f0b94e
    ["aNamed3", "Getter"],
Packit f0b94e
    ["aNamespace", "{\u2026}"],
Packit f0b94e
    ["aNamespace2", "{\u2026}"],
Packit f0b94e
    ["aNamespace3", "{\u2026}"],
Packit f0b94e
    "root()"
Packit f0b94e
  ]);
Packit f0b94e
Packit f0b94e
  await breakpointScopes(dbg, "webpack-modules-es6", { line: 17, column: 2 }, [
Packit f0b94e
    "Module",
Packit f0b94e
    ["aDefault", '"a-default"'],
Packit f0b94e
    ["aDefault2", '"a-default2"'],
Packit f0b94e
    ["aDefault3", '"a-default3"'],
Packit f0b94e
    ["anAliased", '"an-original"'],
Packit f0b94e
    ["anAliased2", '"an-original2"'],
Packit f0b94e
    ["anAliased3", '"an-original3"'],
Packit f0b94e
    ["aNamed", '"a-named"'],
Packit f0b94e
    ["aNamed2", '"a-named2"'],
Packit f0b94e
    ["aNamed3", '"a-named3"'],
Packit f0b94e
    ["aNamespace", "{\u2026}"],
Packit f0b94e
    ["aNamespace2", "{\u2026}"],
Packit f0b94e
    ["aNamespace3", "{\u2026}"],
Packit f0b94e
    "root()"
Packit f0b94e
  ]);
Packit f0b94e
});