<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p>This test verifies that the Home/End/PageUp/PageDown keys work correctly for &lt;select&gt; elements.
Since it requires <CODE>eventSender.keyDown</CODE>, it will not run solo in the web browser; it must be run with <KBD>run-webkit-tests</KBD>.</p>
<hr>
<form>
     <!-- We specify a size of 3 but will end up rendering with 4 because webkit imposes a minimum size of 4.
     It is important to make sure the code handles this case  -->
    <select name="singleselect" id="ss" size="3" multiple="true">
        <option value="0">0 </option>
        <option value="1">1 </option>
        <option value="2">2 </option>
        <option value="3">3 </option>
        <option value="4">4 </option>
        <option value="5">5 </option>
        <option value="6">6 </option>
    </select>
    <select name="singleselectwithdisabled" id="ssd" size="4" multiple="false">
        <option value="0" disabled="true">0 </option>
        <option value="1">1 </option>
        <option value="2">2 </option>
        <option value="3" disabled="true">3 </option>
        <option value="4">4 </option>
        <option value="5">5 </option>
        <option value="6">6 </option>
        <option value="7" disabled = "true">7 </option>
    </select>
    <select name="singleselectwithgroup" id="ssg" size="4" multiple="false">
        <optgroup label="gp0">
            <option value="0">0 </option>
            <option value="1">1 </option>
            <option value="2">2 </option>
        </optgroup>
        <optgroup label="gp1">
            <option value="3">3 </option>
        </optgroup>
        <option value="4">4 </option>
        <optgroup label="gp2">
            <option value="5">5 </option>
        </optgroup>
        <option value="6">6 </option>
    </select>
</form>

<p id="description"></p>
<div id="console"></div>
<div id="log"></div>

<script>

function log(message) {
    document.getElementById('log').appendChild(document.createTextNode(message + "\n"));
}

function sendKeyAndExpectIndex(selectId, key, initialIndex, expectedIndex) {
    var select = document.getElementById(selectId);
    clearSelection(select);
    select.focus();
    select.selectedIndex = initialIndex;
    if (select.selectedIndex != initialIndex) {
        log("can't set selectedIndex to " + initialIndex + ' (is ' + select.selectedIndex + ')');
        return false;
    }
    if (window.testRunner)
        eventSender.keyDown(key);
    if (select.selectedIndex != expectedIndex) {
        log('selectedIndex should be ' + expectedIndex + ' (is ' + select.selectedIndex + ') after a ' + key + ' from index ' + initialIndex);
        return false;
    }
    return true;
}

function equalArrays(a1, a2) {
    if (a1.length != a2.length)
        return false;
    for (i = 0; i < a1.length; i++) {
        if (a1[i] != a2[i])
            return false;
    }
    return true;
}

function dumpArray(a) {
    s = "[";
    for (i = 0; i < a.length; i++) {
        s = s + a[i];
        if (i < a.length - 1)
             s = s + ", ";
    }
    return s + "]";
}

function getSelectedIndices(select) {
    nowSelected = [];
    for (i = 0; i < select.options.length; i++)
        if (select.options[i].selected)
              nowSelected.push(i);
    return nowSelected;
}

function clearSelection(select) {
    for (i = 0; i < select.options.length; i++)
        select.options[i].selected = false;
}

// expectedIndices should be in sorted order
function sendWithShiftKeyAndExpectIndices(selectId, key, expectedIndices) {
    var select = document.getElementById(selectId);
    select.focus();
    if (window.testRunner)
        eventSender.keyDown(key, ["shiftKey"]);
    nowSelected = getSelectedIndices(select);
    if (!equalArrays(nowSelected, expectedIndices)) {
        log('selected indices should be ' + dumpArray(expectedIndices) + ' (is ' +
            dumpArray(nowSelected) + ') after a ' + key);
        return false;
    }
    return true;
}

function testPageDownNoDisabledElements() {
    shouldBe('sendKeyAndExpectIndex("ss", "pageDown", 0, 3)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "pageDown", 1, 4)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "pageDown", 2, 5)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "pageDown", 3, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "pageDown", 4, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "pageDown", 5, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "pageDown", 6, 6)', 'true');
}

function testPageUpNoDisabledElements() {
    shouldBe('sendKeyAndExpectIndex("ss", "pageUp", 6, 3)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "pageUp", 5, 2)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "pageUp", 4, 1)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "pageUp", 3, 0)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "pageUp", 2, 0)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "pageUp", 1, 0)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "pageUp", 0, 0)', 'true');
}

function testHomeNoDisabledElements() {
    shouldBe('sendKeyAndExpectIndex("ss", "home", 6, 0)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "home", 5, 0)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "home", 4, 0)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "home", 3, 0)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "home", 2, 0)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "home", 1, 0)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "home", 0, 0)', 'true');
}

