summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/dom/SelectElement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/dom/SelectElement.cpp')
-rw-r--r--Source/WebCore/dom/SelectElement.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/Source/WebCore/dom/SelectElement.cpp b/Source/WebCore/dom/SelectElement.cpp
index a4da0ae..15c69ad 100644
--- a/Source/WebCore/dom/SelectElement.cpp
+++ b/Source/WebCore/dom/SelectElement.cpp
@@ -787,18 +787,24 @@ void SelectElement::listBoxDefaultEventHandler(SelectElementData& data, Element*
ASSERT_UNUSED(listItems, !listItems.size() || (endIndex >= 0 && (unsigned) endIndex < listItems.size()));
setActiveSelectionEndIndex(data, endIndex);
+ bool selectNewItem = !data.multiple() || static_cast<KeyboardEvent*>(event)->shiftKey() || !isSpatialNavigationEnabled(element->document()->frame());
+ if (selectNewItem)
+ data.setActiveSelectionState(true);
// If the anchor is unitialized, or if we're going to deselect all other options, then set the anchor index equal to the end index.
- bool deselectOthers = !data.multiple() || !static_cast<KeyboardEvent*>(event)->shiftKey();
+ bool deselectOthers = !data.multiple() || (!static_cast<KeyboardEvent*>(event)->shiftKey() && selectNewItem);
if (data.activeSelectionAnchorIndex() < 0 || deselectOthers) {
- data.setActiveSelectionState(true);
if (deselectOthers)
deselectItems(data, element);
setActiveSelectionAnchorIndex(data, element, data.activeSelectionEndIndex());
}
toRenderListBox(element->renderer())->scrollToRevealElementAtListIndex(endIndex);
- updateListBoxSelection(data, element, deselectOthers);
- listBoxOnChange(data, element);
+ if (selectNewItem) {
+ updateListBoxSelection(data, element, deselectOthers);
+ listBoxOnChange(data, element);
+ } else
+ scrollToSelection(data, element);
+
event->setDefaultHandled();
}
} else if (event->type() == eventNames().keypressEvent) {
@@ -810,7 +816,12 @@ void SelectElement::listBoxDefaultEventHandler(SelectElementData& data, Element*
if (htmlForm)
htmlForm->submitImplicitly(event, false);
event->setDefaultHandled();
- return;
+ } else if (data.multiple() && keyCode == ' ' && isSpatialNavigationEnabled(element->document()->frame())) {
+ // Use space to toggle selection change.
+ data.setActiveSelectionState(!data.activeSelectionState());
+ updateSelectedState(data, element, listToOptionIndex(data, element, data.activeSelectionEndIndex()), true /*multi*/, false /*shift*/);
+ listBoxOnChange(data, element);
+ event->setDefaultHandled();
}
}
}