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 <input type=range></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