<html>
<script src="../../resources/js-test-pre.js"></script>
<script>
function getCenterFor(element)
{
  var rect = element.getBoundingClientRect();
  return { x : parseInt((rect.left + rect.right) / 2) , y : parseInt((rect.top + rect.bottom) / 2)};
}

function runTest()
{
  if (!window.testRunner)
    return;
  if (!window.eventSender)
    return;

  testRunner.dumpAsText();
  center = getCenterFor(document.getElementById("emptyselect"));
  eventSender.mouseMoveTo(center.x, center.y);
  eventSender.mouseDown();
  eventSender.mouseUp();
  eventSender.keyDown("downArrow");
}

</script>
<style>
</style>
<body onload="runTest();">
<select multiple id="emptyselect"></select>
This should not crash
</body>
</html>

