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

"use strict";

/* eslint no-unused-vars: [2, {"vars": "local", "args": "none"}] */
/* import-globals-from ../../../test/head.js */

// Load the NetMonitor head.js file to share its API.
var netMonitorHead =
  "chrome://mochitests/content/browser/devtools/client/netmonitor/test/head.js";
Services.scriptloader.loadSubScript(netMonitorHead, this);

// Directory with HAR related test files.
const HAR_EXAMPLE_URL =
  "https://example.com/browser/devtools/client/netmonitor/src/har/test/";

/**
 * Trigger a "copy all as har" from the context menu of the requests list.

 * @param {object} monitor
 *        The network monitor object
 */
async function copyAllAsHARWithContextMenu(monitor, { asString = false } = {}) {
  const { HarMenuUtils } = monitor.panelWin.windowRequire(
    "devtools/client/netmonitor/src/har/har-menu-utils"
  );

  info("Open the context menu on the first visible request.");
  const firstRequest =
    monitor.panelWin.document.querySelectorAll(".request-list-item")[0];

  EventUtils.sendMouseEvent({ type: "mousedown" }, firstRequest);
  EventUtils.sendMouseEvent({ type: "contextmenu" }, firstRequest);

  info("Trigger Copy All As HAR from the context menu");
  const onHarCopyDone = HarMenuUtils.once("copy-all-as-har-done");
  await selectContextMenuItem(monitor, "request-list-context-copy-all-as-har");
  const jsonString = await onHarCopyDone;

  if (asString) {
    return jsonString;
  }
  return JSON.parse(jsonString);
}

/**
 * Trigger a "save as har" from the context menu of the requests list.

 * @param {object} monitor
 *        The network monitor object
 */
async function saveAsHARWithContextMenu(monitor, { asString = false } = {}) {
  info("Open the context menu on the first visible request.");
  const firstRequest =
    monitor.panelWin.document.querySelectorAll(".request-list-item")[0];

  EventUtils.sendMouseEvent({ type: "mousedown" }, firstRequest);
  EventUtils.sendMouseEvent({ type: "contextmenu" }, firstRequest);

  info("Trigger Save As HAR from the context menu");
  await selectContextMenuItem(monitor, "request-list-context-save-as-har");

  info("Mock the file picker dialog to save the HAR file to disk");
  const MockFilePicker = SpecialPowers.MockFilePicker;
  MockFilePicker.init(window.browsingContext);
  const nsiFile = new FileUtils.File(
    PathUtils.join(PathUtils.tempDir, `save_as_har-${Date.now()}.har`)
  );
  MockFilePicker.setFiles([nsiFile]);
  const path = nsiFile.path;

  info("Wait for the downloaded file to be fully saved to disk");
  await BrowserTestUtils.waitForCondition(() => IOUtils.exists(path));
  await BrowserTestUtils.waitForCondition(async () => {
    const { size } = await IOUtils.stat(path);
    return size > 0;
  });
  const buffer = await IOUtils.read(path);
  const savedFileContent = new TextDecoder().decode(buffer);

  if (asString) {
    return savedFileContent;
  }
  return JSON.parse(savedFileContent);
}
