Log Message
Cannot select multiple options by mouse dragging in <select multiple="multiple" size="7"> list https://bugs.webkit.org/show_bug.cgi?id=70496
Patch by Rakesh KN <[email protected]> on 2011-11-14 Reviewed by Kent Tamura. Source/WebCore: Select Multiple options in a select element with a mouse drag when no. of options are less than the no. specified in size attribute. Other browsers(IE, Opera, Firefox) support this feature Test: fast/forms/select-multiple-elements-with-mouse-drag-with-options-less-than-size.html * html/HTMLSelectElement.cpp: (WebCore::HTMLSelectElement::listBoxDefaultEventHandler): Handled mouse move event with Left button pressed. We select the options under mouse when mouse drag happens and the select element cannot autoscroll. LayoutTests: Select Multiple options in a select element with a mouse drag when no. of options are less than the no. specified in size attribute. Other browsers(IE, Opera, Firefox) support this feature. * fast/forms/select-multiple-elements-with-mouse-drag-with-options-less-than-size-expected.txt: Added. * fast/forms/select-multiple-elements-with-mouse-drag-with-options-less-than-size.html: Added.
Modified Paths
- trunk/LayoutTests/ChangeLog
- trunk/Source/WebCore/ChangeLog
- trunk/Source/WebCore/html/HTMLSelectElement.cpp
Added Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (100110 => 100111)
--- trunk/LayoutTests/ChangeLog 2011-11-14 09:16:06 UTC (rev 100110)
+++ trunk/LayoutTests/ChangeLog 2011-11-14 09:18:25 UTC (rev 100111)
@@ -1,3 +1,17 @@
+2011-11-14 Rakesh KN <[email protected]>
+
+ Cannot select multiple options by mouse dragging in <select multiple="multiple" size="7"> list
+ https://bugs.webkit.org/show_bug.cgi?id=70496
+
+ Reviewed by Kent Tamura.
+
+ Select Multiple options in a select element with a mouse drag when no. of options
+ are less than the no. specified in size attribute.
+ Other browsers(IE, Opera, Firefox) support this feature.
+
+ * fast/forms/select-multiple-elements-with-mouse-drag-with-options-less-than-size-expected.txt: Added.
+ * fast/forms/select-multiple-elements-with-mouse-drag-with-options-less-than-size.html: Added.
+
2011-11-14 Yury Semikhatsky <[email protected]>
Web Inspector: [chromium] list dedicated workers in case inspector opened post-worker creation.
Added: trunk/LayoutTests/fast/forms/select-multiple-elements-with-mouse-drag-with-options-less-than-size-expected.txt (0 => 100111)
--- trunk/LayoutTests/fast/forms/select-multiple-elements-with-mouse-drag-with-options-less-than-size-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/forms/select-multiple-elements-with-mouse-drag-with-options-less-than-size-expected.txt 2011-11-14 09:18:25 UTC (rev 100111)
@@ -0,0 +1,51 @@
+Select multiple options with mouse drag with no. of options less than the size attribute
+
+Also test mouse drag on select element without multiple attribute select only the option under mouse
+
+
+Test for select element with multiple attribute
+Dragging down
+PASS document.getElementById("selectId").options[0].selected is true
+PASS document.getElementById("selectId").options[1].selected is true
+PASS document.getElementById("selectId").options[2].selected is true
+PASS document.getElementById("selectId").options[3].selected is true
+Dragging up
+PASS document.getElementById("selectId").options[0].selected is true
+PASS document.getElementById("selectId").options[1].selected is true
+PASS document.getElementById("selectId").options[2].selected is true
+PASS document.getElementById("selectId").options[3].selected is true
+Dragging with addSelectionKey
+PASS document.getElementById("selectId").options[0].selected is true
+PASS document.getElementById("selectId").options[2].selected is true
+PASS document.getElementById("selectId").options[3].selected is true
+PASS document.getElementById("selectId").options[4].selected is true
+Dragging with rangeSelectionKey
+PASS document.getElementById("selectId").options[0].selected is true
+PASS document.getElementById("selectId").options[1].selected is true
+PASS document.getElementById("selectId").options[2].selected is true
+PASS document.getElementById("selectId").options[3].selected is true
+Test for select element without multiple attribute
+Dragging down
+PASS document.getElementById("nonmultiple").options[0].selected is false
+PASS document.getElementById("nonmultiple").options[1].selected is false
+PASS document.getElementById("nonmultiple").options[2].selected is false
+PASS document.getElementById("nonmultiple").options[3].selected is true
+Dragging up
+PASS document.getElementById("nonmultiple").options[0].selected is true
+PASS document.getElementById("nonmultiple").options[1].selected is false
+PASS document.getElementById("nonmultiple").options[2].selected is false
+PASS document.getElementById("nonmultiple").options[3].selected is false
+Dragging with addSelectionKey
+PASS document.getElementById("nonmultiple").options[0].selected is false
+PASS document.getElementById("nonmultiple").options[1].selected is false
+PASS document.getElementById("nonmultiple").options[2].selected is false
+PASS document.getElementById("nonmultiple").options[3].selected is true
+Dragging with rangeSelectionKey
+PASS document.getElementById("nonmultiple").options[0].selected is true
+PASS document.getElementById("nonmultiple").options[1].selected is false
+PASS document.getElementById("nonmultiple").options[2].selected is false
+PASS document.getElementById("nonmultiple").options[3].selected is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/fast/forms/select-multiple-elements-with-mouse-drag-with-options-less-than-size.html (0 => 100111)
--- trunk/LayoutTests/fast/forms/select-multiple-elements-with-mouse-drag-with-options-less-than-size.html (rev 0)
+++ trunk/LayoutTests/fast/forms/select-multiple-elements-with-mouse-drag-with-options-less-than-size.html 2011-11-14 09:18:25 UTC (rev 100111)
@@ -0,0 +1,127 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<script src=""
+<title></title>
+</head>
+<body>
+<p>Select multiple options with mouse drag with no. of options less than the size attribute</p>
+<p>Also test mouse drag on select element without multiple attribute select only the option under mouse</p>
+
+<select multiple="multiple" size="7" id="selectId">
+ <option value="P1">P1</option>
+ <option value="P2">P2</option>
+ <option value="P3">P3</option>
+ <option value="P4">P4</option>
+ <option value="P5">P5</option>
+</select>
+
+<select size="7" id="nonmultiple">
+ <option value="P1">P1</option>
+ <option value="P2">P2</option>
+ <option value="P3">P3</option>
+ <option value="P4">P4</option>
+ <option value="P5">P5</option>
+</select>
+
+<div id="console"></div>
+<script>
+if (window.eventSender) {
+ debug("Test for select element with multiple attribute");
+ var selectObject = document.getElementById("selectId");
+
+ var optionHeight = selectObject.offsetHeight / selectObject.size;
+ var x = selectObject.offsetLeft + selectObject.offsetWidth / 2;
+ var y = selectObject.offsetTop + optionHeight / 2;
+
+ eventSender.dragMode = false;
+ eventSender.mouseMoveTo(x, y);
+ eventSender.mouseDown();
+
+ debug("Dragging down");
+ eventSender.mouseDown();
+ eventSender.mouseMoveTo(x, y + (optionHeight * 3));
+ eventSender.mouseUp();
+ testOptionSelection(0, 4, "true", "selectId");
+
+ debug("Dragging up");
+ eventSender.mouseDown();
+ eventSender.mouseMoveTo(x, y);
+ eventSender.mouseUp();
+ testOptionSelection(0, 4, "true", "selectId");
+
+ debug("Dragging with addSelectionKey")
+ eventSender.mouseDown();
+ eventSender.mouseUp();
+ eventSender.mouseMoveTo(x, y + (optionHeight * 2));
+ eventSender.mouseDown(0, "addSelectionKey");
+ eventSender.mouseMoveTo(x, y + (optionHeight * 4));
+ eventSender.mouseUp(0, "addSelectionKey");
+ testOptionSelection(0, 1, "true", "selectId");
+ testOptionSelection(2, 5, "true", "selectId");
+
+ debug("Dragging with rangeSelectionKey");
+ eventSender.mouseDown();
+ eventSender.mouseUp();
+ eventSender.mouseMoveTo(x, y + (optionHeight * 2));
+ eventSender.mouseDown(0, "rangeSelectionKey");
+ eventSender.mouseMoveTo(x, y);
+ eventSender.mouseUp(0, "rangeSelectionKey");
+ testOptionSelection(0, 4, "true", "selectId");
+
+ debug("Test for select element without multiple attribute");
+ var nonMultipleObject = document.getElementById("nonmultiple");
+ var optionHeight = nonMultipleObject.offsetHeight / nonMultipleObject.size;
+ x = nonMultipleObject.offsetLeft + nonMultipleObject.offsetWidth / 2;
+ y = nonMultipleObject.offsetTop + optionHeight / 2;
+
+ eventSender.dragMode = false;
+ eventSender.mouseMoveTo(x, y);
+ eventSender.mouseDown();
+
+ debug("Dragging down");
+ eventSender.mouseDown();
+ eventSender.mouseMoveTo(x, y + (optionHeight * 3));
+ eventSender.mouseUp();
+ testOptionSelection(0, 3, "false", "nonmultiple");
+ testOptionSelection(3, 4, "true", "nonmultiple");
+
+ debug("Dragging up");
+ eventSender.mouseDown();
+ eventSender.mouseMoveTo(x, y);
+ eventSender.mouseUp();
+ testOptionSelection(0, 1, "true", "nonmultiple");
+ testOptionSelection(1, 4, "false", "nonmultiple");
+
+ debug("Dragging with addSelectionKey")
+ eventSender.mouseDown();
+ eventSender.mouseDown(0, "addSelectionKey");
+ eventSender.mouseMoveTo(x, y + (optionHeight * 3));
+ eventSender.mouseUp(0, "addSelectionKey");
+ testOptionSelection(0, 3, "false", "nonmultiple");
+ testOptionSelection(3, 4, "true", "nonmultiple");
+
+ debug("Dragging with rangeSelectionKey");
+ eventSender.mouseDown();
+ eventSender.mouseDown(0, "rangeSelectionKey");
+ eventSender.mouseMoveTo(x, y);
+ eventSender.mouseUp(0, "rangeSelectionKey");
+ testOptionSelection(0, 1, "true", "nonmultiple");
+ testOptionSelection(1, 4, "false", "nonmultiple");
+
+} else {
+ debug("Test manually if options are getting selected by dragging on the select element.");
+}
+
+function testOptionSelection(start, end, criteria, element) {
+ for (var i = start; i < end; i++) {
+ shouldBe("document.getElementById(\"" + element + "\").options[" + i + "].selected", criteria);
+ }
+}
+
+successfullyParsed = true;
+</script>
+<script src=""
+</body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (100110 => 100111)
--- trunk/Source/WebCore/ChangeLog 2011-11-14 09:16:06 UTC (rev 100110)
+++ trunk/Source/WebCore/ChangeLog 2011-11-14 09:18:25 UTC (rev 100111)
@@ -1,3 +1,21 @@
+2011-11-14 Rakesh KN <[email protected]>
+
+ Cannot select multiple options by mouse dragging in <select multiple="multiple" size="7"> list
+ https://bugs.webkit.org/show_bug.cgi?id=70496
+
+ Reviewed by Kent Tamura.
+
+ Select Multiple options in a select element with a mouse drag when no. of options
+ are less than the no. specified in size attribute.
+ Other browsers(IE, Opera, Firefox) support this feature
+
+ Test: fast/forms/select-multiple-elements-with-mouse-drag-with-options-less-than-size.html
+
+ * html/HTMLSelectElement.cpp:
+ (WebCore::HTMLSelectElement::listBoxDefaultEventHandler):
+ Handled mouse move event with Left button pressed. We select the options under mouse
+ when mouse drag happens and the select element cannot autoscroll.
+
2011-11-14 Yury Semikhatsky <[email protected]>
Web Inspector: [chromium] list dedicated workers in case inspector opened post-worker creation.
Modified: trunk/Source/WebCore/html/HTMLSelectElement.cpp (100110 => 100111)
--- trunk/Source/WebCore/html/HTMLSelectElement.cpp 2011-11-14 09:16:06 UTC (rev 100110)
+++ trunk/Source/WebCore/html/HTMLSelectElement.cpp 2011-11-14 09:18:25 UTC (rev 100111)
@@ -1203,6 +1203,21 @@
event->setDefaultHandled();
}
+ } else if (event->type() == eventNames().mousemoveEvent && event->isMouseEvent() && !toRenderBox(renderer())->canBeScrolledAndHasScrollableArea()) {
+ MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
+ if (mouseEvent->button() != LeftButton || !mouseEvent->buttonDown())
+ return;
+
+ IntPoint localOffset = roundedIntPoint(renderer()->absoluteToLocal(mouseEvent->absoluteLocation(), false, true));
+ int listIndex = toRenderListBox(renderer())->listIndexAtOffset(toSize(localOffset));
+ if (listIndex >= 0) {
+ if (m_multiple) {
+ setActiveSelectionEndIndex(listIndex);
+ updateListBoxSelection(false);
+ } else
+ updateSelectedState(listIndex, false, false);
+ event->setDefaultHandled();
+ }
} else if (event->type() == eventNames().mouseupEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton && document()->frame()->eventHandler()->autoscrollRenderer() != renderer()) {
// This makes sure we fire dispatchFormControlChangeEvent for a single
// click. For drag selection, onChange will fire when the autoscroll
_______________________________________________ webkit-changes mailing list [email protected] http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes
