Make slider tick mark snapping threshold configurable for each platform
authorkeishi@webkit.org <keishi@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 8 Aug 2012 17:31:12 +0000 (17:31 +0000)
committerkeishi@webkit.org <keishi@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 8 Aug 2012 17:31:12 +0000 (17:31 +0000)
https://bugs.webkit.org/show_bug.cgi?id=93429

Reviewed by Kent Tamura.

Source/WebCore:

This makes the slider tick mark snapping threshold configurable for each platform.
And we increase the threshold for the Chromium port.

No new tests. Covered by range-snap-to-datalist.html.

* html/shadow/SliderThumbElement.cpp:
(WebCore::SliderThumbElement::setPositionFromPoint):
* rendering/RenderTheme.cpp:
(WebCore::RenderTheme::sliderTickSnappingThreshold):
(WebCore):
* rendering/RenderTheme.h:
(RenderTheme):
(WebCore::RenderTheme::sliderTickSnappingThreshold): Returns the threshold distance to the tick mark for snapping to occur.
* rendering/RenderThemeChromiumCommon.cpp:
(WebCore::RenderThemeChromiumCommon::sliderTickSnappingThreshold):
(WebCore):
* rendering/RenderThemeChromiumCommon.h:
(RenderThemeChromiumCommon):
* rendering/RenderThemeChromiumMac.h:
* rendering/RenderThemeChromiumMac.mm:
(WebCore):
(WebCore::RenderThemeChromiumMac::sliderTickSnappingThreshold):
* rendering/RenderThemeChromiumSkia.cpp:
(WebCore):
(WebCore::RenderThemeChromiumSkia::sliderTickSnappingThreshold):
* rendering/RenderThemeChromiumSkia.h:

LayoutTests:

* fast/forms/datalist/range-snap-to-datalist-expected.txt: Removed.
* fast/forms/datalist/range-snap-to-datalist.html: Changed so we can use this test for different snapping thresholds.
* platform/chromium/fast/forms/datalist/range-snap-to-datalist-expected.txt: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@125048 268f45cc-cd09-0410-ab3c-d52691b4dbfc

14 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/forms/datalist/range-snap-to-datalist-expected.txt [deleted file]
LayoutTests/fast/forms/datalist/range-snap-to-datalist.html
LayoutTests/platform/chromium/fast/forms/datalist/range-snap-to-datalist-expected.txt [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/html/shadow/SliderThumbElement.cpp
Source/WebCore/rendering/RenderTheme.cpp
Source/WebCore/rendering/RenderTheme.h
Source/WebCore/rendering/RenderThemeChromiumCommon.cpp
Source/WebCore/rendering/RenderThemeChromiumCommon.h
Source/WebCore/rendering/RenderThemeChromiumMac.h
Source/WebCore/rendering/RenderThemeChromiumMac.mm
Source/WebCore/rendering/RenderThemeChromiumSkia.cpp
Source/WebCore/rendering/RenderThemeChromiumSkia.h

index 90038ca..148605b 100644 (file)
@@ -1,3 +1,14 @@
+2012-08-08  Keishi Hattori  <keishi@webkit.org>
+
+        Make slider tick mark snapping threshold configurable for each platform
+        https://bugs.webkit.org/show_bug.cgi?id=93429
+
+        Reviewed by Kent Tamura.
+
+        * fast/forms/datalist/range-snap-to-datalist-expected.txt: Removed.
+        * fast/forms/datalist/range-snap-to-datalist.html: Changed so we can use this test for different snapping thresholds.
+        * platform/chromium/fast/forms/datalist/range-snap-to-datalist-expected.txt: Added.
+
 2012-08-08  Mike West  <mkwst@chromium.org>
 
         Until CSP fully supports paths, we should log a warning if we encounter a source with a path.
diff --git a/LayoutTests/fast/forms/datalist/range-snap-to-datalist-expected.txt b/LayoutTests/fast/forms/datalist/range-snap-to-datalist-expected.txt
deleted file mode 100644 (file)
index c35a8e2..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-Tests if clicking close to a tick mark snaps to it.
-
-PASS input.value is "0"
-PASS parseInt(input.value, 10) < 500 is true
-PASS input.value is "0"
-PASS parseInt(input.value, 10) < 500 is true
-PASS input.value is "0"
-PASS parseInt(input.value, 10) < 500 is true
-PASS input.value is "0"
-PASS input.value is '500'
-PASS input.value is "0"
-PASS input.value is '500'
-PASS input.value is "0"
-PASS input.value is '500'
-PASS input.value is "0"
-PASS input.value is '500'
-PASS input.value is "0"
-PASS input.value is '500'
-PASS input.value is "0"
-PASS parseInt(input.value, 10) > 500 is true
-PASS input.value is "0"
-PASS parseInt(input.value, 10) > 500 is true
-PASS input.value is "0"
-PASS parseInt(input.value, 10) > 500 is true
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
index 02ff0f1..129f230 100644 (file)
@@ -4,7 +4,7 @@
 <script src="../../js/resources/js-test-pre.js"></script>
 </head>
 <body>
-<p id="description">Tests if clicking close to a tick mark snaps to it.</p>
+<p id="description">Tests if clicking close to a tick mark snaps to it. Result will change depending on the return value of RenderTheme::sliderTickSnappingThreshold().</p>
 <div id="console"></div>
 <input id="input" type=range min=0 max=1000 step=1 list=target style="width: 100px">
 <datalist id="target">
@@ -20,41 +20,26 @@ function clickSlider(offsetLeft) {
 }
 function resetSliderPosition() {
     clickSlider(0);
-    shouldBe('input.value', '"0"');
+    if (input.value !== "0") {
+       testFailed('Failed to reset slider position');
+    }
+}
+function test(position) {
+       resetSliderPosition();
+       clickSlider(position);
+       var value = parseInt(input.value, 10);
+       if (value < 500) {
+               debug('value for ' + position + ' is &lt;500');
+       } else if (value > 500) {
+               debug('value for ' + position + ' is &gt;500');
+       } else {
+               debug('value for ' + position + ' is =500');
+       }
+}
+
+for (var i = 40; i <= 60; ++i) {
+       test(i);
 }
-resetSliderPosition();
-clickSlider(45);
-shouldBeTrue('parseInt(input.value, 10) < 500');
-resetSliderPosition();
-clickSlider(46);
-shouldBeTrue('parseInt(input.value, 10) < 500');
-resetSliderPosition();
-clickSlider(47);
-shouldBeTrue('parseInt(input.value, 10) < 500');
-resetSliderPosition();
-clickSlider(48);
-shouldBe('input.value', "'500'");
-resetSliderPosition();
-clickSlider(49);
-shouldBe('input.value', "'500'");
-resetSliderPosition();
-clickSlider(50);
-shouldBe('input.value', "'500'");
-resetSliderPosition();
-clickSlider(51);
-shouldBe('input.value', "'500'");
-resetSliderPosition();
-clickSlider(52);
-shouldBe('input.value', "'500'");
-resetSliderPosition();
-clickSlider(53);
-shouldBeTrue('parseInt(input.value, 10) > 500');
-resetSliderPosition();
-clickSlider(54);
-shouldBeTrue('parseInt(input.value, 10) > 500');
-resetSliderPosition();
-clickSlider(55);
-shouldBeTrue('parseInt(input.value, 10) > 500');
 </script>
 
 <script src="../../js/resources/js-test-post.js"></script>
diff --git a/LayoutTests/platform/chromium/fast/forms/datalist/range-snap-to-datalist-expected.txt b/LayoutTests/platform/chromium/fast/forms/datalist/range-snap-to-datalist-expected.txt
new file mode 100644 (file)
index 0000000..0766f69
--- /dev/null
@@ -0,0 +1,27 @@
+Tests if clicking close to a tick mark snaps to it. Result will change depending on the return value of RenderTheme::sliderTickSnappingThreshold().
+
+value for 40 is <500
+value for 41 is <500
+value for 42 is <500
+value for 43 is <500
+value for 44 is <500
+value for 45 is =500
+value for 46 is =500
+value for 47 is =500
+value for 48 is =500
+value for 49 is =500
+value for 50 is =500
+value for 51 is =500
+value for 52 is =500
+value for 53 is =500
+value for 54 is =500
+value for 55 is =500
+value for 56 is >500
+value for 57 is >500
+value for 58 is >500
+value for 59 is >500
+value for 60 is >500
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
index 8a3ead1..a4308d9 100644 (file)
@@ -1,3 +1,37 @@
+2012-08-08  Keishi Hattori  <keishi@webkit.org>
+
+        Make slider tick mark snapping threshold configurable for each platform
+        https://bugs.webkit.org/show_bug.cgi?id=93429
+
+        Reviewed by Kent Tamura.
+
+        This makes the slider tick mark snapping threshold configurable for each platform.
+        And we increase the threshold for the Chromium port.
+
+        No new tests. Covered by range-snap-to-datalist.html.
+
+        * html/shadow/SliderThumbElement.cpp:
+        (WebCore::SliderThumbElement::setPositionFromPoint):
+        * rendering/RenderTheme.cpp:
+        (WebCore::RenderTheme::sliderTickSnappingThreshold):
+        (WebCore):
+        * rendering/RenderTheme.h:
+        (RenderTheme):
+        (WebCore::RenderTheme::sliderTickSnappingThreshold): Returns the threshold distance to the tick mark for snapping to occur.
+        * rendering/RenderThemeChromiumCommon.cpp:
+        (WebCore::RenderThemeChromiumCommon::sliderTickSnappingThreshold):
+        (WebCore):
+        * rendering/RenderThemeChromiumCommon.h:
+        (RenderThemeChromiumCommon):
+        * rendering/RenderThemeChromiumMac.h:
+        * rendering/RenderThemeChromiumMac.mm:
+        (WebCore):
+        (WebCore::RenderThemeChromiumMac::sliderTickSnappingThreshold):
+        * rendering/RenderThemeChromiumSkia.cpp:
+        (WebCore):
+        (WebCore::RenderThemeChromiumSkia::sliderTickSnappingThreshold):
+        * rendering/RenderThemeChromiumSkia.h:
+
 2012-08-08  Mike West  <mkwst@chromium.org>
 
         Until CSP fully supports paths, we should log a warning if we encounter a source with a path.
index 1c7507f..baca86c 100644 (file)
@@ -275,14 +275,16 @@ void SliderThumbElement::setPositionFromPoint(const LayoutPoint& point)
     Decimal value = stepRange.clampValue(stepRange.valueFromProportion(fraction));
 
 #if ENABLE(DATALIST_ELEMENT)
-    Decimal closest = input->findClosestTickMarkValue(value);
-    if (closest.isFinite()) {
-        double closestFraction = stepRange.proportionFromValue(closest).toDouble();
-        double closestRatio = isVertical || !renderBox()->style()->isLeftToRightDirection() ? 1.0 - closestFraction : closestFraction;
-        LayoutUnit closestPosition = trackSize * closestRatio;
-        const LayoutUnit snapThreshold = 3;
-        if ((closestPosition - position).abs() < snapThreshold)
-            value = closest;
+    const LayoutUnit snappingThreshold = renderer()->theme()->sliderTickSnappingThreshold();
+    if (snappingThreshold > 0) {
+        Decimal closest = input->findClosestTickMarkValue(value);
+        if (closest.isFinite()) {
+            double closestFraction = stepRange.proportionFromValue(closest).toDouble();
+            double closestRatio = isVertical || !renderBox()->style()->isLeftToRightDirection() ? 1.0 - closestFraction : closestFraction;
+            LayoutUnit closestPosition = trackSize * closestRatio;
+            if ((closestPosition - position).abs() <= snappingThreshold)
+                value = closest;
+        }
     }
 #endif
 
index 1126a07..3382d3f 100644 (file)
@@ -963,6 +963,11 @@ bool RenderTheme::paintMeter(RenderObject*, const PaintInfo&, const IntRect&)
 #endif
 
 #if ENABLE(DATALIST_ELEMENT)
+LayoutUnit RenderTheme::sliderTickSnappingThreshold() const
+{
+    return 0;
+}
+
 void RenderTheme::paintSliderTicks(RenderObject* o, const PaintInfo& paintInfo, const IntRect& rect)
 {
     Node* node = o->node();
index 3d39762..6facf52 100644 (file)
@@ -215,6 +215,8 @@ public:
 #endif
 
 #if ENABLE(DATALIST_ELEMENT)
+    // Returns the threshold distance for snapping to a slider tick mark.
+    virtual LayoutUnit sliderTickSnappingThreshold() const;
     // Returns size of one slider tick mark for a horizontal track.
     // For vertical tracks we rotate it and use it. i.e. Width is always length along the track.
     virtual IntSize sliderTickSize() const = 0;
index 2b368fb..68de37b 100644 (file)
@@ -41,4 +41,9 @@ bool RenderThemeChromiumCommon::supportsDataListUI(const AtomicString& type)
         || type == InputTypeNames::range();
 }
 
+LayoutUnit RenderThemeChromiumCommon::sliderTickSnappingThreshold()
+{
+    return 5;
+}
+
 }
index be099a8..80aeca9 100644 (file)
@@ -27,6 +27,7 @@
 #ifndef RenderThemeChromiumCommon_h
 #define RenderThemeChromiumCommon_h
 
+#include "LayoutTypes.h"
 #include <wtf/text/AtomicString.h>
 
 namespace WebCore {
@@ -34,6 +35,7 @@ namespace WebCore {
 class RenderThemeChromiumCommon {
 public:
     static bool supportsDataListUI(const AtomicString& type);
+    static LayoutUnit sliderTickSnappingThreshold();
 };
 
 }
index 973299a..e19ffa3 100644 (file)
@@ -71,6 +71,9 @@ private:
     virtual Color disabledTextColor(const Color& textColor, const Color&) const OVERRIDE { return textColor; }
     virtual void updateActiveState(NSCell*, const RenderObject*);
     virtual String extraDefaultStyleSheet();
+#if ENABLE(DATALIST_ELEMENT)
+    virtual LayoutUnit sliderTickSnappingThreshold() const OVERRIDE;
+#endif
 #if ENABLE(CALENDAR_PICKER)
     virtual CString extraCalendarPickerStyleSheet() OVERRIDE;
 #endif
index 05a9589..fc01e6f 100644 (file)
@@ -192,6 +192,13 @@ String RenderThemeChromiumMac::extraDefaultStyleSheet()
            String(themeChromiumUserAgentStyleSheet, sizeof(themeChromiumUserAgentStyleSheet));
 }
 
+#if ENABLE(DATALIST_ELEMENT)
+LayoutUnit RenderThemeChromiumMac::sliderTickSnappingThreshold() const
+{
+    return RenderThemeChromiumCommon::sliderTickSnappingThreshold();
+}
+#endif
+
 #if ENABLE(CALENDAR_PICKER)
 CString RenderThemeChromiumMac::extraCalendarPickerStyleSheet()
 {
index 7ce2a0c..3eaae41 100644 (file)
@@ -591,6 +591,13 @@ bool RenderThemeChromiumSkia::shouldShowPlaceholderWhenFocused() const
     return true;
 }
 
+#if ENABLE(DATALIST_ELEMENT)
+LayoutUnit RenderThemeChromiumSkia::sliderTickSnappingThreshold() const
+{
+    return RenderThemeChromiumCommon::sliderTickSnappingThreshold();
+}
+#endif
+
 #if ENABLE(PROGRESS_ELEMENT)
 
 //
index 489738c..ee9b11c 100644 (file)
@@ -174,6 +174,10 @@ private:
     virtual Color disabledTextColor(const Color& textColor, const Color&) const OVERRIDE { return textColor; }
     virtual bool shouldShowPlaceholderWhenFocused() const OVERRIDE;
 
+#if ENABLE(DATALIST_ELEMENT)
+    virtual LayoutUnit sliderTickSnappingThreshold() const OVERRIDE;
+#endif
+
     int menuListInternalPadding(RenderStyle*, int paddingType) const;
     bool paintMediaButtonInternal(GraphicsContext*, const IntRect&, Image*);
     IntRect convertToPaintingRect(RenderObject* inputRenderer, const RenderObject* partRenderer, LayoutRect partRect, const IntRect& localOffset) const;