chromium/third_party/blink/web_tests/fast/forms/select/select-multiple-elements-with-mouse-drag-with-options-less-than-size.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="../../../resources/js-test.js"></script>
<title></title>
</head>
<body>
<p>Select multiple options with mouse drag with no. of options less than the size attribute</p>
<p>Also test mouse drag on select element without multiple attribute select only the option under mouse</p>

<select multiple="multiple" size="7" id="selectId">
    <option value="P1">P1</option>
    <option value="P2">P2</option>
    <option value="P3">P3</option>
    <option value="P4">P4</option>
    <option value="P5">P5</option>
</select>

<select size="7" id="nonmultiple">
    <option value="P1">P1</option>
    <option value="P2">P2</option>
    <option value="P3">P3</option>
    <option value="P4">P4</option>
    <option value="P5">P5</option>
</select>

<div id="console"></div>
<script>
if (window.eventSender) {
    debug("Test for select element with multiple attribute");
    var selectObject = document.getElementById("selectId");

    var optionHeight =  selectObject.offsetHeight / selectObject.size;
    var x = selectObject.offsetLeft + selectObject.offsetWidth / 2;
    var y = selectObject.offsetTop + optionHeight / 2;

    eventSender.dragMode = false;
    eventSender.mouseMoveTo(x, y);

    debug("Dragging down");
    eventSender.mouseDown();
    eventSender.mouseMoveTo(x, y + (optionHeight * 3));
    eventSender.mouseUp();
    testOptionSelection(0, 4, "true", "selectId");

    debug("Dragging up");
    eventSender.mouseDown();
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseUp();
    testOptionSelection(0, 4, "true", "selectId");

    debug("Dragging with addSelectionKey")
    eventSender.mouseDown();
    eventSender.mouseUp();
    eventSender.mouseMoveTo(x, y + (optionHeight * 2));
    eventSender.mouseDown(0, ["addSelectionKey"]);
    eventSender.mouseMoveTo(x, y + (optionHeight * 4));
    eventSender.mouseUp(0, ["addSelectionKey"]);
    testOptionSelection(0, 1, "true", "selectId");
    testOptionSelection(2, 5, "true", "selectId");

    debug("Dragging with rangeSelectionKey");
    eventSender.mouseDown();
    eventSender.mouseUp();
    eventSender.mouseMoveTo(x, y + (optionHeight * 2));
    eventSender.mouseDown(0, ["rangeSelectionKey"]);
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseUp(0, ["rangeSelectionKey"]);
    testOptionSelection(0, 4, "true", "selectId");

    debug("Test for select element without multiple attribute");
    var nonMultipleObject = document.getElementById("nonmultiple");
    var optionHeight =  nonMultipleObject.offsetHeight / nonMultipleObject.size;
    x = nonMultipleObject.offsetLeft + nonMultipleObject.offsetWidth / 2;
    y = nonMultipleObject.offsetTop + optionHeight / 2;

    eventSender.dragMode = false;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseDown();

    debug("Dragging down");
    eventSender.mouseDown();
    eventSender.mouseMoveTo(x, y + (optionHeight * 3));
    eventSender.mouseUp();
    testOptionSelection(0, 3, "false", "nonmultiple");
    testOptionSelection(3, 4, "true", "nonmultiple");

    debug("Dragging up");
    eventSender.mouseDown();
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseUp();
    testOptionSelection(0, 1, "true", "nonmultiple");
    testOptionSelection(1, 4, "false", "nonmultiple");

    debug("Dragging with addSelectionKey")
    eventSender.mouseDown();
    eventSender.mouseDown(0, "addSelectionKey");
    eventSender.mouseMoveTo(x, y + (optionHeight * 3));
    eventSender.mouseUp(0, "addSelectionKey");
    testOptionSelection(0, 3, "false", "nonmultiple");
    testOptionSelection(3, 4, "true", "nonmultiple");

    debug("Dragging with rangeSelectionKey");
    eventSender.mouseDown();
    eventSender.mouseDown(0, "rangeSelectionKey");
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseUp(0, "rangeSelectionKey");
    testOptionSelection(0, 1, "true", "nonmultiple");
    testOptionSelection(1, 4, "false", "nonmultiple");

} else {
    debug("Test manually if options are getting selected by dragging on the select element.");
}

function testOptionSelection(start, end, criteria, element) {
    for (var i = start; i < end; i++) {
        shouldBe("document.getElementById(\"" + element + "\").options[" + i + "].selected", criteria);
    }
}

successfullyParsed = true;
</script>
</body>
</html>