Title: [100111] trunk
Revision
100111
Author
[email protected]
Date
2011-11-14 01:18:25 -0800 (Mon, 14 Nov 2011)

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

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

Reply via email to