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

"use strict";

add_task(function* () {
  let tab = yield addTab("data:text/html;charset=utf8,Test RDM custom presets");

  let { rdm, manager } = yield openRDM(tab);

  let oldPrompt = Services.prompt;
  Services.prompt = {
    value: "",
    returnBool: true,
    prompt: function (parent, dialogTitle, text, value, checkMsg, checkState) {
      value.value = this.value;
      return this.returnBool;
    }
  };

  registerCleanupFunction(() => {
    Services.prompt = oldPrompt;
  });

  // Is it open?
  let container = gBrowser.getBrowserContainer();
  is(container.getAttribute("responsivemode"), "true",
     "Should be in responsive mode.");

  ok(rdm, "RDM instance should be attached to the tab.");

  // Tries to add a custom preset and cancel the prompt
  let idx = rdm.menulist.selectedIndex;
  let presetCount = rdm.presets.length;

  Services.prompt.value = "";
  Services.prompt.returnBool = false;
  rdm.addbutton.doCommand();

  is(idx, rdm.menulist.selectedIndex,
     "selected item shouldn't change after add preset and cancel");
  is(presetCount, rdm.presets.length,
     "number of presets shouldn't change after add preset and cancel");

  // Adds the custom preset with "Testing preset"
  Services.prompt.value = "Testing preset";
  Services.prompt.returnBool = true;

  let resized = once(manager, "content-resize");
  let customHeight = 123, customWidth = 456;
  rdm.startResizing({});
  rdm.setViewportSize({
    width: customWidth,
    height: customHeight,
  });
  rdm.stopResizing({});

  rdm.addbutton.doCommand();
  yield resized;

  yield closeRDM(rdm);

  ({rdm} = yield openRDM(tab));
  is(container.getAttribute("responsivemode"), "true",
     "Should be in responsive mode.");

  let presetLabel = "456" + "\u00D7" + "123 (Testing preset)";
  let customPresetIndex = yield getPresetIndex(rdm, manager, presetLabel);
  ok(customPresetIndex >= 0, "(idx = " + customPresetIndex + ") should be the" +
                             " previously added preset in the list of items");

  yield setPresetIndex(rdm, manager, customPresetIndex);

  let browser = gBrowser.selectedBrowser;
  yield ContentTask.spawn(browser, null, function* () {
    let {innerWidth, innerHeight} = content;
    Assert.equal(innerWidth, 456, "Selecting preset should change the width");
    Assert.equal(innerHeight, 123, "Selecting preset should change the height");
  });

  info(`menulist count: ${rdm.menulist.itemCount}`);

  rdm.removebutton.doCommand();

  yield setPresetIndex(rdm, manager, 2);
  let deletedPresetA = rdm.menulist.selectedItem.getAttribute("label");
  rdm.removebutton.doCommand();

  yield setPresetIndex(rdm, manager, 2);
  let deletedPresetB = rdm.menulist.selectedItem.getAttribute("label");
  rdm.removebutton.doCommand();

  yield closeRDM(rdm);
  ({rdm} = yield openRDM(tab));

  customPresetIndex = yield getPresetIndex(rdm, manager, deletedPresetA);
  is(customPresetIndex, -1,
     "Deleted preset " + deletedPresetA + " should not be in the list anymore");

  customPresetIndex = yield getPresetIndex(rdm, manager, deletedPresetB);
  is(customPresetIndex, -1,
     "Deleted preset " + deletedPresetB + " should not be in the list anymore");

  yield closeRDM(rdm);
});

var getPresetIndex = Task.async(function* (rdm, manager, presetLabel) {
  var testOnePreset = Task.async(function* (c) {
    if (c == 0) {
      return -1;
    }
    yield setPresetIndex(rdm, manager, c);

    let item = rdm.menulist.firstChild.childNodes[c];
    if (item.getAttribute("label") === presetLabel) {
      return c;
    }
    return testOnePreset(c - 1);
  });
  return testOnePreset(rdm.menulist.firstChild.childNodes.length - 4);
});
