Source/WebCore/ChangeLog

 12011-02-07 Chang Shu <chang.shu@nokia.com>
 2
 3 Reviewed by NOBODY (OOPS!).
 4
 5 When spatial navigation is enabled, use space key to toggle select
 6 items. And the up and down keys should not affect selection but just
 7 navigate through items, which is indicated visually by a focus ring.
 8 https://bugs.webkit.org/show_bug.cgi?id=49261
 9
 10 * dom/SelectElement.cpp:
 11 (WebCore::SelectElement::listBoxDefaultEventHandler):
 12 * rendering/RenderListBox.cpp:
 13 (WebCore::RenderListBox::addFocusRingRects):
 14 * rendering/RenderListBox.h:
 15
1162011-02-07 Darin Adler <darin@apple.com>
217
318 Turn UTF-8 decoder off for now so we can look into failing tests
77832

Source/WebCore/dom/SelectElement.cpp

@@void SelectElement::listBoxDefaultEventH
787787 ASSERT_UNUSED(listItems, !listItems.size() || (endIndex >= 0 && (unsigned) endIndex < listItems.size()));
788788 setActiveSelectionEndIndex(data, endIndex);
789789
 790 bool selectNewItem = !isSpatialNavigationEnabled(element->document()->frame());
790791 // 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.
791  bool deselectOthers = !data.multiple() || !static_cast<KeyboardEvent*>(event)->shiftKey();
 792 bool deselectOthers = !data.multiple() || (!static_cast<KeyboardEvent*>(event)->shiftKey() && selectNewItem);
792793 if (data.activeSelectionAnchorIndex() < 0 || deselectOthers) {
793  data.setActiveSelectionState(true);
 794 if (selectNewItem)
 795 data.setActiveSelectionState(true);
794796 if (deselectOthers)
795797 deselectItems(data, element);
796798 setActiveSelectionAnchorIndex(data, element, data.activeSelectionEndIndex());
797799 }
798800
799801 toRenderListBox(element->renderer())->scrollToRevealElementAtListIndex(endIndex);
800  updateListBoxSelection(data, element, deselectOthers);
801  listBoxOnChange(data, element);
 802 if (selectNewItem) {
 803 updateListBoxSelection(data, element, deselectOthers);
 804 listBoxOnChange(data, element);
 805 } else
 806 scrollToSelection(data, element);
 807
802808 event->setDefaultHandled();
803809 }
804810 } else if (event->type() == eventNames().keypressEvent) {

@@void SelectElement::listBoxDefaultEventH
810816 if (htmlForm)
811817 htmlForm->submitImplicitly(event, false);
812818 event->setDefaultHandled();
813  return;
 819 } else if (keyCode == ' ' && isSpatialNavigationEnabled(element->document()->frame())) {
 820 // Use space to toggle selection change.
 821 data.setActiveSelectionState(!data.activeSelectionState());
 822 updateSelectedState(data, element, listToOptionIndex(data, element, data.activeSelectionEndIndex()), true, false);
 823 listBoxOnChange(data, element);
 824 event->setDefaultHandled();
814825 }
815826 }
816827}
77831

Source/WebCore/rendering/RenderListBox.cpp

@@void RenderListBox::paintObject(PaintInf
276276 }
277277}
278278
 279void RenderListBox::addFocusRingRects(Vector<IntRect>& rects, int tx, int ty)
 280{
 281 SelectElement* select = toSelectElement(static_cast<Element*>(node()));
 282
 283 // Focus the last selected item.
 284 int selectedItem = select->activeSelectionEndListIndex();
 285 if (selectedItem >= 0) {
 286 rects.append(itemBoundingBoxRect(tx, ty, selectedItem));
 287 return;
 288 }
 289
 290 // No selected items, find the first non-disabled item.
 291 int size = numItems();
 292 const Vector<Element*>& listItems = select->listItems();
 293 for (int i = 0; i < size; ++i) {
 294 OptionElement* optionElement = toOptionElement(listItems[i]);
 295 if (optionElement && !optionElement->disabled()) {
 296 rects.append(itemBoundingBoxRect(tx, ty, i));
 297 return;
 298 }
 299 }
 300}
 301
