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

requestLongerTimeout(2);

// Test that searching for XPaths via the search field actually selects the
// matching nodes.

const TEST_URL = URL_ROOT + "doc_inspector_search.html";

// The various states of the inspector: [key, id, isTextNode, isValid]
// [
//  what key to press,
//  what id should be selected after the keypress,
//  is the selected node a text node,
//  is the searched text valid selector
// ]
const KEY_STATES = [
  ["/", "b1", false, true], // /
  ["*", "b1", false, true], // /*
  ["VK_RETURN", "root", false, true], // /*
  ["VK_BACK_SPACE", "root", false, true], // /
  ["/", "root", false, true], // //
  ["d", "root", false, true], // //d
  ["i", "root", false, true], // //di
  ["v", "root", false, true], // //div
  ["VK_RETURN", "d1", false, true], // //div
  ["VK_RETURN", "d2", false, true], // //div
  ["VK_RETURN", "d1", false, true], // //div
  ["VK_BACK_SPACE", "d1", false, true], // //di
  ["VK_BACK_SPACE", "d1", false, true], // //d
  ["VK_BACK_SPACE", "d1", false, true], // //
  ["s", "d1", false, true], // //s
  ["p", "d1", false, true], // //sp
  ["a", "d1", false, true], // //spa
  ["n", "d1", false, true], // //span
  ["/", "d1", false, true], // //span/
  ["t", "d1", false, true], // //span/t
  ["e", "d1", false, true], // //span/te
  ["x", "d1", false, true], // //span/tex
  ["t", "d1", false, true], // //span/text
  ["(", "d1", false, true], // //span/text(
  [")", "d1", false, true], // //span/text()
  ["VK_RETURN", "s1", false, true], // //span/text()
  ["VK_RETURN", "s2", true, true], // //span/text()
];

add_task(async function() {
  const { inspector } = await openInspectorForURL(TEST_URL);
  const { searchBox } = inspector;

  await selectNode("#b1", inspector);
  await focusSearchBoxUsingShortcut(inspector.panelWin);

  let index = 0;
  for (const [key, id, isTextNode, isValid] of KEY_STATES) {
    info(index + ": Pressing key " + key + " to get id " + id + ".");
    EventUtils.synthesizeKey(
      key,
      { shiftKey: key === "*" },
      inspector.panelWin
    );
    info("Got processing-done event");

    if (key === "VK_RETURN") {
      info("Waiting for " + (isValid ? "NO " : "") + "results");
      await inspector.search.once("search-result");
    }

    info("Waiting for search query to complete");
    await inspector.searchSuggestions._lastQuery;

    if (isTextNode) {
      info(
        "Text node of " +
          inspector.selection.nodeFront.parentNode.id +
          " is selected with text " +
          searchBox.value
      );

      is(
        inspector.selection.nodeFront.nodeType,
        Node.TEXT_NODE,
        "Correct node is selected for state " + index
      );
    } else {
      info(
        inspector.selection.nodeFront.id +
          " is selected with text " +
          searchBox.value
      );

      const nodeFront = await getNodeFront("#" + id, inspector);
      is(
        inspector.selection.nodeFront,
        nodeFront,
        "Correct node is selected for state " + index
      );
    }

    is(
      !searchBox.parentNode.classList.contains("devtools-searchbox-no-match"),
      isValid,
      "Correct searchbox result state for state " + index
    );

    index++;
  }
});
