blob: 8009e76b2808c267d30c5e646aa15be2031579cd [file]
<!DOCTYPE html>
<html>
<body>
<script>
function testMenuShowAndHideEvents() {
var menu = document.createElement('div');
cr.ui.decorate(menu, cr.ui.Menu);
document.body.appendChild(menu);
var menuButton = document.createElement('div');
cr.ui.decorate(menuButton, cr.ui.MenuButton);
menuButton.menu = menu;
document.body.appendChild(menuButton);
var events = [];
menuButton.addEventListener('menushow', function(e) { events.push(e); });
menuButton.addEventListener('menuhide', function(e) { events.push(e); });
// Click to show menu.
menuButton.dispatchEvent(new MouseEvent('mousedown'));
assertEquals(1, events.length);
assertEquals('menushow', events[0].type);
assertEquals(true, events[0].bubbles);
assertEquals(true, events[0].cancelable);
assertEquals(window, events[0].view);
// Click to hide menu by clicking the button.
menuButton.dispatchEvent(new MouseEvent('mousedown'));
assertEquals(2, events.length);
assertEquals('menuhide', events[1].type);
assertEquals(true, events[1].bubbles);
assertEquals(false, events[1].cancelable);
assertEquals(window, events[1].view);
// The button must not appear highlighted.
assertTrue(menuButton.classList.contains('using-mouse'));
// Click to show menu and hide by clicking the outside of the button.
menuButton.dispatchEvent(new MouseEvent('mousedown'));
assertEquals(3, events.length);
assertEquals('menushow', events[2].type);
document.dispatchEvent(new MouseEvent('mousedown'));
assertEquals(4, events.length);
assertEquals('menuhide', events[3].type);
// Emulate losing focus after clicking outside of the button.
menuButton.dispatchEvent(new Event('blur'));
// Focus highlight should not be suppressed anymore.
assertFalse(menuButton.classList.contains('using-mouse'));
}
function testFocusMoves() {
var menu = document.createElement('div');
var otherButton = document.createElement('button');
cr.ui.decorate(menu, cr.ui.Menu);
menu.addMenuItem({});
document.body.appendChild(menu);
document.body.appendChild(otherButton);
var menuButton = document.createElement('div');
cr.ui.decorate(menuButton, cr.ui.MenuButton);
// Allow to put focus on the menu button by focus().
menuButton.tabIndex = 1;
menuButton.menu = menu;
document.body.appendChild(menuButton);
// Case 1: Close by mouse click outside the menu.
otherButton.focus();
// Click to show menu.
menuButton.dispatchEvent(new MouseEvent('mousedown'));
assertTrue(menuButton.isMenuShown());
// Click again to hide menu by clicking the button.
menuButton.dispatchEvent(new MouseEvent('mousedown'));
assertFalse(menuButton.isMenuShown());
// Focus should be kept on the original place.
assertEquals(otherButton, document.activeElement);
// Case 2: Activate menu item with mouse.
menuButton.dispatchEvent(new MouseEvent('mousedown'));
assertTrue(menuButton.isMenuShown());
// Emulate choosing a menu item by mouse click.
var menuItem = menu.menuItems[0];
menuItem.selected = true;
menuItem.dispatchEvent(new MouseEvent('mouseup', {buttons: 1}));
assertFalse(menuButton.isMenuShown());
// Focus should be kept on the original place.
assertEquals(otherButton, document.activeElement);
// Case 3: Open menu and activate by keyboard.
menuButton.focus();
assertEquals(menuButton, document.activeElement);
// Open menu
menuButton.dispatchEvent(new KeyboardEvent('keydown', {key: 'Enter'}));
assertTrue(menuButton.isMenuShown(), 'menu opened');
// Select an item and activate
menu.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowDown'}));
menu.dispatchEvent(new KeyboardEvent('keydown', {key: 'Enter'}));
assertFalse(menuButton.isMenuShown(), 'menu closed');
// Focus should be still on the menu button.
assertEquals(menuButton, document.activeElement);
}
</script>
</body>
</html>