function testEndNoDisabledElements() {
    shouldBe('sendKeyAndExpectIndex("ss", "end", 6, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "end", 5, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "end", 4, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "end", 3, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "end", 2, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "end", 1, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ss", "end", 0, 6)', 'true');
}

function testPageDownWithDisabledElements() {
    shouldBe('sendKeyAndExpectIndex("ssd", "pageDown", 0, 4)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "pageDown", 1, 4)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "pageDown", 2, 5)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "pageDown", 4, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "pageDown", 5, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "pageDown", 6, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "pageDown", 7, 6)', 'true');
}

function testPageUpWithDisabledElements() {
    shouldBe('sendKeyAndExpectIndex("ssd", "pageUp", 7, 4)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "pageUp", 6, 2)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "pageUp", 5, 2)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "pageUp", 4, 1)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "pageUp", 2, 1)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "pageUp", 1, 1)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "pageUp", 0, 1)', 'true');
}

function testHomeWithDisabledElements() {
    shouldBe('sendKeyAndExpectIndex("ssd", "home", 7, 1)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "home", 6, 1)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "home", 5, 1)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "home", 4, 1)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "home", 3, 1)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "home", 2, 1)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "home", 1, 1)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "home", 0, 1)', 'true');
}

function testEndWithDisabledElements() {
    shouldBe('sendKeyAndExpectIndex("ssd", "end", 7, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "end", 6, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "end", 5, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "end", 4, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "end", 3, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "end", 2, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "end", 1, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssd", "end", 0, 6)', 'true');
}

function testVariousShiftKeysNoDisabledElements() {
    var select = document.getElementById("ss");
    select.focus();
    clearSelection(select);
    select.selectedIndex = 0;

    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "pageDown", [0, 1, 2, 3])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "pageDown", [0, 1, 2, 3, 4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "pageDown", [0, 1, 2, 3, 4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "pageUp", [0, 1, 2, 3])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "pageUp", [0])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "pageUp", [0])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "end", [0, 1, 2, 3, 4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "end", [0, 1, 2, 3, 4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "home", [0])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "home", [0])', 'true');

    clearSelection(select);
    select.selectedIndex = 3;
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "pageDown", [3, 4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "pageDown", [3, 4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "pageUp", [3])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "pageUp", [0, 1, 2, 3])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "pageUp", [0, 1, 2, 3])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "pageUp", [0, 1, 2, 3])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "end", [3, 4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "end", [3, 4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "home", [0, 1, 2, 3])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ss", "home", [0, 1, 2, 3])', 'true');
}

function testVariousShiftKeysWithDisabledElements() {
    var select = document.getElementById('ssd');
    select.focus();
    clearSelection(select);
    select.selectedIndex = 1;

    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "pageDown", [1, 2, 4])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "pageDown", [1, 2, 4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "pageDown", [1, 2, 4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "pageUp", [1, 2])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "pageUp", [1])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "pageUp", [1])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "end", [1, 2, 4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "end", [1, 2, 4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "home", [1])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "home", [1])', 'true');

    clearSelection(select);
    select.selectedIndex = 4;
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "pageDown", [4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "pageDown", [4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "pageUp", [2, 4])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "pageUp", [1, 2, 4])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "pageUp", [1, 2, 4])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "end", [4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "end", [4, 5, 6])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "home", [1, 2, 4])', 'true');
    shouldBe('sendWithShiftKeyAndExpectIndices("ssd", "home", [1, 2, 4])', 'true');
}

function testPageDownWithGroup() {
    shouldBe('sendKeyAndExpectIndex("ssg", "pageDown", 0, 3)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssg", "pageDown", 1, 3)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssg", "pageDown", 2, 4)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssg", "pageDown", 3, 5)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssg", "pageDown", 4, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssg", "pageDown", 5, 6)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssg", "pageDown", 6, 6)', 'true');
}

function testPageUpWithGroup() {
    shouldBe('sendKeyAndExpectIndex("ssg", "pageUp", 6, 4)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssg", "pageUp", 5, 3)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssg", "pageUp", 4, 2)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssg", "pageUp", 3, 1)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssg", "pageUp", 2, 0)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssg", "pageUp", 1, 0)', 'true');
    shouldBe('sendKeyAndExpectIndex("ssg", "pageUp", 0, 0)', 'true');
}

testPageDownNoDisabledElements();
testPageUpNoDisabledElements();
testHomeNoDisabledElements();
testEndNoDisabledElements();
testPageDownWithDisabledElements();
testPageUpWithDisabledElements();
testHomeWithDisabledElements();
testEndWithDisabledElements();
testVariousShiftKeysNoDisabledElements();
testVariousShiftKeysWithDisabledElements();
testPageDownWithGroup();
testPageUpWithGroup();
</script>

<script src="../../resources/js-test-post.js"></script> 
</body>
</html>
