Title: [91827] trunk
Revision
91827
Author
[email protected]
Date
2011-07-27 02:15:21 -0700 (Wed, 27 Jul 2011)

Log Message

Knob of a disabled or readonly range control should not be draggable.
https://bugs.webkit.org/show_bug.cgi?id=54820

Patch by Shinya Kawanaka <[email protected]> on 2011-07-27
Reviewed by Kent Tamura.

Source/WebCore:

Made disabled or readonly range control undraggable.

Test: fast/forms/range-drag.html

* html/RangeInputType.cpp:
(WebCore::RangeInputType::handleMouseDownEvent):
  Added check that the element is readonly or disabled.
* html/shadow/SliderThumbElement.cpp:
(WebCore::SliderThumbElement::defaultEventHandler): ditto.

LayoutTests:

Added tests to confirm disabled or readonly range control is undraggable.

* fast/forms/range-drag-expected.txt: Added.
* fast/forms/range-drag.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (91826 => 91827)


--- trunk/LayoutTests/ChangeLog	2011-07-27 08:56:58 UTC (rev 91826)
+++ trunk/LayoutTests/ChangeLog	2011-07-27 09:15:21 UTC (rev 91827)
@@ -1,3 +1,15 @@
+2011-07-27  Shinya Kawanaka  <[email protected]>
+
+        Knob of a disabled or readonly range control should not be draggable.
+        https://bugs.webkit.org/show_bug.cgi?id=54820
+
+        Reviewed by Kent Tamura.
+
+        Added tests to confirm disabled or readonly range control is undraggable.
+
+        * fast/forms/range-drag-expected.txt: Added.
+        * fast/forms/range-drag.html: Added.
+
 2011-07-27  Yuta Kitamura  <[email protected]>
 
         WebSocket: CloseEvent attribute is not available on WebWorkers in JSC

Added: trunk/LayoutTests/fast/forms/range-drag-expected.txt (0 => 91827)


--- trunk/LayoutTests/fast/forms/range-drag-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/forms/range-drag-expected.txt	2011-07-27 09:15:21 UTC (rev 91827)
@@ -0,0 +1,28 @@
+Test for dragging operations of <input type=range>
+
+Tests for range dragging from center.
+readOnly=false, disabled=false
+PASS input.value is "100"
+PASS changeEventCounter is >= lastChangeEventCounter + 1
+readOnly=true
+PASS input.value is "50"
+PASS lastChangeEventCounter is changeEventCounter
+disabled=true
+PASS input.value is "50"
+PASS lastChangeEventCounter is changeEventCounter
+
+Tests for range dragging from edge
+readOnly=false, disabled=false
+PASS input.value is "100"
+PASS changeEventCounter is >= lastChangeEventCounter + 1
+readOnly=true
+PASS input.value is "50"
+PASS lastChangeEventCounter is changeEventCounter
+disabled=true
+PASS input.value is "50"
+PASS lastChangeEventCounter is changeEventCounter
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/fast/forms/range-drag.html (0 => 91827)


--- trunk/LayoutTests/fast/forms/range-drag.html	                        (rev 0)
+++ trunk/LayoutTests/fast/forms/range-drag.html	2011-07-27 09:15:21 UTC (rev 91827)
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href=""
+<script src=""
+</head>
+<body>
+<p id="description">Test for dragging operations of &lt;input type=range&gt;</p>
+<div id="console"></div>
+<script>
+
+var changeEventCounter = 0;
+function handleChange() {
+    changeEventCounter++;
+}
+var lastChangeEventCounter = changeEventCounter;
+
+function dragMouseFromCenter() {
+    var centerX = input.offsetLeft + input.offsetWidth / 2;
+    var centerY = input.offsetTop + input.offsetHeight / 2;
+    eventSender.mouseMoveTo(centerX, centerY);
+    eventSender.mouseDown();
+    eventSender.mouseMoveTo(input.offsetLeft + input.offsetWidth, centerY);
+    eventSender.mouseUp();
+}
+
+function dragMouseFromEdge() {
+    var centerY = input.offsetTop + input.offsetHeight / 2;
+
+    eventSender.mouseMoveTo(input.offsetLeft + 1, centerY);
+    eventSender.mouseDown();
+    eventSender.mouseMoveTo(input.offsetLeft + input.offsetWidth, centerY);
+    eventSender.mouseUp();
+}
+
+function testInput(dragsFromEdge) {
+    if (!window.eventSender)
+        return;
+
+    var dragMouse = dragsFromEdge ? dragMouseFromEdge : dragMouseFromCenter;
+
+    debug('readOnly=false, disabled=false');
+    input.valueAsNumber = 50;
+    lastChangeEventCounter = changeEventCounter;
+    dragMouse();
+    shouldBe('input.value', '"100"');
+    shouldBeGreaterThanOrEqual('changeEventCounter', 'lastChangeEventCounter + 1');
+
+    debug('readOnly=true');
+    input.disabled = false;
+    input.readOnly = true;
+    input.valueAsNumber = 50;
+    lastChangeEventCounter = changeEventCounter;
+    dragMouse();
+    shouldBe('input.value', '"50"');
+    shouldBe('lastChangeEventCounter', 'changeEventCounter');
+
+    debug('disabled=true');
+    input.readOnly = false;
+    input.disabled = true;
+    input.valueAsNumber = 50;
+    lastChangeEventCounter = changeEventCounter;
+    dragMouse();
+    shouldBe('input.value', '"50"');
+    shouldBe('lastChangeEventCounter', 'changeEventCounter');
+}
+
+var parent = document.createElement('div');
+document.body.appendChild(parent);
+parent.innerHTML = '<input type=range id=range1 min=0 max=100 value=50>' +
+'<input type=range id=range2 min=0 max=100 value=50>';
+
+debug('Tests for range dragging from center.');
+var input = document.getElementById('range1');
+input._onchange_ = handleChange;
+input.focus();
+testInput(false);
+debug('');
+
+debug('Tests for range dragging from edge');
+var input = document.getElementById('range2');
+input._onchange_ = handleChange;
+input.focus();
+testInput(true);
+debug('');
+
+var successfullyParsed = true;
+</script>
+<script src=""
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (91826 => 91827)


