blob: e254188d5b4840f0471cd981b911db61d4adec14 [file] [log] [blame]
<!DOCTYPE html>
<style>
#menu_entry:hover,
.items:hover,
button:hover {
background-color: #CCC;
}
#menu_entry {
width: 80px;
cursor: pointer;
}
#menu_list {
visibility: hidden;
width: 80px;
border: 1px #CCC solid;
}
.items {
cursor: pointer;
}
</style>
<button id="btn1">Button 1</button>
<div id="menu_container">
<div id='menu_entry'>Menu 1</div>
<div id='menu_list'>
<div id='first_item' class='items'>item 1</div>
<div id='second_item' class='items'>item 2</div>
<div id='third_item' class='items'>item 3</div>
</div>
</div>
<button id="btn2">Button 2</button>
<p>An element focused via SpatNav followed by focus() should be hovered.</p>
<script src='../../resources/testharness.js'></script>
<script src='../../resources/testharnessreport.js'></script>
<script src='resources/snav-testharness.js'></script>
<script>
const menu_entry = document.querySelector('#menu_entry');
const menu_list = document.querySelector('#menu_list');
const first_item = document.querySelector('#first_item');
const btn1 = document.querySelector('#btn1');
// In general sites, authors use focus event handler due to a11y requirements.
menu_entry.addEventListener('focus', () => {
// When users press up key on a topmost item, menu_entry should get focus.
if (event.relatedTarget && event.relatedTarget.className === 'items') {
menu_list.style.visibility = 'hidden';
btn1.focus();
return;
}
// Once menu_entry gets focus, menu_list shows up and an item gets focus.
menu_list.style.visibility = 'visible';
document.querySelectorAll('.items')[0].focus();
});
menu_container.addEventListener('mouseover', () => {
menu_list.style.visibility = 'visible';
});
menu_container.addEventListener('mouseleave', () => {
menu_list.style.visibility = 'hidden';
});
// SpatNav Test
snav.assertSnavEnabledAndTestable();
test(() => {
// Move focus to first_item
snav.triggerMove('Down');
snav.triggerMove('Down');
assert_equals(document.activeElement, first_item, 'first_item gets focus.');
assert_equals(menu_list.style.visibility, 'visible', 'menu_list shows up.');
assert_true(first_item.matches(':hover'), 'first_item should be hovered.');
// Move focus to menu_entry
snav.triggerMove('Down');
snav.triggerMove('Up');
snav.triggerMove('Up');
assert_equals(document.activeElement, btn1, 'button1 gets focus.');
assert_equals(menu_list.style.visibility, 'hidden', 'menu_list disappears.');
assert_true(btn1.matches(':hover'), 'button1 should be hovered.');
}, 'Focused and hovered elements should be indentical.');
</script>
<p><em>Manual test instruction: Ensure that focused(focus indicator) and
hovered(gray background) element should be identical.</em></p>