(async function () {
  var items = [
    {
      title: "first",
      index: 0
    },
    {
      title: "second",
      index: 1
    },
    {
      title: "third",
      index: 2
    },
    {
      title: "fourth",
      index: 3
    },
    {
      title: "disabled 4.5",
      disabled: true,
      index: 4
    },
    {
      title: "fifth",
      index: 5
    },
    {
      title: "sixth",
      index: 6
    },
    {
      title: "seventh",
      index: 7
    },
    {
      title: "eighth",
      index: 8
    }
  ];

  class Delegate {
    titleFor(item) {
      return item.title;
    }

    createElementForItem(item) {
      var element = createElement("div");
      element.textContent = this.titleFor(item);
      return element;
    }

    isItemSelectable(item) {
      return !item.disabled;
    }

    itemSelected(item) {
      if (item !== null)
        TestRunner.addResult("Item selected: " + this.titleFor(item));
    }

    highlightedItemChanged(from, to, fromElement, toElement) {
      if (to !== null)
        TestRunner.addResult("Item highlighted: " + this.titleFor(to));
    }
  };

  function pressKey(key) {
    var element = document.deepActiveElement();
    if (!element)
      return;
    TestRunner.addResult(key);
    element.dispatchEvent(TestRunner.createKeyEvent(key));
  }
  var model = new UI.ListModel();
  var dropDown = new UI.SoftDropDown(model, new Delegate());
  for (var i = items.length - 1; i >= 0; i--)
    model.insertWithComparator(items[i], (a, b) => a.index - b.index);

  UI.inspectorView.element.appendChild(dropDown.element);
  dropDown.selectItem(items[5]);
  TestRunner.addResult("Showing drop down");
  dropDown.element.dispatchEvent(new Event("mousedown"));
  pressKey('ArrowDown');
  pressKey('ArrowDown');
  pressKey('ArrowDown');
  pressKey('ArrowUp');
  pressKey('ArrowUp');
  pressKey('ArrowUp');
  pressKey('ArrowDown');
  pressKey('ArrowDown');
  pressKey('f');
  pressKey('f');
  pressKey('t');
  TestRunner.completeTest();
})();
