Title: [122865] branches/chromium/1180
Revision
122865
Author
[email protected]
Date
2012-07-17 11:50:24 -0700 (Tue, 17 Jul 2012)

Log Message

Merge 122224 - Input type=range issue with events not being raised when value set in js
https://bugs.webkit.org/show_bug.cgi?id=84674

Source/WebCore:

Fix dispatching of change and click events for the input slider.
Prior to the fix, change events were not fired if the new value
matched the value at last change notification based on expected
behavior for text fields.  Clicks were not fired if the thumb
element was repositioned under the cursor on mouse down.

Patch by Kevin Ellis <[email protected]> on 2012-07-10
Reviewed by Kent Tamura.

Tests: fast/events/click-range-slider.html
       fast/events/onchange-range-slider.html

* html/shadow/SliderThumbElement.cpp:
(WebCore::SliderThumbElement::setPositionFromPoint):
* page/EventHandler.cpp:
(WebCore::EventHandler::handleMouseReleaseEvent):

LayoutTests:

Ensure that click and change events are properly triggered for range
sliders.  Prior to the fix, change events were not fired if the new
value matched the value at last change notification based on expected
behavior for text fields.  Clicks were not fired if the thumb element
was positioned under the cursor on mouse down.

Patch by Kevin Ellis <[email protected]> on 2012-07-10
Reviewed by Kent Tamura.

* fast/events/click-range-slider-expected.txt: Added.
* fast/events/click-range-slider.html: Added.
* fast/events/onchange-range-slider-expected.txt: Added.
* fast/events/onchange-range-slider.html: Added.

[email protected]
Review URL: https://chromiumcodereview.appspot.com/10783036

Modified Paths

Added Paths

Diff

Copied: branches/chromium/1180/LayoutTests/fast/events/click-range-slider-expected.txt (from rev 122224, trunk/LayoutTests/fast/events/click-range-slider-expected.txt) (0 => 122865)


--- branches/chromium/1180/LayoutTests/fast/events/click-range-slider-expected.txt	                        (rev 0)
+++ branches/chromium/1180/LayoutTests/fast/events/click-range-slider-expected.txt	2012-07-17 18:50:24 UTC (rev 122865)
@@ -0,0 +1,5 @@
+Test that click events are fired for a slider when the range of values is dense enough that the thumb element is repositioned under the cursor on mouse press.
+
+
+PASS clickCount is 3
+

Copied: branches/chromium/1180/LayoutTests/fast/events/click-range-slider.html (from rev 122224, trunk/LayoutTests/fast/events/click-range-slider.html) (0 => 122865)


--- branches/chromium/1180/LayoutTests/fast/events/click-range-slider.html	                        (rev 0)
+++ branches/chromium/1180/LayoutTests/fast/events/click-range-slider.html	2012-07-17 18:50:24 UTC (rev 122865)
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+<head>
+</head>
+<body>
+<p>Test that click events are fired for a slider when the range of values is dense enough that the thumb element is repositioned under the cursor on mouse press.</p>
+
+<!-- See bug 84674 -->
+<input id="slider" type="range" min="0" max="100" value="50"></input>
+<pre id="console"></pre>
+<script src=""
+<script>
+var clickCount = 0;
+var slider;
+
+function onClick(e)
+{
+    clickCount++;
+}
+
+window._onload_ = function()
+{
+    if (!window.testRunner)
+        return;
+
+    slider = document.getElementById("slider");
+    slider.addEventListener("click", onClick);
+
+    // Click respositions the slider thumb element under the cursor.
+    // Ensure that the click event still fires.
+    var x = slider.offsetLeft + 1;
+    var y = slider.offsetTop + slider.clientHeight / 2;
+
+    eventSender.mouseMoveTo(x, y);
+    eventSender.mouseDown();
+    eventSender.mouseUp();
+
+    eventSender.mouseMoveTo(x + slider.clientWidth - 2, y);
+    eventSender.mouseDown();
+    eventSender.mouseUp();
+
+    eventSender.mouseMoveTo(x + slider.clientWidth / 2, y);
+    eventSender.mouseDown();
+    eventSender.mouseUp();
+
+    shouldBe("clickCount", "3");
+}
+</script>
+</body>
+</html>

Copied: branches/chromium/1180/LayoutTests/fast/events/onchange-range-slider-expected.txt (from rev 122224, trunk/LayoutTests/fast/events/onchange-range-slider-expected.txt) (0 => 122865)


