<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test.js"></script>
<script src="../resources/common.js"></script>
<script src="../resources/picker-common.js"></script>
</head>
<body>
<select id="menu">
  <option>foo</option>
  <option selected>bar</option>
  <option hidden>baz</option>
  <optgroup label="qux">
      <option>garply</option>
  </optgroup>
</select>
<script>
var menu = document.getElementById('menu');
var picker = null;
function openPickerErrorCallback() {
    testFailed('picker didn\'t open')
    finishJSTest();
}
openPicker(menu, test1, openPickerErrorCallback);

function test1() {
    picker = window.internals.pagePopupWindow.global.picker;
    shouldBeEqualToString('picker._selectElement.value', '1');
    shouldBeEqualToString('menu.value', 'bar');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'bar');

    eventSender.keyDown('downArrow');
    shouldBeEqualToString('picker._selectElement.value', '4');
    shouldBeEqualToString('menu.value', 'bar');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'garply');

    eventSender.keyDown('downArrow');
    shouldBeEqualToString('picker._selectElement.value', '4');
    shouldBeEqualToString('menu.value', 'bar');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'garply');

    eventSender.keyDown('upArrow');
    shouldBeEqualToString('picker._selectElement.value', '1');
    shouldBeEqualToString('menu.value', 'bar');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'bar');

    eventSender.keyDown('upArrow');
    shouldBeEqualToString('picker._selectElement.value', '0');
    shouldBeEqualToString('menu.value', 'bar');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'foo');

    eventSender.keyDown('upArrow');
    shouldBeEqualToString('picker._selectElement.value', '0');
    shouldBeEqualToString('menu.value', 'bar');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'foo');

    eventSender.keyDown('\n');
    shouldBeNull('window.internals.pagePopupWindow');
    shouldBeEqualToString('menu.value', 'foo');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'foo');

    waitUntilClosing(function() {
        openPicker(menu, test2, openPickerErrorCallback);
    });
}

function test2() {
    picker = window.internals.pagePopupWindow.global.picker;
    shouldBeEqualToString('picker._selectElement.value', '0');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'foo');

    eventSender.keyDown('downArrow');
    shouldBeEqualToString('picker._selectElement.value', '1');
    shouldBeEqualToString('menu.value', 'foo');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'bar');

    // Escape should close the popup and select that keyboard selected item.
    eventSender.keyDown('escape');
    shouldBeNull('window.internals.pagePopupWindow');
    shouldBeEqualToString('menu.value', 'bar');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'bar');

    waitUntilClosing(function() {
        openPicker(menu, test3, openPickerErrorCallback);
    });
}

function test3() {
    picker = window.internals.pagePopupWindow.global.picker;
    shouldBeEqualToString('picker._selectElement.value', '1');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'bar');

    eventSender.keyDown('g');
    shouldBeEqualToString('picker._selectElement.value', '4');
    shouldBeEqualToString('menu.value', 'bar');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'garply');

    // Escape should close the popup and select that keyboard selected item.
    eventSender.keyDown('escape');
    shouldBeNull('window.internals.pagePopupWindow');
    shouldBeEqualToString('menu.value', 'garply');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'garply');

    waitUntilClosing(function() {
        openPicker(menu, test4, openPickerErrorCallback);
    });
}

function test4() {
    picker = window.internals.pagePopupWindow.global.picker;
    shouldBeEqualToString('picker._selectElement.value', '4');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'garply');

    hoverOverElement(picker._selectElement.children[0]);
    shouldBeEqualToString('picker._selectElement.value', '0');
    shouldBeEqualToString('menu.value', 'garply');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'garply');

    // Escape should close the popup. Simply hovering over an item should not select it.
    eventSender.keyDown('escape');
    shouldBeNull('window.internals.pagePopupWindow');
    shouldBeEqualToString('menu.value', 'garply');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'garply');

    waitUntilClosing(function() {
        openPicker(menu, test5, openPickerErrorCallback);
    });
}

function test5() {
    picker = window.internals.pagePopupWindow.global.picker;
    shouldBeEqualToString('picker._selectElement.value', '4');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'garply');

    hoverOverElement(picker._selectElement.children[0]);
    shouldBeEqualToString('picker._selectElement.value', '0');
    shouldBeEqualToString('menu.value', 'garply');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'garply');

    // leftArrow doesn't change the selection in the popup. So,
    // selectMenuListText won't change.
    eventSender.keyDown('leftArrow');
    shouldBeEqualToString('picker._selectElement.value', '0');
    shouldBeEqualToString('menu.value', 'garply');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'garply');

    eventSender.keyDown('escape');
    shouldBeNull('window.internals.pagePopupWindow');
    shouldBeEqualToString('menu.value', 'garply');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'garply');
    menu.selectedIndex = 0;

    waitUntilClosing(function() {
        openPicker(menu, test6, openPickerErrorCallback);
    });
}

function test6() {
    picker = window.internals.pagePopupWindow.global.picker;
    shouldBeEqualToString('picker._selectElement.value', '0');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'foo');

    eventSender.keyDown('downArrow');
    shouldBeEqualToString('picker._selectElement.value', '1');
    shouldBeEqualToString('menu.value', 'foo');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'bar');

    clickElement(picker._selectElement.children[0]);
    shouldBeNull('window.internals.pagePopupWindow');
    shouldBeEqualToString('menu.value', 'foo');
    shouldBeEqualToString('internals.selectMenuListText(menu)', 'foo');

    finishJSTest();
}
</script>
</body>
</html>