select-optgroup-arrow-keys.optional.html (2299B)
1 <!DOCTYPE html> 2 <link rel=author href="mailto:jarhar@chromium.org"> 3 <link rel=help href="https://issues.chromium.org/issues/417119055"> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src="/resources/testdriver.js"></script> 7 <script src="/resources/testdriver-vendor.js"></script> 8 <script src="/resources/testdriver-actions.js"></script> 9 10 <!-- This test is optional because the HTML spec does not require that specific 11 behaviors are mapped to specific keyboard buttons. --> 12 13 <style> 14 select, ::picker(select) { 15 appearance: base-select; 16 } 17 </style> 18 19 <select> 20 <optgroup label=group1> 21 <option class=one>one</option> 22 <option class=two>two</option> 23 </optgroup> 24 <optgroup label=group2> 25 <option class=three>three</option> 26 <option class=four>four</option> 27 </optgroup> 28 <optgroup label=group3> 29 <option class=five>five</option> 30 <option class=six>six</option> 31 </optgroup> 32 </select> 33 34 <script> 35 const ArrowUp = '\uE013'; 36 const ArrowDown = '\uE015'; 37 const Space = ' '; 38 39 function sendKey(key) { 40 return (new test_driver.Actions() 41 .keyDown(key) 42 .keyUp(key)) 43 .send(); 44 } 45 46 promise_test(async () => { 47 const select = document.querySelector('select'); 48 const options = [ 49 document.querySelector('.one'), 50 document.querySelector('.two'), 51 document.querySelector('.three'), 52 document.querySelector('.four'), 53 document.querySelector('.five'), 54 document.querySelector('.six') 55 ]; 56 57 assert_equals(getComputedStyle(select).appearance, 'base-select', 58 'appearance:base-select must be supported to run this test.'); 59 60 select.focus(); 61 await sendKey(Space); 62 assert_true(select.matches(':open'), 63 'Space should open picker.'); 64 assert_equals(document.activeElement, options[0], 65 'First option should be initially focused.'); 66 67 for (let i = 1; i < 6; i++) { 68 await sendKey(ArrowDown); 69 assert_equals(document.activeElement, options[i], 70 `Option ${i} should be focused after ArrowDown.`); 71 } 72 73 for (let i = 4; i > -1; i--) { 74 await sendKey(ArrowUp); 75 assert_equals(document.activeElement, options[i], 76 `Option ${i} should be focused after ArrowUp.`); 77 } 78 }, 'Keyboard navigation forwards and backwards should visit each option with optgroups.'); 79 </script>