--- branches/chromium/1180/LayoutTests/fast/events/onchange-range-slider-expected.txt	                        (rev 0)
+++ branches/chromium/1180/LayoutTests/fast/events/onchange-range-slider-expected.txt	2012-07-17 18:50:24 UTC (rev 122865)
@@ -0,0 +1,6 @@
+This test verifies that updating the slider for an input element with type=range fires a change event.
+
+
+PASS Change event fired.
+PASS slider.value is "0"
+

Copied: branches/chromium/1180/LayoutTests/fast/events/onchange-range-slider.html (from rev 122224, trunk/LayoutTests/fast/events/onchange-range-slider.html) (0 => 122865)


--- branches/chromium/1180/LayoutTests/fast/events/onchange-range-slider.html	                        (rev 0)
+++ branches/chromium/1180/LayoutTests/fast/events/onchange-range-slider.html	2012-07-17 18:50:24 UTC (rev 122865)
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+<head>
+</head>
+<body>
+<p>This test verifies that updating the slider for an input element with type=range fires a change event.</p>
+
+<!-- See bug 84674 -->
+<input id="slider" type="range" min="0" max="3" value="0"></input>
+<pre id="console"></pre>
+<script src=""
+<script>
+var receivedChangeEvent = false;
+var slider;
+
+function onChange(e)
+{
+    testPassed('Change event fired.');
+    receivedChangeEvent = true;
+    shouldBeEqualToString("slider.value", "0");
+}
+
+window._onload_ = function()
+{
+    if (!window.testRunner)
+        return;
+
+    slider = document.getElementById("slider");
+    slider.addEventListener("change", onChange);
+
+    // Programmatically changing an input value should not fire a change event.
+    slider.value = 1;
+
+    // Changing back to original value should fire a change event.
+    var x = slider.offsetLeft + 1;
+    var y = slider.offsetTop + slider.clientHeight / 2;
+
+    eventSender.mouseMoveTo(x, y);
+    eventSender.mouseDown();
+    eventSender.mouseUp();
+
+    if (!receivedChangeEvent)
+        testFailed('Change event not fired.');
+}
+</script>
+</body>
+</html>

Modified: branches/chromium/1180/Source/WebCore/html/shadow/SliderThumbElement.cpp (122864 => 122865)


--- branches/chromium/1180/Source/WebCore/html/shadow/SliderThumbElement.cpp	2012-07-17 18:44:37 UTC (rev 122864)
+++ branches/chromium/1180/Source/WebCore/html/shadow/SliderThumbElement.cpp	2012-07-17 18:50:24 UTC (rev 122865)
@@ -218,6 +218,7 @@
     if (!input->renderer() || !renderer())
         return;
 
+    input->setTextAsOfLastFormControlChangeEvent(input->value());
     LayoutPoint offset = roundedLayoutPoint(input->renderer()->absoluteToLocal(point, false, true));
     bool isVertical = hasVerticalAppearance(input);
     LayoutUnit trackSize;

Modified: branches/chromium/1180/Source/WebCore/page/EventHandler.cpp (122864 => 122865)


--- branches/chromium/1180/Source/WebCore/page/EventHandler.cpp	2012-07-17 18:44:37 UTC (rev 122864)
+++ branches/chromium/1180/Source/WebCore/page/EventHandler.cpp	2012-07-17 18:50:24 UTC (rev 122865)
@@ -1880,8 +1880,13 @@
 
     bool swallowMouseUpEvent = dispatchMouseEvent(eventNames().mouseupEvent, targetNode(mev), true, m_clickCount, mouseEvent, false);
 
-    bool swallowClickEvent = m_clickCount > 0 && mouseEvent.button() != RightButton && targetNode(mev) == m_clickNode && dispatchMouseEvent(eventNames().clickEvent, targetNode(mev), true, m_clickCount, mouseEvent, true);
+    Node* clickTarget = targetNode(mev);
+    if (clickTarget)
+        clickTarget = clickTarget->shadowAncestorNode();
+    Node* adjustedClickNode = m_clickNode ? m_clickNode->shadowAncestorNode() : 0;
 
+    bool swallowClickEvent = m_clickCount > 0 && mouseEvent.button() != RightButton && clickTarget == adjustedClickNode && dispatchMouseEvent(eventNames().clickEvent, targetNode(mev), true, m_clickCount, mouseEvent, true);
+
     if (m_resizeLayer) {
         m_resizeLayer->setInResizeMode(false);
         m_resizeLayer = 0;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to