279302void RenderListBox::paintScrollbar(PaintInfo& paintInfo, int tx, int ty)
280303{
281304 if (m_vBar) {
77831

Source/WebCore/rendering/RenderListBox.h

@@private:
7777
7878 virtual void layout();
7979
 80 virtual void addFocusRingRects(Vector<IntRect>&, int tx, int ty);
 81
8082 virtual bool canBeProgramaticallyScrolled(bool) const { return true; }
8183 virtual void autoscroll();
8284 virtual void stopAutoscroll();
77831

LayoutTests/ChangeLog

 12011-02-07 Chang Shu <chang.shu@nokia.com>
 2
 3 Reviewed by NOBODY (OOPS!).
 4
 5 Enhanced the test for testing multiple selection.
 6 https://bugs.webkit.org/show_bug.cgi?id=49261
 7
 8 * fast/spatial-navigation/snav-multiple-select.html:
 9 * fast/spatial-navigation/snav-multiple-select-expected.txt:
 10
1112011-02-07 Martin Robinson <mrobinson@igalia.com>
212
313 Unskip a passing accessibility test and organize the rest of the tests missing
77832

LayoutTests/fast/spatial-navigation/snav-multiple-select-expected.txt

@@PASS gFocusedDocument.activeElement.getA
1414PASS gFocusedDocument.activeElement.getAttribute("id") is "start"
1515PASS gFocusedDocument.activeElement.getAttribute("id") is "4"
1616PASS gFocusedDocument.activeElement.getAttribute("id") is "start"
 17PASS gFocusedDocument.getElementById("start").options[0].selected is false
 18PASS gFocusedDocument.getElementById("start").options[1].selected is false
 19PASS gFocusedDocument.getElementById("start").options[2].selected is false
 20PASS gFocusedDocument.getElementById("start").options[0].selected is false
 21PASS gFocusedDocument.getElementById("start").options[1].selected is false
 22PASS gFocusedDocument.getElementById("start").options[2].selected is false
 23PASS gFocusedDocument.getElementById("start").options[0].selected is false
 24PASS gFocusedDocument.getElementById("start").options[1].selected is true
 25PASS gFocusedDocument.getElementById("start").options[2].selected is false
 26PASS gFocusedDocument.getElementById("start").options[0].selected is false
 27PASS gFocusedDocument.getElementById("start").options[1].selected is true
 28PASS gFocusedDocument.getElementById("start").options[2].selected is false
 29PASS gFocusedDocument.getElementById("start").options[0].selected is false
 30PASS gFocusedDocument.getElementById("start").options[1].selected is true
 31PASS gFocusedDocument.getElementById("start").options[2].selected is true
 32PASS gFocusedDocument.getElementById("start").options[0].selected is false
 33PASS gFocusedDocument.getElementById("start").options[1].selected is true
 34PASS gFocusedDocument.getElementById("start").options[2].selected is true
 35PASS gFocusedDocument.getElementById("start").options[0].selected is false
 36PASS gFocusedDocument.getElementById("start").options[1].selected is false
 37PASS gFocusedDocument.getElementById("start").options[2].selected is true
1738
77489

LayoutTests/fast/spatial-navigation/snav-multiple-select.html

4343 // starting the test itself: get to a known place.
4444 document.getElementById("start").focus();
4545
46  initTest(resultMap, testCompleted);
 46 initTest(resultMap, additionalTest);
 47 }
 48
 49 function additionalTest()
 50 {
 51 document.getElementById("start").focus();
 52 shouldBe("gFocusedDocument.getElementById(\"start\").options[0].selected", "false");
 53 shouldBe("gFocusedDocument.getElementById(\"start\").options[1].selected", "false");
 54 shouldBe("gFocusedDocument.getElementById(\"start\").options[2].selected", "false");
 55 eventSender.keyDown("downArrow");
 56 shouldBe("gFocusedDocument.getElementById(\"start\").options[0].selected", "false");
 57 shouldBe("gFocusedDocument.getElementById(\"start\").options[1].selected", "false");
 58 shouldBe("gFocusedDocument.getElementById(\"start\").options[2].selected", "false");
 59 eventSender.keyDown(" ");
 60 shouldBe("gFocusedDocument.getElementById(\"start\").options[0].selected", "false");
 61 shouldBe("gFocusedDocument.getElementById(\"start\").options[1].selected", "true");
 62 shouldBe("gFocusedDocument.getElementById(\"start\").options[2].selected", "false");
 63 eventSender.keyDown("downArrow");
 64 shouldBe("gFocusedDocument.getElementById(\"start\").options[0].selected", "false");
 65 shouldBe("gFocusedDocument.getElementById(\"start\").options[1].selected", "true");
 66 shouldBe("gFocusedDocument.getElementById(\"start\").options[2].selected", "false");
 67 eventSender.keyDown(" ");
 68 shouldBe("gFocusedDocument.getElementById(\"start\").options[0].selected", "false");
 69 shouldBe("gFocusedDocument.getElementById(\"start\").options[1].selected", "true");
 70 shouldBe("gFocusedDocument.getElementById(\"start\").options[2].selected", "true");
 71 eventSender.keyDown("upArrow");
 72 shouldBe("gFocusedDocument.getElementById(\"start\").options[0].selected", "false");
 73 shouldBe("gFocusedDocument.getElementById(\"start\").options[1].selected", "true");
 74 shouldBe("gFocusedDocument.getElementById(\"start\").options[2].selected", "true");
 75 eventSender.keyDown(" ");
 76 shouldBe("gFocusedDocument.getElementById(\"start\").options[0].selected", "false");
 77 shouldBe("gFocusedDocument.getElementById(\"start\").options[1].selected", "false");
 78 shouldBe("gFocusedDocument.getElementById(\"start\").options[2].selected", "true");
 79
 80 testCompleted();
4781 }
4882
4983 function testCompleted()
77489