bool AccessibilityMenuList::press() const { RenderMenuList* menuList = toRenderMenuList(m_renderer); if (menuList->popupIsVisible()) menuList->hidePopup(); else menuList->showPopup(); return true; }
bool AccessibilityMenuList::press() { #if !PLATFORM(IOS) RenderMenuList* menuList = static_cast<RenderMenuList*>(m_renderer); if (menuList->popupIsVisible()) menuList->hidePopup(); else menuList->showPopup(); return true; #else return false; #endif }
void HTMLSelectElement::menuListDefaultEventHandler(Event* evt) { RenderMenuList* menuList = static_cast<RenderMenuList*>(renderer()); if (evt->type() == eventNames().keydownEvent) { if (!renderer() || !evt->isKeyboardEvent()) return; String keyIdentifier = static_cast<KeyboardEvent*>(evt)->keyIdentifier(); bool handled = false; #if ARROW_KEYS_POP_MENU if (keyIdentifier == "Down" || keyIdentifier == "Up") { focus(); // Save the selection so it can be compared to the new selection when we call onChange during setSelectedIndex, // which gets called from RenderMenuList::valueChanged, which gets called after the user makes a selection from the menu. saveLastSelection(); menuList->showPopup(); handled = true; } #else int listIndex = optionToListIndex(selectedIndex()); if (keyIdentifier == "Down" || keyIdentifier == "Right") { int size = listItems().size(); for (listIndex += 1; listIndex >= 0 && listIndex < size && (listItems()[listIndex]->disabled() || !listItems()[listIndex]->hasTagName(optionTag)); ++listIndex) { } if (listIndex >= 0 && listIndex < size) setSelectedIndex(listToOptionIndex(listIndex)); handled = true; } else if (keyIdentifier == "Up" || keyIdentifier == "Left") { int size = listItems().size(); for (listIndex -= 1; listIndex >= 0 && listIndex < size && (listItems()[listIndex]->disabled() || !listItems()[listIndex]->hasTagName(optionTag)); --listIndex) { } if (listIndex >= 0 && listIndex < size) setSelectedIndex(listToOptionIndex(listIndex)); handled = true; } #endif if (handled) evt->setDefaultHandled(); } // Use key press event here since sending simulated mouse events // on key down blocks the proper sending of the key press event. if (evt->type() == eventNames().keypressEvent) { if (!renderer() || !evt->isKeyboardEvent()) return; int keyCode = static_cast<KeyboardEvent*>(evt)->keyCode(); bool handled = false; #if ARROW_KEYS_POP_MENU if (keyCode == ' ') { focus(); // Save the selection so it can be compared to the new selection when we call onChange during setSelectedIndex, // which gets called from RenderMenuList::valueChanged, which gets called after the user makes a selection from the menu. saveLastSelection(); menuList->showPopup(); handled = true; } if (keyCode == '\r') { menuListOnChange(); if (form()) form()->submitClick(evt); handled = true; } #else int listIndex = optionToListIndex(selectedIndex()); if (keyCode == '\r') { // listIndex should already be selected, but this will fire the onchange handler. setSelectedIndex(listToOptionIndex(listIndex), true, true); handled = true; } #endif if (handled) evt->setDefaultHandled(); } if (evt->type() == eventNames().mousedownEvent && evt->isMouseEvent() && static_cast<MouseEvent*>(evt)->button() == LeftButton) { focus(); if (menuList->popupIsVisible()) menuList->hidePopup(); else { // Save the selection so it can be compared to the new selection when we call onChange during setSelectedIndex, // which gets called from RenderMenuList::valueChanged, which gets called after the user makes a selection from the menu. saveLastSelection(); menuList->showPopup(); } evt->setDefaultHandled(); } }