--- trunk/Source/WebCore/ChangeLog	2011-07-27 08:56:58 UTC (rev 91826)
+++ trunk/Source/WebCore/ChangeLog	2011-07-27 09:15:21 UTC (rev 91827)
@@ -1,3 +1,20 @@
+2011-07-27  Shinya Kawanaka  <[email protected]>
+
+        Knob of a disabled or readonly range control should not be draggable.
+        https://bugs.webkit.org/show_bug.cgi?id=54820
+
+        Reviewed by Kent Tamura.
+
+        Made disabled or readonly range control undraggable.
+
+        Test: fast/forms/range-drag.html
+
+        * html/RangeInputType.cpp:
+        (WebCore::RangeInputType::handleMouseDownEvent):
+          Added check that the element is readonly or disabled.
+        * html/shadow/SliderThumbElement.cpp:
+        (WebCore::SliderThumbElement::defaultEventHandler): ditto.
+
 2011-07-27  Yuta Kitamura  <[email protected]>
 
         WebSocket: CloseEvent attribute is not available on WebWorkers in JSC

Modified: trunk/Source/WebCore/html/RangeInputType.cpp (91826 => 91827)


--- trunk/Source/WebCore/html/RangeInputType.cpp	2011-07-27 08:56:58 UTC (rev 91826)
+++ trunk/Source/WebCore/html/RangeInputType.cpp	2011-07-27 09:15:21 UTC (rev 91827)
@@ -153,6 +153,9 @@
 
 void RangeInputType::handleMouseDownEvent(MouseEvent* event)
 {
+    if (element()->disabled() || element()->readOnly())
+        return;
+
     Node* targetNode = event->target()->toNode();
     if (event->button() != LeftButton || !targetNode || (targetNode != element() && !targetNode->isDescendantOf(element()->shadowRoot())))
         return;
@@ -166,6 +169,7 @@
 {
     if (element()->disabled() || element()->readOnly())
         return;
+
     const String& key = event->keyIdentifier();
 
     double current = parseToDouble(element()->value(), numeric_limits<double>::quiet_NaN());

Modified: trunk/Source/WebCore/html/shadow/SliderThumbElement.cpp (91826 => 91827)


--- trunk/Source/WebCore/html/shadow/SliderThumbElement.cpp	2011-07-27 08:56:58 UTC (rev 91826)
+++ trunk/Source/WebCore/html/shadow/SliderThumbElement.cpp	2011-07-27 09:15:21 UTC (rev 91827)
@@ -270,6 +270,14 @@
         return;
     }
 
+    // FIXME: Should handle this readonly/disabled check in more general way.
+    // Missing this kind of check is likely to occur elsewhere if adding it in each shadow element.
+    HTMLInputElement* input = hostInput();
+    if (!input || input->isReadOnlyFormControl() || !input->isEnabledFormControl()) {
+        HTMLDivElement::defaultEventHandler(event);
+        return;
+    }
+
     MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
     bool isLeftButton = mouseEvent->button() == LeftButton;
     const AtomicString& eventType = event->type();
@@ -374,4 +382,3 @@
 }
 
 }
-
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to