/* vim: set ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
 http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

// Test that adding nodes does work as expected: the parent gets expanded, the
// new node gets selected.

const TEST_URL = URL_ROOT + "doc_inspector_add_node.html";
const PARENT_TREE_LEVEL = 3;

add_task(function* () {
  let {inspector} = yield openInspectorForURL(TEST_URL);

  info("Adding in element that has no children and is collapsed");
  let parentNode = yield getNodeFront("#foo", inspector);
  yield selectNode(parentNode, inspector);
  yield testAddNode(parentNode, inspector);

  info("Adding in element with children but that has not been expanded yet");
  parentNode = yield getNodeFront("#bar", inspector);
  yield selectNode(parentNode, inspector);
  yield testAddNode(parentNode, inspector);

  info("Adding in element with children that has been expanded then collapsed");
  // Select again #bar and collapse it.
  parentNode = yield getNodeFront("#bar", inspector);
  yield selectNode(parentNode, inspector);
  collapseNode(parentNode, inspector);
  yield testAddNode(parentNode, inspector);

  info("Adding in element with children that is expanded");
  parentNode = yield getNodeFront("#bar", inspector);
  yield selectNode(parentNode, inspector);
  yield testAddNode(parentNode, inspector);
});

function* testAddNode(parentNode, inspector) {
  let btn = inspector.panelDoc.querySelector("#inspector-element-add-button");
  let markupWindow = inspector.markup.win;
  let parentContainer = inspector.markup.getContainer(parentNode);

  is(parentContainer.tagLine.getAttribute("aria-level"), PARENT_TREE_LEVEL,
    "Parent level should be up to date.");

  info("Clicking 'add node' and expecting a markup mutation and focus event");
  let onMutation = inspector.once("markupmutation");
  btn.click();
  let mutations = yield onMutation;

  info("Expecting an inspector-updated event right after the mutation event " +
       "to wait for the new node selection");
  yield inspector.once("inspector-updated");

  is(mutations.length, 1, "There is one mutation only");
  is(mutations[0].added.length, 1, "There is one new node only");

  let newNode = mutations[0].added[0];

  is(newNode, inspector.selection.nodeFront,
     "The new node is selected");

  ok(parentContainer.expanded, "The parent node is now expanded");

  is(inspector.selection.nodeFront.parentNode(), parentNode,
     "The new node is inside the right parent");

  let focusedElement = markupWindow.document.activeElement;
  let focusedContainer = focusedElement.container;
  let selectedContainer = inspector.markup._selectedContainer;
  is(selectedContainer.tagLine.getAttribute("aria-level"),
    PARENT_TREE_LEVEL + 1, "Added container level should be up to date.");
  is(selectedContainer.node, inspector.selection.nodeFront,
     "The right container is selected in the markup-view");
  ok(selectedContainer.selected, "Selected container is set to selected");
  is(focusedContainer.toString(), "[root container]",
    "Root container is focused");
}

function collapseNode(node, inspector) {
  let container = inspector.markup.getContainer(node);
  container.setExpanded(false);
}
