// Test that URL opens in a new tab when click while
// pressing CTR (or CMD in MacOS) as expected.

"use strict";

const TEST_URI =
  "https://example.com/browser/devtools/client/webconsole/" +
  "test/browser/test-console.html";

add_task(async function () {
  // Enable net messages in the console for this test.
  await pushPref("devtools.webconsole.filter.net", true);
  const isMacOS = Services.appinfo.OS === "Darwin";

  // We open the console
  const hud = await openNewTabAndConsole(TEST_URI);

  info("Reload the content window to produce a network log");
  await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
    content.wrappedJSObject.location.reload();
  });
  const message = await waitFor(() =>
    findMessageByType(hud, "test-console.html", ".network")
  );
  ok(message, "Network log found in the console");

  const currentTab = gBrowser.selectedTab;
  const tabLoaded = listenToTabLoad();

  info("Cmd/Ctrl click on the message");
  const urlObject = message.querySelector(".url");

  EventUtils.sendMouseEvent(
    {
      type: "click",
      [isMacOS ? "metaKey" : "ctrlKey"]: true,
    },
    urlObject,
    hud.ui.window
  );

  info("Opening the URL of the message on a new tab");
  const newTab = await tabLoaded;
  const newTabHref = newTab.linkedBrowser.currentURI.spec;

  is(newTabHref, TEST_URI, "Tab was opened with the expected URL");
  info("Remove the new tab and select the previous tab back");
  gBrowser.removeTab(newTab);
  gBrowser.selectedTab = currentTab;
});

/**
 * Simple helper to wrap a tab load listener in a promise.
 */
function listenToTabLoad() {
  return new Promise(resolve => {
    gBrowser.tabContainer.addEventListener(
      "TabOpen",
      function (evt) {
        const newTab = evt.target;
        BrowserTestUtils.browserLoaded(newTab.linkedBrowser).then(() =>
          resolve(newTab)
        );
      },
      { capture: true, once: true }
    );
  });
}
