/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

// Tests that clicking on a function in a pretty-printed file displays its
// original source in the debugger. See Bug 1590824.

"use strict";

requestLongerTimeout(5);

const TEST_ROOT =
  "http://example.com/browser/devtools/client/webconsole/test/browser/";

const TEST_URI = TEST_ROOT + "test-click-function-to-prettyprinted-source.html";
const TEST_GENERATED_URI =
  TEST_ROOT + "test-click-function-to-source.unmapped.min.js";
const TEST_PRETTYPRINTED_URI = TEST_GENERATED_URI + ":formatted";

add_task(async function () {
  await clearDebuggerPreferences();

  info("Open the console");
  const hud = await openNewTabAndConsole(TEST_URI);
  const toolbox = hud.toolbox;

  const onLoggedFunction = waitForMessageByType(
    hud,
    "function foo",
    ".console-api"
  );
  invokeInTab("foo");
  const { node } = await onLoggedFunction;
  const jumpIcon = node.querySelector(".jump-definition");
  ok(jumpIcon, "A jump to definition button is rendered, as expected");

  info("Click on the jump to definition button");
  jumpIcon.click();
  await toolbox.getPanelWhenReady("jsdebugger");
  const dbg = createDebuggerContext(toolbox);
  await waitForSelectedSource(dbg, TEST_GENERATED_URI);

  info("Pretty-print the minified source");
  clickElement(dbg, "prettyPrintButton");
  await waitForSelectedSource(dbg, TEST_PRETTYPRINTED_URI);

  info("Switch back to the console");
  await toolbox.selectTool("webconsole");
  info("Click on the jump to definition button a second time");
  jumpIcon.click();

  info("Wait for the Debugger panel to open");
  await waitForSelectedSource(dbg, TEST_PRETTYPRINTED_URI);
  await waitForSelectedLocation(dbg, 2);

  const location = dbg.selectors.getPendingSelectedLocation();
  // Pretty-printed source maps don't have column positions
  const { url, line } = location;

  is(url, TEST_PRETTYPRINTED_URI, "Debugger is open at the expected file");
  is(line, 2, "Debugger is open at the expected line");
});
